Vim mode — コマンドリファレンス
このページでは各キーの挙動がプラグイン適用によってどう変わるのかを説明します。
「For everyone」「macOS (Emacs) style」と違って、この Vim mode 関連の挙動アップグレードはホットキーへのコマンドの割り当てでは ありません。
トグルスイッチが ON の場合は Obsidian 標準の Vim mode 内部の挙動定義を直接差し替えますが、OFF の場合は差し替えを行わず、標準 Vim mode そのままの挙動を維持します。(下記の「これまでは」に記述された挙動)
Motion upgrades (挙動のアップグレード)
Vim の基本的なカーソル移動関連挙動を修正します。
テーブルのセルを「行」に見立て、h / l はセルの先頭 / 末尾で停止し、w / b / e は先頭 / 末尾を越えて進みます。
| キー | 機能概要 |
|---|---|
h l x | 絵文字・拡張漢字対応 絵文字などの、内部的に複数の文字分の長さを持つ文字を 1 文字として数えます。(「🟩」「𠮷」などのサロゲートペア、「☺️」のような異体字セレクタ付きの絵文字) これまでは 4l のように回数を付けて移動すると絵文字 1 つにつき 1 文字分ずれ、3x のように回数を付けて削除すると絵文字が壊れて文字化けすることがありました。また「☺️」のような文字ではカーソルが見えなくなることもありました。テーブル対応 セル内のテキストに関しても行頭 / 行末で停止し ( h / l)、行末での文字削除も正しく動作します (x)。これまでは行頭 / 行末を越えて隣のセルに移動したり、行末で文字削除できず隣のセルに移動していました。 |
j k | テーブル対応 テーブルの下の行 / 上の行に移動する際に、カーソルのカラム位置 (Vim 自身の目標カラム位置) を保ったまま移動します。セル内で改行されたテキストにも正しく止まります。 これまでは行をまたぐとカラム位置が維持されずセルの先頭に移動したり、セル内改行されたテキストを移動する際にセルを出る直前の行 ( j は最後の行、k は最初の行) がスキップされていました。 |
w b e(および W B E ge gE) | 日本語対応 日本語 / 英語の単語単位で移動します。(日本語は辞書ベースの単語分割による。 W / B / E / gE は空白区切りのままです)これまでは連続する漢字ひらがな等はひとかたまりの単語とみなされていました。 テーブル対応 Vim の w / b / e が行頭・行末を越えて次の行へ進むのと同じように、セル・行の境界を越えて移動します。テーブルの端まで進むとテーブルの外 (前後のテキスト) へ抜け出します。これまではセルの先頭 / 末尾で止まってしまい、先へ進めませんでした。 |
gg G | テーブル対応 テーブル内にいる場合でもノートの先頭行 / 最終行に移動します。 移動先のカーソル位置は Smart home の設定に従います。 G でノート末尾に移動した先がテーブルだった場合には、テーブルの外に空行を追加してそこに着地します。(テーブル内部には着地しません)一方で、 gg はこのような空行を追加する動作はせずにノート先頭がテーブルだった場合には見出し行 (の左端セル先頭) に着地します。これまではテーブル内の場合には現在のセルの先頭行 / 最終行に移動するだけでした。 |
gj gk | テーブル対応 上記の j / k の表示行版です。折り返されたセル内でも表示行ごとに移動し、行をまたいでも画面上の横位置 (見た目のカーソル位置) を維持します。セル内改行された行にも正しく止まります。 これまでは、行をまたぐとカラム位置が維持されずセルの先頭に移動したり、セル内改行された行のうちセルを出る直前の行 ( gj は最後の行、gk は最初の行) がスキップされたりしていました。また、折り返されたセルでは表示行ごとに止まらず、隣のテーブル行 (最終行のセルではテーブルの外) へ一気に移動していました。 |
$ | テーブル対応$ で行末に移動した後に j / k、gj / gk で上下に移動すると各行の行末に揃い続けます (吸着 / sticky)。テーブルの行をまたぐ場合も同様で、プレーンテキストからテーブルに侵入する場合は最も右のセルに入ります。j / k と gj / gk を混在させても吸着は維持されます。これまでは、テーブルの行をまたぐと行末に吸着せずセルの先頭に移動していました。また、テーブルに侵入する際は常に左端のセルに入っていました。 j / k と gj / gk を混在させると吸着が外れることがありましたが、これは本家 Vim / Neovim の挙動とも異なるものでした。 |
^ I | Smart home^ の移動先と I の挿入位置を、空白だけでなく行頭の Markdown 記法 (リスト・引用など) を飛ばした本文テキストの先頭にします。テーブルの内外を問わず適用されます。Smart home (standard) が OFF の時には元の Vim mode 挙動のままで、ON の時はリスト、チェックボックス、インデント、引用マーカーをスキップします。 Smart home (advanced) が ON の場合には、さらに見出し・脚注・コールアウトの種類マーカーもスキップします。 Smart home の動作イメージは macOS (Emacs) style ページ にある動画をご覧ください。 これまでは Vim の元の挙動である「空白文字のみをスキップ」でした。 |
J | Smart join 2 行目の冒頭の Markdown 記法を (Smart home に準じて) 削除した上で、空白を 1 つ挟んで行を結合します。 Smart join が OFF の時 (デフォルト) には元の Vim mode 挙動のままで、ON の時はリスト、チェックボックス、インデント、引用マーカーを削除します。 Smart home (advanced) が ON の時はこれに加えて見出し・脚注・コールアウトの種類マーカーも削除します。 Smart join の動作イメージは macOS (Emacs) style ページ にある動画をご覧ください。 これまでは、2 行目先頭の空白だけを取り除いて、空白を 1 つ挟んで結合していました。(引用やリストのマーカーは残ります) |
Table structure (テーブルの構造操作)
既存の Obsidian 標準のテーブル操作コマンドを Vim mode から <leader> t で始まるキーシーケンスで実行できるようにします。リーダーキー <leader> はデフォルトで Space ですが \ も選択できます。
tm を除き、テーブルの外では何もしません。
Vim の行挿入コマンド o / O にならい、テーブル行の下への挿入を to、上への挿入を tO としていますが、同じコマンドを tiJ / tiK でも実行できます。(エイリアスになっています) これは上下への行の挿入と左右への列の挿入を対比させた tiH / tiJ / tiK / tiL のセットになっています。
| 行をー | 列をー | |
|---|---|---|
| ー挿入 | <leader>to / <leader>tO<leader>tiJ / <leader>tiK(下 / 上) | <leader>tiH / <leader>tiL(左 / 右) |
| ー移動 | <leader>tK / <leader>tJ(上 / 下) | <leader>tH / <leader>tL(左 / 右) |
| ー削除 | <leader>tdd | <leader>tdc |
| ー複製 | <leader>tyyp | <leader>tyc |
| ー揃える | — | <leader>tal (左)<leader>tac (中央)<leader>tar (右) |
<leader>tm : カーソル位置にテーブルを挿入します。ここに挙げたコマンドの中で唯一、既存のテーブルの外で動作します。
Table navigation (セル間のカーソル移動)
セル間のカーソル移動だけを行うコマンドです。テーブルセルの外では何もしません。
| キー | 機能 |
|---|---|
<leader>tj / <leader>tk | 同じ列の下 / 上のセルへジャンプし、その本文の先頭に着地します。j / k がカーソルのカラム位置を保つのとは異なります。また、テーブルの上下端では何もしません。 |
<leader>th / <leader>tl | 同じ行の左 / 右のセルへジャンプし、その本文の先頭に着地します。 Obsidian 組み込みの Tab / Shift + Tab によるセル移動では移動先セル内のテキスト全体を選択し、行の左右端からは次の行の反対側に回り込みます。また、テーブルの端で新しい行を挿入します。しかし th / tl は範囲選択を行わず、常に現在の行の中にとどまり、行の左右端では何もしません。 |
<leader>tx / <leader>tX | 現在のテーブルから下 / 上に抜け出します。Smart home により着地行の先頭の Markdown はスキップされます。 ノート末尾のテーブルで tx を実行した時はノート末尾に空行を追加してそこに着地します。一方で、ノート先頭のテーブルで tX を実行した時はノート先頭に空行を追加せず、見出し行の左端に着地します。ライブプレビュー・ソースモードのどちらでも動作します。 |