相信很多Linux大神对vim这个编辑工具运用的得心应手,但是习惯了vim的那一套规则以后,在idea中写代码的时候时不时需要用鼠标。觉得很不方便,今天这个就教大家如何使用idea和vim进行编程。这个前提是要对vim的一些规则熟悉。这里参考我的文章《Linux效率提升:终端和Vim编辑器快捷键全指南》,这里面记录Linux中vim大量的指令以及用法。

idea中安装vim

jetbrains系列的都适用。在Plugins搜索框选中的这三项进行安装。

Intellj Idea中 安装以下三个插件

  • IdeaVim

  • IdeaVim-EasyMotion

  • IdeaVimExtension

image-20240427182437070

vim使用

1.方向键移动hjkl

在 Vim 编辑器中,h, j, k, l 键用作光标移动的主要方式,这一设计受到了传统的影响。这些按键的分配可以追溯到更早的编辑器 —— Bill Joy 的 vi 编辑器。Bill Joy 创建 vi 编辑器时,使用的是没有箭头键的 Lear-Siegler ADM-3A 终端。

在这种终端上,字母键被用作光标移动,以便用户在编辑时不需要将手从主键盘区移开。具体到每个键的作用:

  • h 用于向左移动光标。
  • j 用于向下移动光标。
  • k 用于向上移动光标。
  • l 用于向右移动光标。

记忆: j 字母的下划部分向下延伸,看起来像是向下指;而 k 字母的结构则给人一种向上的感觉。h相对其他三个是最左边;l相对其他三个在最右边。

d654ba27619ec9e7737d5f4fbc9bef97

2. 复制&&粘贴

  • y复制单个字母
  • yy复制当前行
  • p粘贴

4db17763a96bd94c609b9def6fad672d

3. 其他命令模式

9bcb69330c6970c4f6e012a9f998d1e9

4. y p f ciw

  1. yy复制当前行private String username;
  2. p将复制的内容进行粘贴
  3. f;跳转到字符;处,这里其实就是相当于行位。
  4. h向左移动一个光标
  5. ciw删除当前处的词,并进入插入模式
  6. password输入 password 完成

在 Vim 编辑器中,ciw 是一个非常有用的命令组合,用于编辑文本。这个命令组合由三部分构成:c, i, 和 w,每个部分都有其特定的意义:

  1. c - 这是 Vim 中的一个命令,表示 "change"(更改)。它用于删除选定的文本范围并进入插入模式。
  2. i - 这代表 "inside"(内部),用于指定一个文本范围的内部。
  3. w - 这代表 "word"(单词),用于指定操作的范围是当前的单词。

5. 可视块模式

  1. V进入内容选择模式
  2. kkk向上移动 3 行,并进行选中
  3. d删除选中部分

6.文本对象操作

di"这个是删除成对双引号之间的内容

di'删除成对单引号之间的内容;以及类推,di(,di{等。删除以后依然是normal模式,ci是插入模式,这是他两的区别。

类似文本对象操作命令:

  • ci'(Change Inside single quotes): 删除单引号内的内容并进入插入模式。
  • yi'(Yank Inside single quotes): 复制(不删除)单引号内的内容。
  • vi'(Visual Inside single quotes): 选择单引号内的内容,进入可视模式。

相信很多人在这里有个疑问:i不是进入插入模式了吗,这怎么组合起来就不一样了呢?

在 Vim 中,i 除了是一个独立的命令,表示进入插入模式之外,它还可以是一个修饰符,特别是在与某些命令组合使用时。在像 di'di" 或类似命令中,i 表示 inside(内部),这是一种文本对象的选择方式。这里的 i 与进入插入模式的 i 是不同的使用上下文。

解释 di"

  • d - 这是 "delete"(删除)命令,用于删除指定的文本范围。
  • i" - 这里的 i 与一个文本限定符(在这个例子中是双引号 " ")组合,表示 "inside double quotes"(双引号内部),用于选择双引号内的文本。

