大部分的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. UIImagePickerController按钮的中文问题

    UIImagePickerController按钮的中文问题 执行以下两步即可 1. 在targets中设置region为China 2. 在project中添加支持中文  

  2. 电脑技巧——DOS和windows的区别?

    本质:都是微软公司的操作系统,某种从程度上说windows是dos的后续操作系统版本.只是windows相比dos有质的飞跃.dos只支持命令操作,windows则有了良好的图形操作界面,window ...

  3. IKVM.NET入门(1)

    IKVM.NET是一个针对Mono和微软.net框架的java实现,其设计目的是在.NET平台上运行java程序.本文将比较详细的介绍这个工具的原理.使用入门(如何java应用转换为.NET应用.如何 ...

  4. python第十九课——random模块中的常用函数

    1.random():返回一个[0,1)的随机浮点数(双精度浮点数) 2.uniform(a,b): 返回[a,b]之间的一个随机浮点数(双精度浮点数) [注意]a和b接受的数据大小随意 例如:3.r ...

  5. BZOJ3786:星系探索(Splay,括号序)

    Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...

  6. 利用Python实现12306爬虫--查票

    在上一篇文章(http://www.cnblogs.com/fangtaoa/p/8321449.html)中,我们实现了12306爬虫的登录功能,接下来,我们就来实现查票的功能. 其实实现查票的功能 ...

  7. JVM(二)GC算法和垃圾收集器

    前言 垃圾收集器(Garbage Collection)通常被成为GC,诞生于1960年MIT的Lisp语言.上一篇介绍了Java运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈3个区域随线 ...

  8. 在handlebars.js {{#if}}条件下的逻辑运算符解决方案

    解决方案.这增加了比较运算符. Handlebars.registerHelper('ifCond', function (v1, operator, v2, options) { switch (o ...

  9. [2012山东ACM省赛] Pick apples (贪心,全然背包,枚举)

    Pick apples Time Limit: 1000MS Memory limit: 165536K 题目描写叙述 Once ago, there is a mystery yard which ...

  10. C\C++ vector 构造函数 & 析构函数

    #include <iostream> #include <vector> using namespace std; class Obj { public: Obj(void) ...