vim: Datei mit + x Bit erstellen

14

Gibt es eine Möglichkeit, +xbeim Erstellen ein Bit auf das Skript zu setzen ?

Zum Beispiel laufe ich:

vim -some_option_to_make_file_executable script.sh

und nach dem speichern kann ich datei ohne zusätzliche bewegungen ausführen.

ps. Ich kann chmodvon vimoder sogar von der Konsole selbst laufen , aber das ist ein wenig nervig, vimdenn es empfiehlt sich, die Datei neu zu laden. Es ist auch ärgerlich, chmodjedes Mal einen Befehl einzugeben. pps. Es wäre toll, es abhängig von der Dateierweiterung zu machen (ich brauche keine ausführbare Datei .txt:-))

eilen
quelle

Antworten:

23

Ich kann mich nicht erinnern, wo ich das gefunden habe, aber ich verwende das Folgende in meinem ~ / .vimrc

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

Der Befehl setzt das ausführbare Bit automatisch, wenn die erste Zeile mit "#!" oder enthält "/ bin /".

tonymac
quelle
1
Wow, das ist großartig. Übrigens, scheinbar können Sie zwei ifzu einem verbinden if getline(1) =~ "^#!/bin/". Wie auch immer, das ist unglaublich. Vielen Dank.
Ansturm
Dies ist kein "oder". Ich bevorzuge es, nur die erste Bedingung zu verwenden,au BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
Tresor
1
@rush Der Grund für die double if -Anweisung ist, Zeilen zu fangen, in denen der shebang /binnicht sofort folgt, wie #!/usr/bin/env. Ein Weg , um die natürlich einen Platzhalter zu verwenden: getline(1) =~ "^#!.*/bin/".
Harald Nordgren
1
Ordentlicher Trick, aber jedes Mal, wenn ich speichere, written/bin/bash: endif: command not found /bin/bash: endif: command not found
erhalte
3
dies behebt es:au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif
StevieD
4

Ich habe dieses Skript unter http://vim.wikia.com gefunden . Keine perfekte, aber akzeptable Lösung, denke ich.

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

Sie können jetzt das Ausführungsbit mit dem Befehl setzen :Xbit. Wir danken Max Ischenko auf vim.wikia.com

nsg
quelle
0

Ich verwende dies in 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
quelle
0

Die Antwort von tonymac funktionierte irgendwann nicht mehr für mich (mit VIM 7.4), und ich hatte das gleiche Problem wie bei @StevieD. Das Ändern hat das Problem behoben:

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

Ich fand die Antwort von https://bbs.archlinux.org/viewtopic.php?id=126304 , obwohl @StevieD auch die gleiche Antwort gab.

Jonathan
quelle