vim:+ xビットでファイルを作成


14

+x作成中にスクリプトにビットを設定する方法はありますか?

たとえば、私は実行します:

vim -some_option_to_make_file_executable script.sh

保存した後、追加の移動なしでファイルを実行できます。

追伸 私は実行することができますchmodからvim、あるいはコンソール自体から、これは少し厄介な、原因があるvimファイルをリロードすることを示唆しています。また、chmod毎回コマンドを入力するのは面倒です。pps。ファイル拡張子に応じて作成するのは素晴らしいことです(実行可能ファイルは必要ありません.txt:-))

回答:


23

これを見つけた場所は思い出せませんが、〜/ .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 /」を含む。


1
うわー、それは素晴らしいことです。ところで、2つifを1つに結合できるようですif getline(1) =~ "^#!/bin/"。とにかくすごい。ありがとうございました。
ラッシュ

これは「または」ではありません。私は最初の条件、使用することを好むau BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
ボールト

1
@rush double ifステートメントの理由は、/binがシバンの直後に続かない行をキャッチするため#!/usr/bin/envです。それを回避する方法は、もちろんワイルドカードを使用することです:getline(1) =~ "^#!.*/bin/"
ハラルドノルドグレン

1
巧妙なトリックが、私は保存し、次のすべての時間を取得:written/bin/bash: endif: command not found /bin/bash: endif: command not found
StevieD

3
この修正それ:au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif
StevieD

4

このスクリプト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の功績


0

これを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

0

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も同じ答えを出しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.