1

vim が相対ヘッダー/ソース ファイルを分割ウィンドウで開くようにする関数を作成しようとしています。

私が持っているもの(以下を参照)は、分割で開くファイルとは別に、構文の強調表示がありません。

function! SplitOther()
    let s:fname = expand("%:p:r")

    if expand("%:e") == "h"
        set splitright
        exe "vsplit" fnameescape(s:fname . ".cpp")
    elseif expand("%:e") == "cpp"
        set nosplitright
        exe "vsplit" fnameescape(s:fname . ".h")
    endif
endfunction

autocmd! BufReadPost *.h,*.cpp call SplitOther()

syntax onコマンドに(の直前に)追加しようとしましendfunctionたが、うまくいかないようです。

分割前にファイルがバッファにない場合に発生すると思いますか? 私は100%確かではありません。

編集

ファイルペアの定義を許可するように関数を変更しましたが、質問がまったく変更されるかどうかわからないため、拡張バージョンは次のとおりです。

function! SplitOther()
    let s:pairs = [ [ "h", "cpp" ], [ "vert", "frag" ] ]
    let s:fname = expand("%:p:r")

    for [s:left, s:right] in s:pairs
        if expand("%:e") == s:left
            set splitright
            exe "vsplit" fnameescape(s:fname . "." . s:right)
        elseif expand("%:e") == s:right
            set nosplitright
            exe "vsplit" fnameescape(s:fname . "." . s:left)
        endif
    endfor
endfunction

autocmd! BufReadPost * call SplitOther()
4

2 に答える 2

2

とった!

ファイルが vsplit にロードされているときに、ファイル タイプが設定されていませんでした。

vsplit が呼び出されると、新しい分割がフォーカスを取得します。これは、構文の強調表示がないウィンドウであるためexe "filetype" "detect"、関数の最後に追加するだけで、現在のウィンドウのファイルタイプを検出するように vim に指示できます。

結果:

function! SplitOther()
    let s:pairs = [ [ "h", "cpp" ], [ "vert", "frag" ] ]
    let s:fname = expand("%:p:r")

    for [s:left, s:right] in s:pairs
        if expand("%:e") == s:left
            set splitright
            exe "vsplit" fnameescape(s:fname . "." . s:right) 
            break
        elseif expand("%:e") == s:right
            set nosplitright
            exe "vsplit" fnameescape(s:fname . "." . s:left)
            break
        endif
    endfor

    exe "filetype" "detect"
endfunction 

autocmd! BufRead * call SplitOther()
于 2013-05-15T15:30:22.467 に答える
1

問題は、ファイルタイプの検出が によってトリガーされるautocmdことですが、デフォルトでは、自動コマンドはネストされません (cp. :help autocmd-nested)。

また、:autocmd!強打で使用することにより、他のすべてのそのようなグローバル autocmd をクリアします。これは、他のカスタマイズやプラグインに影響を与える可能性があります! を介して独自のスコープを定義する必要があります。そうすれば:augroup安全です。まとめると:

augroup MyAltSplitPlugin
    autocmd! BufReadPost * nested call SplitOther()
augroup END
于 2013-05-16T06:44:54.117 に答える