欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > Linux运维——Vim基础

Linux运维——Vim基础

2025/5/5 5:03:06 来源:https://blog.csdn.net/cold___play/article/details/147596583  浏览:    关键词: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、使用示例
  • 十、Ex命令
    • 10.1、文件操作
    • 10.2、行号与范围
    • 10.3、文本替换(`:s`)
    • 10.4、多文件与缓冲区
    • 10.5、窗口与标签页
    • 10.6、环境控制
    • 10.7、高级技巧
    • 10.8、实际应用

一、移动光标

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

十、Ex命令

ex 命令是 Vim 的底层命令模式,以 : 开头,继承自古老的 ed 编辑器。所有可视化操作最终都会转换为 ex 命令(可通过 :help ex-cmd-index 查看完整列表)。

10.1、文件操作

命令作用示例
:e[dit]重新加载当前文件:e! 强制丢弃修改重新加载
:w[rite]保存文件:w /tmp/backup 另存为备份
:sav[eas]另存为新文件:sav newfile.txt
:q[uit]退出:q! 强制退出不保存
:wq / :x保存并退出
:r[ead]插入文件内容:r /etc/passwd
:r!插入命令输出:r! date 插入当前日期

10.2、行号与范围

语法作用示例
:n跳转到第 n 行:10 跳转到第 10 行
:.,$当前行到文件末尾:.,$d 删除此后所有行
:'<,'>可视化模式选中的范围:'<,'>s/foo/bar/g 替换选区
:%整个文件(相当于 1,$):%s/old/new/g 全局替换
:+/pattern/-n基于搜索的偏移范围:/foo/+1,/bar/-2d

10.3、文本替换(:s

命令作用示例
:s/old/new/替换当前行第一个匹配:s/foo/bar/
:s/old/new/g替换当前行所有匹配:s/\s\+$//g 删除行尾空格
:n,ms/old/new/g替换 n 到 m 行所有匹配:10,20s/error/warning/g
:%s/old/new/gc全局替换并每次确认
高级技巧
\v启用 “very magic” 模式(减少转义):s/\v\d{4}/\=submatch(0)+1/
\c忽略大小写:s/foo\c/bar/

10.4、多文件与缓冲区

命令作用示例
:bn[ext]切换到下一个缓冲区`:bn! 强制切换(忽略修改)
:bp[revious]切换到上一个缓冲区
:ls列出所有缓冲区
:badd添加文件到缓冲区:badd ~/.zshrc
:bd[elete]删除缓冲区:bd! 强制删除
:argadd添加到参数列表:argadd *.py
:argdo对参数列表所有文件执行命令:argdo %s/foo/bar/g

10.5、窗口与标签页

命令作用示例
:sp[lit]水平分割窗口:sp ~/.vimrc
:vs[plit]垂直分割窗口:vs /tmp/log
:tabnew新建标签页:tabnew
:tabn[ext]下一个标签页:tabn 3 跳转到第 3 个标签
:tabm[ove]移动标签页位置:tabm 0 移动到首位
:windo对所有窗口执行命令:windo set nu! 切换行号显示

10.6、环境控制

命令作用示例
:set查看/设置选项:set wrap? 查看换行状态
:set nu显示行号:set nonu 隐藏行号
:set paste进入粘贴模式(防格式混乱)
:syntax on启用语法高亮
:vert h垂直分割帮助窗口:vert h pattern

10.7、高级技巧

命令组合:

" 删除所有包含 "TODO" 的行
:g/TODO/d" 复制所有匹配行到文件末尾
:g/pattern/t$" 对指定文件类型执行操作
:autocmd FileType python nnoremap <buffer> <leader>c I#<Esc>

表达式替换:

" 将数字递增 1
:%s/\d\+/\=submatch(0)+1/g" 格式化日期(需系统支持)
:%s/\v(\d{4})-(\d{2})-(\d{2})/\3.\2.\1/g

宏录制与ex命令:

" 录制宏到寄存器 q(操作第1-5行)
:1,5norm @q" 对所有缓冲区执行宏
:bufdo normal @q

外部命令集成:

" 用 sort 对选区排序
:'<,'>!sort" 用 Python 处理文本
:%!python -c "import sys; print(sys.stdin.read().upper())"

10.8、实际应用

批量重命名变量:

" 1. 将局部变量 `tmp` 改为 `context`
:argdo %s/\<tmp\>/context/g | update" 2. 仅修改函数内的变量(需熟悉函数边界标记)
:/function start/,/function end/s/\<tmp\>/context/g

快速处理日志文件:

" 1. 提取所有 ERROR 行并保存
:g/ERROR/. w >> errors.log" 2. 删除时间戳列(假设第1-20字符)
:%s/^.\{20\}//

项目全局操作:

" 1. 在所有 Python 文件中替换字符串
:args ​**​/*.py
:argdo %s/old_api/new_api/g | update" 2. 统计所有文件的 "TODO" 出现次数
:grep TODO ​**​/*
:copen

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词