NeoVim 键盘操作指南

26 年 4 月 8 日 星期三 (已编辑)
5481 字
28 分钟

说在前面

本文只是个人在学习 NeoVim 操作中进行的一些总结,肯定会有总结不全面的地方,如果需要全面的了解 NeoVim 的键盘操作,可以访问官方的文档:

模式概述

NeoVim 的核心设计理念是模式编辑。不同的模式下,键盘按键有不同的含义。

模式名称说明退出方式
NORMAL普通模式默认模式,用于导航和操作文本Esc 从其他模式返回
INSERT插入模式输入文本Esc 返回普通模式
VISUAL可视模式选择文本区域Escv 返回普通模式
REPLACE替换模式覆盖方式输入文本Esc 返回普通模式
COMMAND-LINE命令模式输入命令(如 :w 保存)EscEnter 执行后返回
TERMINAL终端模式在 NeoVim 内置终端中操作Ctrl+\ Ctrl+n 返回普通模式

模式切换快捷键

快捷键作用目标模式
Esc返回普通模式NORMAL
i在光标前插入INSERT
a在光标后插入INSERT
I(Shift+i)在行首插入INSERT
A(Shift+a)在行尾插入INSERT
o在下方新建一行插入INSERT
O(Shift+o)在上方新建一行插入INSERT
v进入可视模式(字符级)VISUAL
V(Shift+v)进入可视行模式(行级)VISUAL
Ctrl+v进入可视块模式(列级)VISUAL
r进入替换模式(只替换一个字母)REPLACE
R(Shift+v)进入替换模式REPLACE
:进入命令行模式COMMAND-LINE
/?进入搜索模式COMMAND-LINE
Ctrl+l清空搜索高亮并刷新屏幕(普通模式)-
Ctrl+z挂起 NeoVim(返回终端,用 fg 恢复)-

光标移动

基本移动

