あなたが求めていることを成し遂げるには3つの主要なステップがあります:
- 代替ファイルの名前を取得する
- 必要に応じて、現在のウィンドウまたは別のウィンドウでそのファイルを開く
- そのファイル内のカーソル位置を復元する
代替ファイル名を見つけるには、現在のファイル名を「ルート」と「拡張子」に分割します。これを行う簡単な方法は次のとおりです。
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
ファイル.h
と.cpp
ファイルを切り替えるだけであることがわかっている場合は、拡張子を簡単に変更できます。
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
または、既知の拡張子を有効な代替拡張子にマッピングする辞書を作成します。または、現在のファイルのすべての可能な代替globpath()
を取得するために使用します。
let alternates = globpath(expand("%:h"), root . ".*")
そして最初のものを選ぶか、何でも。私はこのglobpath
アプローチを好みますが、後で説明するいくつかの追加のスマートがあります。ターゲット拡張機能を選択したら、完全なターゲットパスを作成します。
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
これで、現在のウィンドウで代替ファイルを開くことができます。
execute "edit " . target
またはwinnr()
、「他のウィンドウ」の番号(ジャンプ先winnr("#")
のウィンドウ<C-W>p
、またはセットアップで常に同じであることがわかっている場合はハードコードできます)を取得して、次のようにします。
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
これにより、代替ファイルを開くための本当に基本的な解決策が得られます。上記のアプローチにはいくつかの欠点があります。それは、私がそれを単純明快に書くように書いたからです。「希望どおり」に代替ファイルの切り替えを行うプラグインを作成しました(利用可能なすべてのglobpath()
結果を循環します)。上記のシンプルさでいくつかの問題に対処します。詳細を調べたい場合は、その実装を確認できます。
最後に、「カーソル位置の復元」ポイント。代替の切り替えと直交するため、最後に保存しました(たとえば、私のプラグインでは処理しません)が、独自にロールバックする場合は、関数に入れることができます。:help line()
ファイルが最後に開かれたときの位置にカーソル位置を復元するのに役立つオートコマンドがあります:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
私はいつも.vimrc
それを好むので、私はそれに、またはそれに非常によく似た何かを入れました。ただし、コードを別の場所に置くだけでも簡単にできます。
:h line()
(一般的な解決策)の終わりを参照してください:「このオートコマンドは、 '"マークが設定されている場合、ファイルを開いた直後に、ファイル内の最後の既知の位置にジャンプします。:au BufReadPost * if line("' \ "")> 1 && line( "'\" ")<= line(" $ ")| exe "normal!g` \" "| endif