vim使用总结

参考链接:

vim键盘图

一、两种模式及常用快捷键

1.1 标准模式及命令模式

光标移动

  • 单位级光标移动:
    • h 向左一字符
    • j 下一行
    • k 上一行
    • l 向右一字符
  • 单词级光标移动:
    • w or W 向右移动到下一单词开头(word)
    • e or E 向右移动到单词结尾(end)
    • b or B 向左移动到单词开头
    • f+<char>:移动到当前行中 [char] 的下一个出现位置
    • F+<char>:移动到当前行中 [char] 的上一个出现位置
  • 块级光标移动:
    • ^:到第一个非空白字符
    • $:到行尾gg:到文档第一行
    • 0:到行首(第 1 列)
    • {:到上一个段落
    • }:到下一个段落
    • gg:到文档第一行
    • G:到文档最后一行
    • :<N> or <N>gg or <N>G 跳转到第 N 行
    • :+<N> or <N>j 向下跳 N 行
    • :-<N> or <N>k 向上跳 N 行
  • 翻页
    • Ctrl+u:向上移动半页
    • Ctrl+d:向下移动半页
    • Ctrl+b:向上移动一整页
    • Ctrl+f:向下移动一整页

打开文件

  • gf:文件内跳转到对应的文件(打开include文件时)
  • :e <filename> 打开名为 filename 的文件,若文件不存在则创建之
  • :Ex 在 Vim 中打开目录树,光标选中后回车打开对应文件(提示:- 进入上级目录)

文件buffer

  • :buffers:ls :查看 buffer 列表(即打开文件的历史记录)
  • :bn 打开缓存中下一个文件
  • :bp 打开缓存中上一个文件
  • :b<N> 打开缓存中第 N 个文件
  • :bdelete<N>:bd<N>:删除要关闭的缓冲区(文件)

保存文件

  • :w 保存当前文件
  • :q 关闭当前 buffer
  • :wa 保存全部文件
  • :wq or ZZ 保存并退出
  • :q! or ZQ 强制退出,不保存
  • :qa! 保存并推出全部 buffer
  • :saveas <new filename> 文件另存为
  • :w <new filename> 文件另存一份名为 <new filename> 的副本并继续编辑原文件

查找

  • 文件内查找
    • * 向后查找光标当前所在单词
    • # 向前查找光标当前所在单词
    • /<search> 向后查找指定字符串
    • ?<search> 向前查找指定字符串
    • n 继续查找一个,方向由之前查找的方向决定
    • N 继续查找一个,方向由之前查找的方向决定
  • 行内查找
    • f<X> 当前行内向行尾方向查找并定位到字符 X
    • t<X> 当前行内向行尾方向查找并定位到字符 X 之前
    • F<X> 当前行内向行首方向查找并定位到字符 X
    • T<X> 当前行内向行首方向查找并定位到字符 X 之后
    • ; 继续向当前方向查找下一个字符
    • , 向当前相反方向查找下一个字符
  • 匹配查找
    • 当光标位于()[]{}其中一个符号上时,按下 %,光标会跳到与之匹配的另外一个符号上。

1.2 插入模式

