vim: utwórz plik z bitem + x

14

Czy jest jakiś sposób, aby ustawić +xbit na skrypcie podczas tworzenia?

Na przykład uruchamiam:

vim -some_option_to_make_file_executable script.sh

a po zapisaniu mogę uruchomić plik bez żadnych dodatkowych ruchów.

ps. Mogę uruchomić chmodz vimsamej konsoli lub nawet z niej, ale jest to trochę denerwujące, ponieważ vimsugeruje ponowne załadowanie pliku. Również denerwujące jest wpisywanie chmodpolecenia za każdym razem. pps. Byłoby wspaniale zrobić to w zależności od rozszerzenia pliku (nie potrzebuję pliku wykonywalnego .txt:-))

wysypka
źródło

Odpowiedzi:

23

Nie pamiętam, gdzie to znalazłem, ale używam następujących w moim ~ / .vimrc

" Set scripts to be executable from the shell
au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod +x <afile> | endif | endif

Polecenie automatycznie ustawia bit wykonywalny, jeśli pierwszy wiersz zaczyna się od „#!” lub zawiera „/ bin /”.

tonymac
źródło
1
Wow, to świetna rzecz. Btw, wydaje się, że możesz połączyć dwa ifw jeden if getline(1) =~ "^#!/bin/". W każdym razie to niesamowite. Dziękuję Ci.
pędzi
To nie jest „ani”. Wolę użyć tylko pierwszego warunku,au BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
sklepienie
1
@rush Powodami podwójnych instrukcji if jest uchwycenie linii, w których /binnie następuje natychmiast po shebang, na przykład #!/usr/bin/env. Sposób wokół to oczywiście użyć symbolu wieloznacznego: getline(1) =~ "^#!.*/bin/".
Harald Nordgren,
1
Niezła sztuczka, ale za każdym razem, gdy zapisuję, otrzymuję następujące informacje:written/bin/bash: endif: command not found /bin/bash: endif: command not found
StevieD
3
to naprawia:au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif
StevieD,
4

Znalazłem ten skrypt na stronie http://vim.wikia.com . Myślę, że nie jest to idealne rozwiązanie, ale akceptowalne.

function! SetExecutableBit()
  let fname = expand("%:p")
  checktime
  execute "au FileChangedShell " . fname . " :echo"
  silent !chmod a+x %
  checktime
  execute "au! FileChangedShell " . fname
endfunction
command! Xbit call SetExecutableBit()

Teraz możesz ustawić bit wykonania za pomocą polecenia :Xbit. Wszystkie podziękowania dla Maxa Ischenko na vim.wikia.com

nsg
źródło
0

Używam tego w niestandardowej wersji MacVim 8.0.648 (134)

" if file is executable just exit

au BufWritePost *.sh if FileExecutable("%") | if getline(1) =~ "^#!" | silent !chmod u+x % | endif | endif

" Determines if file is already executable 

function! FileExecutable(fname)

    execute "silent! ! test -x" a:fname
    return v:shell_error

endfunction
TonyB
źródło
0

Odpowiedź tonymaca w pewnym momencie przestała działać dla mnie (z VIM 7.4), dając mi ten sam problem co @StevieD. Modyfikacja rozwiązała problem:

au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod +x <afile>" | endif | endif

Znalazłem odpowiedź z https://bbs.archlinux.org/viewtopic.php?id=126304 , chociaż @StevieD również dało tę samą odpowiedź.

Jonathan
źródło