快捷键作用
h向左移动一个字符
j向下移动一行
k向上移动一行
l向右移动一个字符
w移动到下一个单词的开头
b移动到当前/上一个单词的开头
e移动到当前/下一个单词的结尾
ge移动到上一个单词的结尾
0移动到行首(第一个字符)
^移动到行首第一个非空白字符
_移动到当前行的第一个非空白字符(同 ^
g_移动到当前行的最后一个非空白字符
$移动到行尾
gg移动到文件开头
G移动到文件结尾
:nnG移动到第 n 行

单词移动的变体

  • WBE:以空白字符分隔的广义单词移动(忽略标点符号)

示例:

foo.bar(baz) 中,w 会停在 .( 处,W 会一次性跨过整个 foo.bar(baz)

屏幕移动

快捷键作用
Ctrl+f向下翻一页(forward)
Ctrl+b向上翻一页(backward)
Ctrl+d向下翻半页(down)
Ctrl+u向上翻半页(up)
H移动到屏幕顶部(High)
M移动到屏幕中部(Middle)
L移动到屏幕底部(Low)
zt将当前行置于屏幕顶部
zz将当前行置于屏幕中央
zb将当前行置于屏幕底部

跳转历史

快捷键作用
Ctrl+o跳转到上一个位置
Ctrl+i跳转到下一个位置
''(两个单引号)跳转到上一次光标所在行
` `(两个反引号)跳转到上一次光标精确位置

文本编辑

删除(Delete)

快捷键作用
x删除光标处的字符
X删除光标前的字符
dd删除整行
D从光标位置删除到行尾
dw删除到当前单词结尾(包括空格)
daw删除当前单词(delete around word)
diw删除当前单词(delete inner word,不包括周围空格)
d$D
d0从光标位置删除到行首
dgg从光标删除到文件开头
dG从光标删除到文件结尾

此处的删除操作同时都伴随着把删除的文本放入缓存区,所以此处的删除更像是 “剪切” 操作

如果想要不保存到缓存区,则需要在配置里自行编写快捷键。

修改(Change)

快捷键作用
c修改(删除后进入插入模式)
cc修改整行
C从光标位置修改到行尾
cw修改到单词结尾
ciw修改当前单词(inner word)
ci"修改双引号内的内容
ci(cib修改括号内的内容
ci[修改方括号内的内容
ci{ciB修改花括号内的内容
cit修改 XML/HTML 标签内的内容
ct + 字符修改到指定字符之前
cf + 字符修改到指定字符(包括该字符)

此处的修改操作同时都伴随着把删除的文本放入缓存区

如果想要不保存到缓存区,则需要在配置里自行编写快捷键。

插入

快捷键作用
i光标前插入
a光标后插入
I行首插入
gI在行首第一个非空白字符处插入
A行尾插入
o下方新建行插入
O上方新建行插入
gi在最后一次插入的位置插入

复制与粘贴

快捷键作用
y复制(yank)
yyY复制整行
yw复制到单词结尾
yiw复制当前单词
y$复制到行尾
y0复制到行首
p在光标后粘贴(paste)
P在光标前粘贴
gp粘贴并将光标移动到粘贴内容末尾
gP在光标前粘贴,光标移动到末尾
"+y复制到系统剪贴板(Windows)
"+p从系统剪贴板粘贴
"*y复制到主剪贴板(Linux 中键粘贴)
"*p从主剪贴板粘贴

缩进

快捷键作用
>>向右缩进(普通模式)
<<向左缩进(普通模式)
> + 移动命令向右缩进文本块,如 >j 缩进当前和下一行
< + 移动命令向左缩进文本块
= + 移动命令自动缩进,如 =G 从当前行缩进到文件末尾
==自动缩进当前行
gg=G自动缩进整个文件

大小写转换

快捷键作用
~切换光标处字符的大小写
g~ + 移动命令切换指定区域的大小写
gu + 移动命令转换为小写(如 guw 将单词转为小写)
gU + 移动命令转换为大写
guguguu当前行转换为小写
gUgUgUU当前行转换为大写

可视模式

进入可视模式

快捷键作用
v字符级可视模式
V行级可视模式
Ctrl+v块级可视模式
gv重新选中上次的可视区域

可视模式下的操作

进入可视模式选中文本后,可以按以下命令进行操作:

快捷键作用
dx删除选中文本
y复制选中文本
c修改(删除后进入插入模式)
~切换大小写
u转换为小写
U转换为大写
>向右缩进
<向左缩进
=自动缩进
J合并行
I在块级可视模式下,在每行光标位置插入文本(按 Esc 生效)
A在块级可视模式下,在每行光标后追加文本
r + 字符将选中区域所有字符替换为指定字符
s删除选中区域并进入插入模式
S删除选中行并进入插入模式

块级可视模式技巧

  • 选中多行的一个矩形区域后,按 I 输入文本,按 Esc 后文本会插入到每行的相同位置
  • 选中矩形区域后按 c 可以删除矩形区域并进入插入模式
  • 选中矩形区域后按 d 删除矩形内容,留下空白区域
  • 选中矩形区域后按 ~ 可以转换大小写

查找与替换

基本搜索

快捷键作用
/ + 模式 + Enter向下搜索
? + 模式 + Enter向上搜索
n重复上次搜索,相同方向
N重复上次搜索,相反方向
*搜索光标处的单词(向下)
#搜索光标处的单词(向上)
gd跳转到光标下的符号定义(LSP)
gD跳转到光标下符号的声明

搜索设置

命令作用
:set hlsearch开启搜索高亮
:set nohlsearch关闭搜索高亮
:set incsearch开启增量搜索(边输入边匹配)
:set ignorecase忽略大小写
:set smartcase智能大小写(模式含大写时区分大小写)
:nohlsearchCtrl+l暂时清除搜索高亮

替换

基本语法:

:[范围]s/查找模式/替换内容/[标志]
命令作用
:s/old/new/替换当前行第一个匹配
:s/old/new/g替换当前行所有匹配
:%s/old/new/g替换整个文件所有匹配
:%s/old/new/gc替换整个文件所有匹配,逐个确认
:10,20s/old/new/g替换第 10-20 行的所有匹配
:.,$s/old/new/g替换从当前行到文件末尾
:'<,'>s/old/new/g替换选中区域(可视模式下按 : 自动添加范围)
:%s/old/new/gi忽略大小写替换
:%s/\<old\>/new/g替换完整单词(不匹配 older

确认标志选项

标志作用
cconfirm,逐个确认是否替换
gglobal,替换行内所有匹配(默认只替换第一个)
iignore case,忽略大小写
n只报告匹配次数,不实际替换

确认模式下的操作:

  • y:替换当前匹配
  • n:跳过当前匹配
  • a:替换所有剩余匹配
  • q:退出替换
  • l:替换当前匹配并退出

撤销与重做

快捷键作用
u撤销上一步操作
Ctrl+r重做撤销的操作
U撤销对整行的所有修改(恢复到光标第一次到该行时的状态)
:earlier 5m回到 5 分钟前的状态
:later 5m前进到 5 分钟后的状态
:earlier 3撤销 3 次更改
:later 3重做 3 次更改
:undolist查看所有撤销分支
:undo 5跳转到第 5 次更改后的状态

重复操作

快捷键作用
.重复最后一次修改操作
@:重复上次命令行命令
@@重复上次执行的宏
&重复上次 :s 替换
Ctrl+A在光标处的数字上加 1
10Ctrl+A在光标处的数字上加 10
g Ctrl+A在可视模式下,按列递增数字
Ctrl+x在光标处的数字上减 1
10Ctrl+x在光标处的数字上减 10
g Ctrl+x在可视模式下,按列递减数字

寄存器

NeoVim 使用寄存器存储复制、删除、修改的文本。使用 " + 寄存器名访问。

寄存器列表

寄存器名称说明
"无名寄存器默认寄存器,dyp 默认使用
0复制专用寄存器yyy 复制的内容存入(不包括 d 删除)
1-9删除专用寄存器最近删除的内容,1 最新,9 最旧
a-z命名寄存器用户自定义,内容会累积追加
A-Z大写命名寄存器追加到对应小写寄存器
*主剪贴板Linux 中键粘贴,macOS 需配置
+系统剪贴板Ctrl+c/Ctrl+v 使用的剪贴板
_黑洞寄存器写入后丢弃,用于删除而不影响其他寄存器
/搜索寄存器存储上次搜索的模式
:命令行寄存器存储上次命令行命令
%文件名寄存器存储当前文件名
#交替文件寄存器存储上一个编辑的文件名

寄存器操作

快捷键作用
"ayy将当前行复制到寄存器 a
"ap粘贴寄存器 a 的内容
"Ayy将当前行追加到寄存器 a
"+y复制到系统剪贴板
"+p从系统剪贴板粘贴
:reg查看所有寄存器内容
:reg a查看寄存器 a 的内容

宏录制与回放

宏用于录制一系列操作,然后重复执行。

基本操作

快捷键作用
q + 寄存器名(a-z)开始录制宏到指定寄存器
q停止录制
@ + 寄存器名播放宏一次
@@重复播放上次的宏
5@a播放寄存器 a 中的宏 5 次
:normal @a在命令行中播放宏
:reg 查看宏内容宏存储为文本,可编辑

示例

" 录制宏:删除当前行并在下一行添加序号
qq " 开始录制到寄存器 q
dd " 删除当前行
j " 移动到下一行
I1. \<Esc> " 在行首插入 "1. "
q " 停止录制
" 重复执行宏
@q " 执行一次
5@q " 执行五次

宏技巧

  • 录制宏前使用 ggG 移动到起始位置
  • 使用 nN 在宏中处理搜索结果
  • 宏中可以包含递归调用(在宏中写 @a 实现循环)
  • 录制宏出错时按 q 停止,删除错误内容后重新录制
  • 宏内容可编辑::let @q='内容' 或直接修改寄存器

文本对象

文本对象允许对特定结构的文本块进行操作。语法格式为 [操作][i/a][对象],其中:

  • i:inner,不包含分隔符(如引号内的内容不含引号)
  • a:around,包含分隔符(如引号内的内容包含引号)
操作符说明
d删除(delete)
c修改(change)
y复制(yank)
v选中(visual)

常用文本对象

对象快捷键说明
单词iw / awinner word / around word
大单词iW / aW以空格分隔的单词块
括号i( / a(ib / ab括号内 / 包括括号
方括号i[ / a[方括号内 / 包括方括号
花括号i{ / a{iB / aB花括号内 / 包括花括号
引号i" / a"双引号内 / 包括引号
单引号i' / a'单引号内 / 包括引号
反引号i` / a`反引号内 / 包括反引号
尖括号i< / a<尖括号内 / 包括尖括号
标签it / atXML/HTML 标签内 / 包括标签
句子is / as句子内 / 包括句子
段落ip / ap段落内 / 包括段落
缩进块iI / aI同缩进级别的代码块

示例

" 假设光标在 "hello" 的任意位置
ciw " 删除 hello 并进入插入模式
ci" " 删除双引号内的内容(不含引号)
da" " 删除包括双引号在内的整个字符串
yip " 复制当前段落
vat " 选中包括标签在内的整个 HTML 标签
cit " 删除标签内内容并进入插入模式

窗口管理

窗口操作

快捷键作用
Ctrl+w s水平分割窗口
Ctrl+w v垂直分割窗口
Ctrl+w w在窗口间循环切换
Ctrl+w h/j/k/l切换到左/下/上/右窗口
Ctrl+w H/J/K/L将当前窗口移动到左/下/上/右
Ctrl+w t移动到左上角窗口
Ctrl+w b移动到右下角窗口
Ctrl+w p移动到上次访问的窗口
Ctrl+w q关闭当前窗口
Ctrl+w o只保留当前窗口,关闭其他
Ctrl+w =使所有窗口等高宽
Ctrl+w _最大化当前窗口高度
Ctrl+w |最大化当前窗口宽度
Ctrl+w +增加当前窗口高度
Ctrl+w -减少当前窗口高度
Ctrl+w >增加当前窗口宽度
Ctrl+w <减少当前窗口宽度
:split:sp水平分割窗口
:vsplit:vs垂直分割窗口
:new水平分割并创建新空白缓冲区
:vnew垂直分割并创建新空白缓冲区

标签页操作

快捷键作用
:tabnew新建标签页
:tabnew 文件名在新标签页打开文件
gt切换到下一个标签页
gT切换到上一个标签页
1gt切换到第 1 个标签页
:tabclose:tabc关闭当前标签页
:tabonly:tabo只保留当前标签页
:tabmove 0将当前标签页移动到最左
:tabmove将当前标签页移动到最右
Ctrl+w T将当前窗口移动到新标签页

缓冲区操作

快捷键作用
:ls:buffers列出所有缓冲区
:b n切换到缓冲区编号 n
:b 文件名切换到指定文件名的缓冲区(支持 Tab 补全)
:bn切换到下一个缓冲区
:bp切换到上一个缓冲区
:bd删除当前缓冲区(关闭文件)
:bw强制删除当前缓冲区(不保存)
:e 文件名编辑文件(在新缓冲区打开)
:e#编辑上一个文件
:enew创建新空白缓冲区
Ctrl+^在最近两个缓冲区之间切换
:bufdo 命令在所有缓冲区执行命令,如 :bufdo %s/old/new/gc

跳转与标记

内置标记

标记说明
` `上次跳转前的精确位置
''上次跳转前的行首
[上次修改/复制/粘贴的开始位置
]上次修改/复制/粘贴的结束位置
<上次可视选择的开始位置
>上次可视选择的结束位置
0退出 NeoVim 时的光标位置
"上次退出当前缓冲区时的光标位置
.最后修改的位置

用户自定义标记

快捷键作用
m + 字母(a-z)在光标位置设置局部标记(仅当前文件)
m + 大写字母(A-Z)设置全局标记(跨文件)
` + 字母跳转到标记的精确位置
' + 字母跳转到标记的行首
:marks查看所有标记
:delmarks a删除标记 a
:delmarks!删除所有小写字母标记

常用标记示例

ma " 在当前光标位置设置标记 a
`a " 跳转到标记 a 的精确位置
'a " 跳转到标记 a 所在行的行首
:marks a " 查看标记 a 的位置

折叠

折叠方法

命令作用
zf + 移动命令创建折叠,如 zf% 折叠到匹配括号
zF创建指定行数的折叠(如 3zF 折叠 3 行)
zfa{折叠花括号内的内容
zd删除光标下的折叠
zD删除光标下的所有嵌套折叠
zE删除当前缓冲区中的所有折叠

折叠开关

快捷键作用
zo打开光标下的折叠(open)
zO递归打开光标下的所有折叠
zc关闭光标下的折叠(close)
zC递归关闭光标下的所有折叠
za切换光标下的折叠状态(toggle)
zA递归切换光标下的所有折叠
zv打开足够的折叠使当前行可见
zx更新折叠(重新应用 foldlevel

折叠导航

快捷键作用
zj移动到下一个折叠的起始位置
zk移动到上一个折叠的起始位置
]z移动到当前折叠的末尾
[z移动到当前折叠的开头

折叠设置

:set foldmethod=indent " 根据缩进自动折叠
:set foldmethod=marker " 根据标记折叠(如 {{{ }}})
:set foldmethod=syntax " 根据语法折叠
:set foldmethod=manual " 手动折叠(默认)
:set foldlevel=1 " 设置初始折叠级别(1 表示一级折叠打开)
:set foldcolumn=4 " 在左侧显示折叠列

文件操作

基本文件操作

命令作用
:w保存文件
:w 文件名另存为
:q退出(如有未保存更改会提示)
:q!强制退出(不保存)
:wq:xZZ保存并退出
:wqa保存所有并退出
:e 文件名打开文件
:e!重新加载当前文件(放弃更改)
:e#打开上一个文件
:enew创建新空白缓冲区
:find 文件名path 中搜索并打开文件
:saveas 文件名另存为
:bdelete:bd删除缓冲区(关闭文件)

多文件编辑

:args file1 file2 file3 " 设置参数列表
:next 或 :n " 编辑下一个文件
:previous 或 :N " 编辑上一个文件
:first " 编辑第一个文件
:last " 编辑最后一个文件
:argdo 命令 " 在所有参数文件上执行命令

外部命令集成

命令作用
:! + 命令执行外部命令
:r! + 命令将外部命令输出插入到当前位置
:%! + 命令将整个文件内容作为输入传递给外部命令,并用输出替换
:!ls列出当前目录文件
:r!date插入当前日期时间
:!git diff执行 git diff
:w !python将当前缓冲区内容发送给 Python 执行

选中区域执行外部命令

在可视模式下选中文本后,按 : 会自动添加 '<,'> 范围,然后输入 ! + 命令可以将选中文本传递给外部命令并用输出替换。

帮助系统

命令作用
:help:h打开帮助
:h 主题搜索帮助主题,如 :h navigation
:h 命令查看命令帮助,如 :h :w
:h '选项'查看选项帮助,如 :h 'hlsearch'
Ctrl+]在帮助中跳转到标签链接
Ctrl+o在帮助中返回上一位置
:helpgrep 模式在所有帮助文档中搜索模式
:help -c查看命令行参数帮助

常用配置建议

" 基础设置
set number " 显示行号
set relativenumber " 显示相对行号
set cursorline " 高亮当前行
set showmode " 显示当前模式
set showcmd " 显示未完成的命令
set wildmenu " 命令行补全增强
set wildmode=longest:list,full
set ignorecase " 搜索忽略大小写
set smartcase " 智能大小写
set incsearch " 增量搜索
set hlsearch " 高亮搜索结果
set scrolloff=5 " 光标上下保留 5 行
set sidescrolloff=5 " 光标左右保留 5 列
set mouse=a " 启用鼠标
set clipboard=unnamedplus " 使用系统剪贴板(需支持)
set timeoutlen=300 " 按键序列等待时间
set ttimeoutlen=30 " 按键码等待时间
set splitbelow " 新水平分割在下方
set splitright " 新垂直分割在右侧
" 缩进设置
set autoindent " 自动缩进
set smartindent " 智能缩进
set tabstop=4 " Tab 宽度
set shiftwidth=4 " 缩进宽度
set expandtab " 将 Tab 展开为空格
" 文件类型检测
filetype on
filetype plugin on
filetype indent on
" 语法高亮
syntax on

总结

NeoVim 的键盘操作体系可以归纳为以下几个层次:

层次内容学习优先级
基础模式切换、基本移动(hjkl)、iaoddyypu必须掌握
进阶单词移动(wbe)、行移动(0$)、删除修改(ciwda")、查找替换核心效率
高级宏录制、文本对象、寄存器、多窗口、折叠提升上限
专家命令组合、自定义映射、LSP 集成按需学习

掌握 NeoVim 的核心在于组合:动作 + 文本对象 + 计数。例如 d2w(删除两个单词)、ci"(修改引号内内容)、y3j(复制下面三行)。熟练之后,编辑效率会有显著提升。

NeoVimVim键盘操作

·文章标题:NeoVim 键盘操作指南

·文章作者:NeoWangKing

·文章概要:本文系统总结 NeoVim 中的键盘操作,包括模式切换、光标移动、文本编辑、复制粘贴、搜索替换、窗口管理、标签页操作以及宏录制等核心内容,帮助用户从零开始掌握 NeoVim 的高效编辑方式。

·文章链接:https://www.neowangking.top/posts/development-tools/neovim/neovim-keyboard-operations[点击复制]

·上次修改:


Layer 1

商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。