跳到主要内容

vim实用技巧

这篇文章记录一些日常写代码、改配置、远程机器排障时高频用到的 Vim 技巧。先记住少量命令,再逐步把它们组合起来,效率会提升得很明显。

Vim 模式

Vim 的核心是“模式”。不用一开始记太多,先掌握下面几种就够日常使用。

  • 普通模式:移动光标、复制、删除、搜索、执行命令。按 Esc 回到普通模式。
  • 插入模式:输入文本。常用 iao 进入。
  • 可视模式:选择文本。常用 vVCtrl + v 进入。
  • 命令模式:保存、退出、替换、打开文件。普通模式下输入 : 进入。

Vim 基础操作

进入插入模式

i 在光标前插入

a 在光标后插入

I 在当前行行首插入

A 在当前行行尾插入

o 在下一行新建一行并插入

O 在上一行新建一行并插入

保存和退出

:w 保存文件

:q 退出

:wq 保存并退出

:q! 不保存强制退出

:x 保存并退出,只有文件发生变化时才写入

ZZ 保存并退出

ZQ 不保存退出

光标移动

基础移动

h 向左移动

j 向下移动

k 向上移动

l 向右移动

w 移动到下一个单词开头

e 移动到当前或下一个单词结尾

b 移动到当前或上一个单词开头

0 移动到当前行行首

^ 移动到当前行第一个非空字符

$ 移动到当前行行尾

页面移动

gg 跳转到文件开头

G 跳转到文件末尾

10G 跳转到第 10 行

Ctrl + f 向下翻一页

Ctrl + b 向上翻一页

Ctrl + d 向下翻半页

Ctrl + u 向上翻半页

zt 将当前行移动到屏幕顶部

zz 将当前行移动到屏幕中间

zb 将当前行移动到屏幕底部

编辑文本

删除、复制、粘贴

x 删除当前字符

dd 删除当前行

D 删除光标到行尾的内容

dw 删除一个单词

d$ 删除光标到行尾

yy 复制当前行

yw 复制一个单词

p 粘贴到光标后

P 粘贴到光标前

u 撤销

Ctrl + r 重做

修改文本

r 替换当前字符

R 进入替换模式

cw 修改一个单词

ciw 修改当前单词

C 修改光标到行尾的内容

cc 修改整行

s 删除当前字符并进入插入模式

S 删除当前行并进入插入模式

常用组合

Vim 很多命令都遵循“操作 + 范围”的组合方式。

d2w 删除后面两个单词

y3j 复制当前行和下面三行

c$ 修改光标到行尾的内容

d} 删除到下一个段落

ci" 修改双引号里面的内容

ci' 修改单引号里面的内容

