Emacs:神的编辑器
Vim:编辑器之神
Vim它的最大特色是完全使用键盘命令进行编辑,脱离了鼠标操作虽然使得入门变得困难,但上手之后键盘流的各种巧妙组合操作却能带来极为大幅的效率提升。
Vim的入门学习曲线陡峭,需要记住很多按键组合和命令,如今被看作是高手、Geek们专用的编辑器(装逼必备神器)。
而本文,只讨论Vim以及常用的一些命令总结(主要是为了自己方便使用而记录)
Vim是Vi最受欢迎的变种之一,除了继承了Vi迅捷的编辑方式, Vim的功能已经比原始的Vi强大得多。这也得益于它可以用Vim脚本无限地扩展。 Vim.org 上已经有数千个脚本了,给Vim增加各种各样的特性和功能。
说明
本文只会记录一些常用的命令,能够满足我们平时大部分时候使用Vim,但是并不让你成为专家水平,毕竟我们还是使用为主,我也并不是专业运维,不需要那么厉害的技能,哈哈~~
Vim的四种模式
vim --version:用来查看vim的版本(当前最通用的为7.x版本。8.x版本为最新版本)
四大模式
正常模式 (Normal-mode)
启动vim后默认处理该模式。任意模式下,按下Esc键都会进入此模式
插入模式 (Insert-mode)
正常模式下:按i I a A(左侧、行首、右侧、行位),就进入插入(编辑)模式
命令模式 (Command-mode)
正常模式下:按下:(英文冒号)键,会进入命令模式。这里就可以输入一系列的命令了,这是最强大的地方。常用的有保存退出:
:wq!:强制保存和退出
:w:保存但不退出
:q!:不保存文件,强制退出
可视模式 (Visual-mode) 块选择模式
正常模式下:按下v, V, +v,可以进入可视模式。可视模式中的操作有点像拿鼠标进行操作,选择文本的时候有一种鼠标选择的即视感,有时候会很方便。(再按一下退出到正常模式(或者按两次Esc))。选中后就可以用“编辑模式”的命令操作了:
d :删除 y:复制 p:粘贴
常用命令(正常模式下)
gg:跳到文首 G:跳至文尾(nG定位到指定的行)
0/$ 和 Home/End:效果一样 跳到行首/行尾
w:跳到下一个字首(比移动光标快一点)
翻页相关:半页 ctrl-d ctlr-u(d=down u=up) 整页 ctrl-f ctrl-b(f=forword,b=backward)
调整屏幕位置(使用较少):zz 让光标所的行居屏幕中央 zt 让光标所杂的行居屏幕最上一行 t=top zb 让光标所杂的行居屏幕最下一行 b=bottom
撤销和恢复:u 撤销 ctrl+r 恢复上一次操作
删除(剪切):dd 删除一行 dw删除一个单词 删除多行:3dd 下同(复制多行原理一样)
复制:yy复制一行 yw复制一个单词 复制多行同上
粘贴:p 当前光标行下粘贴 P 当前行上粘贴
移动整行:<< >> == 光标所在行向左、向右移动一个tab的距离
重复上一步操作:. 这是小数点键
常用命令(命令模式下)
临时显示行号::set number(永久请改配置文件) 简写:set nu
取消行号显示::set nonumber 简写::set nonu
/word或者?/word:向下向上查找指定单词,并且高亮显示出来
n N:重复查找动作(下一个 和 上一个)
取消高亮::noh
文件另存为并退出当前文件::wq! newFileName
多文件编辑、多窗口编辑
多文件编辑
场景:你需要把一个文件的内容复制到另外一个文件,如何做?
答曰:打开2个shell窗口,然后Command + C ; Command + P(原理其实是借用了OS的剪贴板功能)
这样显然是能达到效果的。但稍微麻烦点嘛。显得也不是那么的高级
如果我只想用命令来呢?比如10yy,然后p可以么?不可以的,因为每个vim都是独立的。
那么我们可以这么做:一次性就打开两个文件,然后就可以自由的复制了(因为还是一个vim嘛)
vim file1 file2 file3…可以同时打开多个文件
查看打开的文件::files 可以查看当前vim打开的文件们
文件之间跳转:命令行模式中,:n :N表示上一个、下一个文件
继续再打开一个文件:命令行模式中 :e newfile
这样我们在同一Vim窗口打开了多个文件,就医随意的使用yy p等命令咯
多窗口编辑
加入你的一个文件很长,然后表头信息你又想一直看到怎么办。这个时候多窗口编辑,就能很好的实现效果了。比如这个文件的前10行放在一个窗口,另外一个窗口放其余的(也达到类似excel冻结窗口表头的功效)
切割::sp 横向 :vs 竖向 :sp newfile 就会把newfile在新编辑窗口打开。否则还是打开当前文件 【sp:split page】
快速窗口间切换:ctrl+w(两次) 可以依次切换窗口 若要指定顺序(此处先不做记录了)
文本替换(使用较多) [:[range]s/from/to/[flags]]
flags解释:
无 : 只对指定范围内的第一个匹配项进行替换。
g : 对指定范围内的所有匹配项进行替换。
c : 在替换前请求用户确认。
e : 忽略执行过程中的错误。
替换当前行内容 [:s/from/to/]
[:s/from/to/] : 将当前行中的第一个from,替换成to。如果当前行含有多个from,则只会替换其中的第一个。
[:s/from/to/g]:将当前行中的所有from都替换成to。
[:s/from/to/g]:将当前行中的所有from都替换成to,但是每一次替换之前都会询问请求用户确认此操作。
注意:这里的from和to都可以是任何字符串,其中from还可以是正则表达式。
替换指定行的内容 [:33s/from/to/g]
:.s/from/to/g : 在当前行进行替换操作
:33s/from/to/g : 在第33行进行替换操作。
:$s/from/to/g : 在最后一行进行替换操作。
替换所有行的内容 [:%s/from/to/g]
:%s/from/to/g : 对所有行的内容进行替换。
一些特殊替换的应用
在行首插入:【:%s/^/your_word/】
在行尾插入:【:%s/$/your_word/】
多行变一行:【:0,$s/\n/ /】
多行变一行,中间加入逗号分隔:【:0,$s/\n/,/】
最后
学习命令没任何技巧,只有一句良言:熟能生巧