菜鸟vimer成长记——第2.3章、insert模式

时间:2021-10-14 15:06:58

大部分的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一样可以使用。

插入现有文本

  如果是当前没有的文本,通过键盘录入即可插入到当前光标。如果是是当前现有的文本到,可以通过多种途径插入当前光标。

  这些途径如下:

上下行

  复制光标处在位置的上下行字符。每次操作一次复制一个字符。

  菜鸟vimer成长记——第2.3章、insert模式

  语法:

操作 用途
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' )。

  当你想输入一个长单词或者很难拼写的单词时,字典自动补全也许最管用了。这里有一个例子

  菜鸟vimer成长记——第2.3章、insert模式

自动补全文件名

  这个其实就是<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>

  全能补全是,它将提供一份为光标所处的上下文量身定做的补全建议列表.

  菜鸟vimer成长记——第2.3章、insert模式

  实际上,该功能由专用的文件类型插件实现,因此,我们必须先加载以下配置行:

set nocompatible
filetype plugin on

  Vim 的发行版本身就支持十几种语言,包括HTML、CSS、JavaScript、PHP 以及SQL。你可以通过:h compl-omni-filetypes 找到完整的列表

减少按键次数

  只要和其他的快捷操作没有冲突都可以把两个操作变为一个。

  建议设置如下:

  菜鸟vimer成长记——第2.3章、insert模式

缩进

  语法:

操作 用途
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,在插入-普通模式中触发这条命令。此操作完成后就会直接回到插入模式,因此我可以不受中断地继续打字。