ci( 修改小括号里面的内容

ci{ 修改大括号里面的内容

di[ 删除中括号里面的内容

查找和替换

查找

/keyword 向下搜索 keyword

?keyword 向上搜索 keyword

n 跳转到下一个匹配结果

N 跳转到上一个匹配结果

* 搜索当前光标所在单词

# 反向搜索当前光标所在单词

替换

:s/old/new 替换当前行第一个匹配项

:s/old/new/g 替换当前行所有匹配项

:%s/old/new/g 替换整个文件所有匹配项

:%s/old/new/gc 替换整个文件所有匹配项,并逐个确认

:10,20s/old/new/g 替换第 10 行到第 20 行的匹配项

如果替换内容中包含 /,可以换成其他分隔符:

:%s#https://old.example.com#https://new.example.com#g

可视模式

v 进入字符选择模式

V 进入行选择模式

Ctrl + v 进入块选择模式

选中文本后可以继续执行:

d 删除选区

y 复制选区

> 向右缩进

< 向左缩进

= 自动格式化缩进

块选择模式适合批量编辑多行。例如给多行前面加注释:

  1. Ctrl + v 进入块选择模式
  2. jk 选择多行
  3. I 在行首插入
  4. 输入注释符号,例如 //
  5. Esc 应用到所有选中的行

多文件和缓冲区

:e fileName 打开文件

:ls 查看缓冲区列表

:bnext 切换到下一个缓冲区

:bprev 切换到上一个缓冲区

:b 2 切换到编号为 2 的缓冲区

:bd 关闭当前缓冲区

:tabnew fileName 在新 tab 中打开文件

gt 切换到下一个 tab

gT 切换到上一个 tab

分屏操作

:sp 水平分屏

:vsp 垂直分屏

:sp fileName 水平分屏打开文件

:vsp fileName 垂直分屏打开文件

Ctrl + w + h 切换到左侧窗口

Ctrl + w + j 切换到下方窗口

Ctrl + w + k 切换到上方窗口

Ctrl + w + l 切换到右侧窗口

Ctrl + w + = 平均分配窗口大小

Ctrl + w + q 关闭当前窗口

寄存器

Vim 的复制、删除会进入寄存器。最常用的是系统剪贴板寄存器和黑洞寄存器。

"ayy 复制当前行到寄存器 a

"ap 粘贴寄存器 a 的内容

"+y 复制选中内容到系统剪贴板

"+p 从系统剪贴板粘贴

"_d 删除内容但不污染默认寄存器

例如想删除一段文本,但不影响刚才复制的内容,可以选中后执行:

"_d

宏适合处理“重复但又不完全适合搜索替换”的编辑任务。

qa 开始录制宏到寄存器 a

执行一组操作

q 停止录制

@a 执行寄存器 a 中的宏

10@a 连续执行 10 次宏

一个常见场景是批量给每行末尾加逗号:

  1. 将光标放到第一行
  2. 输入 qa
  3. 输入 A,
  4. Esc
  5. 输入 j
  6. 输入 q
  7. 输入 10@a

标记和跳转

ma 在当前位置设置标记 a

`a 跳转到标记 a 的精确位置

'a 跳转到标记 a 所在行

Ctrl + o 跳转到上一个位置

Ctrl + i 跳转到下一个位置

% 在成对括号之间跳转

折叠代码

zf 创建折叠,需要先选中范围

zo 打开当前折叠

zc 关闭当前折叠

za 切换当前折叠状态

zR 打开所有折叠

zM 关闭所有折叠

常用命令

:set number 显示行号

:set relativenumber 显示相对行号

:set paste 开启粘贴模式,避免粘贴时自动缩进错乱

:set nopaste 关闭粘贴模式

:set ignorecase 搜索时忽略大小写

:set smartcase 搜索时如果包含大写字母,则区分大小写

:set list 显示不可见字符

:set nolist 隐藏不可见字符

:noh 取消搜索高亮

推荐配置

可以把下面配置放到 ~/.vimrc 中:

set number
set relativenumber
set cursorline
set tabstop=2
set shiftwidth=2
set softtabstop=2
set expandtab
set autoindent
set smartindent
set ignorecase
set smartcase
set incsearch
set hlsearch
set wildmenu
set showcmd
set clipboard=unnamedplus

nnoremap <leader><space> :noh<CR>

其中 <leader><space> 用来快速取消搜索高亮。默认情况下 <leader>\,也可以自己改成空格:

let mapleader=" "

高频使用场景

快速修改引号中的内容

ci"

适合把:

const name = "old value";

快速改成:

const name = "new value";

删除当前行并保持剪贴板内容不变

"_dd

全文件替换并逐个确认

:%s/oldName/newName/gc

确认时常用选项:

y 替换当前匹配项

n 跳过当前匹配项

a 替换所有剩余匹配项

q 退出替换

批量缩进选中代码

选中多行后输入:

=

或者直接在普通模式下格式化当前大括号内代码:

=i{

回到上一次编辑的位置

`.

重复上一次修改

.

. 是 Vim 中非常高频的命令。比如执行一次 ciwnewValue 后,把光标移动到另一个单词上,再按 . 就能重复同样的修改。

评论