+x
生成時にスクリプトにビットを設定する方法はありますか?
たとえば、次のようにします。
vim -some_option_to_make_file_executable script.sh
保存したら、追加の移動なしでファイルを実行できます。
注意事項chmod
コンソール自体でもコンソール自体でもこの操作を実行できますが、ファイルを再ロードすることをお勧めしますので、vim
少し迷惑です。vim
そしてchmod
毎回命令を入力するのも面倒です。 pps。ファイル拡張子を基準にして作ればいいようです。 (実行ファイルは必要ありません.txt
:-) )
答え1
これをどこで見つけたかは覚えていませんが、〜/.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/」を含みます。
答え2
私が見つけたこのスクリプト存在する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のすべてのクレジット
答え3
私はより選択的なバージョンを自分で書いた。新しいファイルが作成されたときにのみファイルを実行可能にし、ファイルが#!
。
" automatically make script files executable when writing for the first time
function! NewScriptExec() abort
" check if this is a new file which starts with a shebang
if exists('s:new_file') && getline(1)[0:1] == '#!'
" based on https://stackoverflow.com/a/57539332/370695
let l:file = expand('%')
let l:old_perm = getfperm(l:file)
" set the exec bit everywhere the read bit is set
let l:new_perm = substitute(l:old_perm, '\v(r.)-', '\1x', 'g')
if (l:old_perm != l:new_perm)
call setfperm(l:file, l:new_perm)
endif
unlet s:new_file
endif
endfunction
augroup new_script_exec
autocmd!
autocmd BufNewFile * let s:new_file = 1
autocmd BufWritePost * call NewScriptExec()
augroup END
答え4
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も同じ答えを提供しましたが。