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

菜鸟vimer成长记——第2.3章、insert模式的更多相关文章

  1. 菜鸟vimer成长记——第2.0章、模式初探

    首先,其他的文本编辑器只有一种模式,就是插入模式.而vim一下子颠覆了我们的世界观——有好多模式.这个是思维上的切换,很难也很重要!!! 其次,Vim 提供一个区分模式的用户界面.也就是说在不同的模式 ...

  2. 菜鸟vimer成长记——第2.4章、cmd-line模式

    cmd-line模式又有3个类型:Ex 命令(ex commands).查找模式(Search patterns).Filter 命令(Filter commands).本文主要重点的是Ex 命令和S ...

  3. 菜鸟vimer成长记——第2.1章、normal模式

    目的 掌握normal模式下常用操作的语法和概念,这些操作对应的应用场景以及实用技巧. 通过normal模式举一反三掌握cmd-line和visual的常用文本操作. 简介 文本操作的理想状态为:一个 ...

  4. 菜鸟vimer成长记——第4.2章、编程插件

    简介 这部分的插件是与编程相关的插件.主要涉及两大块:所有编程语言通用的插件,以及各个语言独有的插件.插件的数量和合理性,这可能是一个不断累积和修正的过程. 个人感觉,现在比较适合sh,html,ma ...

  5. 菜鸟vimer成长记——第4.1章、通用插件

    简介 关于插件的分类,此系列只会简单的区分为通用插件和编程插件.通用插件的意思是,不基于任何编程语言都可以使用的插件.编程插件,是针对于编程习惯,或者说是针对于某种语言的插件. 计划中,是先把基本常用 ...

  6. 菜鸟vimer成长记——第4.0章、Vim插件管理利器-Vundle

    定义 Vundle是vim bunler和简称,它是一个vim插件管理器. Vim本身缺乏对插件的有效管理,安装插件并配置.vimrc文件非常不便.gmarik受到Ruby的bunler的启发,开发了 ...

  7. 菜鸟vimer成长记——第2.2章、visual模式

    vi是没有可视模式的.然而大多数编辑软件都都是有可视模式.所以我猜测vim是几乎迫于无奈才有了visual模式. 个人建议,能不用就不用.这样能直接在头脑里处理好文本,锻炼文本处理能力,同时能转变过来 ...

  8. 菜鸟vimer成长记——目录

    菜鸟vimer成长记——第0章.我眼中的vim学习 菜鸟vimer成长记——第1章.统一概念 菜鸟vimer成长记——第2.0章.模式初探 菜鸟vimer成长记——第2.1章.normal模式 菜鸟v ...

  9. 菜鸟vimer成长记——第0章、我眼中的vim学习

    这是一系统总结vim的学习文章,记录我自己学习vim的过程和感悟.与此同时也想分享出来给大家,欢迎大家互相讨论和学习. 在这里假设你们对vim已经有了一些基本的认识或者说已经使用过几个月的vim.该系 ...

随机推荐

  1. wxpython 编程触发菜单或按钮事件

    最近逐步熟悉wxpython,编写了几个小小功能的GUI程序,GUI中免不了会有在代码中触发控件事件的业务需求.在其他Gui界面的语言中有postevent.triggerevent 调用事件名称的函 ...

  2. matlab操作(整理)

    http://blog.csdn.net/ysuncn/article/details/1741828 http://zhan.renren.com/h5/entry/3602888498000464 ...

  3. (转)Matlab矩阵的简单操作

    转自:http://blog.sina.com.cn/s/blog_6264e23a0100veeq.html

  4. EntityFramework Code First便捷工具——数据迁移

    使用EntityFramework Code First开发,数据迁移是一个不得不提的技术. 在我们的开发过程中,难免需要对模型进行改进,模型改进后,会导致实体集与数据库不一致,当然我们可以通过删除数 ...

  5. September 25th 2017 Week 39th Monday

    No man is rich enough to buy back his own past. 没有人富有到可以赎回自己的过去. Those rich are not willing to buy b ...

  6. September 05th 2017 Week 36th Tuesday

    I always in the deepest despair, meet the most beautiful sunrise. 我总是在最深的绝望里遇见最美丽的惊喜. Some pessimist ...

  7. November 6th 2016 Week 46th Sunday

    The starting point of all achievements is desire. 成功的第一步是渴望. Those who make great achievements are o ...

  8. JDK1.6在LINUX下的安装配置[转]

    JDK1.6在LINUX下的安装是如何进行的呢,让我们开始我们的演示: Ubuntu Linux下jdk的安装与配置 1.JDK1.6安装准备 从sun公司网站www.sun.com下载linux版本 ...

  9. Day7 访问权限

    构造者模式思想 进行初始化,解决了多个构造器重载,构造器参数过多记不住的情况. package day7;//声明一个程序包 class Employee{ private String name; ...

  10. 下拉控件jQuery插件

    由于后端开发需要一个下拉控件,能输入,能选择,于是自己写了一个 ;(function($,window,document,undefined){ function Select(el,opt){ th ...