Vim 学习笔记进阶版,初级版可以参考这篇文章
这篇文章主要分为替换操作,多窗口操作,Vim 的 Tab 操作,以及 Visual mode 命令模式等等。
组合命令 combine command
Vim 所有的操作都是原子化的,将操作组合起来能够实现非常快捷的 Input。在引入 .
命令时需要记住这么几条原则, Vim 哲学的第一条,不要重复自己,所有重复的命令都可以使用 .
来实现,而在这一条之后需要注意的是使得操作可重复,每一次的编辑命令有意识的让其可以重复,这样就可以达成一键移动,一键执行,来实现重复编辑的脏活累活。
. (dot) will repeat the last command 点命令重复上一个命令
n<commmand> will repeat the command n times 将命令重复 n 次
for example:
2dd will delete 2 lines
3p will paste the text 3 times
40idesu [ESC] will write "desu " 40 times
5w 向后移动 5 个单词
6j 向下移动 6 行
Vim 还支持另一种组合
di" 光标在引号内, (d)elete (i)nside " 删除在引号之间的内容
yi( 光标在括号内, (y)ank (i)nside () 复制在 () 中的内容
vi] 光标在中括号内, 选中 [] 内的内容
dtx 向后删除字符直到遇到第一个 `x` 字符, (d)elete (t)ill x
ytx 向后复制内容直到遇到第一个 `x` 字符
以下是命令 c 加上一些操作,其他 d(elete) y(ank) v(iual) 都可以接
ctx 向后修改内容到 `x`,也就是意味着删除光标到 `x` 中间内容,并进入插入模式
ci" 改写双引号中的内容
ci' 改写单引号中的内容
cib 改写小括号中的内容
cab 改写小括号中的内容(包含小括号本身)
ci) 改写小括号中的内容
ci] 改写中括号中内容
ciB 改写大括号中内容
caB 改写大括号中的内容(包含大括号本身)
ci} 改写大括号中内容
cit 改写 xml tag 中的内容
cis 改写当前句子
c2w 改写下两个单词
ct( 改写到小括号前
文件中快速跳转
nG go to line N, N is a number, like 23G means go to line 23
:x 跳转到第 x 行 x 为行号
gg shortcut for 1G - 跳转到第一行
G 跳转到最后一行
标记和宏 macro
ma 将当前位置标记为 a,26 个字母都可以作为标记,`mb`, `mc` 等
'a 跳转到 a 标记位置
qa 将所有的键盘操作录制下来,直到再次在命令模式按下 <kbd>q</kbd>, 并存储在 <kbd>a</kbd> 中
@a 执行刚刚记录在 <kbd>a</kbd> 中的键盘操作
@@ 执行上一次 macro 操作
宏命令是 Vim 中最神奇的操作之一,需要慢慢体会,关于宏命令可以参考这篇
批量替换
简单的大小写替换可以使用:
~ 替换大小写
g~iw 替换当前单词大小写
gUiw 将单词转为大写
guiw 将单词转为小写
gUU 全行转为大写
guu 全行转为小写
在全文中用一个单词替换另外一个单词
:%s/ 想要被替换的字串 / 新字串 /g
- ”%” 范围前缀表示在所有行中执行替换,% 为当前文件, 相当于
:1,$s/
,如果不加%
则表示在当前行中 - ”s” 表示 substitute 替换
- “g” 标记表示替换行中所有匹配点。g 模式全局替换
替换的语法为::[addr]s/ 源字符 / 目的字符 /[option]
[addr] 表示检索范围,省略表示当前行。
- :n1,n2s/word1/word2/g 从 n1 行到 n2 行,替换 word1 为 word2 全局替换
- :%s/ = :1,$s/
- :.,$/word1/word2/g 从当前行到尾行
s: 表示替换操作
[option] 表示操作类型
- g 全局替换
- c 确认,如果加上 c 选项,每次都需要确认 confirm
- p 逐行显示结果
省略 option 时只对每一行的第一个匹配串进行替换
删除所有空行
:g/^$/d
删除所有空白行和空行
:g/^[ ][ ]*$/d
在每行开始插入两个空白
:%s/^/ /
在接下来 5 行末尾加入"
:.,5/$/"/
多窗口操作
新建与关闭窗口
在 Normal 模式下使用以下命令新建窗口
:split 水平分割窗口,内容一样
:sp split 缩写
:10split 水平分割窗口,新窗口高度 10 行
:split filename 窗口中打开新文件
:new 功能和 split 一样
:vsplit 垂直分割窗口,简写 :vs
:vsp 垂直分割
Ctrl-w s,v 分割窗口的快捷方式,s 水平分割,v 垂直分割
:clo[se] 关闭窗口
Ctrl-w c 关闭当前窗口
:on[ly] 只保留激活的窗口,关闭其他窗口
窗口间移动
Ctrl-w w w 窗口间循环移动 Ctrl-w Ctrl-w 同样
Ctrl-w h,j,k,l Ctrl 按下,按下 w 松开,Ctrl 松开,按 hjkl 对应左下上右
移动窗口
Ctrl-w H,J,K,L 大写 HJKL, 移动窗口
窗口最大化
Ctrl-w o 让当前文件占据整个窗口,同时会关闭其他窗口
调整窗口大小
`Ctrl-w < >` 调整窗口宽度,`<` 缩小当前窗口宽度,向左扩展一列,`>` 增加当前窗口宽度,向右扩展一列。当然 `Ctrl-w` 之后可以使用 `n+<` 调整多列宽度
`Ctrl-w - +` 调整窗口高度
`Ctrl-w_` 高度最大化
`Ctrl-w|` 宽度最大化
在使用 Nerd tree 插件后,可以使用 Nerd tree 内置的快捷键,在 Nerd tree 中
i
split 一个新窗口打开选中的文件,并跳转到该窗口s
vsplit 一个新窗口打开选中文件,并跳到该窗口
Tabs
在 Vim 中 Tab 和 Windows 是不一样的概念,如果平时使用 Chrome 或者 Firefox,就很好理解 Tab,中文可以翻译为标签页,但是 Vim 中 Tab 和正在编辑的 buffer 不是一对一的关系,在 Vim 中每一个 Tab 能够包含多个窗口 Window。
Create New tab
有很多方法可以创建新 Tab , 这里是最简单方式:
:tabnew create a empty new tab
:tabedit {file} edit specified file in new tab
Manage tabs
Some ways to close tabs:
:tabc[lose] close current tab
:tabclose {i} close i-th tab
:tabo[nly] 只保留当前 tab,close all other tabs
Some ways to move tabs:
:tabm 0 move current tab to first
:tabm move current tab to last
:tabm {i} move current tab to position i+1
:tabs list all tabs including their opening windows
Ways to move between tabs:
:tabn[ext] go to next tab
:tabp[revious] go to previous tab
:tabfirst go to first tab
:tablast go to last tab
While in normal mode, you can type:
gt go to next tab
gT go to previous tab
{i}gt go to tab in position i
修改文本
Insert 模式下
<BS> 退格键,删除光标前
<Del> Delete 键,删除光标后
<C-W> 删除一个单词
<C-U> 删除光标前的字符,保留光标之后的文本,保留行首的缩进,只删除第一个非空字符至光标位置之间的文本。
可视 Visual mode
v 按字符选择,在 Normal mode 下按下 v 进入 Visual mode
V 按行选择
Ctrl+Q 块选择,Windows 下,其他平台下 Ctrl+V
选择字符之后操作
d 剪切选择内容到剪贴板
y 拷贝选择内容到剪贴板
c 剪贴选择内容到剪贴板并进入 Insert mode
命令模式
:! command 暂时离开 vi 到命令模式下执行 command
把命令的结果读入 Vim
在命令模式下,可以不离开 Vim 进行操作,但如果想要把命令的结果粘贴到 Vim 中,就需要使用 read 命令
:read !ls -al
Vim 会在当前光标处插入命令执行的结果。
Other
:verbose set tabstop? in Vim, it will tell you where the tapstop option value is coming from
:help + command 查看 Vim 命令的帮助,比如想要查看 c 命令的帮助直接使用 `:h c` 就能查到。
g <C-g> 单词统计
差不多看到这里就能够直接看文档了:http://vimcdoc.sourceforge.net/ 通过文档学习更多符合自己使用习惯的命令或者操作。
还有一些参考资料
- http://vimhelp.appspot.com/
- Practial Vim Vim Tips 的书籍
- Vimium 用 Vim 方式操作 Chrome 浏览器
- Vimer 一个极好的博客