gf
を実行するとカーソル下のファイルが開きます。筆者は「Markdownのときは見出しの箇所までジャンプしてほしい」と考えました。実装してみたのでその備忘録です。
次のような## この見出しにジャンプしたい
へジャンプするためのリンクを作り、ジャンプさせます。
リンクは次のような書き方を想定しています。
まずはリンクを作ってクリップボードに入れるキーマップを紹介します。
リンク生成時のタイトルはそのMarkdownファイルの一行目のh1とします。
先に実装全体を載せます。次の項目から小分けにして解説します。
このキーマップでは途中でカーソル行を移動します。そのため、処理が終わったら元の位置に戻れるようにあらかじめ記録しておきます。
上記はノーマルモードのmz
と同じです。
「現在のカーソル行より前にある見出し」に移動します。
第2引数は「カーソル行よりも上を検索する」というフラグです。ノーマルモードの?
による検索と同じことをしています。
移動後の見出しが1行目ではない場合、見出しテキストを抜き出します。前述のとおり1行目ならタイトルとなるため、見出しテキストは空です。
見出しのテキストをLua Patternで取得します。
見出しの一部の文字は-
に置換しています。ジャンプのキーマップを簡単にするためにこのような仕様にしました(後述)。
たとえば、次のように変換されます。
- 変換前:
## これが 見出しです $についての見出しです
- 変換後:
##これが-見出しです--についての見出しです
Lua Patternでタイトル(ファイルの1行目の見出しテキスト)を取得します。
wikilinkの形式でリンクを生成します。
リンクを+
レジスタに入れることでコピーします。
カーソルを最初に記録した位置に戻します。
カーソル位置にあるwikilinkを解釈してジャンプするキーマップです。Stack Exchangeの投稿を参考にLua化して実装しました。
リンクが[[test.md##この見出しにジャンプしたい|タイトル]]
だとすると、cfile
はtest.md##この見出しにジャンプしたい
の部分です。
見出しテキストに半角スペースが含まれるとこのAPIでは取得できません。そのため、前述のとおりリンク生成時に-
へ置換したのでした。
リンク生成時に置換されて-
になった部分は.
に変換しておきます。
最初から-
ではなく.
に置換すればいいのでは?と思うかもしれません。それはそうなのですが、筆者の好みです。
実際にファイルを開くときには次のようなコマンドが実行されます。
:edit
は+/foo
のようなオプションがあります。これを使うとファイルを開いた時に検索し、カーソルを移動してくれます(詳しくは:help +cmd
)。
見出しテキストに()
などの記号が含まれると正しく移動できません。そのため、前述のとおりリンク生成時に-
へ置換したのでした。
以上、見出し付きwikilinkをNeovimで扱うためのキーマップでした。ちょっとオレオレ仕様ですが、メモ管理でしか使わないのでこれで満足です。
筆者はよく引っかかるのですが、Lua Patternは正規表現でありません。使えない概念がいくつかあります。Lua Patternを使うときはLua Patterns Viewerで想定どおりかどうかチェックしましょう。