Linux运维——Vim基础
Vim基础
- 一、移动光标
- 1.1、基础移动
- 1.2、屏幕滚动
- 二、编辑操作
- 2.1、插入模式
- 2.2、删除与修改
- 2.3、复制粘贴
- 三、搜索与替换
- 3.1、搜索
- 3.2、替换
- 4、分屏与窗口管理
- 4.1、分屏操作
- 4.2、窗口调整
- 五、宏与批量操作
- 六、效率技巧
- 七、操作符
- 7.1、内置操作符
- 7.2、操作符 + 文本对象(高效组合)
- 7.3、操作符进阶技巧
- 7.4、自定义操作符
- 八、文本对象
- 8.1、内置文本对象
- 8.2、操作符+文本对象
- 8.3、自定义文本对象
- 8.4、插件增强文本对象
- 8.5、使用技巧
- 九、动作
- 9.1、基础动作
- 9.2、高级动作技巧
- 9.3、动作+操作符
- 9.4、自定义动作
- 9.5、使用示例
一、移动光标
1.1、基础移动
快捷键 | 作用 |
---|---|
h j k l | 左/下/上/右移动 |
w | 跳到下一个单词开头 |
b | 跳到上一个单词开头 |
e | 跳到当前单词末尾 |
0 | 跳到行首 |
^ | 跳到行首第一个非空白字符 |
$ | 跳到行尾 |
gg | 跳到文件第一行 |
G | 跳到文件最后一行 |
:n | 跳到第 n 行(如 :10 跳第 10 行) |
1.2、屏幕滚动
快捷键 | 作用 |
---|---|
Ctrl+u | 向上滚动半屏 |
Ctrl+d | 向下滚动半屏 |
Ctrl+b | 向上滚动整屏 |
Ctrl+f | 向下滚动整屏 |
zz | 当前行居中显示 |
zt | 当前行置顶 |
zb | 当前行置底 |
二、编辑操作
2.1、插入模式
快捷键 | 作用 |
---|---|
i | 在光标前插入 |
a | 在光标后插入 |
I | 在行首插入 |
A | 在行尾插入 |
o | 在下方插入新行 |
O | 在上方插入新行 |
2.2、删除与修改
快捷键 | 作用 |
---|---|
x | 删除当前字符 |
dw | 删除当前单词 |
dd | 删除当前行 |
D | 删除到行尾 |
cw | 修改当前单词(删除并进入插入模式) |
cc | 修改整行 |
r | 替换单个字符 |
R | 进入替换模式(连续替换) |
2.3、复制粘贴
快捷键 | 作用 |
---|---|
yy | 复制当前行 |
yw | 复制当前单词 |
p | 粘贴到光标后 |
P | 粘贴到光标前 |
"ayy | 复制当前行到寄存器 a |
"ap | 粘贴寄存器 a 的内容 |
三、搜索与替换
3.1、搜索
快捷键 | 作用 |
---|---|
/keyword | 向前搜索 keyword |
?keyword | 向后搜索 keyword |
n | 跳转到下一个匹配项 |
N | 跳转到上一个匹配项 |
* | 搜索当前光标下的单词 |
3.2、替换
命令 | 作用 |
---|---|
:s/old/new | 替换当前行第一个 old |
:s/old/new/g | 替换当前行所有 old |
:%s/old/new/g | 替换全文所有 old |
:%s/old/new/gc | 替换全文并每次确认 |
4、分屏与窗口管理
4.1、分屏操作
快捷键 | 作用 |
---|---|
:sp | 水平分屏 |
:vsp | 垂直分屏 |
Ctrl+w h/j/k/l | 跳转到左/下/上/右窗口 |
Ctrl+w w | 循环切换窗口 |
Ctrl+w c | 关闭当前窗口 |
Ctrl+w o | 关闭其他窗口 |
4.2、窗口调整
快捷键 | 作用 |
---|---|
Ctrl+w + | 增加窗口高度 |
Ctrl+w - | 减少窗口高度 |
Ctrl+w > | 增加窗口宽度 |
Ctrl+w < | 减少窗口宽度 |
Ctrl+w = | 所有窗口等宽等高 |
五、宏与批量操作
快捷键 | 作用 |
---|---|
qa | 开始录制宏到寄存器 a |
q | 停止录制 |
@a | 执行寄存器 a 的宏 |
@@ | 重复执行上一次宏 |
:normal @a | 对选中行执行宏 a |
- 按 qa 开始录制 → 执行操作(如 dd 删除行)→ 按 q 结束录制
- 执行 @a 重复删除操作
六、效率技巧
组合操作:
dap
:删除整个段落cis
:修改当前句子
文本对象:
viw
:选中当前单词vip
:选中当前段落
重复操作:
10j
:向下移动 10 行5dd
:删除 5 行
七、操作符
Vim 的操作符遵循 "操作符 + 动作 = 操作" 的模式:
[次数] 操作符 [范围/文本对象]
例如:d2w 表示 “删除 2 个单词”。
7.1、内置操作符
操作符 | 作用 | 示例 | 说明 |
---|---|---|---|
d | 删除 (Delete) | dw 删除单词 | 内容会存入寄存器,可粘贴 |
y | 复制 (Yank) | y$ 复制到行尾 | 配合 p /P 粘贴 |
c | 修改 (Change) | ciw 修改当前单词 | 删除后自动进入插入模式 |
~ | 大小写切换 | ~ 切换当前字符 | 支持视觉模式选区 |
g~ | 反转选区大小写 | g~iw 反转单词 | |
gu | 转为小写 | guw 单词转小写 | |
gU | 转为大写 | gUw 单词转大写 | |
> | 增加缩进 | >j 下一行缩进 | 通常结合 >> 缩进整行 |
< | 减少缩进 | <k 上一行缩进 | 通常结合 << 取消缩进整行 |
= | 自动缩进 | =ap 段落自动缩进 | 需设置 filetype indent on |
! | 通过外部命令过滤 | !}sort 段落排序 | 调用 sort 命令处理选区 |
gq | 文本重排 (Format) | gqap 重排段落 | 依赖 textwidth 设置 |
z | 折叠操作 | zfap 创建段落折叠 | 需启用折叠功能 |
7.2、操作符 + 文本对象(高效组合)
基础文本对象:
文本对象 | 作用 | 示例 | 说明 |
---|---|---|---|
iw | 当前单词 (inner word) | diw 删除单词 | 不包括空格 |
aw | 当前单词 + 空格 | daw 删除单词 | 包括相邻空格 |
i" | 引号内内容 | ci" 修改引号内容 | 光标需在引号间 |
a" | 引号及内容 | da" 删除引号及内容 | |
i( / i) | 括号内内容 | di( 删除括号内容 | 适用于 [] , {} , <> 等 |
a( / a) | 括号及内容 | da( 删除括号及内容 |
高级文本对象:
文本对象 | 作用 | 示例 | 说明 |
---|---|---|---|
ip | 段落 (inner paragraph) | dip 删除段落 | 需设置 :set paragraph= |
ap | 段落 + 空行 | yap 复制段落 | |
is | 句子 (inner sentence) | cis 修改句子 | 以 .!? 结尾为句子 |
as | 句子 + 空格 | das 删除句子 |
7.3、操作符进阶技巧
跨行操作:
d/pattern<CR> " 删除直到匹配 pattern 的位置
y?error<CR> " 复制到上一个 "error" 出现处
寄存器指定:
"aD " 删除到行尾并存入寄存器 a
"+yiw " 复制当前单词到系统剪贴板
重复操作符:
.. " 重复上一次修改(包括操作符动作)
& " 重复最近的 `:s` 替换操作
视觉模式配合:
用 v/V/Ctrl+v 选择区域
按操作符(如 d/y/>)执行
7.4、自定义操作符
通过 map-operator 创建自定义操作符(需 Vim 7.4+):
高亮选区:
" 定义操作符(输入 \h 高亮选区)
vnoremap <silent> <leader>h :<C-U>call HighlightSelection()<CR>
function! HighlightSelection()execute "'<,'>s/\\%V\$.*\$\\%V/\\1/"echom "选区已高亮"
endfunction
base64编码:
" 输入 \b 对选区进行 Base64 编码
vnoremap <silent> <leader>b :<C-U>call Base64Encode()<CR>
function! Base64Encode()execute "'<,'>!base64"
endfunction
八、文本对象
文本对象是 结构化文本片段(如单词、句子、括号内容等),通过 操作符 + 文本对象
或 可视化模式 + 文本对象
实现高效操作。
语法:
i
+ 对象 → 操作 内部(不包含边界符号,如引号/括号)a
+ 对象 → 操作 整体(包含边界符号)
8.1、内置文本对象
基础对象:
文本对象 | 作用范围 | 示例 | 说明 |
---|---|---|---|
iw /aw | 单词 (word) | diw 删除单词 | aw 包含相邻空格 |
iW /aW | 大单词 (WORD) | ciW 修改连续非空白字符 | 以空格为分隔 |
is /as | 句子 (sentence) | yas 复制句子 | 以.!? 结尾为界 |
ip /ap | 段落 (paragraph) | dap 删除段落 | 以空行为分隔 |
i" /a" | 双引号内容 | ci" 修改引号内文本 | 适用于 ' ` `等同类符号 |
i( /a( | 括号内容 (圆括号) | di( 删除括号内内容 | 同样适用于 [] {} <> |
标签对象(HTML/XML):
文本对象 | 作用范围 | 示例 | 说明 |
---|---|---|---|
it /at | 标签内部/整个标签 | cit 修改标签内容 | 需光标在标签内 |
i> /a> | 尖括号内容 | yi> 复制标签属性 | 适用于 <div class="..."> |
其它对象:
文本对象 | 作用范围 | 示例 | 说明 |
---|---|---|---|
i{ /a{ | 花括号块 (代码块) | va { 选中整个代码块 | 适用于 if /for 等代码块 |
i/a 缩进块 (indent) | >i 增加缩进块 | 需开启 :set indentkeys | |
i /a | 函数参数 (argument) | cia 修改函数参数 | 需插件如 vim-textobj-parameter |
8.2、操作符+文本对象
高效编辑:
ci" " 修改双引号内的内容(自动进入插入模式)
da{ " 删除花括号及内部代码块(包括换行)
yip " 复制当前段落
>ap " 增加段落缩进
复杂嵌套场景:
<!-- 修改嵌套标签内容 -->
<div><span>|光标在这里|</span>
</div>
cit
→ 修改<span>
内容dat
→ 删除整个<span>
标签2cit
→ 修改外层<div>
内容(需插件支持层级跳转)
8.3、自定义文本对象
基础自定义(.vimrc):
" 定义 XML 属性文本对象(选中 class="...")
xnoremap <silent> ix :<C-U>call SelectXMLAttr()<CR>
function! SelectXMLAttr()execute "normal! /\\s\\w\\+=\\s*[\"']\\<CR>v/\\s\\w\\+=\\s*[\"']\\>\\zs<CR>"
endfunction
使用:vix 选中当前 XML 属性值。
通过插件扩展:
vim-textobj-user:创建自定义文本对象的框架
示例:定义 if 条件语句为文本对象:
call textobj#user#plugin('condition', {
\ 'if': {
\ 'select-a': 'aif',
\ 'select-i': 'iif',
\ 'pattern': '\<if\>.\{-}\<endif\>',
\ },
\ })
使用:diif 删除 if 条件块内容。
8.4、插件增强文本对象
vim-surround:
操作 | 效果 |
---|---|
ds" | 删除周围双引号 |
cs"' | 将双引号改为单引号 |
ysiw] | 给单词添加 [] 包围 |
vim-indent-object:
文本对象 | 作用 |
---|---|
ii /ai | 操作相同缩进层级的内容 |
dii " 删除当前缩进块(保留父级)
vim-textobj-line:
文本对象 | 作用 |
---|---|
il /al | 操作整行(非空白部分/全行) |
yal " 复制整行(包括换行符)
8.5、使用技巧
快速修复JSON键名:
{ "old_name": "value" }
光标定位到键名 → ci"new_name → 快速修改键名
代码块操作:
def foo():|光标在这里|return True
di → 删除函数体(需 indent 文本对象支持)
选取扩展:
在可视化模式中:
按 i 或 a 后输入文本对象(如 i")可动态调整选区范围
九、动作
动作是 移动光标或选择文本 的命令,可与 操作符(如 d/y/c)或 可视化模式 组合使用。
- 语法:[次数] + 动作
- 例如:d2w → 删除 2 个单词,v3j → 向下选择 3 行。
9.1、基础动作
字符级移动:
动作 | 作用 | 示例 |
---|---|---|
h | 左移 | dl 删除右侧字符 |
l | 右移 | ch 修改左侧字符 |
k | 上移 | 5k 上移 5 行 |
j | 下移 | vj 选择当前和下一行 |
单词级移动:
动作 | 作用 | 示例 |
---|---|---|
w | 跳到下一个单词开头 | dw 删除到下一单词 |
b | 跳到上一个单词开头 | cb 修改上一单词 |
e | 跳到当前单词末尾 | ge 跳到前一单词末尾 |
行级移动:
动作 | 作用 | 示例 |
---|---|---|
0 | 跳到行首 | d0 删除到行首 |
^ | 跳到行首非空白字符 | y^ 复制到行首 |
$ | 跳到行尾 | c$ 修改到行尾 |
+ | 跳到下一行首 | v+ 选择两行 |
- | 跳到上一行首 | d- 删除上一行 |
屏幕滚动:
动作 | 作用 |
---|---|
H | 跳到屏幕顶部(High) |
M | 跳到屏幕中间(Middle) |
L | 跳到屏幕底部(Low) |
Ctrl+u | 上翻半屏 |
Ctrl+d | 下翻半屏 |
9.2、高级动作技巧
搜索跳转:
动作 | 作用 | 示例 |
---|---|---|
f{char} | 跳到当前行下一个 {char} | df. 删除到句点 |
F{char} | 跳到当前行上一个 {char} | yF, 复制到逗号 |
t{char} | 跳到 {char} 前一个字符 | ct" 修改到引号前 |
/{pattern} | 全局搜索 | d/end<CR> 删除到 “end” |
标记跳转:
动作 | 作用 |
---|---|
m{a-z} | 设置标记(如 ma) |
`a | 精确跳转到标记 a |
'{a-z} | 跳到标记行的行首 |
代码块跳转:
动作 | 作用 | 示例 |
---|---|---|
% | 匹配括号跳转 | d% 删除括号间内容 |
[[ | 跳到上一个函数开头 | y[[ 复制函数 |
]] | 跳到下一个函数开头 | v]] 选择函数 |
9.3、动作+操作符
经典组合:
d2w " 删除 2 个单词
ci( " 修改括号内内容
yG " 复制到文件末尾
>} " 增加缩进到段落末尾
跨行操作:
d/function<CR> " 删除直到 "function" 出现处
y?end<CR> " 复制到上一个 "end" 位置
精准选区:
v3e " 选择当前单词和后 2 个单词(共 3 个)
vat " 选择整个 XML/HTML 标签
9.4、自定义动作
映射组合动作(.vimrc):
" 快速跳转到行尾并插入分号
nnoremap <leader>; A;<Esc>
通过插件扩展:
vim-easymotion:快速跳转到任意位置
<leader><leader>w " 高亮显示所有单词首字母,按字母跳转
vim-sneak:增强 f/t 动作
sxy " 跳转到下一个 "xy" 出现处
9.5、使用示例
快速修复代码:
def calculate(a, b):result = a * b # |光标在此|return result
- ciwsum → 修改 result 为 sum
- f(di( → 删除函数参数
批量缩进:
>j " 下一行增加缩进
3>> " 当前行和下两行缩进
跨文件标记:
- 在关键位置设置标记:mA
- 在其他文件跳回:`A