# 基础知识

houdunren.com (opens new window) @ 向军大叔

xj-small

Vim是从vi发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

Neovim 是基于vim的速度更快的编辑器,也是vim的良好替代品。官网:https://neovim.io/

Neovim

# 运行模式

上vi/vim可以分为三种状态,分别是普通模式、插入模式和命令模式,各模式的功能区分如下:

# 普通模式

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段,以其它任何模式按esc 即可进宪普通模式

按键 描述 助记
i 在当前光标字符前插入 insert
a 在当前光标字符后插入 append
I 在当前行首插入 Insert
A 在当前行尾插入 Append
o 在下方开一新行,插入 open
O 在上方开一新行,插入 Open
r 替代字符,将当前字符替代为紧跟着输入的字符 replace
R 进入替代模式,将当前及之后的字符都替代为紧跟着输入的字符串,直到按 `` 返回 Normal 模式 Replace
gj 移动到屏幕折行后的下行
gk 移动到屏幕折行后的上行

# 命令模式

命令模式是在普通模式下按 : 进客户,用于搜索、保存退出等操作。

命令 说明
:w 保存保存
:w file 另存为文件
:q 退出
:q! 放弃修改退出
:wq 保存修改并退出
:e hd.ts 打开hd.ts文件
:e src/**/index.ts 打开 src 子目录下的 index.ts,按 tab 键有文件列表提示

# 可视化模式

在普通模式下按 v 进入可视模式

指令 说明
v 字符可视化模式,文本选择是以字符为单位
V 行可视化模式,文本选择是以行为单位
ctrl-V 块可视化模式,可以选择一个矩形内的文本

下面是指定在行首添加 houdunren.com的示例

  1. shift+v进入可视模式
  2. : normal 表示在可视模式执行normal指令
  3. Ihoudunren.com 表示在行首插入 houdunren.com

# 常用命令

# 移动命令

Vim 的各种移动命令主要是在标准模式下

按键 描述
h 光标左移
j 光标下移
k 光标上移
l 光标右移
0 跳到行首,可以理解为无穷大的h
^ 跳到行首开始的第一个非空白字符
$ 跳到行尾,可以理解为无穷大的l
gg 跳到首行,可以理解为无穷大的k
G 跳到末行,可以理解为无穷大的j
w 跳到下一个词首
ge 跳到上一个词尾
b 跳到单词开头
e 跳到单词尾部
5k 向上移动5行
5j 向下移动5行
5w 向后移动5个词
fx 向前移动到字符x上
Fx 向后移动到字符x上
tx 移动到字符x前
Tx 向后移动到字符x前
zz 当前行设为页面中心
ctrl+o 移动到上次编辑位置,可以跨文件操作
ctrl+i 从上次编辑位置移动到本次编辑位置,可以跨文件操作

# 制表符

按键 说明
:6,16> 6行到 16 行向右缩进
:6,16< 6行到 16 行向左缩进

# 选择

按键 说明
vt] 选择到],不包含],也适用于)、}
va] 选择到], 包含 ],也适用于)、}

# 剪切操作

按键 说明
x 删除当前光标所在处的字符
X 删除当前光标左边的字符
d$ 删除从光标到一行末尾的整个文本
d0 删除从光标到一行开头的所有单词
dd 删除当前光标处的一整行
5dd 删除从光标开始处的5行代码
dgg 删除从光标到文本开头
dG 删除从光标到文本结尾
di" 删除在引号之间的内容
dit 删除HTML标签内容
dtx 向后删除字符直到遇到第一个 x 字符
dw 删除到下一个单词的词首
dW 删除到右边界
daw 删除到左或边界,适合删除HTML属性
diw 删除光标所在单词
daw 删除光标所在单词,包括空格
dit 删除html标签内容
dat 删除html标签
D 删除到行尾
C 删除到行尾,进入插入模式
c^ 删除到行首
c$ 删除到行尾
ciw 删除单词并进行修改
caw 删除单词和空格并进行修改

