IDEA中如何使用Vim?看完本教程,让你用IDEA用到爽~(建议收藏)

本文介绍了Vim的特点及在IDEA中使用的优势,包括其高度可配置性、稳定性及与IDEA的互补。通过环境配置、基本操作如hjkl键、复制粘贴、代码块选择与删除、插入模式的运用,以及跳转技巧,帮助读者掌握Vim,提高编程效率。同时,推荐了IDEA中的Vim插件,并提供了Action配置的快捷方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

Vim有什么特点?

为什么我要安利你在 IEAD 中使用Vim?

Vim

一、环境配置

二、Vim的使用

2.1、方向键 hjkl

2.2、复制&粘贴

2.3、选择代码块并删除

2.4、块级删除

2.5、各种插入模式

2.5.1、以下是gif演示

2.6、jump(解放鼠标~)

三、Action配置

四、重要章节补充(上文内容只是简单介绍,此处开始补充)

4.1、重复操作

4.2、翻页

4.3、寄存器

4.4、宏

4.5、命令模式


前言

Vim有什么特点?

        vim是一个高度可配置的文本编辑器,非常稳定,可以高效的创建任何文本、持久的、多级撤销树、支持数百种变成语言和格式、与许多工具集成;

为什么我要安利你在 IEAD 中使用Vim?

        1、首先,高效!!!让你体会到什么是 IDEA + Vim = 起飞 这种感觉~

        2、如果你使用过 Linux ,修改过服务器上的系统配置文件,就必不可免的使用 vim 编译器;如果不熟练,操作起来是很麻烦的;

        3、IDEA 中安装了 vim 插件后,就是一个互补的状态,各自发挥优势,大大提升编程效率~

Vim

        Vim 还是有一部分学习成本的,入门稍微有一点难,如果你能坚持看完本文,一旦入门以后就会对她爱不释手(像不像你们的女朋友 doge~);


一、环境配置

在 IDEA 中需要以下三个插件:

  • IeadVim
  • IdeaVim-EasyMotion
  • IdeaVimExtension

步骤如下:

当你的光标变成了小方块后,就说明你的 vim 插件安装好了~,如下图


二、Vim的使用

2.1、方向键 hjkl

这也是刚开始上手使用Vim最不习惯的操作,没有什么好说的,克服这一关,多练就行~

以下为视频演示:

vim方向键

2.2、复制&粘贴

程序员自嘲:我是CV工程师~; 复制粘贴还是要第一时间学会滴~

yy 复制当前行

p 粘贴

如下:

2.3、选择代码块并删除

使用键v k d

补充:也可以使用dd删除一行

gif步骤如下:

1. v 进入内容选择模式(选择代码块);

2. kkk 向上移动3行,并选中;

3. d 删除选中部分;

2.4、块级删除

 常用di* 和 da*,这里的*表示边界字符,可以是 双引号,小括号,大括号 等;

        比如你要删除双引号中的内容:"hello world";你就可以通过 di" 进行删除,如果不仅想删除双引号里的内容,还想把双引号一起删除,就可以使用 da" 来完成;删除完双引号里的内容想立即切换到 插入模式 也可以使用 ci" 来完成;

