vim: créer un fichier avec + x bit

14

Existe-t-il un moyen de définir le +xbit sur le script lors de la création?

Par exemple, je lance:

vim -some_option_to_make_file_executable script.sh

et après avoir enregistré, je peux exécuter le fichier sans aucun mouvement supplémentaire.

ps. Je peux courir chmoddepuis vimou même depuis la console elle-même, mais c'est un peu gênant, car vimsuggère de recharger le fichier. Il est également ennuyeux de taper une chmodcommande à chaque fois. pps. Ce serait génial de le faire en fonction de l'extension du fichier (je n'ai pas besoin d'exécutable .txt:-))

se ruer
la source

Réponses:

23

Je ne me souviens pas où j'ai trouvé cela, mais j'utilise ce qui suit dans mon ~ / .vimrc

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

La commande définit automatiquement le bit exécutable si la première ligne commence par "#!" ou contient "/ bin /".

tonymac
la source
1
Wow, c'est super. Btw, semble que vous pouvez joindre deux ifen un if getline(1) =~ "^#!/bin/". Quoi qu'il en soit, c'est incroyable. Je vous remercie.
rush
Ce n'est pas un "ou". Je préfère utiliser uniquement la première condition,au BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
coffre
1
@rush Les raisons de la double instruction if est d'attraper des lignes où le /binne suit pas immédiatement le shebang, comme #!/usr/bin/env. Une façon de contourner qui est bien sûr d'utiliser un joker: getline(1) =~ "^#!.*/bin/".
Harald Nordgren
1
written/bin/bash: endif: command not found /bin/bash: endif: command not found
Truc sympa
3
cela le corrige:au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif
StevieD
4

J'ai trouvé ce script sur http://vim.wikia.com . Pas une solution parfaite, mais une solution acceptable, je pense.

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()

Vous pouvez maintenant définir le bit d'exécution avec la commande :Xbit. Tous les crédits à Max Ischenko sur vim.wikia.com

NS g
la source
0

Je l'utilise dans MacVim Custom Version 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
la source
0

la réponse de tonymac a cessé de fonctionner pour moi à un moment donné (avec VIM 7.4), me posant le même problème que @StevieD. La modifier a résolu le problème:

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

J'ai trouvé la réponse sur https://bbs.archlinux.org/viewtopic.php?id=126304 , bien que @StevieD ait également donné la même réponse.

Jonathan
la source