vim入门指南

vim入门指南

快捷操作

- di" 删除本行""内的文本
- cw 替换一个词
- yaw 复制当前词
- f和 t来查找当前行字符,`;`重复查找,`*`查找当前词,n 跳往下一个.
- ctrl + d/u 向下/上 滚动半屏
- 分隔符 a/i 带空格/不带空格 ,例如 a(/i( ,一般 d 和 a 配合,c 和 i 配合, w/词 -> s/句子->p/段落.
- u 撤销修改,U 撤销所有修改(undo), 撤销最后一次修改 ctrl + R
- i/I,a/A,o/O 插入
- mm 命令可以标记一个位置,然后~m回到标记点
- 全局替换`:%s/{pattern}/{string}/{flags}`
- 宏: q a-z 命名, 操作 q 离开完成.调用 @ a-z 具体的宏.

字符跳动

  • h,j,k,l 左下上右

模式

所有命令都需要在normal模式下使用

  • i切换到insert模式,按esc回到normal模式
  • v 可视化模式,按v或V进入可视模式
    v可以进入面向字符的可视模式,V 是针对行的可视模式.ctrl +v可以进入针对列的可视模式.可视模式下按 o 可以调整选择区边界.
  • :wqa! w为保存,q为离开,!为强制执行 ,a表示all所有

行内移动

  • 0 到行头
  • ^ 第一个不是空的位置
  • $ 行尾
  • g_ 最后一个不是空的位置

  • w 下一个单词开头

  • b 当前或上一个单词开头
  • wi/bi 在开头前插入

  • e 当前或下一个单词结尾 (end)

  • ge 上一个单词结尾
  • ea,gea 在结尾后插入

  • fa 下一个字符为a的位置

  • ta 字符a前的第一个字符

页移动

  • H 跳转到当前屏幕第一行 (head)
  • M 当前屏幕中间一行 (middle)
  • L 最后一行 (last)

  • 2H 移动到当前屏幕第2行

  • 3L 移动到当前屏幕倒数第三行
  • ctrl + f 前移一页 (forward)
  • ctrl + b 后移一页 (back)
  • ctrl + d 往下滚动半屏 (down)
  • ctrl + u 往上滚动半屏

  • gg 调到首行 相当于:1

  • G 调到尾行
  • nG 调到n行 相当于:n
  • % 调到另一边括号 ({[]})

配合查找字符方式移动

  • fa 正向移动到第一个字符a处, ta 正向移动到下一个a字符之前
  • Fa 逆向移动到第一个字符a处, Ta 逆向移动到下一个a字符之前
  • ;可以重复查找上次 f 命令查找的字符,不用再重复使用 f 命令.如果按了太多次,可以按,回到上次位置.
  • *命令可以查找光标当前所在词,按 n 跳往下一个.
  • f/t 只能在行内查找且查找时只能查找一个字符,而不是单词.查找时尽量选择频率比较低的字符从而快速移动到目标处.

非相邻单词或字符间移动

  • 8w 正向移动到相隔8个单词的首字符
  • 4Fa 逆向移动到第4个a字符

搜索匹配

  • /text 向后搜索
  • ? text 向前搜索
  • :g/word 全局搜索
  • n 搜索下一个同样的内容
  • N 搜索上一个同样的内容

  • 查找 :{作用范围}s/{目标}/{替换}/{替换标志}

  • :%s/old/new/gc 全局替换

  • 作用范围 当前行:s,全文:%s,选区在visual 选择区域后输入:后 vim 自动补全:’<,>’s 或手动指定:4,6s 或.,+2s 接下来 2 行

  • 替换标志

    • i 表示大小写不敏感,I 表示敏感,等于与模式中的\c
      :%s/foo/bar/i === :%s/foo\c/bar
    • g 全局替换
    • c 表示需要确认,每次替换系统按键确认 y 替换/n 不替换/a 替换所有/q 退出查找模式/ l 替换当前位置并退出
  • 在normal模式下按下*即可查找光标所在单词(word)

  • \c表示大小写不敏感查找,\C表示大小写敏感查找
  • # 匹配当前光标所在的单词 是下一个 #是上一个
  • 光标移动可以与其他命令联动,比如 0y$ 表示从行首拷贝到最后一个字符
  • 拷贝不一定要用y,还可以使用d(删除),v(可视化选择),gU(变大写),gu(变小写)

插入

  • i在光标前插入(insert),I 在当前行开头插入
  • a在光标后插入(append),A在当前行结尾进行插入,相当于执行了$a操作
  • o在当前行后插入新行, O在当前行前插入新行
  • ea 在当前行结尾插入(end append)
  • cw 当前光标到单词结尾清空并插入
  • 在插入模式删除除了使用退格键,还可以使用 ctrl+w 删除前一个单词或使用 ctrl + u 删除至行首.

替换和删除

  • r 替换一个字符 replace,R 可以替换多个字母.
  • cc 替换一行
  • cw 替换一个 word
  • c$ 替换到行尾
  • s 修改一个字符
  • S 修改一整行

  • x 删除当前光标所在的一个字符

  • dl 删除当前字符 === x
  • dw 删除到下一个单词开头
  • d0 删除至行首
  • dd 删除当前行
  • dj 删除上一行
  • dk 删除下一行
  • gg dG 删除全部内容
  • :1,10d 删除1-10行
  • :11,$d 删除11行及以后所有行
    删除的内容存到剪贴板.

操作

d,c,y等操作符加 一个动作命令组成一次操作.例如 daw.
操作符有

- c 修改 (change)
- d 删除 (delete)
- y 复制, (yank)
- p 粘贴 (paste/put)
- g~ 反转大小写
- gu 转换为小写
- gU 转换为大写
-  `>` 增加缩进
-  `<` 减少缩进
- `=` 自动缩进

复制粘贴

  • yy 拷贝当前行(yank)
  • 按v或V进入可视模式,然后上下左右选择,再按y即可复制,按d即可剪贴
  • p 粘贴到下一行或右侧
  • P 粘贴至上一行或左侧
  • 调换文本行可以使用 ddp(先删除当前行再粘贴),同理复制当前行 yyp
  • 交换两个词. 先用 d 删除一个词,然后 mm 标记,在用 v 选中另一个词按 p替换,然后 ~m 回到标记位置再按 p 即可完成替换.
  • 针对字符的复制或删除操作如 x,diw等将创建面向字符的寄存器,粘贴时会放在光标后.针对行的复制删除操作如 dd,yy 或 dap 会创建针对行的寄存器,粘贴时会放在当前行的下一行.

撤销和重复

  • u撤销最近一次修改(undo)
  • .命令可以再普通模式下重复上次修改,如果想要在命令模式下重复上次命令可以用@:
  • U撤销所有
  • ctrl + r 取消最后一次的撤销

文件管理

  • :e 打开一个文件
  • :saveas 文件另存为
  • :x 或 zz 或:wq 保存并推出
  • :bn 切换到下一个文件(n表示next,b表示切换blocked-out)
  • :bp 切换到上一个文件(p表示prev)
  • :n 切换到下一个

命令行模式技巧

  • DTc 删除光标的c之间的所有字符
  • Rc 将光标的字符替换为c
  • nDD 删除n行数据
  • nYY 复制n行数据
  • nX 删除n个字符

命令模式

按:进入命令模式.

  • :n 光标移动到多少行
  • :1,5w file 将第一行至第五行写入文件
  • :.,$w file 当前行至结束写入文件
  • :w 保存
  • :wq 保存退出
  • :q 退出
  • :q! 强制退出
  • :/str/ 正向搜索,光标移动到下一个结果
  • :?str? 逆向搜索
  • 正则:
  • :/^xxx/
  • :/xxx$/
  • :s实现替换
  • delete 删除
  • yank 复制
  • put 粘贴
  • copy 拷贝
  • move 移动
  • join 连接
  • normal 可以执行普通模式下的命令
  • substitute/{pattern}/{string}/{flags} 在范围内出现{pattern}的地方替换为{string}
  • x,y 表示 x-y 行,.表示当前行,%表示当前文件所有行
  • 使用:t:m命令复制和移动行.其中:t是 copy 命令的简写(可以理解为copyTo),:m是 move 命令的简写

vim 实用技巧

  • 分隔符文本对象.
    vim 的文本对象由两个字符组成,第一个字符是 i/a, i 会选择分隔符内部文本,a 会选择包括分隔符在内的整个文本.可以理解为 inside/all. 第二个字符是分隔符如)]}>'",t 表示标签

    • a)/i)
    • a”/i”
    • at/it
      文本对象前可使用 d/c/y/g~/gu/gU/>/</= 等操作符
  • 范围文本对象

    • aw 当前单词及一个空格/iw 当前单词
    • as 当前句子及一个空格/is 当前句子
    • ap 当前段落及一个空行/ ip 当前段落
      一般 d 和 a 配合, c 和 i 配合.
  • 标记位置
    mm 命令可以标记一个位置,然后~m回到标记点 可以回到上次修改位置.
    比如我们想要修改一对大括号,可以先用%匹配大括号,这时 vim 会自动为发生跳转的地方设置一个标记,在我们使用 r]修改后大括号后,按 ~~ 调回到前大括号,然后 r[ 修改完成.

  • 自定义宏

    • 创建宏 q a,操作,q 结束. 其中 a 为命名的寄存器.
    • 查看宏 :reg a
    • 调用宏 @a, @@可以回放上次调用的宏.
    • 当前行多次调用宏. 3@a ,调用三次宏 a
    • 多行调用宏, 按 v 进入可视模式,选中执行区间,:normal @a就可以在每一行执行宏了.
  • 用迭代求值的方式给列表编号

    1
    2
    3
    4
    5
    :let i = 1  #定义变量
    qa # 定义宏和寄存器
    I ctrl+r =1 ctrl+R ) esc # 对行进行操作
    :let i += 1 # 变量递增
    q # 完成录制
  • 搜索引擎
    \v表示模式开关,可以让搜索时不用正则写过多的转义字符,比如要匹配 css 中的颜色可以使用/\v #[0-9a-fA-F]{6}|[0-9a-fA-F]{3}
    \V表示原义开关,按照字符进行匹配,即便字符中有像.这样的符号也会按照原义查找.

  • substitude命令
    该命令可以提供查找模式以及替换字符串,还可以指定执行的范围.具体语法:s/{pattern}/{string}/{flags} 在范围内出现{pattern}的地方替换为{string},如果想要全局配置要使用:%s/xxx/xxx/g
    flags 为标志位,其中 g 是全局范围,n 为统计个数而不执行替换,c 让我们确认每一次修改.e 可以屏蔽错误提示.i 表示大小写不敏感,I 表示大小写敏感.

分屏

  • :vsp 左右分屏
  • :sp 上下分屏
  • :tabnew 新建标

z和fzf脚本

1
2
3
4
5
6
7
8
9
10
11
12
j() {
if [[ -z "$*" ]]; then
cd "$(_z -l 2>&1 | fzf +s | sed 's/^[0-9,.]* *//')"
else
_last_z_args="$@"
_z "$@"
fi
}

jj() {
cd "$(_z -l 2>&1 | sed 's/^[0-9,.]* *//' | fzf -q $_last_z_args)"
}