用 di" 删除 双引号 里的内容,删除后想立即进入 插入模式 可以用 ci"  如下:

 用 di( 删除 括号里的内容,删除后想立即进入 插入模式 可以用 ci(   如下:

用 di{ 删除 { 里的内容,删除后想立即进入 插入模式 可以用 ci{  如下:

2.5、各种插入模式

汇总如下:

  • a 在光标后,进入插入模式;
  • A 在本行结尾,进入插入模式;
  • i 在光标前,进入插入模式;
  • I 在本行开头,进入插入模式
  • o 在本行之后新增一行,并进入插入模式;
  • O 在本行之前新增一行,并进入插入模式;
  • s 删除当前字符,并进入插入模式;
  • S 删除当前行中的所有文本,并进入插入模式;

2.5.1、以下是gif演示

a 在光标后,进入插入模式,如下:

A 在本行结尾,进入插入模式,如下:

i 在光标前,进入插入模式,如下:

I 在本行开头,进入插入模式,如下:

o 在本行之后新增一行,并进入插入模式,如下:

O 在本行之前新增一行,并进入插入模式,如下:

2.6、jump(解放鼠标~)

通过vim真的是减少了很多鼠标操作,接下来再来看看一些更加便利的方案!

1、  f{word}  是用来查找 当前行,当前光标后,是否存在某个字符 {word}  若存在光标就会自动移动过去;

2、  $ 跳转到行尾,^ 跳转到行首;

3、  % 括号匹配跳转 () [] {}

4、  *跳转到i上一个字符定位处;

5、  [n]h/j/k/l  数字加上方向键 代表重复运行多少次;

  • 例如 10h 向左移动10个字符,3j 向下移动三行;

6、  G移动到最后一行,gg移动到第一行;

7、  H 移动到当前页的第一行,M 移动到编辑器的中部,L 移动到当前页的最后一行;

8、  [n]w 移动到后面的 第[n]个单词 的开始位置;

  • e 移动到下一个单词末尾
  • b 移动到上一个单词的开头

9、ctrl + ] 可以跳转到函数定义处


三、Action配置

IDEA中很多操作都可以抽象为一个Action,如下:

  • Rename File 文件重命名;
  • RenameElement 重命名变量 或者 类名;
  • GotoImplementation 去接口实现;
  • 复制Class引用 CopyReference;
  • ......

例如,Vim中可以通过插入命令模式直接调用action,如下,调用 RenameElement 重命名:

还有一些更加方便的命令(直接在前面输入 : 即可)

  • :tabn 下一个 tab
  • :tabp 上一个 tab
  • :tabo 关闭其他所有 tab,只保留当前页.

四、重要章节补充(上文内容只是简单介绍,此处开始补充)

4.1、重复操作

  • . 重复上一次的修改
  • u 撤销上一次的修改
  • ctrl u 恢复撤销的内容(比如撤销多了,想恢复)

4.2、翻页

  • ctrl d 向下滚动半屏
  • ctrl u 向上滚动半屏
  • ctrl e 向下滚动一行
  • ctrl y 向上滚动一行
  • zz 将当前行滚动到屏幕中央
  • zt 将当前行滚动到屏幕顶部
  • zb 将当前行滚动到屏幕底部

4.3、寄存器

1)vim 提供的寄存器可以理解为是一个剪切板,一个字符对应一个寄存器(例如 a~z,0~9)

特殊的寄存器如下:

  • " 默认寄存器,平时的复制,删除的内容都在这里.
  • % 当前的文件名.
  • . 上一次插入的内容.
  • : 上一次执行的命令.

例如我们对某一行进行 yy 操作,然后通过 :reg " 就可以查看默认寄存器的内容:

2)如果我们想要持久化保存文本到特定的寄存器中,可以随时进行粘贴,避免覆盖,可以如下这样操作:

  1. 例如我们将一行复制到 a 寄存器中.
  2. 通过 "ayy 就可以将这一行复制到 a 寄存器中.
  3. 此时,可以通过 :reg a 随时查看寄存器 a 内容
  4. 将来有一天,我们想把寄存器 a 的东西取出来,就可以通过 "ap ,就可以把寄存器中的内容粘贴出来.

对于通过 v 选中的内容保存到寄存器中,过程是这样的.

  1. 先通过 v 进入可视化模式选中我们要复制的内容
  2. 通过 "ay 就可以将我们选中的内容复制到寄存器 a 中.
  3. 将来想要把寄存器 a 中的东西取出来,就可以通过 "ap.

Ps:如果我们存放的寄存器是大写字符,例如寄存器A,那么就会追加,而不是覆盖.

4.4、宏

1)录制一段键盘的操作,并允许我们重放这些操作.

录制的宏可以存在指定的寄存器中.

  • q{register} 可以开始录制宏,存在寄存器 register 中(寄存器就是上一章节讲到的).
  • 录制过程中按 q 退出录制.
  • @{register} 就可以重放寄存器 register 中的操作.
  • @@ 表示重放上一次宏操作.

常见用法:q{register} 录制一段操作,@{register} 重放,然后一直 @@ 重放.

Ps:. 命令对宏不生效,因为 . 命令只是记录上一次修改,而宏是可能包含多次修改.

2)一些技巧

  • 录制的段落要具有普遍性. 比如我要给每一行的行首都加一个 # 符号,那么录制时,无论你此时的光标是否在行首,都建议你跳到行首,然后进行操作,最后关闭录制.
  • 一个好的习惯时在宏录制的结尾,就跳到下一个需要编辑的起时位置.
  • 可以使用 [count]@{register} 重放 count 次.

4.5、命令模式

1)命令模式的格式如下:

: [range] {excommand} [args]
  • range:作用的范围,不给默认是本行.
  • excommand:命令模式下特有的命令.
  • args:后续的参数,根据命令而定.