# 复制粘贴

按键 说明
y 复制
p
yy 复制一整行
2yy 复制从当前光标所在行开始的2行
yit 复制标签内容
yat 复制完整标签
yG 复制到最后
y{ 复制到段落开始
y} 复制到段落结尾
yiw 复制单词并移到词首
yaw 复制单词并移到上个单词尾部
yit 复制html标签内容
yat 复制html标签
yi{ 复制{内的内容,不包含{,也适用于(、}
ya{ 复制{内的内容,包含{,也适用于(、}

# 删除修改

按键 说明
cw 删除从光标处到单词结尾的文本并进入到插入模式
cb 删除从光标处到单词开头的文本并进入到插入模式
cc 删除一整行并进入到插入模式
r 替换当前光标下的字符
R 进入到替换模式
ctx 向后修改内容到 x,也就是意味着删除光标到 x 中间内容,并进入插入模式
ci" 改写双引号中的内容
cc 编辑当前行
c^ 删除到行首,并进入编辑模式
c$ 删除到行尾,并进入编辑模式
cw 删除到词结束并进入编辑
ciw 删除整个单词并进入编辑
caw 删除整个单词并进入编辑,包含左右空格边界
d2t) 删除到第2个扩号
shft+d 删除到行尾
d+^ 删除到行首
d+$ 删除到行尾
c+^ 删除到行首,并进入编辑
c+$ 删除到行尾,并进入编辑
di} 删除花扩号内容,不包含},也适用于)、]
da} 删除花扩号内容,包含},也适用于)、]
diw 删除单词,不包含左右空格边界
diw 删除单词,包含左右空格边界
d2i} 删除2层}的内容
dip 删除连接段落
cip 删除连接段落,并进入编辑

# 注释操作

按键 说明
gcc 注释
gc2j 注释两行

# 环绕字符

按键 原内容 结果
单词加引号ysiw' houdunren.com 'houdunren.com'
添加标签 ysiwt h2 houdunren.com

houdunren.com

整行加引号 yss" houdunren.com 后盾人 "houdunren.com 后盾人"
替换为单引号 cs"' "houdunren" 'houdunren.com'
整行替换 cS'" 'houdunren' "houdunren"
替换引号为标签cs"t h2 'houdunren'

houdunren

删除绰号 ds' 'ds' ds
删除标签 dst
houdunren
Houdunren

# 查找替换

按键 说明
:/string 正向查找
:?string 反向查找
fx 向后查找x字符,按 ; 继续查找
Fx 向前查找x字符,按 ; 继续查找
fa 向右查找 a
Fa 向左查找a
2fa 向右查找第2个 a
2Fa 向左查找第2个a
:%s/hd/houdunren/g 全局搜索hd替换为houdunren
:5,12s/hd/houdunren/g 从第5行到12行替换hdhoudunren
:.,+2s/hd/houdunren/g 从当前行到后两行替换hdhoudunren

# 快速跳转

按键 说明
gg 跳转到第一行
G 跳转到最后一行
5G 跳到第5行
:5 跳转到第5行(命令模式)
{ 到段首
} 到段尾
shift+* 向下跳转到同名单词位置
shift+# 向上跳转到同名单词位置
shift+n 跳转到使用 shift+* 的下一个单词
ctrl+d 向下翻半页
ctrl+u 向上翻半页
ctrl+f 向下翻页
ctrl+b 向上翻页
% 跳转到匹配的块如 }、)、]

# 撤销重做

如果使用 vscode 也可以直接使用 ctrl+z 等原来的方式操作

按键 说明
u 撤销上一步的操作
ctrl+r 将原来的插销重做一遍

# 窗口管理

