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

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 /".


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


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.