Vim常用命令学习

《Vim使用技巧》里面的东西还是挺多的,适合每天啃一点、来回品味。当然也有一些地方有更优解,总的来说是本好书,基本上书里讲的都能够理解的话vim也用的很熟练了吧。

1 Vim基础

  • vim -u NONE -N:不加载vimrc、不进入vi兼容模式
  • .命令的时候注意:在插入模式移动光标会重置修改状态!
  • C 删除当前光标至行尾,并进入insert模式
  • S 删除整行并进入insert
  • I 移至行开头并进入inset; A 移至行尾并进入inset
  • 0 移动到开头,^移动到开头非空格处,$移动到行尾
  • 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 切换高亮选区的活动端

  • 如果想构造能重复执行的工作,最好远离可视模式

  • 常用文本对象(基础及扩展):

    1. w 单词; W 字符串
    2. s 句子(以.为分隔符); p 段落(以空行为分隔符)
    3. ( [ { < 用另一半也行
    4. t 一个标签(tag,html/xml用)
    5. i textobj-indent插件提供,选取缩进相同的一段文本
    6. f textobj-function插件提供,选取一个函数
    7. , textobj-parameter插件提供,选取函数的一个参数(vi, 不包括逗号)

5 命令行模式

  • 在多行上执行命令:

    1. :1 跳转到行号处; :$ 跳转到末尾; :3d 跳转并删除第3行
    2. . 表示当前行; % 表示所有行1,$ 表示从第1行到末尾; 'a 表示位置标记a所在行;0 表示虚拟行、在第1行上方
    3. /pattern/ 搜寻并跳转含有pattern的行; /<html>/+1,/<\/html>/-1p 可以进行:{address}+n类似的偏移(p命令表示print)
  • :copy / :t 复制命令; :[range]copy {address} 使用范例:

    1. :t6 复制当前行到第六行; :.t0 复制当前行到第一行上方
    2. 此命令不会使用寄存器,这是它的优势。
  • :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的文件中

  • readwrite命令前都可加[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表示按屏幕行移动

  • 基于单词的移动。 单词开头:wb , 单词结尾:ege;(大写时则变成基于子串的移动)

  • m{letter}创建位置标记,大写字母时为全局标记、小写是局部缓冲区标记

  • Vim中的自动位置标记( `和'都能跳转,但'只能跳转到行、需要具体到列时最好用`):

    1. `` : 上次跳转动作前的位置(结合%命令很好用),<C-o>命令也能完成这一功能
    2. `. :上次修改的地方
    3. `^ : 上次插入的地方
    4. `[ : 上次修改或复制的起始位置( `]为结束位置)
    5. `< : 上次高亮选区的起始位置 (`>为结束位置)。
  • surround.vim插件使用:

    1. ds[...],如ds"表示删除一对"符号(s代表surround)
    2. cs[...][...],如cs"(表示将一对"符号改为()
    3. ysiw],给一个单词两侧加一个[]
    4. yss",给该行套一个" "
    5. 可视模式下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中的正则表达式:

    1. magic模式,使用\m前缀,^,$,.,*和[]等字符含有特殊意义;而+、?、()、和{}等其它字符则按字面意义解释。magic为默认设置,表达式中的\m前缀可以省略;
    2. no magic模式,使用\M前缀,除了^和$之外的特殊字符,都将被视为普通文本;
    3. very magic模式,使用\v前缀,其后模式中除 '0'-'9','a'-'z','A'-'Z' 和 '_'之外的字符都当作特殊字符解释;
    4. 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],默认范围为%、默认cmdprint,该命令用于在所有匹配行上运行Ex命令

  • vglobal或简写:v,在非匹配行上执行Ex命令、不修改匹配行

Author: zcp
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source zcp !
评论
 Previous
C-Tips
(欢迎纠错) 1 基本概念 CPU:运算器+控制器(向内储存器发送地址流数据) 1 Byte=8 Bit,1 K=1024 Byte,每个Byte有一个唯一的地址,一个指针4 Byte 预处理:.c->.i 编译:.
Next 
NHK72h补全计划
都说互联网是有记忆的,每当我寻找以前看过的某集记录片却发现被全网下架了的时候就会开始质疑这句话。但后来一想,记忆本身就不是什么可靠的东西,会被遗忘、被美化、被篡改。ドキュメント72時間(NHK纪实72小时)是我一直唯一坚持看的纪录片。一方面
  TOC