Vim 構文とファイルタイプ検出での非常に奇妙な動作
-
18-09-2019 - |
質問
次のテキストを含む WrongFileTypeDetection.R というファイルがあります。
# This file is sometimes wrongly detected as a conf file
また、_vimrc の 2 つのバージョンがありますが、それらは完全に同一であると考えられていました。ただし、最初のバージョンを使用すると、.R で終わるすべてのファイルを filetype=r に設定するように指定したにもかかわらず、上記のファイルは誤って「conf」ファイルとして検出されます。2 番目のバージョンに変更すると (augroup 定義の後ろに「構文」を移動)、検出は再び正しく機能します。これは、 のみ 私が持っている設定 (デバッグ中に標準の vimrc を移動しました)。
最初のバージョン:
syntax on
augroup filetypedetect
autocmd! BufRead,BufNewFile *.r,*.R setfiletype r
augroup END
2 番目のバージョン:
augroup filetypedetect
autocmd! BufRead,BufNewFile *.r,*.R setfiletype r
augroup END
syntax on
vimrc は 2 つのファイルの特定の順序に非常に敏感であるようです。いずれにせよ、行の 1 つがずっと後で実行される自動コマンドであることを考えると、これはなぜでしょうか?これは Vim のバグですか、それとも私が理解していない機能ですか?
解決
あなたの問題に簡単な答えは、これらの行がすべてであなたのvimrcであってはならないということです。これを処理する公式にサポートされている方法は、以下を含む、あなたのfiletype.vim
ディレクトリに.vim
ファイルを作成されます:
" my filetype file
if exists("did_load_filetypes")
finish
endif
augroup filetypedetect
au! BufRead,BufNewFile *.r setfiletype r
augroup END
あなたのコードはそれがないどのように動作している理由としては、それは実際には非常に少し複雑<のhref = "https://stackoverflow.com/questions/1291955/very-strange-behavior-with-vim-syntaxよります-and-ファイルタイプ検出/ 1291971#1291971" >あまりにも多くのPHPの答えに@を意味します。
あなたのvimrc
の最初のバージョンでは、ファイルタイプ検出は、あなたのsyntax on
ラインで初期化されます。これは.r
拡張子を持つファイルが開かれたときに起動するようにautocmdを設定することにより動作し、このautocmdはfiletype.vimは、関数のs:FTr()
を呼び出します。
しかし、あなたのautocmd!
ラインは、この既存のautocmd 1 、s:FTr()
機能が実行されることはありませんので、 2 上書きされます。 setfiletype
コマンドは、ファイルタイプが既に 3 に設定されていると思うので、あなたのautocmdはその後火災、それのんではないのは、ファイルタイプを設定します。
次に、Vimはファイルの内容に基づいていずれかを割り当てることを試み、conf
タイプに割り当ててしまう 4
このすべてのための最高の参照が:help filetype
です。そして、特にあなたのケースの:help new-filetype
と:help remove-filetype
インチ:verbose
コマンドは、どのようなスクリプトによって設定された設定の把握のために非常に便利です。
<サブ> 1:!
のため。あなたはこの!
を削除した場合は、正しく設定されているファイルタイプを見つけるだろう。そして、あなたは、ファイルが1種類に設定できるようにすること(およびそのファイルタイプのすべての設定を適用)し、その後、別のに変更することになるので、これは、しかし、正しい解決策ではありません。二ファイルタイプは、すべてのこれらの設定を上書きしない場合は、いくつかはあなたが望むものではないかもしれませんこれは、残ることがあります。サブ>
<サブ> 2:あなたは、2つの異なるのvimrcファイルを使用しているとき:set autocmd BufRead *.r
を実行してみてください。所与の出力の違いに注意してください。サブ>
<サブ> 3::help setfiletype
を参照してください。あなたのvimrcの最初のバージョンでsetfiletype r
にラインset ft=r
を変更した場合、ファイルタイプは、のがRに設定されることに注意してください。しかし、これが最善の解決策ではない理由のために脚注1を参照してください。サブ>
<サブ> 4:...コメントされたコードの行に:サブ>
「この最後のを確認し、それだけで推測です」他のヒント
あなたの最初のバージョン、の上の構文でファイルタイプ検出をトリガしているのあなたの自動コマンドが追加されました前に。
このサイトによると
.vimrc ファイルに 2 行のコードを追加するだけです。
au BufRead,BufNewFile *.R set filetype=r
au BufRead,BufNewFile *.r set filetype=r