因此,di" 的含义是删除光标所在的双引号对内的所有内容,但不包括双引号本身。

文本对象和 Vim 中的 i 的使用:

在 Vim 中,当 i 用作文本对象选择的一部分时,它总是表示 "inside",即选择某种文本结构(如引号、括号、标签等)的内部。以下是一些常用的文本对象选择命令:

  • diw - 删除一个单词(delete inside word)。
  • ci[ - 更改一个方括号内的内容(change inside [)。
  • yi( - 复制括号内的内容(yank inside ()。

7. 进入插入模式

  • i在光标之前,进入插入模式

  • I在本行开头,进入插入模式

  • a在光标之后,进入插入模式

  • A在本行结尾,进入插入模式

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

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

  • s删除当前字符,并进入插入模式

  • S删除当前行中的所有文本,并进入插入模式

8. 跳转

  • f{char}移动光标到当前行中光标后的下一个 {char} 字符上。

如果你输入 f{char} 并按下回车,Vim 会将光标移动到当前行中,从光标当前位置向后查找的第一个 {char} 字符上。如果该字符在光标之前或不存在,则光标位置不变。

扩展用法

  • 命令格式[n]f{char}
  • 功能:移动光标到当前行中光标后的第 n{char} 字符上。

当你在 f 命令前加上一个数字(例如 3f,),Vim 将移动光标到当前行中从光标位置开始的第三个逗号(,)上。

相关命令

  • F{char}:与 f{char} 类似,但是在当前行中向后(向左)搜索。

  • t{char}:跳到当前行中光标后的 {char} 字符前的位置。

  • T{char}:跳到当前行中光标前的 {char} 字符后的位置。

  • ;:重复上一次 fFtT 命令的查找方向。

  • ,:反向重复上一次 fFtT 命令的查找方向。

  • $ | ^$跳转到行尾^跳转到行首

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

在 Vim 编辑器中,% 键是用于在匹配的括号、方括号或花括号之间跳转的。当你的光标位于任何一个开放或闭合的括号上(包括圆括号 (), 方括号 [], 花括号 {}),按下 % 将会将光标移动到对应的匹配括号上。这是 Vim 中处理代码或任何嵌套结构时非常有用的功能,尤其是在需要快速理解或编辑复杂的括号嵌套时。

  • *查找光标当前所在位置的单词在文档中的下一个出现位置

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

    • 2jj 向下移动两行
    • 10l 向右移动 10 个字符
    • 3kk 向下移动 3 行
    • 20h 向左移动 20 字符
  • [n]w移动到后面 word 的开始位置,前面加上数字 代表重复多少次

  • e移动到下一个词语的末尾

  • b移动到上一个单词的开头

  • zz改变窗口的整体位置,将当前光标所在处 移动到窗口中部

9. zo、zc、dt

这两个命令用于操作 Vim 中的“折叠”(folding)。折叠是 Vim 中一个非常有用的功能,它允许你隐藏(折叠)和显示(展开)文本块,使得你可以管理大量的代码或文本,更专注于当前正在编辑的部分。

  • zo:打开(展开)当前折叠。如果你的光标位于一个已经被折叠的区域上,zo 命令将展开这个区域,显示其内容。
  • zc:关闭(折叠)当前打开的折叠。这个命令用于折叠光标所在的区域,隐藏其内容。

dt{char}

  • dt{char}:这是一个“直到”(till)命令,用于删除从光标当前位置到指定字符之前的所有字符(不包括该字符本身)。这个命令是 d(删除)和 t(直到,不包括)的组合。
  1. ggG
    • gg:移动到文件的第一行。
    • G:移动到文件的最后一行。结合数字使用时,如 5G,可以跳转到文件的第五行。
  2. ~
    • 切换光标位置字符的大小写。
  3. uCtrl-r
    • u:撤销最后的修改。
    • Ctrl-r:重做之前撤销的修改。
  4. :split:vsplit
    • :split:水平分割当前窗口。
    • :vsplit:垂直分割当前窗口。可以同时查看和编辑同一文件的不同部分或不同文件。
  5. /?
    • /:向下搜索。
    • ?:向上搜索。
    • 使用 nN 来在搜索结果之间前后跳转。
  6. ctrl-octrl-i
    • ctrl-o:跳回到旧的位置。
    • ctrl-i:跳到新的位置。

10. 文本编辑和替换

  1. :s/old/new/:
  • 在当前行进行替换,把 "old" 替换为 "new"。
  • 使用全局标志 g(如 :s/old/new/g)可以在当前行替换所有匹配项。
  • 若要在整个文件中进行替换,可以加上范围 %(如 :%s/old/new/g)。
  1. rR:
  • r:替换光标所在位置的单个字符。
  • R:进入替换模式,可以连续替换多个字符。

11. 缓冲区、窗口和标签管理

  1. :e filename:
    • 打开一个新文件。
  2. :bnext:bprevious:
    • 在打开的多个文件(缓冲区)之间切换。
  3. :tabnew filename:
    • 在新标签中打开一个文件。

12. 多行编辑

  1. :[range]norm[al] {commands}

    :

    • 对指定范围的行执行普通模式命令(如 :1,10norm I# 会在前10行的开头添加井号)。

13. 快速移动和跳转

  1. 0^:
    • 0:移动到当前行的开始位置。
    • ^:移动到当前行的第一个非空白字符。
  2. $:
    • 移动到当前行的末尾。
  3. w, b, e:
    • w:向前跳到下一个单词的开始。
    • b:向后跳到上一个单词的开始。
    • e:向前跳到当前单词的末尾。
  4. {}:
    • 跳转到上一个或下一个段落的开始。

14. 搜索相关

  1. \*#:
    • *:向前搜索光标下的单词。
    • #:向后搜索光标下的单词。
  2. /pattern?pattern:
    • n:重复最后一次搜索。
    • N:反向重复最后一次搜索。

15. 文件和文本处理

  1. :sort:
    • 对选中的行进行排序。
  2. :g/pattern/cmd:
    • 对匹配模式 pattern 的每一行执行 cmd 命令,例如 :g/^test/d 会删除所有以 "test" 开头的行。
  3. :v/pattern/cmd:
    • 对不匹配模式 pattern 的行执行 cmd 命令,相当于 grep -v 的效果。

16. 折叠和代码管理

  1. zf#j:
    • 创建一个从当前行开始、向下 # 行的折叠。
  2. :foldopen:foldclose:
    • 打开或关闭当前行的折叠。

17. 状态行和提示

  1. :set ruler:
    • 在状态行显示光标位置。
  2. :set showcmd:
    • 显示你在底部命令区输入的命令的部分内容。

18. 高级编辑

  1. :joinJ:
    • 将多行合并成一行。使用 J 快捷键可以快速将下一行合并到当前行,而 :join 命令可以具体指定范围。
  2. :retab:
    • 转换现有文本中的制表符为空格(或相反),根据你的 tabstopexpandtab 设置。
  3. :substitute 的更多选项:
    • 使用 & 重复上次替换: :&g
    • 使用特殊字符进行替换,如换行符 (\r), 制表符 (\t)。

19. 搜索和替换

  1. [I:

    • 查找当前单词的所有非编辑出现,帮助你快速查看单词在文档中出现的位置。这个在Linux才能看到效果

    image-20240427201644489

  2. :global 的反向版本 :vglobal:v:

    • 对不匹配模式的每一行执行命令,例如 :v/foo/d 会删除所有不包含 "foo" 的行。

20. 快速导航

  1. [m, ]m:
    • 在当前文件中快速跳转到上一个或下一个函数的开始(或类似代码块的标记)。
  2. H, M, L:
    • H(High)跳转到窗口顶部,M(Middle)跳转到窗口中部,L(Low)跳转到窗口底部。

配置

在安装了 Vim 之后,其实官方只是给我们了一个基本的架子,能够实现 Vim 的基本操作。如果你想要用的更加顺手,那么你需要对 Vim 进行自己的个性化配置。这是一张白纸,它会被书写成什么样子由你自己决定。

如何对 Idea 中的 Vim 模块进行配置

image-20240427202547395

在右下角点击 Vim 图标,然后点击Create ~/.ideavimrc

1. 基础配置

老规矩,个人感觉对于新手对编辑器进行配置,还是参照社区的常用配置进行使用。当自己对 Vim 更加熟练的时候可以在加入自己的东西

"语法高亮
syntax on
"显示行号
set number relativenumber
"显示光标所在位置的行号和列号
set ruler
set wrap                      "自动折行
set shiftwidth=4
set tabstop=4
set softtabstop=4
set expandtab                  "将tab替换为相应数量空格
set smartindent
set backspace=2
set co=5
"设置取消备份 禁止临时文件生成
set nobackup
set noswapfile
" 为IdeaVim插件增加自动切换为英文输入法的功能,
" idea 需要安装 IdeaVimExtension plugin
set keep-english-in-normal
"设置匹配模式 类似当输入一个左括号时会匹配相应的那个右括号
set showmatch
set clipboard^=unnamed,unnamedplus
"set laststatus=2   "命令行为两行
"set fenc=utf-8     "文件编码
"set mouse=a        "启用鼠标
"set ignorecase     "忽略大小写
set cursorline     "突出显示当前行
"set cursorcolumn   "突出显示当前列
set fdm=marker

上面当中比较特别的配置就是

  • 设置 relativenumber 这样可以看相对行号

  • keep-english-in-normal 这个设置开启之后可以在进入命令模式之后自动将输入法切换为英文。这个还是非常推荐设置的,不然每次从 插入模式 切换到 命令模式的时候 如果这个时候是中文输入法,体验就极差了

  • set clipboard^=unamed,unnamedplus共享剪切板,Vim 的剪切板和系统的剪切板是隔离的。设置之后可以共享

2. Action 配置

在 Idea 中大部分的操作都可以抽象为一个 Action 比如

  • 文件重命名 Rename File。这个 Action 允许你重命名当前选中的文件,并自动更新所有对该文件的引用。

  • 重命名变量 或者 类名 RenameElement,这个 Action 允许你重命名任何代码元素,如变量、类、方法等,并自动更新所有在代码中找到的对这些元素的引用。这是重构操作中非常核心的一个功能。

  • 去到接口实现 GotoImplementation,当你在一个接口或抽象类的方法上使用这个 Action 时,IDE 将跳转到这个方法的具体实现。这对于在大型代码库中导航非常有用。

  • 复制 Class 引用 CopyReference,这个 Action 允许你复制当前选中的类、方法或变量的完整引用路径。这非常有用,比如在编写文档或者发送给协作开发者时引用代码位置。

  • ...

Categories: idea

邢宇宇

我是一名热情的云原生架构师和Java开发者,专注于构建可扩展的大数据解决方案。我的职业旅程始于对代码的热爱和创新技术的追求。我拥有在云计算和大数据领域深厚的技术背景,这使我能够设计和实现高效、稳健的系统。 我擅长使用Java来开发高性能的应用程序,同时也深入研究了如何利用云服务来优化数据处理过程。我热衷于探索新技术,如容器化、微服务架构和自动化,这些都是当今构建和部署现代软件解决方案的关键元素。 在我的博客中,我分享我的专业知识和行业见解,探讨最佳实践,以及如何克服在云原生生态系统中遇到的挑战。我相信通过共享和协作,我们可以推动技术的发展,创造出更好的解决方案来解决复杂问题。欢迎加入我的技术之旅,与我一起深入云原生的世界!

0 Comments

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注