2

特定のファイルタイプの新しいファイルを作成するたびに、いくつかのvimコマンドを実行したいと思います.autocommandイベントの組み合わせのようなものBufNewFileですFileType

ファイル拡張子に基づいてファイルタイプを設定するようにBufNewFilefiletype.vim に自動コマンドをセットアップしましたが、すべて同じファイルタイプに対応する複数の拡張子があります。特定のファイル タイプに対応するファイル拡張子に関する情報をこの 1 か所だけにカプセル化し、そのファイル タイプだけに基づいて他の自動コマンドを実行したいと考えています。ただし、FileType既存のファイルを編集するときではなく、新しいファイルに対してコマンドを実行したいだけなので、イベントだけを使用することはできません。

たとえば、filetype.vim には次のようなものがあります。

au BufRead,BufNewFile *.cir setfiletype spice
au BufRead,BufNewFile *.sp setfiletype spice
au BufRead,BufNewFile *.spice setfiletype spice

BufNewFile次のように、このファイルタイプの ftplugin ファイルに自動コマンドを追加できるのではないかと考えました。

echo "Spice file."
au BufNewFile <buffer> echo "New spice file!"

しかし、「test.cir」などの新しいファイルを作成すると、自動コマンドが実行されません。ftplugin ファイル内の他のコマンドを実行します (たとえば、"Spice file." echo を取得します) が、autocommand は実行しません。

あるいは、vimscript にファイルが新しいかどうかを判別できる方法があれば、ファイルが新しいかどうかを条件として、ftplugin で直接コマンドを実行できます。

4

2 に答える 2

4

BufNewFileイベントの順序が間違っているため、ftplugin ファイルの自動コマンドは機能しません。BufNewFileトリガーFileType、その逆ではありません。

を 2 つの別個のコマンドに分割し、最初のau BufRead,BufNewFileコマンドでバッファ ローカル変数を設定できます。b:isNew

しかし、ファイルが新しいかどうかにかかわらず、ftplugin をチェックインするのが最も簡単だと思います。これは、編集されたファイルがディスク上に既に存在するかどうかに依存するため、次のような単純な条件を実行する必要があります。

if filereadable(expand('%'))
    " BufRead
else
    " BufNewFile
endif
于 2014-05-06T13:46:05.063 に答える
3

これら 3 つの拡張子に基づいてファイルタイプを設定するには、次の自動コマンドで十分です。

autocmd BufRead,BufNewFile *.{cir,sp,spice} setlocal filetype=spice

その自動コマンドが実行されると、FileTypeイベントがトリガーされ、Vim は filetype のファイルを編集していることを認識しspiceます~/.vim/ftplugin/spice.vim

setlocal tabstop=23
nnoremap <buffer> <F7> :echo "Woot!"<CR>

「スパイス」バッファを作成するときに特定のアクションを実行したいですか、それともファイルタイプを定義する方法が不明ですか?

于 2014-05-06T13:57:02.417 に答える