智能 Tab 导航
VMark 的 Tab 和 Shift+Tab 键具有上下文感知能力——可帮助你高效地在格式化文本、括号和链接之间导航,无需使用方向键。
启用实验性的工作区导轨后,标签页循环切换和标签栏只涵盖当前活动工作区的标签页。
快速概览
| 上下文 | Tab 操作 | Shift+Tab 操作 |
|---|---|---|
在括号 () [] {} 内 | 跳过闭合括号 | 跳到开括号之前 |
在引号 "" '' 内 | 跳过闭合引号 | 跳到开引号之前 |
在中日韩括号 「」 『』 内 | 跳过闭合括号 | 跳到开括号之前 |
在 粗体、斜体、代码、 | 跳到格式标记之后 | 跳到格式标记之前 |
| 在链接内 | 跳到链接之后 | 跳到链接之前 |
| 在表格单元格中 | 移动到下一个单元格 | 移动到上一个单元格 |
| 在列表项中 | 缩进该项 | 取消缩进该项(在最外层停止) |
括号与引号跳出
当光标紧靠在闭合括号或引号之前时,按 Tab 可跳过它。当光标紧靠在开括号或引号之后时,按 Shift+Tab 可跳回到它之前。
支持的字符
标准括号和引号:
- 圆括号:
( ) - 方括号:
[ ] - 花括号:
{ } - 双引号:
" " - 单引号:
' ' - 反引号:
`
中日韩括号:
- 全角圆括号:
( ) - 方头括号:
【 】 - 角括号:
「 」 - 白角括号:
『 』 - 双书名号:
《 》 - 书名号:
〈 〉
弯引号:
- 双弯引号:
" " - 单弯引号:
' '
工作原理
function hello(world|)
↑ cursor before )按 Tab:
function hello(world)|
↑ cursor after )嵌套括号同样有效——Tab 只跳过紧邻的闭合字符。
按 Shift+Tab 执行反向操作——如果光标紧靠在开括号之后:
function hello(|world)
↑ cursor after (按 Shift+Tab:
function hello|(world)
↑ cursor before (中日韩示例
这是「测试|」文字
↑ cursor before 」按 Tab:
这是「测试」|文字
↑ cursor after 」格式标记跳出(所见即所得模式)
在所见即所得模式中,Tab 和 Shift+Tab 可以跳出内联格式标记。
支持的格式
- 粗体 文本
- 斜体文本
内联代码删除线- 链接
工作原理
当光标位于格式化文本内的任意位置时:
This is **bold te|xt** here
↑ cursor inside bold按 Tab:
This is **bold text**| here
↑ cursor after boldShift+Tab 执行反向操作——跳到格式标记的开始处:
This is **bold te|xt** here
↑ cursor inside bold按 Shift+Tab:
This is |**bold text** here
↑ cursor before bold链接跳出
Tab 和 Shift+Tab 也可以从链接中跳出:
Check out [VMark|](https://vmark.app)
↑ cursor inside link text按 Tab:
Check out [VMark](https://vmark.app)| and...
↑ cursor after link在链接内按 Shift+Tab 移动到开始处:
Check out |[VMark](https://vmark.app) and...
↑ cursor before link链接导航(源码模式)
在源码模式中,Tab 在 Markdown 链接语法内提供智能导航。
嵌套与转义括号
VMark 能正确处理复杂的链接语法:
[text [with nested] brackets](url) ✓ Works
[text \[escaped\] brackets](url) ✓ Works
[link](https://example.com/page(1)) ✓ WorksTab 导航能正确识别链接边界,即使存在嵌套或转义括号。
标准链接
[link text|](url)
↑ cursor in text按 Tab → 光标移动到 URL:
[link text](|url)
↑ cursor in URL再按 Tab → 光标退出链接:
[link text](url)|
↑ cursor after linkWiki 链接
[[page name|]]
↑ cursor in link按 Tab:
[[page name]]|
↑ cursor after link源码模式:Markdown 字符跳出
在源码模式中,Tab 也可以跳过 Markdown 格式字符:
| 字符 | 用途 |
|---|---|
* | 粗体/斜体 |
_ | 粗体/斜体 |
^ | 上标 |
~~ | 删除线(作为整体跳过) |
== | 高亮(作为整体跳过) |
示例
This is **bold|** text
↑ cursor before **按 Tab:
This is **bold**| text
↑ cursor after **INFO
源码模式不支持 Shift+Tab 跳出 Markdown 字符——Shift+Tab 在源码模式中只执行取消缩进(删除前导空格)。
源码模式:自动配对
在源码模式中,输入格式字符会自动插入对应的闭合字符:
| 字符 | 配对 | 行为 |
|---|---|---|
* | *|* 或 **|** | 延迟触发——等待 150ms 以判断是单个还是双个 |
~ | ~|~ 或 ~~|~~ | 延迟触发 |
_ | _|_ 或 __|__ | 延迟触发 |
= | ==|== | 始终配对为双个 |
` | `|` | 单个反引号在延迟后配对 |
``` | 代码围栏 | 行首三个反引号创建围栏代码块 |
在围栏代码块内,自动配对 禁用——在代码块中输入 * 会插入字面量 *,不进行配对。
在配对之间按 Backspace 会同时删除两个字符:*\|* → Backspace → 空。
表格导航
当光标在表格内时:
| 操作 | 按键 |
|---|---|
| 下一个单元格 | Tab |
| 上一个单元格 | Shift + Tab |
| 添加行(在最后一个单元格时) | Tab |
在最后一行的最后一个单元格按 Tab 会自动添加新行。
列表缩进
当光标在列表项中时:
| 操作 | 按键 |
|---|---|
| 缩进项目 | Tab |
| 取消缩进项目 | Shift + Tab |
取消缩进会移除一层嵌套,并在最外层停止——它不会把项目移出列表。如需完全离开列表,请使用 移除列表,或再次按下列表按钮将其关闭。
设置
Tab 跳出行为可在 设置 → 编辑器 中自定义:
| 设置 | 效果 |
|---|---|
| 自动配对括号 | 启用/禁用括号配对和 Tab 跳出 |
| 中日韩括号 | 包含中日韩括号对 |
| 弯引号 | 包含弯引号对(“” ‘’);输入的直引号会变成一对弯引号 |
TIP
如果 Tab 跳出与你的工作流冲突,可以完全禁用自动配对括号。这样 Tab 就会正常插入空格(或在列表/表格中执行缩进)。
对比:所见即所得模式与源码模式
| 功能 | Tab(所见即所得) | Shift+Tab(所见即所得) | Tab(源码) | Shift+Tab(源码) |
|---|---|---|---|---|
| 括号跳出 | ✓ | ✓ | ✓ | — |
| 中日韩括号跳出 | ✓ | ✓ | ✓ | — |
| 弯引号跳出 | ✓ | ✓ | ✓ | — |
| 格式标记跳出(粗体等) | ✓ | ✓ | N/A | N/A |
| 链接跳出 | ✓ | ✓ | ✓(字段导航) | — |
Markdown 字符跳出(*、_、~~、==) | N/A | N/A | ✓ | — |
Markdown 自动配对(*、~、_、=) | N/A | N/A | ✓(延迟触发) | N/A |
| 表格导航 | 下一个单元格 | 上一个单元格 | N/A | N/A |
| 列表缩进 | 缩进 | 取消缩进 | 缩进 | 取消缩进 |
| 多光标支持 | ✓ | ✓ | ✓ | — |
| 在代码块内跳过 | ✓ | ✓ | ✓ | N/A |
多光标支持
Tab 跳出支持多光标——每个光标独立处理。
工作原理
当你有多个光标并按 Tab 或 Shift+Tab 时:
- Tab:格式内的光标跳到末尾;闭合括号前的光标跳过括号
- Shift+Tab:格式内的光标跳到开头;开括号后的光标跳到括号前
- 普通文本中的光标保持不动
示例
**bold|** and [link|](url) and plain|
^1 ^2 ^3按 Tab:
**bold**| and [link](url)| and plain|
^1 ^2 ^3每个光标根据其上下文独立跳出。
TIP
这对于批量编辑特别强大——用 Mod + D 选中多个出现位置,然后用 Tab 同时从所有位置跳出。
优先级与代码块行为
跳出优先级
当多个跳出目标重叠时,Tab 按 由内而外 的顺序处理:
**bold text(|)** here
↑ Tab jumps ) first (bracket is innermost)再按 Tab:
**bold text()**| here
↑ Tab escapes bold mark这意味着括号跳出始终优先于格式标记跳出——你可以依赖 Tab 先退出括号,再退出格式。
代码块保护
代码块内的括号跳出 禁用——包括 code_block 节点和内联代码 span。这可以防止 Tab 跳过代码中的括号(括号在代码中是字面语法):
`array[index|]`
↑ Tab does NOT jump ] in inline code — inserts spaces instead在所见即所得模式和源码模式中,代码块内的自动配对插入也被禁用。
使用技巧
建立肌肉记忆——一旦习惯了 Tab 跳出,你会发现无需使用方向键就能快速导航。
与自动配对协作——当你输入
(时,VMark 会自动插入)。在括号内输入后,只需按 Tab 跳出。嵌套结构——Tab 每次只跳出一层。对于
((nested)),需要按两次 Tab 才能完全退出。Shift + Tab——Tab 的镜像操作。从格式标记、链接和开括号向后跳出。在表格中移动到上一个单元格,在列表中取消缩进。
多光标——Tab 跳出同时对所有光标生效,让批量编辑更加高效。
在打开的标签页之间切换
标签页位于窗口底部的状态栏中。有三种方式可以在它们之间切换:
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 最近使用的标签页 | Ctrl + Tab | 跳到你在当前标签页之前所在的标签页。再按一次即可直接返回。 |
| 下一个 / 上一个标签页 | Mod + Shift + ] / Mod + Shift + [ | 按顺序沿标签栏移动,与你最近使用过哪些标签页无关。 |
| 快速打开 | Mod + O | 输入以筛选。已打开的标签页列在最前面,最近使用的排在顶部。 |
“最近使用的标签页”是来回切换,而不是循环。 它会带你回到最近所在的文档,再按一次就回到起点——这是在两个文件之间来回工作的快捷方式。“下一个”和“上一个标签页”则按位置遍历标签栏,适合你在寻找某个标签页、而不是返回某个标签页的时候使用。
它既是快捷键,也是一个菜单项(视图 → 最近使用的标签页),因此即使内置浏览器拥有键盘焦点,它也能继续工作。
标签页多到放不下时
标签栏可以滚动。当某一侧边缘之外还有标签页时,标签栏在该侧边缘会渐隐,并出现一个小箭头——点击它可滚动一屏。以任何方式切换标签页时,也会把新标签页滚动到可见区域,因此高亮的标签页永远不会隐藏在屏幕之外。
标签栏本身可以通过键盘访问:用 Tab 移动到它上面,然后使用方向键。
并排显示两个文档
视图 → 拆分编辑器——两个文档(Alt + Mod + \)会在当前文档旁边放置第二个文档。要选择显示哪个文档,请右键点击任意标签页并选择 在旁边打开。
| 操作 | 快捷键 |
|---|---|
| 拆分编辑器——两个文档 | Alt + Mod + \ |
| 关闭窗格 | Alt + Mod + Shift + \ |
| 聚焦另一个窗格 | Alt + Mod + Shift + O |
| 同步窗格滚动 | (无默认快捷键) |
关于它的行为:
- 显示在另一个窗格中的标签页会在标签栏中以淡淡的下划线标记,因此你始终能分辨屏幕上是哪两个文档,以及你的输入会进入哪一个。
- 关闭两者之一时会收拢到另一个文档上,而不是把你带到一个不相关的标签页。剩下的文档保持不动。
- 同步窗格滚动 会按比例把两个窗格的滚动联动起来。它默认关闭,并且按每次拆分单独设置。
- 两个窗格共用同一种视图模式。 源码模式(
F6)会同时切换两个窗格,在窗格之间切换时保持当前模式不变。 - 拆分需要打开两个文档。浏览器标签页不是文档,因此拆分不适用于它们。
标签页上下文菜单
右键点击标签页即可打开其菜单。方向键、Home 和 End 用于在菜单中移动;Enter 或空格执行某一项;Escape 关闭菜单。
| 菜单项 | 作用 | 何时可用 |
|---|---|---|
| 移到新窗口 | 把标签页移到一个新窗口中,确认提示中带有 撤销。因此变空的次级窗口会关闭。 | 文档已加载,且它不是主窗口中唯一的标签页 |
| 固定 / 取消固定 | 固定或取消固定该标签页——参见固定标签页。 | 始终 |
| 在旁边打开 | 在另一个拆分窗格中显示该标签页——参见并排显示两个文档。 | 该标签页和活动标签页都是文档,且该标签页不是活动标签页(浏览器标签页不显示此项) |
| 重命名 | 直接在标签页中重命名文件——参见重命名文件。 | 文档已保存过 |
| 复制路径 | 复制文件的绝对路径。 | 文档已保存过 |
| 复制相对路径 | 复制相对于工作区文件夹的路径。 | 已打开工作区且文件位于其中 |
| 在 Finder 中显示 | 在 Finder 中显示该文件(Windows 上为 在资源管理器中显示,Linux 上为 在文件管理器中显示)。 | 文档已保存过 |
| 恢复到磁盘 | 把标签页的内容写回其路径。 | 文件在打开期间已从磁盘上删除 |
| 还原为已保存版本 | 经确认后,丢弃你的更改并从磁盘重新加载文件。 | 标签页有未保存的更改,且其文件仍然存在 |
| 关闭 | 关闭该标签页(如有未保存的更改,会先询问是否保存)。 | 该标签页未被固定 |
| 关闭其他 | 关闭其他所有未固定的标签页。 | 存在另一个未固定的标签页 |
| 关闭右侧标签页 | 关闭其右侧未固定的标签页。 | 右侧存在这样的标签页 |
| 关闭所有未固定标签页 | 关闭所有未固定的标签页,包括这一个。 | 存在未固定的标签页 |
| 全部关闭 | 关闭所有标签页,包括固定的标签页。如果会关闭固定的标签页,它会先询问并说明数量;取消则不关闭任何标签页。 | 始终 |
批量关闭作用于当前工作区的标签页,并逐个关闭它们。每个有未保存更改的标签页都会先询问,取消其中任何一个提示都会停止关闭其余标签页。
固定标签页
通过标签页的上下文菜单固定它,让它始终触手可及:
- 它会移到标签栏左侧的固定分组中,显示一个图钉图标,并且不再有关闭按钮。标签页不能被拖过固定与未固定标签页之间的分界(“固定的标签页保留在左侧。无法在此处放下。”),固定的标签页也不能被拖出其所在窗口。
- 在你取消固定之前,无论用什么方式都无法关闭它——
Mod + W、鼠标中键点击、关闭 或批量关闭都不行;尝试关闭时会显示 “关闭前请先取消固定”。只有两种有意的关闭例外:全部关闭 在你确认后也会关闭固定的标签页;从工作区栏关闭一个工作区时,它的固定标签页会随其他标签页一起关闭。 - 关闭含有固定标签页的窗口时会请求确认——“此窗口有 N 个固定标签页。仍要关闭吗?”——除非之前已经显示过保存对话框。
- 把标签页移到另一个窗口或工作区,以及更新重启后,固定状态都会保留;但退出 VMark 后不会保留:下次启动时重新打开的标签页都是未固定的。
固定没有键盘快捷键。
重命名文件
在标签页的上下文菜单中选择 重命名。名称会在标签页中变为可编辑状态,扩展名之前的部分会被选中。按 Enter 或点击别处即提交;按 Escape 取消。文件会在磁盘上被重命名,所有指向它的已打开标签页都会随之更新。VMark 从不覆盖文件:如果该名称已被占用,会弹出对话框提示 已存在名为“X”的文件。 为空、未更改、为 . 或 ..、或包含 / 或 \ 的名称会被拒绝或忽略。你输入的就是完整的名称——删掉扩展名,文件就会失去扩展名。
在 macOS 上,如果开启了 设置 → 外观 → 在标题栏显示文件名,你也可以双击标题栏中的文件名来重命名。规则和提示消息相同;名称冲突或出错后,名称仍保持可编辑状态,方便你换一个名称。如果 显示文件扩展名 处于关闭状态,当你输入不带扩展名的名称时,会保留原来的扩展名。双击未保存文档的标题则会打开 保存。
关闭标签页和窗口
任何有未保存更改的内容都不会在未询问的情况下被关闭。
- 关闭单个有未保存更改的标签页(
Mod + W、标签页上的 ×,或 关闭)时,会询问 “要保存对“…”的更改吗?”,并提供 保存、不保存 和 取消。对从未保存过的文档选择 保存,会在你的默认保存文件夹中打开保存对话框,并以标签页标题作为建议名称。取消该对话框或保存失败,标签页都会保持打开。 - 关闭窗口时,如果只有一个未保存的文档,会询问同样的问题。如果有两个或更多,会用一个对话框列出全部——从未保存过的文档标有 (新)——并提供 全部保存、不保存 和 取消。
- 全部保存 会保存每个有对应文件的文档。对于从未保存过的文档,它会询问保存位置:只有一个时显示一个保存对话框,有多个时显示一个文件夹选择器(“为 N 个新文档选择文件夹”)。随后每个文档都会以其标题保存到该文件夹中,已被占用的名称会加上编号(
Untitled 2.md),因此不会覆盖任何文件。 - 退出(
Mod + Q)会在每个窗口中逐一执行同样的检查;在任一窗口中取消都会取消退出。开启 设置 → 文件与图片 → 确认退出(默认开启)时,第一次按下只会显示 “再次按 ⌘Q 退出”——请在两秒内再按一次。来自操作系统的退出(例如关机)会跳过两次按键。 - 全部保存并退出 会在不弹出对话框的情况下保存每个窗口中未保存的文档(对从未保存过的文档,仍会在其所在窗口询问保存位置:一个文档弹出保存对话框,多个文档弹出一次文件夹选择),然后退出。如果某个文档无法保存,或你取消了该对话框,退出就会中止:该窗口保持打开,保存失败时会说明原因。
在 macOS 上,VMark 在最后一个窗口关闭后仍会继续运行;在 Windows 和 Linux 上,关闭最后一个窗口即退出——除非在 Windows 上开启了 设置 → 文件与图片 → 关闭时最小化到托盘:此时最后一个窗口会被隐藏到系统托盘中,不关闭任何内容,也不会提示保存(参见设置)。