跳到主要内容

命令详情

关于表格、标注、图片、嵌入、分隔线的说明,除非特别注明,均为实时预览下的行为。源代码模式下的行为会在各项目内单独说明。 当「Table-aware Source Mode editing」设为 OFF 时,源代码模式下的表格支持不适用。(默认为 ON)

Cursor movement(光标移动)​

UP

此命令旨在实现与物理方向键 ↑ 等效的行为。在部分场景下,比物理方向键 ↑ 具有更强的表格支持、Markdown 支持。

此 UP 命令可以在 For everyone 页面中分配给物理方向键 ↑,但这里所说的“物理方向键 ↑”指的是未分配此命令、处于原始状态的 ↑ 键。

与物理方向键 ↑ 等效的行为

从以下位置移动时,行为与物理方向键 ↑ 相同。

  • 文本内: 移动到上一个显示行。
  • 引用、标注、图片、嵌入、分隔线的下方: 从下往上进入该区块,展开 Markdown 源码。
    • 对于图片、嵌入(![[...]]、![...](...)),仅当该语法从行首开始时才适用。
    • 对于分隔线(---、***、___),光标会落在该行的开头。
    • Obsidian 的 macOS 快捷键 Ctrl + P 的行为与物理方向键 ↑ 不同,会穿过该区块移动到其上方。
  • 表格表头行单元格内的第 1 行: 脱出表格,移动到上一行。
    • 会尽量保持光标横向位置。
    • Obsidian 的 macOS 快捷键 Ctrl + P 的行为与物理方向键 ↑ 不同:当光标位于单元格内第 2 个字符及之后时,不会脱出表格,而是移动到单元格开头;当光标位于单元格开头时,才会像物理方向键 ↑ 一样脱出表格。
    • 当表格位于笔记开头时,物理方向键 ↑ 会在笔记开头追加一个空行并落在该空行上,而本插件的 UP 不会追加空行,只会移动到单元格开头。
  • 表格单元格内文本的第 2 行及以后: 移动到同一单元格内的上一行。
    • 会尽量保持光标横向位置。

与物理方向键 ↑ 不同的行为

以下几点的行为与物理方向键 ↑ 不同,是更进一步支持表格、支持 Markdown 的部分。

  • 表格单元格内文本的第 1 行: 移动到上一个单元格的最后一行。
    • 会尽量保持光标原本的横向位置。
    • 物理方向键 ↑ 同样会移动到正上方单元格的最后一行,但光标横向位置总是会落在最左端。
    • Obsidian 的 macOS 快捷键 Ctrl + P 不会移动到上方单元格,而是移动到同一单元格的开头。此后的行为并不稳定,有时会停在开头,有时会脱出表格。
  • 表格下方: 从下往上进入表格,移动到左下单元格的最底部显示行。
    • 会尽量保持光标原本的横向位置。
    • 如果光标横向位置超出左下单元格的宽度,则会落在左下单元格最后一行的末尾。
    • 物理方向键 ↑ 同样会进入左下单元格,但落点行会因紧邻之前的光标位置而变化,有时是最后一行,有时是第 1 行,并不稳定。
DOWN

此命令旨在实现与物理方向键 ↓ 等效的行为。在部分场景下,比物理方向键 ↓ 具有更强的表格支持、Markdown 支持。

此 DOWN 命令可以在 For everyone 页面中分配给物理方向键 ↓,但这里所说的“物理方向键 ↓”指的是未分配此命令、处于原始状态的 ↓ 键。

与物理方向键 ↓ 等效的行为

从以下位置移动时,行为与物理方向键 ↓ 相同。

  • 文本内: 移动到下一个显示行。
  • 标注的上方: 从上往下进入该区块,展开 Markdown 源码。
    • 仅当下一行是标注的标题行(> [!type]...)时才适用。
  • 图片、嵌入、分隔线的上方: 从上往下进入该区块,展开 Markdown 源码。
    • 对于图片、嵌入(![[...]]、![...](...)),仅当该语法从行首开始时才适用。
    • 对于分隔线(---、***、___),光标会落在该行的开头。
  • 表格单元格内文本的倒数第 2 行及更前: 移动到同一单元格内的下一行。
    • 会尽量保持光标横向位置。
  • 表格的最后一行: 脱出表格,移动到下一行。
    • 会尽量保持光标横向位置。
    • 如果表格位于笔记末尾,则会追加一行并落在该行上。(与物理方向键 ↓ 的行为相同)

与物理方向键 ↓ 不同的行为

以下几点的行为与物理方向键 ↓ 不同,是更进一步支持表格、支持 Markdown 的部分。

  • 表格上方: 从上往下进入表格,移动到左上单元格的第 1 个显示行。
    • 会尽量保持光标原本的横向位置。
    • 如果光标横向位置超出左上单元格的宽度,则会落在左上单元格第 1 行的末尾。
    • 物理方向键 ↓ 同样会进入左上单元格,但光标横向位置总是会落在最左端。
  • 表格单元格内文本的最后一行: 移动到下一个单元格的第 1 个显示行。
    • 会尽量保持光标原本的横向位置。
    • 物理方向键 ↓ 同样会移动到下方单元格,但总是会落在单元格开头。
    • Obsidian 的 macOS 快捷键 Ctrl + N 不会移动到下方单元格,而是移动到同一单元格的末尾。此后的行为并不稳定,有时会停在末尾,有时会脱出表格。
LEFT

此命令旨在实现与物理方向键 ← 等效的行为。在部分场景下,比物理方向键 ← 具有更强的表格支持。

