vim: cria um arquivo com bit + x

13

Existe alguma maneira de definir +x bit 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 nenhuma alteração adicional.

ps. Eu posso executar chmod de vim ou mesmo do próprio console, mas isso é um pouco irritante, porque vim sugere recarregar o arquivo. Também é irritante digitar o comando chmod todas as vezes. pps. Seria ótimo fazer isso dependendo da extensão do arquivo (eu não preciso do executável .txt :-))

    
por rush 04.06.2012 / 11:16

4 respostas

22

Não me lembro de onde encontrei isto, mas utilizo 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 /".

    
por 04.06.2012 / 15:26
4

Eu encontrei este script no link . 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 . Todos os créditos para Max Ischenko em vim.wikia.com

    
por 04.06.2012 / 11:44
0

Eu uso isso no 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
    
por 15.07.2017 / 13:14
0

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

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

Eu encontrei a resposta do link , embora @StevieD também tenha dado a mesma resposta.

    
por 14.11.2017 / 10:03