《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用)itextobj-indent插件提供,选取缩进相同的一段文本ftextobj-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命令、不修改匹配行