《Vim使用技巧》里面的东西还是挺多的,适合每天啃一点、来回品味。当然也有一些地方有更优解,总的来说是本好书,基本上书里讲的都能够理解的话vim也用的很熟练了吧。
1 Vim基础
vim -u NONE -N
:不加载vimrc、不进入vi兼容模式- 用
.
命令的时候注意:在插入模式移动光标会重置修改状态! C
删除当前光标至行尾,并进入insert模式S
删除整行并进入insertI
移至行开头并进入inset;A
移至行尾并进入inset0
移动到开头,^
移动到开头非空格处,$
移动到行尾cw
删除光标位置到单词结尾间的字符w
跳转到下个单词开头,b
跳转到上个单词开头,e
跳转到下个单词结尾
2 普通模式
<C-a>
和<C-x>
: 数字加和减1(会把光标移到该行数字前)10<C-a>
: 数字加10,上一条的补充操作符+动作命令= 操作
:g~
改变大小写;gu
变为小写;gU
变为大写gUaw
把当前单词变为大写~
转换一个字母的大小写,同时光标后移一位=
自动缩进有时挺好用zz
重绘屏幕,会把当前行移到屏幕中间R
进入替换模式,gR
虚拟替换模式、会将制表符当一组空格处理,<Esc>
返回普通模式
3 插入模式
<C-r>{register}
插入模式中粘贴寄存器内容<C-r><C-p>{register}
相比上一条更智能,会修正不必要的缩进<C-r>=
表达式寄存器,可以做一些简单运算<C-r>/
把上次查找内容粘贴出来
4 可视模式
gv
重选上次的高亮选区;o
切换高亮选区的活动端如果想构造能重复执行的工作,最好远离可视模式
常用文本对象(基础及扩展):
w
单词;W
字符串s
句子(以.
为分隔符);p
段落(以空行为分隔符)( [ { <
用另一半也行t
一个标签(tag,html/xml
用)i
textobj-indent
插件提供,选取缩进相同的一段文本f
textobj-function
插件提供,选取一个函数,
textobj-parameter
插件提供,选取函数的一个参数(vi,
不包括逗号)
5 命令行模式
在多行上执行命令:
:1
跳转到行号处;:$
跳转到末尾;:3d
跳转并删除第3行.
表示当前行;%
表示所有行;1,$
表示从第1行到末尾;'a
表示位置标记a所在行;0
表示虚拟行、在第1行上方/pattern/
搜寻并跳转含有pattern的行;/<html>/+1,/<\/html>/-1p
可以进行:{address}+n
类似的偏移(p命令表示print)
:copy / :t
复制命令;:[range]copy {address}
使用范例::t6
复制当前行到第六行;:.t0
复制当前行到第一行上方- 此命令不会使用寄存器,这是它的优势。
:move / :m
移动行;:[range]move {address}
@:
重复上次的Ex命令;&
重复上次的:substitute
命令:[range]normal {command}
对范围内每一行同时执行命令,如:% normal A;
表示对所有行执行A;
命令(跳到行尾加一个;)
。修改完后会自动返回普通模式;注意normal
命令执行前会把光标移到改行起始处:<C-r><C-w>
将当前光标下的单词插入到命令行中(类似的有<C-r><C-a>
,范围更广)q:
普通模式下调出命令行窗口,每一行可以编辑,在某行按<CR>
就会执行该行命令。(在命令行模式下按<C-f>
也可进入命令行窗口)类似的也有q/
:打开查找命令历史记录的命令行窗口:!
运行外部shell命令,符号%
可用来代表当前文件名<C-z>
把vim挂起到后台、fg
唤醒一个被挂起的作业:read !{cmd}
把shell命令的输出读入到当前缓冲区:write !sh
缓冲区作为sh命令执行,!
和sh
间可以有空格write
和!
之间一定有空格;:write! sh
将缓冲区内容写入名为sh
的文件中read
、write
命令前都可加[range]
约束
6 文件
缓冲区(Buffer)中,
%
代表当前可见窗口,#
代表轮换文件(:ls
命令访问缓冲区,文件开头的数字为自动分配的编号)在Vim中用
:args filename
打开(新建)一个文件,并添加到缓冲区Glob模式:
*
代表当前目录所有文件,**
递归匹配子目录并找到所有文件,如**/*.js
能匹配到该目录下所有js文件:args `cat filename` ,将会把反引号里的shell命令执行结果作为args的参数,
args
命令,不接文件名显示当前所有缓冲区名、接文件名会新打开所匹配的文件到缓冲区:on(ly)
或者<C-w>o
, 只保留活动窗口,关闭其他<C-w>=
使窗口等宽等高;<C-w>_
最大化活动窗口高度;<C-w>|
最大化活动窗口宽度<C-w>T
打开新标签页,{N} gt(/gT)
标签页间跳转,:tabm(ove) {N}
将当前标签页移到N位置,N=0时为开头位置,N省略时为结尾:!mkdir -p %:h
把文件保存到不存在的目录中。其中-p
表示创建任何不存在的中间目录、%:h
表示当前缓冲区完整文件路径(去除文件名):wall
保存缓冲区列表所有文件
7 更快地移动及跳转
gj
往下移动一个屏幕行(非实际行);其他移动命令同理在前面加个g
表示按屏幕行移动基于单词的移动。 单词开头:
w
、b
, 单词结尾:e
、ge
;(大写时则变成基于子串的移动)m{letter}
创建位置标记,大写字母时为全局标记、小写是局部缓冲区标记Vim中的自动位置标记( `和'都能跳转,但'只能跳转到行、需要具体到列时最好用`):
- `` : 上次跳转动作前的位置(结合
%
命令很好用),<C-o>
命令也能完成这一功能 - `. :上次修改的地方
- `^ : 上次插入的地方
- `[ : 上次修改或复制的起始位置( `]为结束位置)
- `< : 上次高亮选区的起始位置 (`>为结束位置)。
- `` : 上次跳转动作前的位置(结合
surround.vim
插件使用:ds[...]
,如ds"
表示删除一对"
符号(s
代表surround)cs[...][...]
,如cs"(
表示将一对"
符号改为()
ysiw]
,给一个单词两侧加一个[]
yss"
,给该行套一个" "
- 可视模式下
S(
,给所选范围外部套一个()
8 文件间跳转
H/M/L
跳到屏幕最上方/正中间/最下方gf
跳到光标下文件名(go to file)<C-]>
跳到光标下关键字定义处<C-i>
等价于<Tab>
9 寄存器
vim常见的操作会将内容拷贝到无名寄存器
""
,""p
等价于p
命令前加
"{register}
指定寄存器,如"ayiw
、"bdd
寄存器用大写字母时表示把内容附加到指定寄存器后,而小写字母是覆盖原有内容
复制专用寄存器
"0
,被复制的文本(y
命令)会同时拷贝到无名寄存器和该专用寄存器中系统剪贴板
"+
、选择专用寄存器"*
(保存上次v
命令选择的区域)p
粘贴到当前光标后,P
粘贴到光标前;插入模式中用<C-r>{register}
或许更方便
10 宏、模式
@@
重复最近调用过的宏:put a
,粘贴寄存器"a
的内容到新行,可用来编辑录制好的宏qaq
,录制一个空的宏,起到清空寄存器的作用vim中的正则表达式:
magic
模式,使用\m前缀,^,$,.,*和[]
等字符含有特殊意义;而+、?、()、和{}
等其它字符则按字面意义解释。magic为默认设置,表达式中的\m前缀可以省略;no magic
模式,使用\M前缀,除了^和$
之外的特殊字符,都将被视为普通文本;very magic
模式,使用\v前缀,其后模式中除'0'-'9','a'-'z','A'-'Z' 和 '_'
之外的字符都当作特殊字符解释;very nomagic
模式,使用\V前缀,其后模式中只有反斜杠(\
)具有特殊意义,用于原义查找。
vim正则表达式匹配重复部分:
()
与\1
组合使用(引用第1-9个括号内容,0引用整个匹配)强大的替换命令
:[range]s[ubstitute]/{pattern}/{string}/[flags]
; flags:g
全局范围、c
每次修改前确认、n
抑制替换、&
用上一次的flag查找和替换可以分开来,先用
/
查找、再用%s//{...}/g
进行替换({pattern}
部分留空表示自动使用当前查找模式)
11 global命令
[range] g[lobal][!] /{pattern}/ [cmd]
,默认范围为%
、默认cmd
为print
,该命令用于在所有匹配行上运行Ex命令vglobal
或简写:v
,在非匹配行上执行Ex命令、不修改匹配行