# Vi 输入模式

VI 输入模式的目标并不是完全替换掉 Vim 并支持所有 Vim 的功能。他的目标是使得文字编辑的 Vim 方法 ——以及习得的 Vim 习惯——对使用 &kappname; 文本编辑器作为它们内部编辑器的程序可用。

VI 模式的目标为和程序完美整合，在有需要的时候偏离 Vim 的行为。例如，``:w``会在 &kappname; 的 VI 模式中打开一个保存对话框。

要对所有新视图启用 VI 输入模式，打开 设置配置 &kappname;... 编辑 Vi 输入模式。在这个面板您可以设置 VI 输入模式的选项，以及定义和编辑这个模式下的按键映射。VI 输入模式也可以通过 编辑 菜单中的 VI 输入模式 选项来切换。(默认的快捷键是 Meta&Ctrl;V —— 这里 Meta 一般是 Windows 键)。

许多 Vi 模式的键盘命令是大小写敏感的，不像多数 &kde; 键盘快捷方式。也就是说，`y` 和 `Y` 是不同的命令。要输入 `y` (复制) 命令，请确认 Caps Lock 被关闭，然后按下 Y。要输入 `Y` (复制整行) 命令，&Shift;Y。

这对使用 &Ctrl; 键的命令不适用，它们无论 Caps Lock 的状态为何以及 &Shift; 是否被按下都可以被输入。但是，有些命令需要先使用一个 &Ctrl;-按键 的组合，再输入一个其它按键，这些是大小写敏感的。例如，要输入 &Ctrl;W，`h` (切换到右边的分割视图)，首先确保 Caps Lock 处于关闭状态，再按下 &Ctrl;W，随后松开，再按下 H。

### 与 Vim 的不兼容之处

&kappname; 的 VI 模式只有少数和 Vim 不兼容的功能 (不算缺失功能)。接下来会列出它们以及相应的原因。

- &kappname;: `U` 和 &Ctrl;R 可用于重做。

  Vim: &Ctrl;R 可用于一般重做，U 可用于撤销一行的所有最近改动。

  让 U 在 &kappname; 的模式中用作重做功能是因为默认情况下快捷方式&Ctrl;R 被用作 &kappname; 的替换功能 (查找并替换)。默认情况下，VI 模式不会覆盖 &kappname; 的快捷方式 (这可以在 设置 配置&kappname;... 编辑 Vi 输入模式 中配置)，因此重做功能也需要一个 普通的 按键。另外，`U` 命令在 Vim 中的行为并不能很好对应到 &kappname; 的内部重做系统，因此它总是很难被支持。

- &kappname;: ``print`` 显示 打印 对话框。

  Vim: ``print`` 打印选中范围的行，就像它的祖先 ed 一样。

  像 ``:print`` 这样的命令不仅在 VI 模式可用，在 普通的 &kappname; 也可以使用——因此 ``:print`` 命令会打开一个打印对话框——遵循最少意外原则，而不是模仿 Vim 的行为。

- &kappname;：`Y` 复制到行的末尾。

  Vim：`Y` 复制整行，就像 `y` `y` 一样。

  VI 的 `Y` 命令的行为实际上是个缺陷。对于修改和删除命令，`c` `c`/`d` `d` 会对当前行进行操作，而 `C`/`D` 会对从光标到行末的文字进行操作。但是，`y` `y` 和 `Y` 都会复制整行。在 &kappname; 的 VI 模式下 `Y` 会复制到行末。这在 Vim 的 文档 中被认为 更符合逻辑。

