vim: cria arquivo com + x bit

14

Existe alguma maneira de definir o +xbit no script durante a criação?

Por exemplo, eu corro:

vim -some_option_to_make_file_executable script.sh

e depois de salvar, posso executar o arquivo sem movimentos adicionais.

ps. Eu posso correr a chmodpartir vimou mesmo do próprio console, mas isso é um pouco chato, porque vima sugestão sugere recarregar o arquivo. Também é irritante digitar chmodcomando sempre. pps. Seria ótimo fazê-lo, dependendo da extensão do arquivo (não preciso de executável .txt:-))

pressa
fonte

Respostas:

23

Não me lembro onde encontrei isso, mas uso o seguinte no meu ~ / .vimrc

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

O comando define automaticamente o bit executável se a primeira linha começar com "#!" ou contém "/ bin /".

tonymac
fonte
1
Uau, isso é ótimo. Aliás, parece que você pode juntar dois ifem um if getline(1) =~ "^#!/bin/". Enfim, isso é incrível. Obrigado.
apressar
Este não é um "ou". Eu prefiro usar apenas primeira condição,au BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
abóbada
1
@rush As razões para as declarações double if são para pegar linhas em que o /binnão segue imediatamente o shebang, como #!/usr/bin/env. Uma maneira de contornar isso é, naturalmente, para usar um curinga: getline(1) =~ "^#!.*/bin/".
Harald Nordgren 02/04
1
Bom truque, mas recebo o seguinte sempre que salvo:written/bin/bash: endif: command not found /bin/bash: endif: command not found
StevieD 10/17/17
3
isso corrige:au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif
StevieD
4

Encontrei esse script em http://vim.wikia.com . Não é uma solução perfeita, mas aceitável, eu acho.

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

Agora você pode definir o bit de execução com o comando :Xbit. Todo o crédito a Max Ischenko em vim.wikia.com

nsg
fonte
0

Eu uso isso no MacVim Custom Versão 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
fonte
0

A resposta do tonymac parou de funcionar para mim em algum momento (com o VIM 7.4), dando-me o mesmo problema que o @StevieD. A modificação corrigiu o problema:

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

Encontrei a resposta em https://bbs.archlinux.org/viewtopic.php?id=126304 , embora o @StevieD também tenha dado a mesma resposta.

Jonathan
fonte