与物理方向键 ← 等效的行为

从以下位置移动时,行为与物理方向键 ← 相同。

  • 文本内,或单元格内容中途: 向左移动 1 个字符。
  • 表格内单元格开头:
    • 表头行最左侧单元格开头: 脱出表格,移动到上方。
      • 但当 Cross-row navigation 设置为 OFF 时,会停留在单元格开头。
      • 当表格位于笔记开头时,物理方向键 ← 会在笔记开头追加一个空行并落在该空行上,而此 LEFT 命令不会追加空行,什么都不会发生。(与 UP 命令相同的限制)
    • 其他行最左侧单元格开头: 移动到上一行最右侧单元格的末尾。
      • 但当 Cross-row navigation 设置为 OFF 时,会停留在单元格开头。
    • 第 2 个及以后的单元格开头: 移动到左侧相邻单元格的末尾。

与物理方向键 ← 不同的行为

以下条件/位置的行为与物理方向键 ← 不同。

  • 表格下方那一行的开头: 进入表格,移动到右下单元格的末尾。
    • 物理方向键 ← 会落在左下单元格最底部显示行的最左端。
  • 当 Cross-row navigation 设置为 OFF 时,最左侧单元格开头:
    • 前述最左侧单元格开头的 2 种情况(表头行、其他行),都不再跨行移动。(物理方向键 ← 总是会跨行移动)
RIGHT

此命令旨在实现与物理方向键 → 等效的行为。在部分场景下,比物理方向键 → 具有更强的表格支持。

与物理方向键 → 等效的行为

从以下位置移动时,行为与物理方向键 → 相同。

  • 文本内,或单元格内容中途: 向右移动 1 个字符。
  • 表格内单元格末尾:
    • 非最右侧单元格末尾: 移动到右侧相邻单元格的开头。
    • 非最后一行的最右侧单元格末尾: 移动到下一行最左侧单元格的开头。
      • 但当 Cross-row navigation 设置为 OFF 时,会停留在单元格末尾。
    • 最后一行最右侧单元格末尾: 脱出表格,移动到下方。
      • 但当 Cross-row navigation 设置为 OFF 时,会停留在单元格末尾。
      • 当表格位于笔记末尾时,会追加一行并落在该行上。这与 DOWN 命令的行为相同,和 LEFT 命令在笔记开头的限制不同。
  • 表格上方那一行的末尾: 进入表格,移动到表头行最左侧单元格的开头。

与物理方向键 → 不同的行为

以下条件/位置的行为与物理方向键 → 不同。

  • 当 Cross-row navigation 设置为 OFF 时,最右侧单元格末尾:
    • 前述最右侧单元格末尾的 2 种情况(最后一行、其他行),都不再跨行移动。(物理方向键 → 总是会跨行移动)
HOME

此命令旨在实现与物理按键 Home(macOS 下为 fn + ←)等效的行为。在部分场景下,比物理按键 Home 具有更强的表格支持、Markdown 支持。

此 HOME 命令可以在 For everyone 页面中分配给物理按键 Home,但这里所说的“物理按键 Home”指的是未分配此命令、处于原始状态的 Home 键。

与物理按键 Home 等效的行为

在纯文本以及表格单元格内的行中,会朝行首方向分最多 3 个阶段移动。

  • 第 1 步: 移动到当前显示行的左端。(当长文本自动换行显示、且光标不在第 1 个显示行时适用)
  • 第 2 步: 移动到行首 Markdown 语法与正文文本之间。
    • 缩进、列表(- 、+ 、* )、复选框(- [ ] )、编号列表(1. 、1) )、引用(> )都会被跳过,光标停在正文开头。多重引用或带缩进的情况同理。
    • 当引用内紧跟着列表、编号列表或复选框(如 > - )时,虽然实时预览不会渲染这些列表或复选框标记,但 Smart home 的判定会将其与引用一并视为行首 Markdown,移动到列表等语法与正文之间。(这与物理按键 Home 的行为相同)
  • 第 3 步: 移动到行首(逻辑行的开头)。

在纯文本的逻辑行首执行 HOME 不会再继续移动。

与物理按键 Home 不同的行为