- &kappname;：`O` 和 `o` 添加 [`数量`] 个新行，并进入插入模式。

  Vim：`O` 和 `o` 开始一个新行，并且将您在离开插入模式之前插入的文字重复 [`数量`] 次。

  这么做的主要原因是见到了许多人在 vim irc 频道 (freenode 上的 #vim) 中表示自己对这个行为表示疑惑。

### 切换模式

- 普通模式 使您可以通过输入命令来浏览或编辑文档，这也是默认的模式。您可以在任意其它模式下键入 &Esc; 来回到这个模式。

- 可视模式 使您可以高亮文档中的文字。多数普通模式中的命令在此模式下也可以使用。您可以通过键入 `v` 来选择文字，或者 `V` 来选择行。

- 插入模式 使您可以直接编辑文档。您可以通过按下 `i` 或以下列出的其它几个命令来进入这个模式。

- 命令模式 调出 &kappname; 的命令行，使您可以运行许多 Vi 实现中有的命令，以及某些 &kappname; 特定的命令。想要知道关于这些命令的更多信息，请参见 advanced-editing-tools-commandline。要使用它，按下 :，输入命令，随后按下 &Enter;。

### 和 Kate 功能的集成

- 在鼠标选择文字时自动进入可视模式。它也会在使用 Kate 的选择文字功能时进入，例如“全部选中”(通过菜单，或者 &Ctrl;A。)

- Vi 标记和 Kate 书签 已整合。当在 Vi 模式中创建一个标记，一个对应的 Kate 书签也会被同时创建并出现在 书签 菜单。对应地，当一个 Kate 书签被创建时，一个对应的在 0 列的 Vi 标记也会被同时创建。

### 支持普通/可视模式命令

`a` | 进入插入模式；在光标之后附加
`A` | 进入插入模式；在行之后附加
`i` | 进入插入模式；在光标之前插入
Insert | 进入插入模式；在光标之前插入
`I` | 进入插入模式；在行的第一个非空白字符前插入
`gi` | 进入插入模式；从上次离开插入模式的位置之前开始插入
`v` | 进入可视模式；选择字符
`V` | 进入可视模式；选择行
&Ctrl;v | 进入可视模式；选择块
`gb` | 进入可视模式；再次选择上次所选
`o` | 在当前行下插入新行
`O` | 在当前行上方插入新行
`J` | 连接多行
`c` | 修改：附加一个移动操作来删除所经之处并进入插入模式
`C` | 修改到行末：删除到行末并进入插入模式
`cc` | 修改整行：删除行并进入插入模式
`s` | 替换字符
`S` | 替换整行
`dd` | 删除整行
`d` | 附加一个移动操作来删除所经之处
`D` | 删除到行末尾
`x` | 删除光标右面的字符
删除 | 删除光标右面的字符
`X` | 删除光标左面的字符
`gu` | 附加一个移动操作，将所经之处变为小写
`guu` | 将当前行变为小写
`gU` | 附加一个移动操作，将所经之处变为大写
`gUU` | 将当前行变为大写
`y` | 附加一个移动操作，yank (复制) 所经之处
`yy` | Yank (复制) 行
`Y` | Yank (复制) 行
`p` | 在光标后粘贴
`P` | 在光标前粘贴
`]p` | 在光标之后粘贴并缩进
`[p` | 在光标之前粘贴并缩进
`r` | 附加一个字符，将光标下的字符替换为它
`R` | 进入替换模式
`:` | 进入命令模式
`/` | 查找
`u` | 悔棋
&Ctrl;R | 重下
`U` | 重下
`m` | 设置标记 (能在之后用于移动)
`n` | 查找下一个
`N` | 查找上一个
`>>` | 缩进行
`<<` | 减少缩进行
`>` | 缩进多行
`<` | 减少缩进多行
&Ctrl;F | 下一页
&Ctrl;B | 上一页
`ga` | 输出字符的 ASCII 值
`.` | 重复上次变更
`==` | 对齐行
`=` | 对齐多行
`~` | 改变当前字符的大小写
&Ctrl;S | 水平分割视图
&Ctrl;V | 垂直分割视图
&Ctrl; W, `w` | 切换到下一个分割的窗口
&Ctrl; W, `h` &Ctrl; W 左 | 移动到左边的分割窗口
&Ctrl; W, `l` &Ctrl; W 右 | 移动到右边的分割窗口
&Ctrl; W, `k` &Ctrl; W 上 | 移动到上边的分割窗口
&Ctrl; W, `j` &Ctrl; W 下 | 移动到下边的分割窗口

### 支持的移动

这些可用于在普通模式或可视模式时在文档中移动，或者和以上命令配合使用。它们前面可以附带一个数量，用于表示要进行多少次这样的移动。

`h` | 左
左 | 左
&Backspace; | 左
`j` | 下
下 | 下
`k` | 上
上 | 上
`l` | 右
右 | 右
间距 | 右
`$` | 行尾
End | 行尾
`0` | 行的首字符 (列0)
Home | 行的首字符
`^` | 行的第一个非空白字符
`f` | 跟随一个字符，移动到该字符右边
`F` | 跟随一个字符，移动到该字符左边
`t` | 跟随一个字符，移动到它位于光标右边，将光标置于它前面的字符
`T` | 跟随一个字符，移动到它位于光标左边，将光标置于它之前的字符
`gg` | 到第一行
`G` | 到最后一行
`w` | 到下一个词
`W` | 到下一个用空格分隔的词
`b` | 到上一个词
`B` | 到上一个用空格分隔的词
`e` | 到词最后
`E` | 到词结尾，词以空格分隔
`ge` | 到上一个词末尾
`gE` | 到上一个用空格分隔的词的末尾
`|` | 附加一个列号来移动到那个列
`%` | 附加一个项目来移动到那个项目
``` | 标记
`‘` | 标记所在行的第一个非空白字符
`[[` | 上一个左括号
`]]` | 下一个左括号
`[]` | 上一个右括号
`][` | 下一个右括号
&Ctrl;I | 向前跳到下一个位置
&Ctrl;O | 向后跳到前一个位置
`H` | 跳到屏幕上的第一行
`M` | 跳到屏幕上的中间行
`L` | 跳到屏幕上的最后一行
`%`百分比`` | 跳到文档的指定百分比处
`gk` | 上移一可视行 (当使用动态换行时)
`gj` | 下移一可视行 (当使用动态换行时)
&Ctrl;左 | 左移一个单词
&Ctrl;右 | 右移一个单词

### 支持的文字对象

这些可以用来选择文档的一部分。

`iw` | 内部词：包括空白的词
`aw` | 单个词：不包括空白的词
`i"` | 上一个双引号 (`"`) 到下一个双引号，包括引号
`a”` | 上一个双引号 (`"`) 到下一个双引号，不包括引号
`i'` | 上一个单引号 (`'`) 到下一个单引号，包括引号
`a'` | 上一个单引号 (`'`) 到下一个单引号，不包括引号
`i(` | 上一个左括号“`(`”到下一个右括号“`)`”，包括括号本身
`a(` | 上一个左括号“`(`”到下一个右括号“`)`”，不包括括号本身
`i[` | 上一个左方括号 (`[`) 到下一个右方括号 (`]`)，包括括号本身
`a[` | 上一个左方括号 (`[`) 到下一个右方括号 (`]`)，不包括括号本身
`i{` | 上一个左大括号 (`{`) 到下一个右大括号 (`}`)，包括括号本身
`a{` | 上一个左大括号 (`{`) 到下一个右大括号 (`}`)，不包括括号本身
`i<` | 上一个左尖括号 (`<`) 到下一个右尖括号 (`>`)，包括括号本身
`a<` | 上一个左尖括号 (`<`) 到下一个右方括号 (`>`)，不包括括号本身
`i`` | 上一个反引号 (```) 到下一个反引号，包括引号本身
`a`` | 上一个反引号 (```) 到下一个反引号，不包括引号本身