例如一些简单命令:

  • : [range] delete [x] 表示删除 range 中的行(存储到寄存器 x 中),delete 可以简写为 d
  • : [range] yank [x] 表示复制 range 中的行(存储到寄存器 x 中),yank 可以简写为 y
  • : [range] print 表示将 range 中的行打印出来,可以简写为 p

2)range 由一个或两个 address 构成,也就是 {address} 或 {address},{address}

address 可以是:

  • {lineno} 行号,例如 3 代表第三行(0 表示第一行上面的虚拟行)
  • $ 表示最后一行
  • . 表示光标所在行
  • /{pattern}/ 表示下一个 pattern 所在行.

address 可以做加减法,例如 .+3 表示光标所在行的往下第三行, $-3 表示倒数第四行.

因为 address 可以组合成 range,那么就有引申出一些案例:

  • 1, 3 表示文件的 1-3 行,例如 1, 3 d 删除 1~3 行.
  • ., .+4 表示当前行到往下 4 行(共 5 行),例如 ., .+4 y 表示复制当前行到往下的4行
  • $-3, $ 表示文件最后的 4 行,例如 $-3, $ 表示打印文件的后4行.
  • % 是特殊的 range,表示当前文件的所有行.
  • '</'> 是可视模式中选中范围的开头和结尾(可视模式下直接按 : 可以直接设置)

3)行的复制,移动,粘贴

  • :[range] copy {address} 表示把 range 中选中的行复制到 address 后面
  • :[range] move {address} 表示把 range 中选中的行移动到 address 后面
  • :[address] put [x] 表示把寄存器 x 的内容粘贴到 address 后面.

Ps:0 作为虚拟行的 address,可以用途过来将内容插入到第一行.

4)讲到这里,也许你会有一个疑问,上述讲的这些命令,好像我也可以在普通模式下实现,感觉命令模式也并没有带来什么特别便捷的地方?

确实没有解决掉本质问题,但是,接下来要介绍的这个 normal 命令和 global 命令则是非常强大的工具.

5)批量操作:normal 命令(重点)

1)格式如下:

:[range] normal {commands}

含义:对 range 中的所有行执行 normal 模式下的命令 commands

例如,我想对文件的前三行的开头添加一个 # 注释 ,那么你就可以通过 :1,3 normal I# 注释 来实现(1,3  表示选中 1到3 行,I 表示在开头使用插入模式).

再例如一些更强大的常见:我想要在这个文件每行的开头和结尾分别加上 begin 和 end,实现如下:

  1. qa 进行录制,保存到寄存器 a 中.
  2. 然后先 ^ 到当前行开头加上 begin,再 $ 跳到文件结尾加上 end.
  3. 最后 q 保存并退出录制.
  4. 通过命令模式输入 :% normal @a 即实现对每一行都重放寄存器 a 保存的宏操作.

再例如,你想调整每一行都自动调整缩进,如下命令

:% normal ==

6)批量操作:global 命令(重点)

格式如下:

:[range] global/{pattern}/{cmd}

含义:对 range 中包含 pattern 的所有行执行 command 模式下的 ex 命令.

 [cmd]:Ex 命令,不给的话默认是答应 {print}

注意!normal  命令也是 Ex 命令!

另外,命令中的 global 可以使用 g 表示缩写,写成 :[range] g/{pattern}/{cmd}

例如需求是:对文件中存在 Api 字符串的每一行的上面都写一个 //TODO 字符串,那么命令如下:

:% global/Api/normal O//TODO

那么,你也可以删除所有带 TODO 的行

:% global/TODO/normal dd

 Ps:甚至你可以再丧心病狂一点,录制一个非常复杂的宏,然后再嵌套 global 命令.

注意区分 normal 和 global 的主要差别,global 相比较 normal 多了一个可以根据字符串匹配的功能,来指定某些被匹配的特殊行,来执行命令.

7)替换命令(重点)

格式如下:

:[range]s/pattern/string/[flags]

含义:对 range 中的每一行进行替换操作,将 pattern 替换成 string.

flag:

  • g 表示替换每一行的所有匹配.
  • i 忽略大小写
  • c 替换前进行确认
  • n 技术而不是替换

这几个 flag 可以叠加在一起使用~

案例1:替换当前行中所有的 a 为 _ ,如下命令

:.s/a/_/g

 案例2:统计文件中所有出现 Api 字符串的次数(此时上面讲的表达式中的 string 是什么就无所谓了,因为使用 n 就不进行替换操作了)

:%s/Api//gn

 Ps:此命令在给当前文件下指定的变量进行重命名非常实用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈亦康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值