任一插入命令执行后均会进入插入模式,此时如需退出可以按ESCCtrl-[Ctrl-C

插入

  • i 当前字符前插入
  • a 当前字符后插入
  • I 行首插入
  • A 行尾插入
  • o 在下一行插入
  • O 在上一行插入

删除并保存到vim剪切板

  • s 删除当前字符,并进入 INSERT 模式
  • S 删除当前行并保存到 Vim 剪贴板,同时进入 INSERT 模式(等同于 cc
  • x 删除当前字符,相当于 insert 模式下的 Delete
  • X 删除前一个字符,相当于 insert 模式下的 Backspace
  • dd 删除当前行,并将删除的内容保存到 Vim 剪贴板
  • d3d or 3dd 删除后 3 行并保存到 Vim 剪贴板
  • d<X> 删除指定内容并保存到 Vim 剪贴板
  • cc 删除当前行并保存到 Vim 剪贴板,同时进入 INSERT 模式
  • c<X> 删除指定内容并保存到 Vim 剪贴板,同时进入 INSERT 模式
    • cw 从光标前删除到当前单词的结尾并进入 INSERT 模式
    • ciw 删除当前光标所在的整个单词并进入 INSERT 模式
    • c$ 从光标前删除到行尾并进入 INSERT 模式

<X> 部分是对操作内容的描述,如果要删除一个单词,就输入 dw 或者 de,要复制当前位置到行尾的内容,就输入 y$,要删除后面 3 个字符并插入,就输入c3l 诸如此类

复制

  • yy 复制当前行到 Vim 剪贴板
  • y<X> 复制指定内容到 Vim 剪贴板

粘贴

  • p 在当前位置后粘贴
  • P 在当前位置前粘贴

合并

  • J 将当前行与下一行合并

替换

  • r<X> 将当前字符替换为 X

  • gu<X> 将指定的文本转换为小写

  • gU<X> 将指定的文本转换为大写

  • :s/<search>/<replace>/g 查找当前行中所有 search 内容并替换为 replace 内容

    • g 代表 global ,全局替换,否则为替换光标后的第一个
    • c 代表需要确认是否替换
    • i 代表不区分大小写
    • I 代表区分大小写
  • :%s/<search>/<replace>/g 查找所有行中所有 search 内容并替换为 replace 内容

  • :5,12s/<search>/<replace>/g 查找5~12行中所有 search 内容并替换为 replace 内容

  • :.,%s/<search>/<replace>/g 查找当前行到最后一行中所有 search 内容并替换为 replace 内容

  • :.,+2s/<search>/<replace>/g 查找当前行到后2行中所有 search 内容并替换为 replace 内容

  • :g/^baz/s/<search>/<replace>/g 查找所有以baz开头的行中所有 search 内容并替换为 replace 内容

撤销、重做

  • u 撤销
  • Ctrl-r 重做

二、技巧

2.1 常用设置

临时生效方法:

  • :set number 显示行号
  • :set showcmd 显示完整命令
  • :set relativenumber 显示相对行号(这个非常重要,慢慢体会)
  • :set hlsearch 搜索结果高亮
    • 如果想清除高亮,只需要搜索一个不存在的结果即可
  • :set autoindent 自动缩进:set smartindent 智能缩进
  • :set tabstop=4 设置 tab 制表符所占宽度为 4
  • :set softtabstop=4 设置按 tab 时缩进的宽度为 4
  • :set shiftwidth=4 设置自动缩进宽度为 4
  • :set expandtab 缩进时将 tab 制表符转换为空格
  • :filetype on 开启文件类型检测
  • :syntax on 开启语法高亮

永久生效方法:

修改文件 /home/<user>/.vimrc(Linux 系统)或 /Users/<user>/.vimrc(Mac OS 系统)为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
set number " 显示行号
set showcmd " 显示完整命令
set relativenumber " 显示相对行号(这个非常重要,慢慢体会)
set hlsearch " 搜索结果高亮
set autoindent " 自动缩进
set smartindent " 智能缩进
set tabstop=4 " 设置 tab 制表符所占宽度为 4
set softtabstop=4 " 设置按 tab 时缩进的宽度为 4
set shiftwidth=4 " 设置自动缩进宽度为 4
set expandtab " 缩进时将 tab 制表符转换为空格
set mouse= " 关闭鼠标功能
"set mouse=a " 启用全部鼠标功能
set wildmenu " 启用选项菜单
set cursorline " 启用下划线

set fileencodings=utf8,cp936,gb18030,big5 " 尝试按照这些编码方式逐一探测
filetype on " 开启文件类型检测
syntax on " 开启语法高亮
# /etc/vim/vimrc 中开启下行即可记住上次编辑的位置
# 或者直接加到 /home/<user>/.vimrc 中
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif

2.2 重复上一次的命令

  • .:重复上次修改(一次修改的单位可以是字符、整行、甚至是整个文件,不包括光标移动)

2.3 缩进

  • >> 向右缩进当前行
  • << 向左缩进当前行
  • 3>>:后三行向右缩进
  • >G:增加当前行到文档末尾处所有行的缩进层级
  • <G:减小当前行到文档末尾处所有行的缩进层级
  • 可视行模式(正常模式下按 V )下输入
    • > 向右缩进当前行
    • < 向左缩进当前行

2.4 自动排版

  • == 自动排版当前行
  • gg=G 当前文档全文自动排版
  • <N>== 对从当前行开始的 N 行进行自动排版
  • =<N>j 对当前行以及向下 N 行进行自动排版
  • =<N>k 对当前行以及向上 N 行进行自动排版

三、分屏与标签页

3.1 分屏

  • :split 缩写 :sp or Ctrl-w s 上下分屏(此时是同文件分屏)

    • :sp xx 上下分屏打开 xx 文件
  • :vsplit 缩写 :vs or Ctrl-w v 左右分屏(此时是同文件分屏)

    • :vs xx 左右分屏打开 xx 文件
  • :diffsplit 缩写 :diffs diff 模式打开一个分屏,后面可以加上 {filename}

  • :close! or Ctrl-w c 关闭当前分屏

窗口跳转

  • Ctrl-w w 激活下一个窗口
  • Ctrl-w j 激活下方窗口
  • Ctrl-w k 激活上方窗口
  • Ctrl-w h 激活左侧窗口
  • Ctrl-w l 激活右侧窗口

移动分屏

  • Ctrl-w L 移动到最右侧
  • Ctrl-w H 移动到最左侧
  • Ctrl-w K 移动到顶部
  • Ctrl-w J 移动到底部

屏幕缩放

  • Ctrl-w = 平均窗口尺寸
  • Ctrl-w + 增加高度
  • Ctrl-w - 缩减高度
  • Ctrl-w _ 最大高度
  • Ctrl-w > 增加宽度
  • Ctrl-w < 缩减宽度
  • Ctrl-w | 最大宽度

3.2 标签页

创建

  • :tabnew or :tabedit 缩写 :tabe 打开新标签页
  • Ctrl-w gf 在新标签页中打开当前光标所在位置的文件名

:tabnew:tabedit后面都可以跟一个 <空格><文件名> 用以在新标签页中 打开指定文件,还可以在:后面加一个数字,指出新标签页在列表中的位置(从 0 开始)

切换

  • gt or :tabnext 缩写 :tabn 下一个标签页(最后一个会循环到第一个)
  • gT or :tabprevious 缩写 :tabp 上一个标签页(第一个会循环到最后一个)
  • :tabrewind 缩写 :tabr or :tabfirst 缩写 :tabfir 到第一个
  • :tablast 缩写 :tabl 到最后一个标签页

关闭

  • :tabclose 缩写 :tabc 关闭当前标签页
  • :-tabc 关闭上一个标签页
  • :+tabc 关闭下一个标签页
  • :tabonly 缩写 :tabo 关闭其他标签页