[TOC]

https://zhuanlan.zhihu.com/p/68111471
《VIM实用技巧》

文件指令

  • vim -on/-On

分屏

  • ctrl + w / s
  • :sp fil

分屏切换

  • ctrl + w +
  • ctrl + w+ h/j/k/l
  • ctrl + w + H/J/K/L

关闭分屏

  • ctrl + w + c/q

退出

  • :w
  • :w!
  • :w file
  • :q!
  • :qa!
  • :wq = :x
  • :e file
  • :e!
  • :saveas file1
  • :bn/bp
  • ZZ, ZQ

进入插入模式

  • 前: i, I
  • 后: a, A
  • 上/下首: o, O
  • 删除: s, S
  • 删除单词: cw
  • 复制 <C-r>{register} 寄存器名字
  • 自动完成 <C-p>{register}
  • 运算 <C-r>={计算等式}
  • 通过编码输入字符 <C-v>u{编制数字}, ga 获取字符的编码
    • u{十六进制}
    • {十进制}

命令模式

符号含义
.当前行
$最后行
%文件所有行 = 1,$
/< html>/, /<\/html>/选择区域内的文本, 支持相对偏移量,
`m包含标记m的行

复制和移动

:t=:copy=:co,6t.将第6行复制到光标所在行的下一行:[range]coapy{address}, t6 当前行复制到6行下方, t$复制到文件末尾
:m=:move :[range]move{address}

执行普通命令

:`<,`>normal .区域重复指令
  • 当不想覆盖默认寄存器中当前的内容时, 使用:t.来复制行(=yyp)
  • 重复上次指令 @: 往后等于@@, <> :bprevious

Ex命令补全

  • <C-d> 显示所有可能的指令,<Tab>键自动补全

  • 配置自动补全, 提供一个补全导航列表

    • (bash shell) set wildmode=longest,list

    • (zhs) set wildmenu ; set wildmode=full

      • 正向遍历<Tab>, <C-n>, <Right>
      • 反向便利<S-Tab>, <C-p>, <Left>

把当前单词插入到名利行

  • <C-r><C-w> 选中光标下的单词

  • <C-r><C-w> 选中光标下的字符串

  • 打开vimrc 文件, 光标移动到一项设置上 输入:help <C-r><C-w> 可快速查看帮助文档

回溯历史指令

  • set history = 200 设置最大指令保存条数, 重启仍然有有效

  • /<C-n> <C-p>

  • q: 调出历史执行过的命令窗口 :q 关闭窗口 或者 <CR>

  • q/ 打开查找命令历史的命令行窗口

  • <C-f> 从命令行模式切换到命令行窗口

shell

  • vim 使用:shell启动交互式shell 推出时输入exit, 而neovim使用:te(:terminal)

  • <C-z> 挂起进程, jobs 查看挂起进程, fg唤醒 可以用于代替:shell命令

  • :r !{cmd} 将指令结果写入文本中

  • :w !sh 将内容传给sh命令作为标准输入

  • :w! sh 把内容写入到名为sh的文件中

  • 2,$!sort -t ‘,’ -k2 使用外部sort指令, 以记录,为分隔, 然后使用-k2指定第二个字段进行排序

  • 开始选择区域, 以!打头, 执行动作 自动形成:[range]!{filter}中的range

光标移动过

快捷键功能
$行尾
wnext word
Wformer word
bthe end of next word
Bthe end of former
Gthe end of file
ggthe first of file
H当前屏幕的第一行行首
  • M 屏幕中间
  • L 屏幕尾部
  • zt 将当前行移动到屏幕最上方
  • zz 当前行移动到屏幕中间
  • zb 当前行移动到屏幕尾部
  • % 匹配括号移动
    • 和 # 匹配光标当前所在的单词, 移动到下一个匹配单词

翻页

  • ctrl + f 前翻, ctrl + b 后翻页
  • <C-u> 向上翻半页, <C-d> 向下翻半页
  • <C-y> 向上滚动半页, 光标不变
  • <C-o> 切换到插入-普通模式 zz 当前行显示在窗口中间

VIM 的复制, 粘贴, 删除

删除 d

  • d
  • dw
  • dnw 删除n个单词
  • dfa 删除到到下一个a的字符处(连同a一起删除)
  • dnfa
  • dd 删除行
  • ndd 从光标开始删除n行
  • d$ 删除到本行的末尾
  • dH 删除屏幕显示第一行文本在行
  • dG 删除到文本结束

复制 y

  • yw, ynw 复制单词
  • yfa, ynfa
  • yy, nyy
  • y$
  • yH 复制到屏幕第一行行

粘贴 p

  • p 光标后开始粘贴
  • P 光标前开始粘贴

撤销和恢复

  • u
  • ctrl + r 恢复撤销操作

删除字符和替换

  • x
  • r 替换
  • R 替换从光标开始以后的所有字符, <ESC>推出替换

大小写转换

  • ~ 将光标下的字母改变大小写
  • n~
  • g~~ 行大小写反向
  • gUU g
  • guu , nguu
  • gUw, guw 单词
案件操作内容
gUit下一个文本快大写

VIM 可视模式

可在可视模式中进行操作的用途
vi]选在括号中内容
va]包括括号选择
gv重选上次区域
<Esc>/ <C-[>回到到普通模式
v/V/<C-v>可视模式切换
o切换高亮区域区域的活动端

可视模式下v +

按键操作内容
it文本对象的特殊动作指令
U大写

Example

  • 批量替换 Vr-

管理多个文件

  • 打开多个文件 vim *.txt 打开所有后缀为txt的文件, ls 显示打开的文件, :bn (=:bnext) 切换到下一个缓冲区
    • % 表示那个缓冲区在当前窗口, # 表示轮换文件
    • :bp(=bprev), :bf (bfirst), :bl (blast)
    • 跳到指定区域 buffer {n}
  • :bufdo 命令允许在 :ls 列出的所有缓冲区上执行 Ex 指令(:h :bufo) =(argdo 实际中更实用)
  • 删除缓冲区 :bd {N} , {n1},{n2} bd ( bd = bdelete)

用参数列表将缓冲区分组

  • :args 查看缓冲区列表,(低配版:ls)
  • :args{arglist} arglist 包括文件名, 通配符,shell命令等
    • 添加文件 args {file1, file2}
    • 正则表达式 :args *.* / */ .js

隐藏缓冲去

  • :ls 以h标记的区域, 退出时会提示有没有保存的缓冲区
    • :e (:edit) 把磁盘内容读入缓冲区
    • :w (:write) 缓冲区写入磁盘

将工作区拆分为窗口, 多窗口

:h window

  • 快捷键 <C-w>s 水平拆分, <C-w>v垂直拆分 = :split/:vsplit {file}
  • C-w q (=:q)关闭视窗
  • C-w +/- 调整大小

块区域

  • ctrl + v
  • 按下 IA 在区域前面或者后面输入内容.

代码补全

  • ctrl + n 或 ctrl + p

配置

  • 配置文件 vim ~/.vimrc

自带配置

  • 高亮 :syntax on
  • 行号 :set number
  • 缩进(python) :set shiftwidth=4 softtabstop=4 expandtab
    • 缩进 > , <, 2>

插件

代码补全(内置): ctrl + n
第三方插件管理: vim plug
NERDTree,
窗口切换: ctrl + w

批量添加前后缀

可视模式v,V,ctrl + v, : normal A{前缀}

TIP

  • 设置显示5行:set scrolloff = 5
  • 光标回退(不管哪个文件就行) ctrl + o
  • 打开文中地址 gf
  • 保持时需要管理员权限 :w !sudo w tee % (%:当前目录, tee 将输入保存到文件中)
  • <Esc> <C-[>
  • <C-o>切换到插入-普通模式 zz 当前行显示在窗口中间