Vim入门技巧

Vim入门技巧

命令”.”:可以让我们重复上次的修改

在普通模式下执行”x”删除光标所在字符、”dd”删除光标所在行、” > G “增加从当前行到文档末尾处的缩进层级等命令都可以接”.”来重复操作,另外如果担心操作失误,可以使用”u”撤销上次操作,”$”命令可以将光标移动到行末尾,”j”光标下移一行,”k”光标上移动一行,”^”光标移动到行首,’o’当前行的下一行插入空行
比如:如果要在每行结尾加上”;”操作的时候,可以使用”j$.”就够了
其实还可以更加简洁,”a”为在当前光标位置后面附加内容,而”A”为行末尾附加内容,相当于”$a”复合键

还有一些复合键 :
C c$:清楚当前光标到行末尾字符
“s cl” :清除当前光标字符,并且进入插入模式
“I ^i” :在行首位置进入插入模式
“O ko” :当前行上面新增一行 (“o” 当前行下新增一行)

“;” 命令会重复查找上次 “f “命令所查找的字符,原理和”.”类似
“u”用来撤销”.”所做操作,”,”用来撤销”;”所做操作

可重复的操作以及回退的方式


快速查找替换

“:%s/target/relace/g”: 所有本文中target替换为replace,其中/g 为末尾的意思,%为从头开始替换
“*”命令可以选中光标所在字符的单词,并且进入查找模式,使用”n”继续查找下一个匹配项,N查找上一个出现的s,”cw”清楚单词并且进入插入模式,/s向下查找字符串s,输入?s向上查找字符串s,输入*向下寻找游标所在处的单词,#向上寻找游标所在处的单词


重复删除

b 可以将光标从单词末尾移动到单词开始的地方, 组合键dbx可以删除整个单词,反向删除。组合键bdw也可以删除整个单词,属于正向删除,这两命令都是先移动光标然后删除,两步操作导致使用.命令做重复的事情的时候会出现问题,daw删除整个单词,可以理解为”delete a word”,一步就好,而且可以用.做重复操作,并不会紊乱,推荐使用。


快速修改数字

yy 复制当前行, p粘贴,dd 删除当前行
{count}Ctrl-x 会修改当前光标上或者后第一个数字,将原值减去count,而{count}Ctrl-a与之类似,结果不同,原值加上count,note:vim默认会把以0开头的数字当成八进制值,加减法遵循八进制,这点特别需要注意,可以使用set nrformats=来设置进制


操作符+动作命令 = 操作

比如:d{motion}, dl:删除一个字符,daw:删除完整单词,dap:删除整个段落,
c{motion}y{motion}等,还有一些操作符是两个按键的,比如gU:转换为大写、gu:转换为小写、g~:相反转换,因此存在gUaw:把当前单词转换为大写,gUap:当前段落转换为大写。
Notes: Vim 的语法只有一条额外规则,即当一个操作符命令被连续调用两次时,它会作用于当前行。所以 dd 删除当前行,而 >> 缩进当前行。 gU 命令是一种特殊情况,我们既可以用 gUgU ,也可以用简化版的 gUU 来使它作用于当前行。


插入模式纠正手误?

使用backspace吗?可以,但是速度很慢,vim内置很多插入模式也可以使用的组合命,Ctrl+h :删除前一个字符等,Ctrl+w:删除前一个单词,Ctrl+u:删除至行首.


插入模式回到普通模式快速的方法?

Ctrl+o : 切换到插入-普通模式,这个模式下,可以执行一次命令,然后回到插入模式,比如用 zz 命令可以重绘屏幕,并把当前行显示在窗口正中,这样就能够阅读当
前行之上及之下的半屏内容。使用Ctrl+o zz命令键当前屏幕重绘,当前行在屏幕中间。

