Kate 的 VI 模式,是一个旨在将类似 Vim 的编辑引入 [Kate文本编辑器](https://www.kate-editor.org/),并扩展至共享相同编辑器组件的其他 KDE 程序的项目。 该项目始于 2008 年的 Google Summer of Code 项目——所有基本功能都是在其中编写的。我进一步开发并继续维护, 所缺失的Vim功能正越来越少。 多数 Vim 用户已可以在 Kate 的 VI 模式下高效工作。 > 页面底部列出了未完成的功能。 要启用 VI 模式,请到 **设置 → 配置** **Kate... → 编辑 → VI 输入模式** 。 也可以通过“编辑”菜单中的“VI 输入模式”切换。(默认快捷键是 Meta+Ctrl+V, Meta 即 Win 键)。 ## 目标 VI 模式的目标 *不是* 完全替代 Vim 并支持 *所有* 功能。 它的目的是让使用 Kate 文本编辑器作为内部编辑器的程序可以拥有“Vim 模式”以及 Vim 习惯。 程序包括 1. Kate文本编辑器 2. KWrite – KDE 的简单文本编辑器 3. KDevelop – 适用于多种编程语言的高级 IDE 4. Kile – 一个 LaTeX 编辑器 VI 模式旨在与程序很好地集成,并在有理由时刻意与 Vim不同。 例如, `:w`将在 Kate VI 模式下打开保存对话框。 ## 与 Vim 的不同处 Kate VI 模式只有少数功能与 Vim 不同(不包括未完成的功能)。 下面列出,以及原因 1. **Kate:** `U`和 `Ctrl+r`是重做 **Vim:** `Ctrl+r`是一般重做, `U`用于撤消一行上最近所有的更改 之所以 U 在 Kate 的 VI 模式中充当重做,是快捷方式 ctrl+r默认情况下是 Kate 的替换功能(搜索和替换)。 默认情况下,VI 模式不会覆盖 Kate 的快捷键(这可以在设置 → 配置 Kate... → 编辑 → Vi 输入模式中进行配置),因此重做操作也需要作为“常规”按键可用。 此外,Vim 中 U 命令的行为并不能很好地映射到 Kate 的内部撤消系统,因此不容易实现 2. **Kate:** `:print`显示“打印”对话框 **Vim:** `:print`打印给定范围的行,就像它的前前身ed 3. **Kate:** `Y`复制到行尾。 **Vim:** `Y`复制整行,就像 `yy`. VI 的`Y`实际上是一个bug; 对于更改和删除, `cc`/ `dd`用于当前整行, `C`/ `D`是从光标到行尾。 然而,`yy`和 `Y`却都是复制当前一整行。在 Kate 的 VI 模式中 `Y`将拉到行尾,“更合乎逻辑” ([ Vim 文档中的描述](http://vimdoc.sourceforge.net/htmldoc/change.html#Y))。 4. **Kate:** `:map`使用提供的 JavaScript 表达式更改文档的选定行。 **Vim:** `:map`将提供的映射添加到正常和可视模式。 “map”命令在 Kate 中另外有实现, 在 4.12+ 中,您可以使用 `:nmap`和 `:vmap`。 ## 支持的命令 ### 支持的正常/可视模式命令 | 按键 | 描述 | | ---------------- | ----------------- | | a | 进入插入模式并追加 | | A | 进入插入模式并附加到 行尾 | | i | 进入插入模式 | | I | 在行中的第一个非空白字符之前插入 | | v | 进入可视模式 | | V | 进入行可视模式 | | \ | 进入块可视模式 | | gv | 重新选择上次可视 | | o | 在下面插入新行 | | O | 在上面插入新行 | | J | 连接行 | | c | 改写 | | C | 改写到行尾 | | cc | 改写行 | | s | 替换字符 | | S | 替代行 | | dd | 删除行 | | d | 删除 | | D | 删除到 行尾 | | x | 删除字符 | | X | 向后删除字符 | | gu | 变小写 | | guu | 行变小写 | | gU | 变大写 | | gUU | 行变大写 | | y | 复制 | | yy | 复制行 | | Y | 复制 到 行尾 | | p | 粘贴 | | P | 粘贴在光标前 | | r. | 替换字符 | | R | 进入替换模式 | | : | 切换到命令 | | / | 搜索 | | u | 撤消 | | \ | 重做 | | U | 重做 | | m. | 设置标记 | | » | 缩进行 | | « | 反缩进行 | | \> | 缩进行 | | \< | 反缩进行 | | \ | 向下滚动页面 | | \ | 向下滚动页面 | | \ | 向上滚动页面 | | \ | 向上滚动页面 | | \ | 向上滚动半页 | | \ | 向下滚动半页 | | zz | 光标行成为视图中心 | | ga | 查看字符代码 | | . | 重复上次更改 | | == | 对齐行 | | = | 对齐多行 | | ~ | 更改大小写 | | \ | 数字加 | | \ | 数字减 | | \ | 到上一跳 | | \ | 到下一跳 | | \h | 切换到左边视图 | | \\ | 切换到左边视图 | | \\ | 切换到左边视图 | | \j | 切换到向下边视图 | | \\ | 切换到向下边视图 | | \\ | 切换到向下边视图 | | \k | 切换到向上边视图 | | \\ | 切换到向上边视图 | | \\ | 切换到向上边视图 | | \l | 切换到右边视图 | | \\ | 切换到右边视图 | | \\ | 切换到右边视图 | | \w | 切换到下一个视图 | | \\ | 切换到下一个视图 | | \s | 水平分割 | | \S | 水平分割 | | \\ | 水平分割 | | \v | 垂直分割 | | \\ | 垂直分割 | | gt | 切换到下一个标签 | | gT | 切换到上一个标签 | | gqq | 格式化行 | | gq | 格式化多行 | | q. / q | 使用命名的宏寄存器开始/结束录制宏 | ### 支持的移动 | Key | 描述 | | ----------- | ------------------------- | | h | 左移光标 | | \ | 左移光标 | | \ | 左移光标 | | j | 下移光标 | | \ | 下移光标 | | \ | 下到第一个非空白 | | k | 上移光标 | | \ | 上移光标 | | – | 上到第一个非空白 | | l | 右 | | \ | 右 | | \ | 右 | | $ | 到行尾 | | \ | 到行尾 | | | 到 0 列 | | \ | 到 0 列 | | ^ | 到行的第一个字符 | | f. | 光标找字符 | | F. | 光标找字符(反向) | | t. | 光标到字符之前 | | T. | 光标到字符之前(反向) | | ; | 重复最后一个 t.
或 f.
命令 | | , | 重复最后一个 t.
或 f.
命令 | | n | 查找下一个 | | N | 查找上一个 | | gg | 到第一行 | | G | 到最后一行 | | w | | | W | | | b | | | B | | | e | 到词尾 | | E | | | ge | 到上一个单词的结尾 | | gE | | | % | 到匹配项目 | | \`\[a-zA-Z><\] | 到标记 | | '\[a-zA-Z><\] | 标记行 | | \[\[ | 到前一个大括号开始 | | \]\] | 到下一个大括号开始 | | \[\] | 到前一个大括号结束 | | \]\[ | 到下一个大括号结束 | | \* | | | # | | | H | 到窗口的第一行 | | M | 到窗口的中间行 | | L | 到窗口的最后一行 | | gj | 到下一可视行 | | gk | 到上一可视行 | ### 支持的文本对象 | Key | 描述 (未翻译) | | -------- | ----- | | `iw` | 内心话 | | `aw` | 一个字 | | `iW` | 内字 | | `aW` | 一个字 | | `i"` | 内部双引号 | | `a"` | 双引号 | | `i’` | 内单引号 | | `a’` | 单引号 | | `` i` `` | 内背报价 | | `` a` `` | 反向报价 | | `ib` | 内圈 | | `i)` | 内圈 | | `i(` | 内圈 | | `ab` | 停止 | | `a)` | 停止 | | `a(` | 停止 | | `iB` | 内花括号 | | `o}` | 内花括号 | | `i{` | 内花括号 | | `aB` | 一个大括号 | | `a}` | 一个大括号 | | `a{` | 一个大括号 | | `i<` | 内部不等号 | | `i>` | 内部不等号 | | `a<` | 不等号 | | `a>` | 不等号 | | `i[` | 内支架 | | `I]` | 内支架 | | `a[` | 一个支架 | | `a]` | 一个支架 | | `i,` | 内逗号 | | `a,` | 一个段落 | ### 支持的插入模式命令 | Key | 描述 | | -------- | ------------ | | `` | 减少缩进 | | `` | 增加缩进 | | `` | 从下方插入 | | `` | 从上方插入 | | `` | 删除单词 | | `.` | 插入寄存器内容 | | `` | 换到正常模式而只执行一个命令 | | `` | 加光标下的数字 | | `` | 减光标下的数字 | ### *逗号* 文本对象 这是 Vim 中一直缺少的功能。 *逗号* 文本对象使修改像 C 语言中参数列表或其他逗号分隔的列表变得容易。它基本上就是用于两个逗号之间,或逗号和括号之间的区域。 在图所示的行中,文本对象可以选择的三个范围以红色突出显示。 [![](https://kate-editor.org/wp-content/uploads/2012/06/comma_to.png)](https://kate-editor.org/wp-content/uploads/2012/06/comma_to.png) 译注:图为以下代码截图 ```c int f(int arg1, double arg2, char arg3); ``` 逗号文本对象范围。 如果光标在`arg2`处,按 `c` `i` `,` (“更改其中逗号”)将删除`double arg2`,并进入插入模式,光标位于两个逗号之间。 这是更改函数参数的一种非常方便的做法。 ## 模拟 Vim 命令栏 Kate 4.11 引入了一个隐藏的选项,使 `/`, `?`和 `:`调出一个搜索/命令来代替平常模式下的 Kate 的查找/替换/命令行栏。 该新栏旨在模仿 Vim 命令栏的许多功能,并修复 Kate Vim 模式与 查找/替换栏交互的许多问题(交互式替换不能用;增量搜索无法正确定位光标;不适用于映射/宏 等)。 模拟命令栏提供以下快捷方式; 与 Vim 一样,这些可以用 cmap、cnoremap 等重新映射 | Key | 描述 | | ------------ | ----------------------- | | `.` | 插入寄存器的内容。 | | `` | 在(文档)光标下插入单词。 | | `` | 调用特定于上下文的完成(见下文)
在完成列表中向后/向上移动。 | | `` | 在完成列表中向前/向下移动。 | | `` | Kate Vim 扩展。
自动完成文档中的单词。 | | `` | Kate Vim 扩展。
在 sed-replace 表达式中(即 `s/find/replace/[g][c][i]`), 清除`find`并将光标放在那里。 | | `` | Kate Vim 扩展。
在 sed-replace 表达式中 (即 `s/find/replace/[g][c][i]`) ,清除`replace`并将光标放在那里。 | | `.` | (未翻译)Kate Vim 扩展。
与 . 一样,插入命名寄存器的内容,
但是以这样一种方式逃避它,当与搜索一起使用时,
我们搜索寄存器的文字内容;
不是将寄存器的内容解释为正则表达式。 | “特定于上下文的完成”决定如下(未翻译): - 在搜索栏中( `/`或者 `?`),从搜索历史记录中自动完成(包括通过 `*`; 和 `#`; 在 sed-replace 表达式中完成的搜索; 等。) - 在一个空的命令栏中( `:`),从命令历史记录自动完成(注意:当您开始键入时,会自动调用命令名称的自动完成)。 - 在包含 sed-replace 表达式的命令栏中(例如 `:s/find/replace/gc`),如果光标位于“查找”上,则从“搜索”历史记录中自动完成; 如果超过“替换”,则从“替换”条款的历史记录中自动完成。 在带有“c”标志的命令栏中执行 sed-replace 表达式时(例如 `s/find/replace/gc`),将启动 Vim 风格的交互式搜索/替换表达式。 模拟命令栏的一些示例用法, 在[博客](https://kate-editor.org/2013/09/06/kate-vim-progress/)中给出,带有些GIF 动画 。 在 4.11 ,在 katerc/kwriterc/kdeveloprc 中,可以通过将隐藏的配置选项“Vi Input Mode Emulate Command Bar”设置为`true`来启用模拟命令栏 . ## 缺少的功能 如前所述,Kate 的 VI 模式的目标不是 100% 支持 Vim 的功能,尽管如此,有些要的功能尚未完成 - 块可视模式——尤其是在块可视选择中添加/附加文本的能力。 - 在 Kate 应用程序之外的其他程序中可以使用 ex 命令。 - 搜索代码需要改进,* 和 # 命令应该只是常规搜索。 如果您想要其他功能或想对上述功能提供帮助,请随时与我联系或发送补丁! :-) ## 更新日志 - **2010-05-16:** 初始版本。 从博客条目和 README 文件中收集信息,作为当前信息的单一来源。 - **2010-05-17:** 增加`Ctrl+A`和 `Ctrl+X`(光标下的数字加/减)。 - **2010-08-30:** 将页面移至 kate-editor.org。 - **2010-09-10:** 修复了逗号文本对象上的文本并进行了一些格式修复 - **2021-02-03:** 将key-binding表转换为hugo Markdown。