vim: crea un archivo con + x bit

14

¿Hay alguna forma de establecer +xbit en el script mientras se crea?

Por ejemplo, ejecuto:

vim -some_option_to_make_file_executable script.sh

y después de guardar puedo ejecutar el archivo sin movimientos adicionales.

PD. Puedo correr chmoddesde vimo incluso desde la consola, pero esto es un poco molesto, porque vimsugiere volver a cargar el archivo. También es molesto escribir chmodcomandos cada vez. pps. Sería genial hacerlo dependiendo de la extensión del archivo (no necesito el ejecutable .txt:-))

prisa
fuente

Respuestas:

23

No recuerdo dónde encontré esto, pero uso lo siguiente en mi ~ / .vimrc

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

El comando establece automáticamente el bit ejecutable si la primera línea comienza con "#!" o contiene "/ bin /".

tonymac
fuente
1
Wow, eso es genial. Por cierto, parece que puedes unir dos ifen uno if getline(1) =~ "^#!/bin/". De todos modos eso es asombroso. Gracias.
precipitarse
Esto no es un "o". Prefiero usar solo la primera condición,au BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
bóveda
1
@rush Las razones para las declaraciones de doble if es para atrapar líneas donde el /binno sigue inmediatamente al shebang, como #!/usr/bin/env. Un torno manera que es, por supuesto, utilizar un comodín: getline(1) =~ "^#!.*/bin/".
Harald Nordgren
1
Buen truco, pero obtengo lo siguiente cada vez que written/bin/bash: endif: command not found /bin/bash: endif: command not found
guardo
3
esto lo arregla:au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif
StevieD
4

Encontré este script en http://vim.wikia.com . No es una solución perfecta, pero una aceptable, creo.

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

Ahora puede establecer el bit de ejecución con el comando :Xbit. Todo el crédito a Max Ischenko en vim.wikia.com

NS G
fuente
0

Lo uso en 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
fuente
0

La respuesta de Tonyony dejó de funcionar para mí en algún momento (con VIM 7.4), dándome el mismo problema que @StevieD. Modificarlo solucionó el problema:

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

Encontré la respuesta en https://bbs.archlinux.org/viewtopic.php?id=126304 , aunque @StevieD también dio la misma respuesta.

Jonathan
fuente