重新映射大小写转换键(Caps Lock): 对 Vim 用户而言,大小写转换键是一个威胁。如果大小写转换键处于大写模式,而你尝试用 k 或 j 去移动光标,那么你触发的将会是 K 和 J 命令。简单地讲, K 命令用于查看处于光标之下的那个单词的手册页(参见:h K ),而 J 命令则用来把当前行和下一行连接在一起(参见:h J )。也就是说,如果你不小心切换到了大写模式,你将会惊讶地发现,缓冲区的内容怎么这么快就乱掉了!很多 Vim用户都会重新映射大小写转换键,把它当成另外一个键用,比方说 <Esc><Ctrl>,在现代键盘上, <Esc> 键很难够得到,而大小写转换键却很方便。把大小写转换键映射成 \<Esc> 键可以省很多力气,尤其是 Vim 对 \<Esc> 键用得这么频繁。不过我更喜欢把大小写转换键映射为<Ctrl> 键。 <C-[> 的功用和 <Esc> 键相同,如果 <Ctrl> 键触手可及,那么这一组合键输入起来也会很容易。另外,不管是在 Vim 中还是在其他程序中,很多快捷键也都会用到 <Ctrl>。要重新映射大小写转换键,最简单的方法是在操作系统级别进行映射。不过对于OS X、 Linux 及 Windows 来说,其映射方法各不相同。因此,我不会在这儿重复每种系统的映射方法,而是建议你用 Google 搜索一下。注意,这一定制不仅会影响 Vim,还会作用于整个系统。不过,如果你照我的建议做,你将会永远忘掉大小写转换键,我保证你不会怀念它。


插入模式自动运算

可以使用=符号指明使用表达式寄存器,在插入模式中,输入Ctrl+r =,然后输入要执行的脚本比如3*10,回车后结果将会计算出来并写入文档中当前位置


替换模式replace mode–特殊插入模式

R :可以由普通模式进入替换模式,如果键盘上由insert按键,那么可以使用它在插入模式和替换模式之间转换。 另外还有一个虚拟替换模式:gR,替换的时候只会单个字符逐一替换,比如制表符代表8个字符宽度,那么替换模式会一个字符将制表符8宽度全部替换,虚拟替换模式只会替换其中一个。


可视模式 选择模式

v进入可视模式,Ctrl+g可以在切换为选择模式,可视模式下按键viw选中当前单词,接着使用c清除,在选择模式,选中的字符后,输入任何字符都删除之前选中并替换 o: 可以切换选中块的前后移动光标



优先使用普通模式,而不是可视模式命令

it 命令是一种被称为文本对象(text object)的特殊动作命令
可视模式下的U命令有一个等效的普通模式命令:gU{motion}
比如在可视模式下:

重复按下j.后:

但是在普通模式下就没有这个问题:

使用面向列快模式编辑表格或者其他列相同内容



在长短不一的高亮块后添加文本

Vim 对“i”及“a”键的约定: Vim 对于从普通模式切换到插入模式的命令有几个约定, i 命令和 a 命令都完成此切换,并分别把光标置于当前字符之前或之后, I 命令和 A 命令的表现类似,只是它们分别把光标置于当前行的开头和结尾。


命令行模式

一些主要的编辑文本的Ex命令

文件迅速跳转

普通模式下:gg : 跳转到文件头, Shift+g: 跳转到文件末尾, 行数+gg: 跳转到指定行,例跳转到123行:123gg
命令行模式下 :p或者print 打印当前行

如果输入一条只包含数字的Ex 命令,那么 Vim 会把这个数字解析成一个地址,并把光标移动到该数字所指定的行上。

.为当前行,$末尾行,%所有行,因此:%p为打印所有行内容,他跟1,%效果同,.,$当前行道末尾行,还有substitute替换命令,:%s/programer/coder讲当前文件有所有行中内容替换,可以用偏移对地址进行修正,比如加一减一等,/<html>/+1,/<\/html>/-1p打印不包括模式匹配的中间所有行,:.,.+2p打印当前行当前行开始的3行内容,另外 '<代表高亮区域的开头行,'>代表高亮区域的最后一行


命令行下复制copy和剪切move

:copy可以简写为:co或者:t,命令格式为::[range]copy{address}

上表中,也可以将 yyp 变化一下来复制我们想要的行,但不管怎样,这都需要一些额外的移动动作。我们得先跳到想复制的行上(6G),复制该行(yy),快速跳回原先的位置(<C-o>),然后再用粘贴命令(p)创建一个副本。由此可见,在复制距离较远的行时, :t 命令通常更加高效。

:m命令用来移动内容,就是剪切。是:move的简写,命令格式与copy
:normal命令用来对整个范式范围内的所有行执行同样命令。比如::'<,'>normal .对整个高亮区域执行重复指令 .,:%normal A; 对所有行都执行A;命令即行尾加上分号。


命令行窗口

q/ : 打开查找命令历史的命令行窗口, q: 打开 Ex 命令历史的命令行窗口,注意和:q的区别, <Ctrl-f> 从命令行模式切换到命令行窗口,按下回车键即可从命令行窗口回到普通模式
你用命令行窗口可以将定制多个复杂组合命令 ,以|分割。


运行shell命令

执行外部命令的格式为:!%代表当前问价,加入正在编辑py文件,想要立即执行看效果,执行:!python %.
:!{cmd} :这种语法适用于执行一次性命令,但是如果想在 shell 中执行几条命令要怎么做?对这种情况,可以执行 Vim 的 :shell 命令来启动一个交互的 shell 会话,用 exit 命令可以退出此 shell 并返回 Vim。

另外可以执行Ctrl+z将挂起Vim所属进程,并把控制权还给bash,你用jobs命令查看当前后端作业列表,然后使用fg 唤醒进程。操作起来比shell、exit方便许多

当给定一个范围时, :!{cmd} 命令就具有了不同的含义。由[range]所指定的行会传给{cmd}作为标准输入,然后又会用 {cmd} 的输出覆盖[range]内原本的内容。换一种说法就是[range] 内的文本会被指定的 {cmd} 进行过滤。 Vim 把过滤器定义为“一个由标准输入读取文本,并对其进行某种形式的修改后输出到标准输出的程序”.

用 -t’,’ 参数告诉sort 命令,这些记录以逗号分隔,然后再用 -k2 参数指定按第二个字段进行排序。




管理隐藏缓冲区

当vim打开命令时,指定了多个文件,那么将会载入多个缓冲区。对于指定打开文件的方法,vim *.txt只会打开当前文件路径下的txt文件,不会递归子文件夹,vim */*.txt类似于前一个只会打开一级目录下的所有txt文件,vim **/*.txt这样就可以打开当前目录路径下所有的txt,包括所有子路径。
使用:ls命令可以查看当前打开了那些缓冲区,%当前屏幕显示的缓冲区,#将会轮换的缓冲区,轮换的命令为Ctrl+ ^, a,标识活动缓冲区,h标识隐藏缓冲区,+标识有修改

当想要退出vim多个缓冲区时,可以使用如下命令:

:argdo {cmd}同时对所有缓冲区实行相同改的命令


工作区切分成窗口

Ctrl+w s水平切分, Ctrl+w v垂直切分 新生成的两个窗口都会显示与原窗口相同的缓冲区,当前新窗口中执行:edit {filename}就可以载入新的缓冲区,或者


切换窗口

关闭窗口

改变窗口大小


更快的跳转




上面的命令都是基于单词的移动,当然也有基于字符串的移动,字母大写表示基于单词的移动


更快的查找

f{char} 在当前行查找字符{char}


One thought on “Vim入门技巧

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax