我背叛了 Neovim ?! 和我一起配置 VSCode 吧_哔哩哔哩_bilibili
Vim 命令语言入门
Vim 的命令模式通常遵循这样的结构:{操作符}
+ {计数}
+ {动作/文本对象}
。
-
操作符(Operator):这部分决定了你要对文本做什么。例如:
-
d
:删除 (delete) 。 -
c
:修改 (change) 。 -
y
:复制 (yank) 。 -
g~
:切换大小写 (switch case) 。 -
>
:增加缩进 -
<
:减少缩进
-
-
文本对象(Text Object):这部分决定了操作的范围。文本对象是 Vim 对代码或文本中逻辑单元的抽象,例如单词、句子、段落、括号内的内容等 。文本对象通常由两个字母组成:
i
(inner):表示“内部”,即不包括周围的空白或分隔符 。a
(around):表示“整个”,即包括周围的空白或分隔符 。
一些常用的文本对象包括:
w
:单词 (word) 。p
:段落 (paragraph) 。(
或)
:括号内部 。{
或}
:花括号内部 。[
或]
:方括号内部 。"
:引号内部 。
-
计数(Count):这个是可选的,表示重复操作的次数 。
将这三个部分结合起来,你就可以通过组合来创建任何你想要的复杂指令。
例如,以 diw
为例:
d
:操作符,表示“删除”。i
:文本对象的前缀,表示“内部”。w
:文本对象,表示“单词”。
所以,diw
的意思就是“删除光标所在的内部单词” 。它会删除单词本身,但会保留单词前后的空格 。
如果将 i
换成 a
,指令就变成了 daw
。
d
:删除。a
:整个。w
:单词。
daw
的意思就是“删除光标所在的整个单词”,包括它后面的一个空格 。
再比如,cip
:
c
:操作符,表示“修改”。i
:文本对象的前缀,表示“内部”。p
:文本对象,表示“段落”。
cip
的意思是“修改光标所在的内部段落” 。它会删除整个段落的内容,并让你进入插入模式,但会保留段落之间的空行 。
通过这种方式,你可以将 Vim 的指令看作一种简单的“语法”,而不是毫无关联的按键组合。一旦你掌握了这种组合逻辑,就可以轻松地推导出和记忆各种指令,从而大大提高编辑效率。
类别 | 命令 | 描述 | 示例 |
---|---|---|---|
模式切换 | i |
insert,在光标前进入插入模式 | i 用于开始输入文本 |
a |
append,在光标后进入插入模式 | ||
I |
在当前行第一个非空字符处进入插入模式 | ||
A |
在当前行末尾进入插入模式 | ||
o |
open,在下方新行进入插入模式 | ||
O |
在上方新行进入插入模式 | ||
v |
visual,进入字符可视模式 | vd 删除选中内容 |
|
V |
Visual Line,进入行可视模式 | Vy 复制选中行 |
|
<C-V> |
Ctrl + V,进入块可视模式 | <C-V>jj 选中一个矩形文本块 |
|
<ESC> |
Escape,返回普通模式 | <ESC> 是最常用的退出键 |
|
导航 | h , j , k , l |
左, 下, 上, 右 | 10j 向下移动 10 行 |
w , b , e |
按单词前移/后移/移到词尾 | 3w 向前移动 3 个单词 |
|
0 , ^ , ` |
类别 | 命令 | |
-------------- | ---------------------- | ------------------------------------------------ | --------------------------------------- |
模式切换 | i |
insert,在光标前进入插入模式 | i 用于开始输入文本 |
a |
append,在光标后进入插入模式 | ||
I |
在当前行第一个非空字符处进入插入模式 | ||
A |
在当前行末尾进入插入模式 | ||
o |
open,在下方新行进入插入模式 | ||
O |
在上方新行进入插入模式 | ||
v |
visual,进入字符可视模式 | vd 删除选中内容 |
|
V |
Visual Line,进入行可视模式 | Vy 复制选中行 |
|
<C-V> |
Ctrl + V,进入块可视模式 | <C-V>jj 选中一个矩形文本块 |
|
<ESC> |
Escape,返回普通模式 | <ESC> 是最常用的退出键 |
|
导航 | h , j , k , l |
左, 下, 上, 右 | 10j 向下移动 10 行 |
w , b , e |
按单词前移/后移/移到词尾 | 3w 向前移动 3 个单词 |
\| 移动到行首/第一个非空字符/行尾 \| `$` 将光标移到行尾 |
| | gg
, G
| 移动到文件首行/尾行 | 20G
跳转到文件的第 20 行 |
| | H
, M
, L
| 移动到屏幕的顶部/中间/底部 | |
| | f{char}
, t{char}
| 移动到下一个 {char}
字符 / 的前一个位置 | fa
移动到下一个 'a' 字符 |
| | ;
, ,
| 正向 / 反向重复上一次的 f
或 t
操作 | |
| | }
| 向下移动一个段落(到下一个空行) | |
| | {
| 向上移动一个段落(到上一个空行) | |
| 编辑 | d
, c
, y
| delete (删除), change (修改), yank (复制) 操作符 | dw
删除一个单词, ci"
修改引号内文本 |
| | p
, P
| 在光标后 / 前粘贴 | p
在光标后粘贴 |
| | x
| 删除光标下的字符 | xp
交换两个字母 |
| | r
| replace,替换光标下的单个字符 | ra
将光标下的字符替换为 'a' |
| | R
| 进入替换模式,连续替换字符直到按 <ESC>
| R
开始连续替换 |
| | s
| 替换光标下的字符并进入插入模式 | |
| | .
| 重复上一次的修改命令 | |
| 行操作 | dd
, yy
, cc
| 删除 / 复制 / 修改当前行 | 2dd
删除 2 行 |
| | u
| undo,撤销 | u
撤销上次修改 |
| | <C-R>
| Ctrl + Redo,重做 | |
| | >>
, <<
| 增加 / 减少当前行缩进 | 3>>
增加 3 行的缩进 |
| 搜索与替换 | /pattern
, ?pattern
| 向下 / 向上搜索 pattern
| /hello
搜索 "hello" |
| | n
, N
| 跳转到下一个 / 上一个搜索结果 | |
| | :s/old/new/
| 替换当前行的第一个 old
为 new
| |
| | :s/old/new/g
| 替换当前行的所有 old
为 new
| |
| | :%s/old/new/g
| 在整个文件中全局替换所有 old
为 new
| :%s/foo/bar/g
|
| | :'<,'>s/old/new/g
| 在可视模式选中的行内替换所有 old
为 new
| |
| | :%s/old/new/gc
| 全局替换,但每次替换前会请求确认 | |
| 屏幕管理 | zz
| 将当前行置于屏幕中央 | |
| | zt
| 将当前行置于屏幕顶部 (top) | |
| | zb
| 将当前行置于屏幕底部 (bottom) | |
| | <C-E>
| 向下滚动一行 (光标逻辑位置不变) | |
| | <C-Y>
| 向上滚动一行 (光标逻辑位置不变) | |
| 窗口管理 | :sp
, :vsp
| 水平 / 垂直分割窗口 | |
| | <C-w>w
| 在窗口之间循环切换 | |
| | <C-w>h/j/k/l
| 切换到左/下/上/右侧的窗口 | |
| | :q
| 关闭当前窗口 | |
| 命令行模式 | :w
| write,保存文件 | :wq
保存并退出 |
| | :q!
| quit,强制退出(不保存) | :qall
退出所有文件 |
| | :e {file}
| edit,编辑一个文件 | :e newfile.txt
|
显示变量:gh
折叠代码:za