当前位置: 首页 > news >正文

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
  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

http://www.mrgr.cn/news/100765.html

相关文章:

  • 大数据测试集群环境部署过程中各种问题
  • 掌握 Linux 中 SELinux 的强制访问控制机制和 iptables、 firewalld 两种防火墙以及他们的使用方法
  • 开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验(一)
  • 【无报错,亲测有效】如何在Windows和Linux系统中查看MySQL版本
  • ComfyUI 学习笔记:安装篇及模型下载
  • 基于 ChatGPT 分析业务层在事务中高频建表然后删除或者回滚导致 pg_dump 概率出现备份失败问题
  • Git操作指令
  • [C语言]猜数字游戏
  • Python三大Web框架对比:Django、Flask、Tornado的异步实现方式详解
  • 计算机毕业设计--基于深度学习(U-Net与多尺度ViT)的模糊车牌图像清晰化复原算法设计与实现(含Github代码+Web端在线体验链接)
  • [Unity]-[UI]-[Prefab] 关于Unity UGUI 的布局及组件讲解
  • ESP32- 开发笔记- 软件开发 4 - GPIO 口
  • 在C# WebApi 中使用 Nacos02: 配置管理、服务管理实战
  • MySQL 实战 45 讲 笔记 ----来源《极客时间》
  • 【MCP教程系列】如何自己打包MCP服务并部署到阿里云百炼上【nodejs+TypeScript】搭建自己的MCP【Cline】
  • 各服务日志: Grok正则解析
  • Axure疑难杂症:全局变量典型应用及思考逻辑(玩转全局变量)
  • Druid监控sql导致的内存溢出--内存分析工具MemoryAnalyzer(mat)
  • FPGA 39 ,FPGA 网络通信协议栈进阶,RGMII、ARP 与 UDP 协议与模块设计( RGMII、ARP、UDP原理与模块设计 )
  • Python自我娱乐小游戏:跳跳糖