ファイルなし、存在しないファイル、または空のファイルでVimを起動するときにautocmdを実行するにはどうすればよいですか(ただし、既存のファイルで起動するときはできません)。


11

Vimを起動するときに、次のシナリオでautocmdを実行したいと思います。

  • ファイル名が指定されていません。
  • ファイルが新しい場合。
  • ファイルは存在するが完全に空白の場合。

上記の3つのケースすべてで、autocmdを実行したいと思います。具体的には、上記のシナリオでのみ挿入モードを自動的開始したいと思います(すでに存在していて空白ではないファイルを開いているときではありません)。


更新:

私は次のことをに入れようとしました_vimrcが、うまくいきません(さらに、ファイルを開く前に、ファイル内の文字数をカウントする(ゼロかどうかを確認する)関数がvimにあるかどうかわかりません:

if @% == "" || filereadable(@%)
  autocmd BufRead,BufNewFile * startinsert
endif

いいえ、これは重複ではありません。viを、私が言及した3つのシナリオに対してのみ挿入モードで開始したいと思います。
John Sonderson、2015年

3
申し訳ありませんが、本当に重複しているようです。;-)違いを明確にするために、質問を少し編集しました。
Martin Tournoij、2015年


2
@JohnSonderson最初のリンクは、ファイル名が指定されていない場合の検索方法を示します。2番目のリンクは、のnormal代わりにを使用して調整できますexec
muru

1
vimrcファイルは、Vimの起動時に一度だけ読み込まれます。autocmdの内容は、トリガーされるたびに実行されます。したがって、このifステートメントはautocmdの周囲に配置しないでください。autocmd に配置する必要があるため、autocmdがトリガーされるたびに実行されます。
Martin Tournoij 2015年

回答:


10

これは私にとってあなたの3つのケースすべてに機能します:

function InsertIfEmpty()
    if @% == ""
        " No filename for current buffer
        startinsert
    elseif filereadable(@%) == 0
        " File doesn't exist yet
        startinsert
    elseif line('$') == 1 && col('$') == 1
        " File is empty
        startinsert
    endif
endfunction

au VimEnter * call InsertIfEmpty()

ファイル名がないか、存在しないファイルは通常空のバッファとして開始されるため、これらはおそらくファイルが空であるかどうかの最後のチェックに圧縮される可能性があります。ただし、他の一部のプラグインが最初の2つのケースのいずれかでいくつかの項目を事前に入力する可能性があるため(一部のテンプレートプラグインなど)、3つすべてをチェックするのが最善です。

あなたがすでに持っていた最初のテスト。

2番目のテストではfilereadable、ゼロ(存在しない)の値をチェックして、それが新しいかどうかを確認する必要があります(以前の値とは反対です)。

最後のテストでは、ファイルの最後の行の番号が1(最初の行でもある、つまり行が1つしかないこと)であること、および行の終わりの列番号(の最後の文字の後の列)を確認します。行)は1です。これは、0文字があることを意味します。0文字の行が1行しかない場合、ファイルは空でなければなりません。

最後に、質問の中であなたの発言がどのようになっているかによって、驚くべき結果がもたらされる場合があります。つまり、設定BufReadしてBufNewFileいるのは起動時に条件が満たされている場合のみですが、それらの自動コマンドはセッションの残りの部分に存在します。したがって、これらのコマンドを設定する空のファイルから開始する場合、開かれる後続のすべてのファイル(新規かどうか、空かどうか)は挿入モードで開始されます。

自動コマンドVimEnterはVimの起動の最後に実行され、セッション全体で1回だけ実行されます。このように、テストはVimを起動したときにのみ実行され、それ以外のときは実行されません。

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