Linux运维——Vim基础

发布于:2025-05-01 ⋅ 阅读:(64) ⋅ 点赞:(0)

一、移动光标

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
  1. 按 qa 开始录制 → 执行操作(如 dd 删除行)→ 按 q 结束录制
  2. 执行 @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>>   " 当前行和下两行缩进

跨文件标记:

  1. 在关键位置设置标记:mA
  2. 在其他文件跳回:`A