回答:
これを見つけた場所は思い出せませんが、〜/ .vimrcで以下を使用します
" Set scripts to be executable from the shell
au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod +x <afile> | endif | endif
最初の行が「#!」で始まる場合、コマンドは実行可能ビットを自動的に設定します または「/ bin /」を含む。
au BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
/bin
がシバンの直後に続かない行をキャッチするため#!/usr/bin/env
です。それを回避する方法は、もちろんワイルドカードを使用することです:getline(1) =~ "^#!.*/bin/"
。
written/bin/bash: endif: command not found /bin/bash: endif: command not found
au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif
このスクリプトはhttp://vim.wikia.comで見つけました。完璧な解決策ではありませんが、許容できる解決策だと思います。
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()
これで、コマンドで実行ビットを設定できます:Xbit
。vim.wikia.comでのMax Ischenkoの功績
これをMacVimカスタムバージョン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
tonymacの答えは(VIM 7.4で)ある時点で機能しなくなり、@ StevieDと同じ問題が発生しました。それを修正することで問題が修正されました:
au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod +x <afile>" | endif | endif
https://bbs.archlinux.org/viewtopic.php?id=126304から答えを見つけましたが、@ StevieDも同じ答えを出しました。
if
を1つに結合できるようですif getline(1) =~ "^#!/bin/"
。とにかくすごい。ありがとうございました。