命令 说明
:vs 或 :vsplit 左右分屏
:sp 或 :split 上下分屏
:vertical resize 80 设置宽度 80%
:resize 80 设置高度 80%
ctrl+w c 关闭当前窗口
ctrl+w o 关闭其他窗口
ctrl+w l 切换左边窗口
ctrl+w j 切换上边窗口
ctrl+w k 切换下面窗口
ctrl+w l 切换右面窗口
ctrl+w w 窗口间循环切换
ctrl+w x 窗口互换
ctrl+w H 水平布局到垂直布局
ctrl+w J 垂直布局到水平布局

# 文件操作

使用编辑器时我需要在最近文件间的切换操作,VIM提供了相关的指令

命令 说明
:w 打开新文件
:e 编辑文件
:ls 查看缓冲区文件
:bn 编辑下一个文件
:bp 编辑上一个文件
ctrl+6 最近被编辑的两个文件之间的切换
:b1~n 编辑开的文件, 1~n 是缓冲区文件列表的序号
gf 光标停留文件路径字符时,使用gf可以直接打开访文件

# 标签管理

命令 说明
:tabe 打开新标签
:tabnext 下一标签
:+tabnext 上一标签

修改配置文件来定义键盘映射会让操作变得方便

"============标签管理============ 
map tt :tabe<CR>
map tj :-tabnext<CR>
map tk :+tabnext<CR>

# 缓冲区

命令 说明
:ls 查看缓冲区文件
:bn 编辑下一个文件
:bp 编辑上一个文件

# 块操作

使用块操作可以批量操作内容

命令 说明
v 普通块模式
shift+v 行块模式
ctrl+v 可视块模式

下面使用行块模式批量添加内容

  1. 进行行块模式
  2. : 进入命令模式
  3. 之后敲的命令就是对每行的操作,比如敲入 : normal I houdunren- 表示在 normal 模式下首行前添加 houdunren- 字符

下面通过可视块批量在每行前添加字符houdunren

  1. ctrl+v 进入可视块模式
  2. shift+G 选中到页面底部
  3. shift+i 进入编辑模式,输入houdunren
  4. esc 所以可视块区域前添加了字符 houdunren

# 拼写检查

nvim 内置了对错误单词的拼写检查,执行以下命令开关拼写检查

:set spell!

标准模式下

移动到错误单词上按 z=将弹出建议的单词,然后敲单词前的数字键就可以完成替换

编辑模式

在编辑模式下按 ctrl+x s也会弹出单词建议

# 其他命令

命令 说明
zc 折叠代码块
zo 展开代码块
zC 折叠所有代码块
zO 展开所有代码块

# 键盘映射

可以对按键布局进行自定义设置,在 ~/.config/nvim/init.vim 文件中配置

  • nmap 为 normal 模式
  • imap 为 insert 模式
  • 为前缀键,`let mapleader=" "` 将 `LEADER` 定义为空格
  • C 为ctrl键如 <C-b> 指 ctrl+b
" ============ 键盘映射  
let mapleader=" "
nmap ge :CocCommand explorer
nmap S :w <CR>
nmap Q :q <CR>
nmap <C-p> :FZF <CR>
nmap H <Home>
nmap L <End>
imap jj <Esc>  

" ============ 分屏
nmap <LEADER>vh :vsplit<CR>
nmap <LEADER>vj :split<CR>
nmap <LEADER>w <C-w>

" ============ 文件树
nmap <C-b> ge <CR>

# 屏幕分割

命令 说明
split 水平分屏
vsplit 垂直分屏

可以在配置文件中定义热键,来简化分屏操作操作

"分屏热键
nmap sl :set splitright<CR>:vsplit<CR>
nmap sh :set nosplitright<CR>:vsplit<CR>
nmap sk :set nosplitbelow<CR>:split<CR>
nmap sj :set splitbelow<CR>:split<CR>

# 剪贴板共享

manjaro 系统剪贴板共享,需要安装以下命令

sudo pacman -S xsel

然后在~/.config/nvim/init.vim配置文件中添加

set clipboard+=unnamedplus

# 向军配置

向军大叔已经将使用的neovim配置进行了开源,你可以访问github (opens new window)进行快速安装。