vim:+ xビットでファイルを生成する

vim:+ xビットでファイルを生成する

+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も同じ答えを提供しましたが。

関連情報