大部分的Vim 命令都在非插入模式中执行,不过有些功能在插入模式中会更好实现些。
如果没有输入当前文件不存在的新文本的需求时,建议通过其他模式来操作完成。
目的
掌握inser模式下常用操作的语法和概念
光标移动
移动光标的位置,这些操作和其他的编辑器基本一致。列几个常用的,其他的不一一列举。
常用语法:
操作 | 用途 |
---|---|
Ctrl+Left | 向后移动一个单词 |
Ctrl+Right | 向前移动一个单词 |
Home | 移动到行首 |
End | 移动到行尾 |
Ctrl+Home | 移动到文件第一行 |
Ctrl+End | 移动到文件最后一行 |
PageUp | 向上一屏 |
PageDown | 向下一屏 |
详情查看:h ins-special-special
更正错误
在输入的时候,难免会输错。怎么更快速的更正这些错误呢?
情景一:在输入时打错
我们可以用退格键删除错误的文本,然后再输入正确的内容。如果出错的地方靠近单词结尾,这或许是最快的修正方式。 情景二:出错的位置在单词开头
专业打字员会建议先删除整个单词,然后再重新输入一遍。如果你能以每分钟超过60 个单词的速度输入,那么重新输入一个词只需要1 秒钟的时间。即便你打不了这么快,最好也采用这种方式。我以前总是输错某些特定的词,但自从采纳这一建议后,我就更清楚地意识到哪些词会让我犯错,因此现在犯的错也少了很多。
另外,你也可以切换到普通模式,然后跳到这个词的开头并更正错误,再按 A 返回刚才的位置。不过完成这一套动作要花的时间可能不止1 秒钟,并且它也无助于提高你的盲打技巧。虽然说我们可以切换模式,不过这并不意味着一定就得切换。
所以删除错误并且重新输入是最佳方法。
删除时有如下对应的快捷键操作:
操作 | 用途 |
---|---|
Ctrl+h | 删除前一个字符(同退格键) |
Del | 删除后一个字符。很少用 |
Ctrl+W | 删除前一个单词 |
Ctrl+U | 删除到行首 |
注意事项:
- 这几个删除在shell以及cmd-line一样可以使用。
插入现有文本
如果是当前没有的文本,通过键盘录入即可插入到当前光标。如果是是当前现有的文本到,可以通过多种途径插入当前光标。
这些途径如下:
上下行
复制光标处在位置的上下行字符。每次操作一次复制一个字符。
语法:
操作 | 用途 |
---|---|
Ctrl+E | 复制下一行光标位置的字符到当前光标 |
Ctrl+Y | 复制上一行光标位置的字符到当前光标 |
上一次
复制上一次进入insert模式插入的内容。
语法:
操作 | 用途 |
---|---|
Ctrl+A | 复制上一次进入insert模式插入的内容。 |
Ctrl+o | 复制上一次进入insert模式插入的内容,并且退到normal模式 |
寄存器
复制寄存器里的内容。
语法:CTRL-R {0-9a-z"%#*+:.-=}
注意事项:
- 查看所有寄存器的方法:reg
- 在normal模式中使用put {0-9a-z"%#*+:.-=},可以实现黏贴。
在本文顺便介绍一下寄存器的类型。请注意:下面寄存器的名称开头都会多加一个"(双引号)。详细查看:h registers
无名(unnamed)寄存器
"",缓存最后一次操作内容;
数字(numbered)寄存器
"0 ~ "9,缓存最近操作内容,复制与删除有别。
- "0寄存器缓存最近一次复制的内容。
- "1-"9缓存最近9次行删除内容
行内删除(small delete)寄存器
"-,缓存行内删除内容
具名(named)寄存器
"a ~ "z或"A - "0Z,指定时可用;
定义一个具名寄存器的语法:在normal模式下"{name}y{motion}。这个输入可以注意右下角,会有对应的输入提示。
只读(read-only)寄存器
寄存器 | 代表的内容 |
---|---|
": | 最近cmd-line模式执行的命令 |
". | 上次进入插入模式插入的文本 |
"% | 当前文件名 |
"# | 上一个轮换文件名。 |
表达式(expression)寄存器
"=,只读,用于执行表达式命令;
例如:
#假设我们刚输入完下列内容,我们想算一下总价然后再输入
chairs, each costing $, totals $
#只要输入<C-r>=6*35<CR>就可以得到结果
选择及拖拽(selection and drop)寄存器
"*, "+, "~,存取GUI选择文本,可用于与外部应用交互,使用前提为系统剪切板(clipboard)可用;
其他的命令只在vim里才有效。
黑洞(black hole)寄存器
"_,不缓存操作内容(干净删除);
删除文本却不想覆盖无名寄存器中的内容时,此命令很管用。
模式寄存器(last search pattern)
"/,缓存最近的搜索模式。
自动提示
语法:
命令 | 补全类型 |
---|---|
<C-n> | 普通关键字 |
<C-x><C-n> | 当前缓冲区关键字 |
<C-x><C-i> | 包含文件关键字 |
<C-x><C-]> | 标签文件关键字。??这个暂时放到后面,可能单开一个文章来说明。 |
<C-x><C-k> | 字典查找 |
<C-x><C-l> | 整行补全 |
<C-x><C-f> | 文件名补全 |
<C-x><C-o> | 全能(Omni)补全 |
<C-x><C-s> | 拼写建议 |
<C-x><C-v> | vim命令 |
<C-x><C-d> | 补全宏。??这个暂时没有找到对应的使用方式 |
不论使用哪种自动补全命令,都会弹出式菜单。
可供弹出式菜单使用的命令:
按键操作 | 作用 |
---|---|
<C-n> | 使用来自补全列表的下一个匹配项(next 匹配项 |
<C-p> | 使用来自补全列表的上一个匹配项(previous 匹配项) |
<Down> | 选择来自补全列表的下一个匹配项 |
<Up> | 选择来自补全列表的上一个匹配项 |
<C-y> | 确认使用当前选中的匹配项(yes) |
<C-e> | 还原最早输入的文本(从自动补全中exit) |
<C-h> (与<BS>) | 从当前匹配项中删除一个字符 |
<C-l> | 从当前匹配项中增加一个字符 |
{char} | 中止自动补全并插入字符{char} |
还有一些使用技术如下
使用字典中的单词进行自动补全
这个其实就是<C-X><C-K>
有时候,我们可能想通过自动补全功能输入某个单词,但它并没有在任何打开的缓冲区、包含文件或者标签文件中出现过。在这种情况下,可以在字典中进行查找。
为了激活该功能,我们需要为Vim 提供一份合适的单词列表。最简单的方法就是通过运行:set spell 来激活Vim 的拼写检查功能。
如果你不想激活拼写检查功能,也可以通过 ‘dictionary’ 选项来指定一个或多个含有单词列表的文件(参见:h 'dictionary' )。
当你想输入一个长单词或者很难拼写的单词时,字典自动补全也许最管用了。这里有一个例子
自动补全文件名
这个其实就是<C-X><C-F>
Vim 总是维护着一个当前工作目录,这一做法与shell 类似。在任何给定的时间点,我们都可以通过:pwd 命令(print working directory)获取到该信息,还可以通过:cd{path} 命令(change directory)随时切换工作目录。另外,Vim 的文件名自动补全功能只相对于工作目录的路径进行扩展,而不是相对于当前编辑文件的路径,理解这一点很重要。
如果补全的是非当前工作目录的文件,我们的操作有两种方式:
1、写路径的根目录,然后不断的通过<C-X><C-F>来选择补全文件名。其实我比较喜欢这种方式
2、先通过:cd{path}切换目录,然后<C-X><C-F>补全,然后通过:cd - 切回原来的目录。
根据上下文自动补全
这个其实就是<C-X><C-O>
全能补全是,它将提供一份为光标所处的上下文量身定做的补全建议列表.
实际上,该功能由专用的文件类型插件实现,因此,我们必须先加载以下配置行:
set nocompatible
filetype plugin on
Vim 的发行版本身就支持十几种语言,包括HTML、CSS、JavaScript、PHP 以及SQL。你可以通过:h compl-omni-filetypes 找到完整的列表
减少按键次数
只要和其他的快捷操作没有冲突都可以把两个操作变为一个。
建议设置如下:
缩进
语法:
操作 | 用途 |
---|---|
Ctrl+T | 插入一个缩进 |
Ctrl+D | 删除一个缩进 |
0(数字零)+Ctrl+D | 删除当前行的所有缩进 |
^+Ctrl+D | 删除当前行的所有缩进。和上面的区别暂时还没试出来?? |
缩写
缩写可以用于insert和cmd-line模式。这些命令都差不多,只是通过前缀区别。单一个字符是i的表示适合于insert模式。如果是c的表示适合于cmd-line模式。如果没写的,表示两个都可以使用。
下面仅列出都适用的列表,其他的大家对号入座
其中{lhs}表示缩写的字符串。{rhs}表示真实的字符串,这里面支持map-<expr>,map-<buffer>
操作 | 用途 |
---|---|
:ab {lhs} | 查看缩写的列表。如果不写就是所有缩写列表;如果有写就是找到匹配的列表 |
:ab {lhs} {rhs} | 定义一个缩写 |
:una {lhs} | 删除缩写列表。如果不写就是删除所有列表;如果有写就是删除匹配的列表 |
使用缩写例子
#定义了一个:ab syso System.out.println(); #列举insert模式例子,cmd-line模式是一样的。${CURSOR}代表光标位置 #能生效的缩写。
" syso{CURSOR}" #注意,syso的前面有空白文本
#此时只要继续按一下非关键字符(tab键|空格键|Enter键|Esc键等) #不能生效的缩写
" sysob{CURSOR}"
"testsyso{CURSOR}"
所以,使用缩写的方法是:缩写必须是一个完整的独立的{rhs}输入。在{rhs}输入之前,前面需要有空白文本。在{rhs}输入之后不能再有任何其他的关键字符输入。
还有一些其他的,可以细看:h Abbreviations :h map-<expr>,:h map-<buffer>
小技巧
如果是通过cmd-line设置的缩写,关闭vim后就消除了。为了可以一直使用,可以写一个常用的缩写列表文件,然后放在vimrc文件中
#vimrc文件
source $VIMRUNTIME/my/ab.vim
insert normal 模式
它能让我们执行一次普遍模式命令。在此模式中,我们可以执行一个普通模式命令,执行完后,马上就又返回到插入模式。
语法:
Ctrl+o
例如:
场景:在当前行正好处于窗口顶部或底部时,有时我会滚动一下屏幕,以便看到更多的上下文。
用zz 命令可以重绘屏幕,并把当前行显示在窗口正中,这样就能够阅读当前行之上及之下的半屏内容。我常常会键入<C-o>zz,在插入-普通模式中触发这条命令。此操作完成后就会直接回到插入模式,因此我可以不受中断地继续打字。