跳到主要内容

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 个字符;像 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 自身的行为不同。
^ ISmart home
将 ^ 的移动目标和 I 的插入位置,设为跳过空白以及行首 Markdown 语法(列表、引用等)之后的正文文本开头。无论是否在表格内都会应用。
Smart home (standard) 为 OFF 时保持 Vim mode 原本的行为;为 ON 时会跳过列表、复选框、缩进、引用标记。
Smart home (advanced) 为 ON 时,还会进一步跳过标题、脚注、标注的种类标记。
关于 Smart home 的实际效果,请参阅 macOS (Emacs) style 页面 中的视频。

此前是 Vim 原本的行为,即"仅跳过空白字符"。
JSmart 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 键 <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 时,不会在笔记开头追加空行,而是落在表头行的最左侧。
在实时预览和源代码模式下均可使用。