### 支持的插入模式命令

&Ctrl;D | 减少缩进
&Ctrl;T | 缩进
&Ctrl;E | 在下方插入
&Ctrl;Y | 删除词
&Ctrl;W | 删除词
&Ctrl;U | 删除整行
&Ctrl;J | 新行
&Ctrl;H | 反向删除字符
&Ctrl;Home | 回到文档的第一个字符
&Ctrl;R `n` | 插入寄存器 `n` 的内容
&Ctrl;O, `命令` | 进入普通模式，仅限一个命令
&Ctrl;A | 增加当前选中的数字
&Ctrl;X | 减少当前选中的数字

### 逗号文本对象

这个对象在 Vim 中不存在。逗号文本对象让修改类似 C 的语言中的参数列表以及其它逗号分隔的列表变得容易。它基本就是两个逗号之间的区域，或者逗号和括号之间的区域。在样例显示的行中，这个文本对象能够覆盖的三个范围已被高亮显示。

逗号文本对象样例 逗号文本对象样例

逗号文本对象范围。比如如果光标在 `arg2` 上，输入 `ci`，(改变到逗号内部) 会删除 `double arg2` 并将光标以插入模式置于两个逗号之间。这是一种很方便地修改函数参数的方法。

### 缺失的功能

如前所述，&kappname; VI 模式的目标并不是要支持 Vim 100% 的功能。