为什么选择Vim?
- vim无所不在。学习vim无需担心到了其他平台需要学习新编辑器。
- 可扩展性。可以只用它来编辑配置文件,也可以将它当做开发平台。
- 功能强大.
Vim即语言?
动词
所谓动词指的是我们执行的动作,这些动作可以施加在名词之上。可以看看下面几个常见的动作:
- d: 删除
- c: 修改
- y: 拖拉(拷贝)
- v: 可视化选择 (V for line vs. character)
修饰语
定语用在名词之前,表明以哪种方式来执行动作。几个例子:
i: 内部
a: 周围
NUM: 数字 (e.g.: 1, 2, 10)
t: 查找到指定字符,并跳转到这个字符的前面
f: 查找到指定字符,并跳转到字符所处的位置
/: 查找字符串 (literal or regex)
名词
在英语中,名词用来表示你所操作的对象。它们都是客体。在vim中也是这样。下面列出vim中的名词:
- w: 单词
- s: 句子
- ): 句子 (另一种操作方式)
- p: 段落
- }: 段落 (另一种操作方式)
- t: 标签 ( HTML/XML)
- b: 块 (编程语言)
Nouns as motion
同样,你也可以将名词视为移动动作,这意味着你可以用名词表示在文本的跳转范围。我们可以在“移动”章节中看到例子说明。
对于下面这些符号,根据颜色的不同来区分句子的不同组成部分:
删除两个单词
d2w修改所在的句子(删除当前句子并进入插入模式)
cis拷贝当前所在的段落
yip修改当前光标所在位置到下一个括号之间的文本内容
ct<
记住,这里的“目标”是尖括号,除此之外还可以是任意字符。从语法上来说,使用单个字母”t”来表示这个向前查找的“目标”,这样我就可以使用“dt.”表示删除当前位置到下一个句号之间的内容,”yt;”表示拷贝当前位置到下一个分号之间的内容。
—些对文件的基本操作
- Vi file :使用vim打开要编辑的文件
- :w :保存修改
- :q! : 退出vim,后面加感叹号表示不保存修改强制退出
- :wq: 保存修改并退出
- :saveas ~/some/path/: 将文件保存到其他位置
【注意:相比较:wq 我更喜欢使用ZZ,因为我觉得不需要输入冒号我觉得会快一点。也可以使用:x】
ZZ: 同:wq
搜索
- /{string}: 搜索字符串
- t : 跳转到某一字符前
- F : 跳转到某一字符处
- *:搜索当前光标位置单词的其他实例
- n : 搜索完成后,跳转到下一个匹配实例
- N :搜索完成后,跳转到上一条匹配实例
- ; : 跳转到指定字符时,使用分号跳转到下一实例
- , :跳转到指定字符时,使用逗号跳转到上一实例
移动动作
- j : 向下移动一行
- k :向上移动一行
- h :向左移动一个字符
- l :向右移动一个字符
行内移动
你可以在当前行内自由的移动。
- 0: 移动到行首
- $: 移动到行末
- ^: 移动到行首非空字符
- t”: 跳转到下一个引号前
- f”: 跳转到下一个引号处
【注意: 逗号和分号会重复之前的t和f跳转】 - n+ //向下跳n行
- n- //向上跳n行
- nG //跳到行号为n的行
- G //跳至文件的底部
按单词移动
除了按行和字符移动外,还可以按单词移动:
w: 先前移动一个单词
b: 向后移动一个单词
e: 移动到当前单词末尾
当使用大写字母时,vim会忽略掉单词间的分隔符,这样原本被分隔符隔开的多个单词会因此被视为一个大单词。W: 向前移动一个大单词
B: 向后移动一个大单词
这种大写命令的优势在我们实际工作中会频繁地碰到。
按句子或段落移动
- ):向前移动一条句子
- }: 向前移动一个段落
在屏幕间移动
- H:向上移动一屏
- M:移动到屏幕中间
- L:移动到屏幕底端
- gg: 移动到文件顶端
- G:移动到文件结尾
- ^U: 向上移动半屏
- ^D: 向下移动半屏
- ^F: 下一页
- ^B: 上一页
来回跳转
在普通模式下,可以在两点间来回跳转,这在实际操作中非常有用。
- Ctrl-i: 跳转到之前所在的位置
- Ctrl-o: 跳回你实际的位置
其他动作
- :$line_numberH: 移动到指定行号
- M: 移动到屏幕中间
- L: 移动到屏幕底端
- ^E: 向上滚动一行
- ^Y: 向下滚动一行
- ^U: 向上移动半屏
- ^D: 向下移动半屏
- ^F: 向下移动一页
- ^B: 向上移动一页
现在将所以移动动作总结到一起:
移动命令总结
j: move down one line
k: move up one line
h: move left one character
l: move right one character
0: move to the beginning of the line
$: move to the end of the line
w: move forward one word
b: move back one word
e: move to the end of your word
): move forward one sentence
}: move forward one paragraph
:line_number: move to a given line number
H: move to the top of the screen
M: move to the middle of the screen
L: move to the bottom of the screen
^E: scroll up one line
^Y: scroll down one line
gg: go to the top of the file
G: go to the bottom of the file
^U: move up half a page
^D: move down half a page
^F: move down a page
^B: move up a page
Ctrl-i: jump to your previous navigation location
Ctrl-o: jump back to where you were
基础修改/插入命令
- i : 从当前光标位置之前插入
- a : 从当前光标位置之后插入
- I :从当前行开始位置插入
- A :从当前行行末插入
- o : 在当前行下新增一行,并从新行插入
- O :在当前行上新增一行,并从新行插入
- r : 替换当前光标所在字符
- R :替换当前光标的字符,并一直向后替换(替换模式)
- cm:修改文本,其中m表示移动的动作,比如,一个单词,一句或者一个段落。
- C :修改当前所在行
- ct?: 修改问号前的这条问句内容
- s:替换当前字符
- S: 替换整行
修改句子
cis
移动到行首并进入插入模式
I在当前光标位置之后进入插入模式
a
从上面例子可知,有多种方式可以进入插入模式输入文本。还有一些简写来执行多条操作,比如说删除并进入删除模式。
删除从光标所在位置开始到行末的所有内容,并进入插入模式
C删除当前行并进入插入模式
S
修改大小写
可以通过波浪符来变更大小写。就像你猜想的那种方式工作:不管你光标所在字符还是可视模式下选择的文本都可以。
格式化文本
Vim还可以快速格式化文本,比如格式化一整段文本,使用下面这个命令就可以很容易实现:
格式化当前段落
gq ap
gp根据预设的文本宽度testwidth以及参数指定的文本范围来工作,这意味着对于你指定的任意范围的文本,gp都可以自动校准宽度,使得文档看起来干净又整洁。
【注意: ap表示文本对象”整个段落”的覆盖范围】
删除文本
- x: 删除当前光标的字符
- X:删除当前光标的前一个字符
- dm: 根据定义的m来确定删除范围,一个单词或者一句话或者一个段落。
- dd: 删除当前行
- dt. : 删除当前位置到下一个句号之间的所有内容
- D: 删除当前光标位置到本行末的所有内容(对比上面的C,D不会进入插入模式)
- J: 将上下两行合并(删除两行之间的换行符)
- nx //删除从光标开始的n个字符
- ndd //向下删除当前行在内的n行
撤消与重做
- u: 撤销上一个动作
- U //撤销对当前行的所有操作
- Ctrl-r: 重做上一个动作
重复动作
使用“.”来重复上一次操作
你所做的许多操作可能都有重复的价值。比如进入插入模式添加一些文本内容。你只需执行一次,然后一直执行点命令来重复就可以了。请看下面的例子。
删除一个单词
dw
紧接着执行,再删除5个单词
多么给力! 如果结合可视化模式,发挥的能力更让你大开眼界。
复制与粘贴
- yy //将当前行复制到缓存区,也可以用 "ayy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务。
- nyy //将当前行向下n行复制到缓冲区,也可以用 "anyy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务。
- yw //复制从光标开始到词尾的字符。
- nyw //复制从光标开始的n个单词。
- y^ //复制从光标到行首的内容。
- y$ //复制从光标到行尾的内容。
- p //粘贴剪切板里的内容在光标后,如果使用了前面的自定义缓冲区,建议使用"ap 进行粘贴。
- P //粘贴剪切板里的内容在光标前,如果使用了前面的自定义缓冲区,建议使用"aP 进行粘贴。
交换两行的位置
- ddp
使用这条命令可以很快速的交换两行的位置。第一部分删除你所在的行,第二部分将它粘贴回之前所在位置的下面。(ps:文章中用的是above,但是实际上拷贝回下方位置)
拼写检查
如果没有拼写检查的话,感觉会很糟糕,还好vim这方面做得很好。当然我们需要先在配置文件中配置拼写检查选项。
在~/.vimrc的某个位置中添加
找出拼写错误
如果在配置文件中设置了拼写检查的选项,那么拼错的单词会自动添加下划线。你也可以手动输入:set spell和:set nospell来启用或禁用。
使用以下命令来跳转:
跳转到下一处拼写错误
]s跳转到上一处拼写错误
[s若光标处是错误单词,给出修改建议
z=将识别的错误单词标记正确
zg将vim视为正确的单词标记为错误单词
zw
替换
基本设置为:%s
将每行的foo替换为bar
:%s /foo/bar/g
将当前行中的foo替换为bar
:s /foo/bar/g
【注意: 两个命令的不同之处在于,单行替换s前少了%】