关于纯文本和表格单元格内的 3 阶段动作,与物理按键 Home 不同的地方如下。基本行为与物理按键 Home 相同,但细节可以通过设置调整。(→ Smart home / Visual line movement 设置)

  • 第 1 步的差异: 关闭 Visual line movement 后,会跳过移动到第 1 个显示行左端的步骤。
  • 第 2 步的差异: Smart home (standard) 为 OFF 时,会跳过对行首 Markdown 的考虑。
  • 第 2 步的差异: Smart home (standard) 为 ON 且 Smart home (advanced) 为 ON 时(这是默认设置),需要考虑的行首 Markdown 种类会增加。除前述内容外,还会考虑标题(# )、脚注([^1]: )、标注([!type] )。
    • 列表 & 标题(- # )以及引用 & 标题(> # ,这种写法不会被渲染为标题)也会在标题与正文文本之间停止。

在表格的单元格开头(有多行时为第 1 行的开头),行为与物理按键 Home 不同。

  • 表头行最左侧单元格开头: 脱出表格,移动到上一行。
    • 这是 Cross-row navigation(默认 ON)时的行为。
    • 当 Cross-row navigation 为 OFF 时,与物理按键 Home 相同,不会脱出表格,会停留在最左侧单元格开头。
    • 当表格位于笔记开头时,无论 Cross-row navigation 的设置如何,都不会脱出表格,会停留在最左侧单元格开头。
  • 第 2 个及以后的单元格开头: 移动到同一行左侧相邻单元格的末尾。
  • 其他行最左侧单元格开头: 移动到上一行最右侧单元格的末尾。
    • 这是 Cross-row navigation(默认 ON)时的行为。
    • 当 Cross-row navigation 为 OFF 时,与物理按键 Home 相同,不会移动到上一行,会停留在最左侧单元格开头。
  • 参考:单元格内第 2 行及以后的行首: 不会再继续移动。与物理按键 Home 相同。

源代码模式下的行为

源代码模式下,在表格中的行为如下。第 2 点及以后与实时预览相同。

  • 第一个 | 之前: 不会执行 HOME,什么都不会发生。
  • 单元格内第 2 行及以后的开头(<br> 之后): 不会再继续移动。(与实时预览相同)
  • 单元格内第 1 行开头: 与实时预览相同,会移动到左侧相邻单元格的末尾,或者(若为最左侧单元格)移动到上一行最右侧单元格的末尾、并脱出表格。(Cross-row navigation 设置及笔记开头的限制同样适用)
  • 其他情况: 跳过单元格内原始 Markdown 语法,移动到正文开头,或移动到单元格内该行的行首。
END

此命令旨在实现与物理按键 End(macOS 下为 fn + →)等效的行为。在部分场景下,比物理按键 End 具有更强的表格支持。

此 END 命令可以在 For everyone 页面中分配给物理按键 End,但这里所说的“物理按键 End”指的是未分配此命令、处于原始状态的 End 键。

与物理按键 End 等效的行为

在纯文本以及表格单元格内的行中,会朝行末方向分最多 2 个阶段移动。

  • 第 1 步: 移动到当前显示行的右端。(当长文本自动换行显示、且光标不在最后一个显示行时适用)
  • 第 2 步: 移动到行末(逻辑行的末尾)。

在纯文本的逻辑行末执行 END 不会再继续移动。

与物理按键 End 不同的行为

关于纯文本和表格单元格内的 2 阶段动作,与物理按键 End 不同的地方如下。基本行为与物理按键 End 相同,但细节可以通过设置调整。(→ Visual line movement 设置)

  • 第 1 步的差异: 关闭 Visual line movement 后,会跳过移动到第 1 个显示行右端的步骤。

在表格的单元格末尾(有多行时为最后一行的末尾),行为与物理按键 End 不同。物理按键 End 会停留在单元格末尾,不会移动到相邻单元格或相邻行。

  • 非最右侧单元格的末尾: 移动到同一行右侧相邻单元格的开头。
  • 非最后一行的最右侧单元格末尾: 移动到下一行最左侧单元格的开头。
    • 这是 Cross-row navigation(默认 ON)时的行为。
    • 当 Cross-row navigation 为 OFF 时,与物理按键 End 相同,不会移动到下一行,会停留在最右侧单元格末尾。
  • 最后一行最右侧单元格末尾: 脱出表格,移动到下一行。
    • 这是 Cross-row navigation(默认 ON)时的行为。
    • 当 Cross-row navigation 为 OFF 时,与物理按键 End 相同,不会脱出表格,会停留在最右侧单元格末尾。
    • 当表格位于笔记末尾时,会追加一行并落在该行上。(与 DOWN 命令的行为相同)
  • 参考:单元格内非最后一行的行末: 不会再继续移动。与物理按键 End 相同。

源代码模式下的行为

源代码模式下,在表格中的行为如下。

  • 第一个 | 之前: 移动到第一个单元格的正文开头。(与 HOME 相反,这种情况并不是什么都不会发生)
  • <br> 标签中途: 越过 <br> 标签,移动到下一个单元格内行的右端。
TOP / BOTTOM

此命令旨在实现与 Windows 的 Ctrl + Home / End、macOS 的 command + ↑ / ↓ 等效的行为。在部分场景下,比这些物理按键具有更强的表格支持。

TOP / BOTTOM 命令可以在 For everyone 页面中分配给相同的按键,但这里所说的“物理按键”指的是未分配此命令、处于原始状态的按键。

与物理按键等效的行为

在表格之外,会移动到笔记的开头(TOP)或末尾(BOTTOM)。TOP 命令不会应用 Smart home。

与物理按键不同的行为

当笔记开头或末尾存在表格时,与物理按键不同,会移动到更自然的“开头”或“末尾”位置。

  • TOP: 移动到表头行最左侧单元格的开头。
    • 物理按键(Ctrl + Home / command + ↑)在笔记开头是表格的情况下,会移动到表格的最后一行。
  • BOTTOM: 移动到表格最下方一行最右侧单元格的末尾。
    • 物理按键(Ctrl + End / command + ↓)在笔记末尾是表格的情况下,会移动到表头行的开头。
Page down / Page up

此命令旨在实现与物理按键 Page Down / Page Up(macOS 下为 fn + ↓ / ↑)等效的行为。在部分场景下,比这些物理按键具有更强的表格支持。

此 Page down / Page up 命令可以在 For everyone 页面中分配给相同的按键,但这里所说的“物理按键”指的是未分配此命令、处于原始状态的按键。

与物理按键等效的行为

当滚动范围内只有纯文本(不包含表格、标注、嵌入)时,会将显示内容向下(Page down)或向上(Page up)滚动 1 屏。滚动后,光标会保持在屏幕上的同一位置。

与物理按键不同的行为

当滚动范围内包含表格、标注、嵌入(![[...]])时,即使 1 屏的移动目标位于表格或标注等内部,也能正确移动到该位置。

这是通过反复执行 UP / DOWN 命令、累计 1 屏的移动量来实现的。

物理按键(Page Down / Page Up、fn + ↓ / ↑)即使本应落在表格内部,也总是会将光标移动到表格外部。

Word left / Word right

此命令旨在实现与 Windows 的 Ctrl + ← / →、macOS 的 option + ← / → 等效的行为。在部分场景下,比这些物理按键具有更强的表格支持、中文分词支持。

此命令可以在 For everyone 页面中分配给相同的按键,但这里所说的“物理按键”指的是未分配此命令、处于原始状态的按键。

与物理按键等效的行为

  • 纯文本及单元格内文本: Word left 移动到(前一个)单词的开头,Word right 移动到(下一个)单词的末尾。
    • 如果当前行已没有剩余单词,则会跨行移动。
    • 跨行移动时会跳过空行。
    • 在表格内,会从单元格内文本的开头/末尾移动到相邻单元格的末尾/开头;当 Cross-row navigation 设置为 ON 时,还会从行的最左端/最右端移动到相邻行的另一侧。
  • 进入表格: 从纯文本进入表格时,Word left 会进入最下方一行最右侧单元格,Word right 会进入表头行最左侧单元格。
  • 脱出表格: 当 Word left 位于表头行最左侧单元格、Word right 位于最下方一行最右侧单元格,并继续寻找前一个/下一个单词时,会脱出表格移动到上/下一行。
    • 但当 Cross-row navigation 设置为 OFF 时,不会脱出表格,会停留在单元格开头/末尾。
    • 当表格位于笔记开头时(Word left),不会脱出,什么都不会发生。(与 UP / LEFT / HOME 相同)
    • 当表格位于笔记末尾时(Word right),会在表格下方追加一个空行并移动到该处。

与物理按键不同的行为

  • 进入表格时的落点位置: Word left 会落在最下方一行最右侧单元格最后一个单词的开头,Word right 会落在表头行最左侧单元格第一个单词的末尾。
    • 这沿用了纯文本跨行时的惯例。物理按键在纯文本中会落在单词的开头/末尾,但唯独进入表格时只是单纯停在单元格的末尾/开头。
  • 单元格开头/末尾: 会移动到左侧/右侧相邻单元格末尾/开头的单词。
    • 物理按键不会跨单元格移动。
  • 支持中文分词: 基于词典进行分词,按单词单位移动。
    • 物理按键仅以空白、标点符号作为分隔,因此连续的汉字会被视为一个长单词整体识别。

Editing(编辑)​

Kill line

此命令旨在再现 Emacs 的 kill-line 风格行为。与 macOS 版 Obsidian 的 control + K 不同,它可以累积连续操作,并通过 Ctrl + Y 粘贴。另一方面,与真正的 Emacs 的 kill-line 不同,它没有 kill ring(带历史记录的缓冲区),而是通过系统剪贴板实现与其他应用程序之间的复制和粘贴。

Kill line 的具体行为

  • 表格之外,以及实时预览的单元格内:
    • 这里,实时预览单元格内的“行末”是指 Shift + Enter 换行的位置。
    • Kill 的文本会保存到系统剪贴板。
    • 光标不在行末时: 从光标位置 Kill 到行末或单元格末尾。
    • 光标在行末时: Kill 换行符,并与下一行合并。
    • 位于文件末尾或单元格末尾时: 不执行任何操作。
  • 源代码模式的表格单元格内:
    • 在源代码模式下,“行末”是指 <br> 之前的位置。(在实时预览中通过 Shift + Enter 换行的位置,在源代码模式下会显示为 <br>。)
    • Kill 的文本会保存到系统剪贴板,但此时会将 <br> 替换为换行符、将 \| 替换为 | 后再保存。
    • 光标不在行末时: 从光标位置 Kill 到行末或单元格末尾。
    • 位于单元格内文本行末(<br> 之前)时: Kill 该 <br> 标签,并与下一个单元格内行合并。(从外观上看,就像 <br> 被删除、文本被拼接到一起。)
    • 位于单元格末尾(单元格边界)时: 不执行任何操作。
  • 连续 Kill: 连续执行 Kill line 时,Kill 的内容会不断追加到系统剪贴板中。
    • 执行连续 Kill 以外的编辑操作(移动光标、输入文字、鼠标点击)会中止累积。
    • 如果系统具有剪贴板历史记录功能,连续 Kill 的内容会依次保留在剪贴板历史记录中。
  • 与系统复制/剪切的相互作用: 按下 Windows 的 Ctrl + C / X,或 macOS 的 command + C / X,会中止连续 Kill 的累积。
  • 多光标支持: 在各个光标位置独立执行 Kill line。
    • 各光标 Kill 的文本会以换行符拼接后存入剪贴板。

Smart join

通过选项设置,可以让合并行时的操作针对 Markdown 进行优化。

  • Smart join: 当设置页面中的 Smart join 为 ON 时,会先删除下一行开头的 Markdown 语法,然后再进行合并。
    • 删除对象是 Smart home 会跳过的 Markdown 语法。
    • 当 Smart home (standard) 为 ON 时,会删除列表、编号列表、复选框、缩进、引用。
    • 当 Smart home (advanced) 也为 ON 时,还会额外删除标题、脚注、标注。

例如,将 | 作为光标位置:

- 列表文本| (在此处执行 Kill line)
- 列表的第 2 行

会变成这样:

- 列表文本列表的第 2 行

同样,对于引用块:

> 引用文本| (在此处执行 Kill line)
> 引用的第 2 行

会变成这样:

> 引用文本引用的第 2 行
Set mark

开始范围选择模式。此命令相当于 Emacs 的 set-mark 命令,并与 Obsidian 标准的 Shift + 光标移动选择深度整合。

Set mark 的具体行为

  • 范围选择模式关闭时:
    • 以当前光标位置为起点,开始范围选择模式。
    • 在表格外、Live Preview 的单元格内、Source Mode 的表格单元格内均有效。
  • 范围选择模式开启时:
    • 范围选择模式开启状态下移动光标,会扩展/缩小选择范围。(LEFT / RIGHT / UP / DOWN / HOME / END / TOP / BOTTOM / Word left / Word right / Page up / Page down)
      • 在多光标状态下执行 TOP / BOTTOM 时,所有副光标都会消失,仅保留从主光标到笔记开头或末尾的一个选择范围。
      • 其他命令则会让每个光标各自独立扩展选择范围。
    • 范围选择与 Obsidian 标准的范围选择深度整合。用 Shift + 方向键或鼠标拖拽开始选择时,会自动设置 Set-mark 的起点,此后可以用 RIGHT / LEFT 等命令继续扩展/缩小范围。反之,用 Set-mark 开始的选择范围,也可以用 Shift + 方向键继续扩展/缩小。
    • 范围选择过程中移动光标触及表格时,会一次性将整个表格纳入选择范围,然后穿过表格。
    • 单元格内的范围选择无法跨越单元格边界。(到达边界后会直接停止,不再继续移动)
    • 在范围选择模式开启的状态下再次执行 Set mark,会重置当前为止的选择范围,并将当前光标位置重新设为起点。
  • 范围选择模式的自动解除: 以下任一操作都会解除起点:
    • 执行 Deselect 命令
    • 执行编辑类命令(Kill line、Kill region、Copy region、Yank、Uppercase / Lowercase / Capitalize word、Delete char、Transpose chars、Kill word left / right、Undo / Redo)
    • 使用系统标准的复制/剪切/粘贴,或 Backspace / Delete
    • 使用未经按键升级的物理方向键移动光标
    • 使用鼠标点击移动光标
    • 执行跨越单元格边界的命令(Move to cell left / right / above / below、Exit table above / below)
    • 切换到其他笔记
  • 多光标支持:
    • 在多光标状态下执行 Set mark,会为每个光标位置都设置起点,之后移动光标时每个光标都会拥有各自的选择范围。
Kill region

将选中的文本 Kill(剪切),并保存到系统剪贴板。相当于 Emacs 的 kill-region(C-w)命令。

Kill region 的具体行为

  • 选择范围为空时: 不执行任何操作。
  • 表格之外,以及实时预览的单元格内: Kill 选中的文本。
    • 选择范围可以跨越多行。
    • 在实时预览的单元格内,选择范围必须位于同一个单元格内。跨单元格或跨表格行的选择不会执行任何操作。只要在同一个单元格内,就可以跨越由 Shift + Enter 产生的换行。
  • 源代码模式的表格单元格内: Kill 选中的文本。
    • 选择范围必须位于同一个单元格内。跨越单元格边界 | 的选择不会执行任何操作。
    • 只要在同一个单元格内,也可以跨越 <br> 进行选择。此时会将 <br> 替换为换行符、将 \| 替换为 | 后保存到剪贴板。
  • 中止连续 Kill: Kill region 总是会重置连续 Kill 的累积。Kill 的文本不会追加到系统剪贴板,而是替换掉之前的内容。
  • 多光标支持: 各光标独立对各自的选择范围进行 Kill region。
    • 各光标 Kill 的文本会以换行符拼接后存入剪贴板。

与系统标准剪切的区别

  • 跨单元格的选择: Obsidian 标准剪切(Ctrl + X / command + X)会将其作为单元格级别的结构化操作处理,但 Kill region 不支持跨单元格的选择状态。(不执行任何操作)
  • 源代码模式的表格单元格内,剪贴板内容: 系统标准剪切会将 <br> 和 \| 原样复制到剪贴板。而 Kill region 即使在源代码模式下,也会判断出这是来自表格内的 Kill,并将它们转换为换行符和 | 后再保存。
Copy region

将选中的文本复制到系统剪贴板。与 Kill region 不同,文本不会被删除。

Copy region 的具体行为

  • 选择范围为空时: 不执行任何操作。
  • 表格之外,以及实时预览的单元格内: 复制选中的文本。
    • 选择范围可以跨越多行。
    • 在实时预览的单元格内,选择范围必须位于同一个单元格内。跨单元格或跨表格行的选择不会执行任何操作。只要在同一个单元格内,就可以跨越由 Shift + Enter 产生的换行。
  • 源代码模式的表格单元格内: 复制选中的文本。
    • 选择范围必须位于同一个单元格内。跨越单元格边界 | 的选择不会执行任何操作。
    • 只要在同一个单元格内,也可以跨越 <br> 进行选择。此时会将 <br> 替换为换行符、将 \| 替换为 | 后保存到剪贴板。
  • 中止连续 Kill: 与 Kill region 相同,总是会重置连续 Kill 的累积。保存的内容也不是追加,而是替换掉已有内容。
  • 多光标支持: 各光标独立对各自的选择范围进行 Copy region。
    • 各光标 Copy 的文本会以换行符拼接后存入剪贴板。

与系统标准复制的区别

  • 跨单元格的选择: Obsidian 标准复制(Ctrl + C / command + C)会将其作为单元格级别的结构化操作处理,但 Copy region 不支持跨单元格的选择状态。(不执行任何操作)
  • 源代码模式的表格单元格内,剪贴板内容: 系统标准复制会将 <br> 和 \| 原样复制到剪贴板。而 Copy region 即使在源代码模式下,也会判断出这是来自表格内的复制,并将它们转换为换行符和 | 后再保存。
Yank

将系统剪贴板的内容粘贴到光标位置。相当于 Emacs 的 yank(C-y)命令。

Yank 的具体行为

  • 剪贴板为空时: 不执行任何操作。如果读取剪贴板失败,则改用上一次 Kill / Copy 的内容。
  • 表格之外,以及实时预览的单元格内: 直接粘贴剪贴板的内容。在实时预览的单元格内,其中包含的换行符(\n)会直接变为单元格内的换行(Shift + Enter 的分隔)。
  • 源代码模式的表格单元格内: 为了不破坏表格结构,粘贴前会将换行符转义为 <br>,将竖线字符(|)转义为 \|。
  • 中止连续 Kill: Yank 也总是会重置连续 Kill 的累积。
  • 避免重复列表标记: 与 Obsidian 1.14 及以后版本的标准粘贴一致,粘贴到列表项(如 -、- [ ] 、1. 等)所在行时,会自动调整以避免列表标记重复。
  • 多光标支持: 根据光标数量与剪贴板行数是否一致,行为会有所不同:
    • 一致时: 将剪贴板的每一行分别粘贴到对应的光标位置。
    • 不一致时: 在每个光标位置都粘贴剪贴板的全部内容。

与系统标准粘贴的区别

  • 表格之外,以及实时预览的单元格内: 在粘贴文本时,系统标准粘贴与 Yank 没有区别。即使内容包含多行文本或竖线字符(|),也能正确插入。
  • 剪贴板中存储了多个单元格时: 剪切/复制多个单元格时,系统剪贴板中会以表格结构存储。Obsidian 标准粘贴可以作为表格粘贴,而 Yank 只会粘贴表格的源代码。(粘贴到纯文本中会显示为表格,但粘贴到单元格内则会粘贴表格的 Markdown 源代码)
  • 剪贴板中存储了图片时: 当系统剪贴板中存有图片时,Obsidian 标准粘贴会将图片文件保存到仓库中,并插入嵌入链接(![[保存到仓库中的文件名]]),而 Yank 只会将文件名作为文本粘贴。
  • 源代码模式的表格单元格内: 系统标准粘贴不会转换换行符或竖线字符,而是直接原样插入,因此粘贴包含多行文本或竖线字符的内容会破坏表格结构。Yank 会先将换行符转换为 <br>、竖线字符转换为 \| 后再插入,因此能保持表格结构。
Delete char

此命令旨在实现与物理按键 Delete(macOS 下为 ⌦,或 fn + ⌫)等效的行为。

与物理按键 Delete 等效的行为

在以下场景中,其行为与物理按键 Delete 相同。

  • 文本内,以及实时预览的单元格内:
    • 删除光标位置的字符。(向前删除)
    • 行末时会删除换行符,并与下一行合并。
    • 在实时预览的单元格内,Shift + Enter 的分隔处会被视为行末,但在单元格末尾不会执行任何操作(不会前进到下一个单元格)。

与物理按键 Delete 不同的行为

在以下方面,其行为与物理按键 Delete 不同。

  • 源代码模式的表格单元格内: 物理按键 Delete 不会考虑单元格边界(|),会逐字符删除 | 及其前后的空白。而此命令会判断出当前位于表格内,不会删除边界字符。
Undo / Redo

这两个命令就是 Obsidian 自身的撤销和重做操作本身。它们只是撤销/重做整个笔记的编辑历史,不会进行像针对特定单元格、单词的表格支持、中文支持那样的特殊处理。

将它们作为命令提供的原因

Undo(撤销)在 Windows 下是 Ctrl + Z,在 macOS 下是 command + Z;Redo(重做)在 Windows 下是 Ctrl + Shift + Z 或 Ctrl + Y,在 macOS 下是 command + Shift + Z,但这些并不会出现在 Obsidian 标准的快捷键设置页面或命令面板中。因此无法将其改为分配到标准按键以外的按键(例如与 Emacs 等效的按键)。

本插件将它们作为命令提供,以便像其他所有命令一样可以分配到任意按键。

Kill word left / Kill word right

这两个命令按单词单位 Kill 文本。对于中文文本,也会通过基于词典的分词正确处理。

这些命令可以在 For everyone 页面中分配给物理按键(Windows 下为 Ctrl + Backspace / Delete,macOS 下为 option + ⌫ / ⌦),但这里所说的“物理按键”指的是未分配此命令、处于原始状态的按键;以下将说明该命令与原始按键相同和不同的行为。

与物理按键等效的行为

  • 文本内,以及实时预览的单元格内:
    • Kill word left 会 Kill 从左侧单词开头到光标的内容,Kill word right 会 Kill 从光标到右侧单词末尾的内容。
    • 从行首/行末会继续前进到下一行。
    • 在实时预览的单元格内,Shift + Enter 的分隔处会被视为行首/行末,但不会越过单元格的开头/末尾前进到前一个/下一个单元格。

与物理按键不同的行为

  • 剪贴板联动与连续 Kill: 删除的文本会保存到剪贴板。
    • 与 Kill line 相同,连续 Kill 会使删除内容累积到剪贴板中。Kill word 与 Kill line 可以混用。
    • Kill word left 会将删除的单词添加到剪贴板内容的开头,Kill word right 会添加到末尾。累积的文本会在剪贴板中保持原有的词序。
    • 物理按键删除单词不会与剪贴板联动,之后无法粘贴。
  • 中文的处理: 基于词典识别中文单词。
    • 此命令使用基于词典的分词,因此即使是中文也会按单词单位删除。
    • 物理按键只能识别到空白和标点符号为止的分隔,因此中文文本会被视为一个长单词整体,被一次性删除。
  • 不会侵入表格: 此命令会在表格之前停止,不会进入表格内部。
    • 对于物理按键,尤其是从下方删除单词时,可能会删除整个表格。
  • 源代码模式的表格单元格内: 会判断出当前位于表格内,在单元格边界 | 之前停止。
    • 会将单元格内的 <br> 分隔视为行,将 | 视为单元格边界。与实时预览中不会越过单元格边界而停止一样,在源代码模式下也不会删除或越过 |。
    • 对于物理按键,源代码模式下的表格只是单纯的文本,| 也会被逐一删除,因此会破坏表格。
  • 多光标支持: 在各个光标位置独立执行 Kill word left / Kill word right。
    • 各光标 Kill 的文本会以换行符拼接后存入剪贴板。
    • 拼接顺序始终遵循光标在文档中的出现顺序,与执行的是 Kill word left 还是 Kill word right 无关。
Uppercase word / Lowercase word / Capitalize word

将光标位置或选中范围内的文本转换为大写、小写、或首字母大写。这些命令基于现代 Emacs 的 upcase-dwim / downcase-dwim / capitalize-dwim(M-u / M-l / M-c),采用 DWIM(do-what-i-mean)行为。

  • 有选择范围时: 转换选中范围内的文本。
    • Uppercase / Lowercase 不考虑单词边界,会将选择范围内包含的所有字符统一转换为大写/小写。
    • Capitalize 会将每个单词的首字母转换为大写,其余字母转换为小写。(单词之间的空白和标点符号保持不变)
    • 转换后,光标会移动到选择范围的末尾。
  • 没有选择范围时: 转换光标所在、或位于光标右侧的单词。
    • 转换后,光标会移动到该单词的末尾。
    • 这与 Emacs 经典版、DWIM 版的行为都不同。Emacs 只会转换从光标位置到单词末尾的部分,而此命令即使光标位于单词中途,也会转换整个单词。
  • 表格支持: 与 Word right 相同,在查找转换对象单词时会进入表格、跨越单元格、并脱出表格。
    • 当 Cross-row navigation 设置为 OFF 时,不会跨行,也不会脱出表格,只会停止。
    • 当选中了多个单元格时,这些命令不会执行任何操作。
  • 支持全角字符: 全角字母也会与半角字母同样转换。全角和半角可以混合使用。
  • 多光标支持: 各光标独立转换。即使某个光标的选择范围无效(例如跨越源代码模式表格的单元格边界),也不会阻碍其他光标的转换。
Transpose chars

交换光标前后的 2 个字符。这是再现 Emacs 的 transpose-chars(C-t)的命令。

  • 位于行中途时: 交换光标两侧的 2 个字符,光标移动到交换后 2 个字符的紧后方。
    • 连续按下时,会像把 1 个字符向右拖动一样移动。
  • 位于行末时: 由于后方没有字符,转为交换行末前面的 2 个字符。
    • 但如果该行不足 2 个字符,则无法交换,不执行任何操作。
    • 如果有 2 个字符以上,交换后光标会停留在行末,重复按下会交替交换同样的 2 个字符。
  • 位于行首时: 交换光标左侧(上一行的)换行符与光标右侧的行首字符。
    • 结果上看起来就像行首字符被吸收到了上一行。
    • 交换后,光标位于换行符之后,但结果上相当于仍停留在行首、并未移动。
    • 重复执行会逐字符地被吸收到上一行,当该行变空后会成为 0 个字符的行末,此后不再执行任何操作。
  • 位于笔记开头/末尾,或单元格开头/末尾时: 由于其中一侧没有可交换的字符,不执行任何操作。
  • 源代码模式的表格支持: 在表格内,会将单元格左侧的 | 视为笔记开头,将单元格右侧的 | 视为行末——这些边界字符不会被移动,也不会破坏表格。而 <br> 则被视为与真实换行符相同:整个 <br> 标签(4 个字符)会作为一个整体,与前后的字符一起交换。(例如,在 A<br>B<br>C 中光标位于 "B" 开头时,交换后会变为 AB<br><br>C。)
  • 支持表情符号、扩展汉字: 像表情符号等内部由多个字符长度构成的字符,也会被视为 1 个字符进行交换。(如 "🟩"、"𠮷" 等代理对,以及 "☺️" 这类带有异体字选择符的表情符号)
  • 多光标支持: 各光标独立交换。即使某个光标所处的位置无法交换(例如笔记开头),也不会阻碍其他光标的交换。
Select all

此命令相当于 Obsidian 自身的全选。

与全选等效的行为

  • 位于表格之外时: 选择整个笔记。
  • 位于表格单元格内时(实时预览): 不选择整个笔记,而是选择当前单元格的全部内容。
  • 无论哪种情况,光标都会移动到选择范围的末尾。

与全选不同的行为

  • 执行后,还会在选择范围的开头设置 Set-mark 起点。此后用 LEFT / RIGHT / UP / DOWN 等移动光标,会扩展/缩小选择范围。
  • 位于表格单元格内时(源代码模式): 即使在源代码模式下,也会判断出当前位于表格内,选择当前单元格的全部内容,而不是整个笔记。
    • 此时会将单元格开头和末尾的空白排除在选择范围之外。
    • 标准的全选不会判断是否位于表格内,会直接选择整个笔记。

将其作为命令提供的原因

Obsidian 标准的全选快捷键在 Windows 下是 Ctrl + A,但这个按键是 HOME 命令的推荐快捷键。应用推荐快捷键后,该快捷键会被覆盖,但全选本身并不是可以分配快捷键的命令,因此需要新建一个命令,以便可以用其他按键执行它。

(与 Undo / Redo 相同的原因。)

Deselect

此命令相当于 Emacs 的 keyboard-quit(C-g)。它会清除选择范围、清除 Set-mark 的起点,并仅保留主光标。

Deselect 的具体行为

  • 存在多个光标或选择范围时执行,只会保留主光标自己的选择范围,其他光标/选择范围都会被清除。
  • 如果只有一个选择范围,则会清除该范围选择。
    • 也就是说,当多光标状态下每个光标都各自处于范围选择状态时,需要分两次执行才能完全清除:多个选择范围 → 单一选择范围 → 无选择范围。
    • 这与 Esc 键的行为相同。
  • 当前光标位置会保持不变。
  • 所有的 Set-mark 起点都将被清除。
    • 这与 Esc 键的行为不同。

Other hotkeys(其他快捷键)​

Recenter-top-bottom

将光标所在行的显示位置移动到屏幕中央。连续按下时,会按照上方、下方、再回到中央的顺序循环切换。这是对应现代 Emacs 的 recenter-top-bottom(C-l)的命令。

  • 循环动作: 每次按下时,会按照中央 → 上端(留出 2 行空白)→ 下端(留出 2 行空白)的顺序切换滚动位置,此后再回到中央,依此循环。
    • 光标的位置本身不会改变,只是进行滚动。
    • 无论光标位于纯文本还是表格内,行为都相同。
  • 循环的重置: 进行键盘输入、光标移动、鼠标点击等编辑操作后,下一次按下时会从中央重新开始循环。
    • 但执行 Kill line 或 Kill word left / right 时,循环不会被重置。
    • Kill region、Copy region、Yank 会重置循环。
Recenter

将光标所在行的显示位置移动到屏幕中央。这对应的是旧版 Emacs 的 recenter(C-l)。

  • 具体动作: 滚动画面,使光标所在行位于屏幕垂直方向的中央。
    • 光标的位置本身不会改变,只是进行滚动。
    • 无论光标位于纯文本还是表格内,行为都相同。

由于未设置推荐快捷键,如果你偏好滚动位置固定在中央的风格,请点击插件设置页面的 Open → 按钮,手动分配快捷键。

Table navigation(单元格间的光标移动)​

Move to cell left / right / above / below

该命令用于移动到指定方向上相邻的单元格。

Move to cell 的具体行为

  • 光标会落在目标单元格的开头。
  • 左右方向: 始终停留在当前行内。位于行的左右两端时不执行任何操作。(不会跨行移动到相邻行)
  • 上下方向: 保持同一列(单元格位置)不变,移动到上一行/下一行。位于表格的第一行/最后一行时不执行任何操作。
  • 仅在实时预览的表格内有效。表格之外,以及源代码模式下不执行任何操作。

与 Obsidian 标准单元格移动(Tab / Shift + Tab)的区别

  • Obsidian 标准通过 Tab(右侧单元格) / Shift + Tab(左侧单元格)进行的右/左移动会:
    • 选择目标单元格的全部内容。
    • 从行末跨行移动到下一行/上一行。
    • 此时还会在表格的下端/上端插入新行。
  • Move to cell right / Move to cell left 则:
    • 移动单元格时不会进行范围选择。
    • 始终停留在当前行内。(不会跨行移动)
Exit table above / below

移动到当前所在表格之外。

  • Exit table above 会落在表格正上方的行,Exit table below 会落在正下方的行。
  • Smart home 会跳过落点行开头的 Markdown 语法。
  • 当表格位于笔记开头时(Exit table above): 由于不存在可供脱出的行,会落在表头行最左侧单元格的开头。
    • Smart home 会跳过单元格开头的 Markdown 语法。
  • 当表格位于笔记末尾时(Exit table below): 会在笔记末尾添加空行,并落在该空行上。
  • 在实时预览和源代码模式的表格内均可使用。表格之外不执行任何操作。

Add cursor(添加光标)​

Add cursor above / below

在当前光标的上一行或下一行添加一个光标。

添加此命令的原因

  • Obsidian 标准的「在上方添加光标」「在下方添加光标」命令,新增光标所在的行或列位置有时不稳定,在表格内有时还无法使用。
  • 本命令以统一的逻辑重新实现:「在逻辑行的上/下方添加」「对齐到相同的字符列位置」「在表格内也能使用」。

Add cursor above / below 的具体行为

  • 在当前光标的上一行或下一行添加一个光标。
    • 这里的上/下指的是逻辑行,而非显示行;对齐的是相同的字符列位置,而非相同的横向位置。
    • 当上方或下方的行较短、无法对齐到相同字符列位置时: 光标会改为添加在该行末尾。此后即使再添加光标,也不会恢复到原本的字符列位置。
  • 新添加的光标成为「主光标」,原来的光标则成为「副光标」。
    • 只有一个光标时,该光标即为主光标。
    • 新光标的添加始终以主光标为基准,在其上方或下方进行。
    • 当光标移动过程中主光标进入表格时: 所有副光标都会消失,退回为单光标状态。如果只有副光标试图进入表格,则只有该副光标会消失。
  • 可在纯文本内,或表格的单个单元格内使用,但无法跨越纯文本与表格的边界,也无法跨越单元格边界添加多光标。