1. 首页
  2. 后端

idea使用Vim技巧大全

  idea使用Vim技巧大全

=============

一、前言

vim的基础命令我这边不多做介绍,直接给两个比较大而全的直观图,照着一个个命令看下去基本命令就学了一遍了,我会着重介绍我在idea编写代码过程中比较常用的命令,毕竟在idea写代码和在vim编辑器里写代码还是有很大区别的,idea本身自带了很多功能,不需要依赖vim更加方便

2.png

3.png

二、插件推荐

  1. 在idea用vim推荐下载如下几个插件,很多文章也推荐了这两个插件,但都没具体介绍

Untitled 2.png

  1. IdeaEasyMotion

对于不想用鼠标移动的用户来讲,这是个快速定位的神器,入下图所示,通过快捷键<ll>w

显示所有单词的开头,输入对应的字母就可以将光标定位到那个单词的开头,接下去若要修改,直接cw就删掉这个单词进入插入模式修改了

这里<ll> 代表了两个<leader> 在配置文件用let mapleader=" " 来表示这个字符,我习惯用空格来作为leader

Untitled.gif

  • IdeaVimExtension

这个插件就是用来支持vim操作idea的action动作的,下面会介绍如何使用action

三、开发常用命令

  1. v系列

    • viw 选中光标所在的单词,通常配合c进行单词的快速修改,也就是viwc直接修改一个单词变成插入模式直接写,相比于idea的变量重命名快捷键,这个的好处就是不管是变量,类名,方法名都可以直接快速选中单词直接改
      Untitled 1.gif
    • viw:选择当前光标所在的单词(word),不包括周围的空格或标点。
    • visvi' :选择单引号内的文本(不包括单引号本身)。
    • vinvi" :选择双引号内的文本(不包括双引号本身)。
    • vibvi(vi) :选择圆括号内的文本(不包括圆括号本身)。
    • viBvi{vi} :选择大括号内的文本(不包括大括号本身)。
    • vi[vi] :选择方括号内的文本(不包括方括号本身)。
    • vit:选择HTML标签内的文本(不包括标签本身)以上方法对应了选中对应两个相同符号范围内的字符串,比如选中双引号内的字符串

Untitled 2.gif
2. c系列

* `ciw` == `viwc` 相比于`viwc`这种可视化选择修改,`ciw`更加直接,会直接修改光标所在的单词,直接进入插入模式并删除单词![Untitled 3.gif](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/34afd40e6f74470d81c52bc1bb130ec0~tplv-k3u1fbpfcp-jj-mark:3024:0:0:0:q75.awebp#?w=1344&h=424&s=1731214&e=gif&f=49&b=1b1d20)


* `v`系列的所有命令都可以改成`c`开头,效果等同于`vi?c`
  1. hjkl移动

    • 在vim编辑器中,本来移动和定位也是vim语法比较擅长的一项,但在idea中实际上鼠标的移动更方便进行光标的定位,特别是对mac来讲更加如此,手指划拉一下比hjkl的移动更有性价比,所以对vim的移动,感兴趣的学下就好了,没必要在实际开发中用它
    • r替换 x删除

    • idea中command+R进行快速替换就够用了,所以:%s/a/b/g这种方式的替换就没必要了,但我们常常会遇到单个字母写错或者多写的情况,这种情况下,快速的修补方案用r和x就比较有性价比了

    • 选中指定字母,按r,接下去你按任意字母,该字母就会替换为指定字母
    • 选中指定字母,按x,直接删除这个字母,不会进入插入模式
    • 自定义删除指定参数

自定义命令需要在ideavimrc文件里写入,入口在

Untitled 3.png

我自定义的命令如下,前三个是删除,后三个是选择

"光标在多个参数的第一个参数任意位置,执行直接删参数
nnoremap <Space>dn F,vt,d
"光标在多个参数的第一个参数任意位置,执行直接删参数
nnoremap <Space>db T(vf,ld
nnoremap <Space>dm F,vt)d
nnoremap <Space>vn F,vt,
nnoremap <Space>vb T(vf,l
nnoremap <Space>vm F,vt)

Untitled 4.gif

四、action

重点介绍下如何使用idea的action实现用vim的快捷键调用idea的功能

  1. 找到命令

首先我们要知道对应功能的action是什么名字,使用命令:actionlist [pattern]

以下举例,打开terminal控制台,找到激活控制台命令,根据关键词terminal搜索,复制命令后action执行

Untitled 5.gif
2. 执行命令:action [指令]
3. 固话命令

对于有些命令,我们希望通过快捷键就可以便捷的执行,那么我们可以写入.ideavimrc文件
4. 写入命令

在文件底部直接添加如下命令

nnoremap <Space>te :action ActivateTerminalToolWindow<CR>

接下去在普通模式下按空格+te 则可以快捷打开Terminal
5. 常用action

" 这三个都是arthas的命令,结合快捷键快速复制命令
nnoremap <Space>aw :action ArthasWatch<CR>
nnoremap <Space>at :action ArthasTrace<CR>
nnoremap <Space>dc :action ArthasJadCommandAction<CR>

以上三个是我用的比较多的arthas命令(前提下载arthas插件),调试的时候常常用到要频繁切不同的方法,配置了这几个命令用习惯后无脑按键三连就复制出切方法的命令,就可以去服务器执行了

五、详解map

关于map命令有如下几种,分别在不同的模式下起作用,大部分情况下用的都是nnoremap命令

Untitled 4.png

六、我的配置

" .ideavimrc is a configuration file for IdeaVim plugin. It uses
"   the same commands as the original .vimrc configuration.
" You can find a list of commands here: https://jb.gg/h38q75
" Find more examples here: https://jb.gg/share-ideavimrc
" nnoremap - Normal Mode 映射:这个命令用于在 Normal Mode(普通模式)下创建键盘映射。这意味着当您在普通模式下按下键盘上的指定组合时,将触发所定义的操作。
" inoremap - Insert Mode 映射:这个命令用于在 Insert Mode(插入模式)下创建键盘映射。这允许您在编辑文本时定义按键组合的行为。
" nmap - Normal Mode 和 Visual Mode 映射:这个命令用于在 Normal Mode 和 Visual Mode 下创建键盘映射。这意味着它会影响普通模式和可视模式下的按键行为。
" vmap - Visual Mode 映射:这个命令用于在 Visual Mode(可视模式)下创建键盘映射。它会影响到在可视模式下选择文本时的按键操作。
" imap - Insert Mode 和 Command-Line Mode 映射:这个命令用于在 Insert Mode 和 Command-Line Mode(命令行模式)下创建键盘映射。它允许您自定义插入模式和执行命令时的按键行为。
" map - 通用映射:这个命令用于创建通用的键盘映射,会影响到多个模式(Normal Mode、Visual Mode、Insert Mode、Command-Line Mode)。这种映射可能会导致一些不直观的行为,因此需要谨慎使用。


"" -- Suggested options --
" Show a few lines of context around the cursor. Note that this makes the
" text scroll if you mouse-click near the start or end of the window.
set scrolloff=5

" Do incremental searching.
" set incsearch

" Don't use Ex mode, use Q for formatting.
map Q gq

" --- Enable IdeaVim plugins https://jb.gg/ideavim-plugins

" Highlight copied text
Plug 'machakann/vim-highlightedyank'
" Commentary plugin
Plug 'tpope/vim-commentary'

set easymotion
"" -- Map IDE actions to IdeaVim -- https://jb.gg/abva4t
"" Map r to the Reformat Code action
"map r <Action>(ReformatCode)

"" Map <leader>d to start debug
"map <leader>d <Action>(Debug)

"" Map b to toggle the breakpoint on the current line
"map b <Action>(ToggleLineBreakpoint)

set verbose=20
"语法高亮
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 hlsearch
set incsearch
set ignorecase
set smartcase
set history=3000000
set commentary
:set vb
set clipboard^=unnamed,unnamedplus
"set laststatus=2   "命令行为两行
"set fenc=utf-8     "文件编码
"set mouse=a        "启用鼠标
"set ignorecase     "忽略大小写
set cursorline     "突出显示当前行
"set cursorcolumn   "突出显示当前列
set fdm=marker
set timeoutlen=1000
" 防止按leader键乱移动
nnoremap <SPACE> <nop>

nnoremap <SPACE>" ciw""<ESC>hp

"jk退出insert模式
"inoremap jk <ESC>
"inoremap jj <ESC>
"inoremap <esc> <nop>

""""""""""""""""""""""""""""""""""""""基础篇""""""""""""""""""""""""""""""""""""""
"--普通模式下使用回车键,向下/向上 增加一行
nmap <CR> o<Esc>
"nmap <S-Enter> O<Esc>
"debug神器
nmap <C-j> :action StepOver<CR>
nmap <C-k> :action Resume<CR>
nmap <C-h> :action StepOut<CR>
nmap <C-l> :action ForceStepInto<CR>
"移动专精
nnoremap <C-e> %
vmap <C-k> <C-y>
vmap <C-h> 10zh
vmap <C-l> 10zl
noremap vin vi"
"移动专精
"imap <C-j> <Esc>ja
"imap <C-k> <Esc>ka
"imap <C-h> <Esc>10zhi
"imap <C-l> <Esc>l10zla
imap <C-j> <Down>
imap <C-k> <Up>
imap <C-h> <Left>
imap <C-l> <Right>
noremap <S-Enter> <Esc>o
imap <S-Enter> <Esc>o
"imap <C-i> <CR>
"左右视野
nnoremap zH 50zh
nnoremap zL 50zl
"^$符号太难按了
map gh ^
map gl $
"代码提示
"imap <C-n> <ESC>:action HippieCompletion<CR>a
"imap <C-p> <ESC>:action HippieBackwardCompletion<CR>a
xnoremap <  <gv
xnoremap >  >gv
""""""""""""""""""""""""""""""""""""""重构篇""""""""""""""""""""""""""""""""""""""
" 设置leader键"
let mapleader=" "
"元素名称重构
noremap <Space>re ^W:action RenameElement<CR>
"移动重构
noremap <Space>mv :action Move<CR>
"成员变量转换为静态变量重构(配合移动重构有奇效)
noremap <Space>ms :action MakeStatic<CR>
"静态变量转换为成员变量重构
noremap <Space>ci :action ConvertToInstanceMethod<CR>
"内联重构(合并无效变量无效方法)
noremap <Space>il :action Inline<CR>
"抽取方法重构
noremap <Space>em :action ExtractMethod<CR>
"抽取接口重构
noremap <Space>ei :action ExtractInterface<CR>
"字段的访问限制
noremap <Space>ef :action EncapsulateFields<CR>
"引入临时变量
noremap <Space>iv :action IntroduceVariable<CR>
"引入常量
noremap <Space>ic :action IntroduceConstant<CR>
"引入方法参数
noremap <Space>ip :action IntroduceParameter<CR>
"引入字段
noremap <Space>if :action IntroduceField<CR>
"引入参数对象(指定参数)
noremap <Space>po :action IntroduceParameterObject<CR>
"方法下放到子类
noremap <Space>pd :action MemberPushDown<CR>
"方法上移到父类
noremap <Space>pu :action MembersPullUp<CR>
"文件名称重构
noremap <Space>RF :action RenameFile<CR>
"修改方法签名
noremap <Space>cs  :action ChangeSignature<CR>
"抽取类
noremap <Space>ec :action ExtractClass<CR>
"匿名类到内部类
noremap <Space>ai :action AnonymousToInner<CR>
""""""""""""""""""""""""""""""""""""""跳转篇""""""""""""""""""""""""""""""""""""""
"特殊变量跳转
nnoremap <Space>ts mm`m:action GotoSymbol<CR>
"url地址跳转
noremap  <Space>tu  mm`m:action Toolkit.GotoService<CR>
"动作跳转
nnoremap <Space>ta mm`m:action GotoAction<CR>
"文件跳转
noremap <Space>tf mm`m:action GotoFile<CR>
"测试类跳转
noremap <Space>tt mm`m:action GotoTest<CR>
"java类跳转
noremap <Space>tc mm`m:action GotoClass<CR>
"文本跳转
noremap <Space>tp mm`m:action FindInPath<CR>
"跳转下个报错处
noremap <Space>ne mm`m:action GotoNextError<CR>
"跳转上个报错处
noremap <Space>pe mm`m:action GotoPreviousError<CR>
"从子类方法跳到父类的方法
noremap <Space>gs mm`m:action GotoSuperMethod<CR>
"跳到方法实现
noremap <Space>gi mm`m:action GotoImplementation<CR>
"跳转到下个改动处
noremap <Space>g, mm`m:action JumpToLastChange<CR>
"跳转到上个改动处
noremap <Space>g; mm`m:action JumpToNextChange<CR>
"最近查看文件间相互跳转
noremap <Space>rf mm`m:action RecentFiles<CR>
"最近改动文件间相互跳转
noremap <Space>rF mm`m:action RecentChangedFiles<CR>
"项目之间的跳转(上一个)
noremap <Space>nw :action NextProjectWindow<CR>
"项目之间的跳转(下一个)
noremap <Space>pw :action PreviousProjectWindow<CR>
"跳转 需要安装AceJump插件
noremap <Space>tj mm`m:action AceWordAction<CR>
noremap <Space>jp mm`m:action AceDeclarationAction<CR>
""""""""""""""""""""""""""""""""""""""SQL篇""""""""""""""""""""""""""""""""""""""
"sql提交
noremap <Space>sc :action Console.Transaction.Commit<CR>
"sql回滚
noremap <Space>sr :action Console.Transaction.Rollback<CR>
"sql执行
noremap <Space>se :action Console.Jdbc.Execute<CR>
"sql执行计划
noremap <Space>ep :action Console.Jdbc.ExplainPlan<CR>
"sql-raw执行计划
noremap <Space>EP :action Console.Jdbc.ExplainPlan.Raw<CR>

"打开数据库日志窗口,前提安装了MyBatis Log Plugin插件
noremap <Space>sl :action TailMyBatisLog0<CR>
noremap <Space>SL :action ActivateMyBatisLogToolWindow<CR>
noremap <Space>AL :action TailMyBatisLog0<CR>:action ActivateMyBatisLogToolWindow<CR>
""""""""""""""""""""""""""""""""""""""运行篇""""""""""""""""""""""""""""""""""""""
"设置运行配置
nnoremap <Space>rc :action RunConfiguration<CR>
"debug上次运行的类
noremap <Space>dd :action Debug<CR>
"统计单元测试覆盖率运行上个类
noremap <Space>cc :action Coverage<CR>
"统计单元测试覆盖率运行当前(now)类
noremap <Space>cn :action RunCoverage<CR>
"项目停止运行
noremap <Space>sp   :action Stop<CR>
""""""""""""""""""""""""""""""""""""""Debug篇""""""""""""""""""""""""""""""""""""""
"开启或关闭当前行断点
noremap <Space>bp :action ToggleLineBreakpoint<CR>
"debug时快速计算表达式
noremap <Space>qe :action QuickEvaluateExpression <CR>
"debug强制返回
noremap <Space>fr :action Debugger.ForceEarlyReturn<CR>
"添加新的debug观察
noremap <Space>daw :action Debugger.AddToWatch<CR>
"debug强制运行到光标处
noremap <Space>fc :action ForceRunToCursor<CR>
"安装了JRebel且在JRebel debug下才生效,热更新
noremap <Space>hs :action Hotswap<CR>
"安装了JRebel的debug运行
noremap <Space>DD :action JRebel Debug<CR>
"去除所有断点在当前文件中
noremap <Space>rab :action Debugger.RemoveAllBreakpointsInFile<CR>
"去除所有断点
noremap <Space>raB :action Debugger.RemoveAllBreakpoints<CR>
"弹出帧
noremap <Space>df :action Debugger.PopFrame<CR>
"显示当前断点位置
noremap <Space>pp :action ShowExecutionPoint<CR>
"流追踪技术
noremap <Space>ds :action StreamTracerAction<CR>
"哑断点技术
noremap <Space>mb :action XDebugger.MuteBreakpoints<CR>
"条件断点编辑
noremap <Space>eb :action EditBreakpoint<CR>

""""""""""""""""""""""""""""""""""""""窗口篇""""""""""""""""""""""""""""""""""""""
"激活maven窗口
noremap <Space>AM  :action ActivateMavenToolWindow<CR>
"激活database窗口
noremap <Space>AD  :action ActivateDatabaseToolWindow<CR>
"激活todo的窗口
noremap <Space>AT   :action ActivateTODOToolWindow<CR>
"激活Favorites的窗口
noremap <Space>AF :action ActivateFavoritesToolWindow<CR>
"激活project的窗口
noremap <Space>AP :action ActivateProjectToolWindow<CR>
"激活git的窗口
noremap <Space>AG :action ActivateVersionControlToolWindow<CR>
"激活服务的窗口
noremap <Space>AS :action ActivateServicesToolWindow<CR>
"激活Breakpoints的窗口.
noremap <Space>AB :action ViewBreakpoints<CR>
"激活Rest的窗口(需要安装插件)
noremap <Space>AR :action ActivateRestServicesToolWindow<CR>
"激活debug的运行窗口
nnoremap <Space>wd :action ActivateDebugToolWindow<CR>
"激活run的运行窗口
nnoremap <Space>wr :action ActivateRunToolWindow<CR>
"隐藏窗口(windows hide)
nnoremap <Space>wh :action HideActiveWindow<CR>
"窗口最大化windows max
nnoremap <Space>mm :action MaximizeToolWindow<CR>
"隐藏所有窗口
noremap <Space>ha :action HideAllWindows<CR>
noremap <Space><Space> :action HideAllWindows<CR>
"激活窗口,选中当前位置
noremap <Space>si :action SelectInProjectView<CR>

""""""""""""""""""""""""""""""""""""""信息篇""""""""""""""""""""""""""""""""""""""
"弹出警告信息
noremap <Space>ed :action ShowErrorDescription<CR>
"弹出类型信息
noremap <Space>ti :action ExpressionTypeInfo<CR>
"弹出参数信息
noremap <Space>pi :action ParameterInfo<CR>
"快速显示当前方法信息
noremap <Space>jd :action QuickJavaDoc<CR>
"弹出文件结构信息
noremap <Space>fs mm`m:action FileStructurePopup<CR>
"显示maven的依赖层级信息
noremap <Space>sd  :action ShowUmlDiagram<CR>
"弹出方法调用层级信息
noremap <Space>ch :action CallHierarchy<CR>
"查找引用了当前方法的文件信息
nnoremap <Space>fu :action FindUsages<CR>
"查找方法内使用该变量的引用信息
nnoremap <Space>su :action ShowUsages<CR>
"弹出方法结构信息
noremap <Space>mh :action MethodHierarchy<CR>
"弹出项目结构信息
noremap <Space>ps :action ShowProjectStructureSettings<CR>
""""""""""""""""""""""""""""""""""""""项目篇""""""""""""""""""""""""""""""""""""""
"关闭项目
noremap <Space>cP :action CloseProject<CR>
noremap <Space>CP :action CloseProject<CR>
"打开项目
noremap <Space>oP :action OpenFile<CR>
noremap <Space>OP :action OpenFile<CR>
"新建项目
noremap <Space>nP :action NewProject<CR>
noremap <Space>NP :action NewProject<CR>
""""""""""""""""""""""""""""""""""""""实用工具篇""""""""""""""""""""""""""""""""
"代码环绕
noremap <Space>sw :action SurroundWith<CR>
"整理代码
noremap <Space>= :action ReformatCode<CR>
"弹出菜单
noremap <Space>sm :action ShowPopupMenu<CR>
"保存模板
noremap <Space>st :action SaveAsTemplate<CR>
"复制当前文件的绝对路径
noremap <Space>cap   :action CopyAbsolutePath<CR>
"复制当前文件名
noremap <Space>ccp   :action CopyContentRootPath<CR>
"优化导入
noremap <Space>oi :action OptimizeImports<CR>
"改变视图
nnoremap <Space>cv :action ChangeView<CR>
"关闭到只剩当前tab栏
noremap <Space>co :action CloseAllEditorsButActive<CR>
"g4文件生成代码(需要安装anltr4插件)
"noremap <Space>ag :action antlr.Generate<CR>:action antlr.Generate<CR>
"显示字节码
noremap <Space>bc   :action ByteCodeViewer<CR>
"快速翻译(需要安装翻译插件)
noremap <Space>qq   :action $TranslateTextComponent<CR>
"替换翻译(需要安装翻译插件)
noremap <Space>tr :action $TranslateAndReplaceAction<CR>
noremap <Space>gfu :action GenerateFullRestUrl<CR>
"添加到收藏文件
"noremap <Space>atf :action AddToFavorites<CR>
"复制文件元素
noremap <Space>cE :action CopyElement<CR>
"新建文件元素
noremap <Space>nE :action NewElement<CR>
"删除当前文件元素
noremap <Space>dE :action SafeDelete<CR>
nnoremap <Space>cp :action CheckinProject<CR>
"idea智能提示
nnoremap <Space><Space> :action ShowIntentionActions<CR>
"跳转下个报错处(这个与idea智能提示配起来,炒鸡爽)
nnoremap <Space><CR> :action GotoNextError<CR>
"新建类,比nE快
noremap <Space>nc :action NewClass<CR>
"打开项目设置
noremap <Space>ps :action ShowProjectStructureSettings<CR>
"露出文件夹
noremap <Space>ri :action RevealIn<CR>
"代码生成
noremap <Space>ga :action Generate<CR>
"删除未修改的tab
noremap <Space>cu :action CloseAllUnmodifiedEditors<CR>
"Codota查找类似代码,需要提前安装Codota插件
noremap <Space>oc :action OpenCodotaSearch<CR>
"Codota激活窗口,需要提前安装Codota插件
noremap <Space>AC :action ActivateCodotaToolWindow<CR>
"Codota激活窗口,需要提前安装Codota插件
noremap <Space>cl :action CodotaLeanSearchCrossRefAction<CR>
"CSDN万能工具,需要提前安装CSDN插件
noremap <Space>csdn :action SearchByCSDN<CR>
"大小写,驼峰,下划线,中划线转换
noremap <Space>uu :action de.netnexus.CamelCasePlugin.ToggleCamelCase<CR>
"替换
noremap <Space>rp :action ReplaceInPath<CR>
"查看代码git作者
noremap <Space>us :action Annotate<CR>
"打开ddl语句
noremap <Space>dl :action DatabaseView.OpenDdlInConsole<CR>
"大小写切换,必须要先安装插件
noremap <Space>u :action de.netnexus.CamelCasePlugin.ToggleCamelCase<CR>
" 显示git菜单
nnoremap <Space>gm :action Git.Menu<CR>
nnoremap <Space>te :action ActivateTerminalToolWindow<CR>
" 一键提交到test环境
nnoremap <Space>mrt :action com.github.novotnyr.idea.gitlab.quickmr.CreateMergeRequestAction<CR>
" 一键提交到uat环境
nnoremap <Space>mru :action com.github.novotnyr.idea.gitlab.quickmr.CreateMergeRequestAction2<CR>
nnoremap <Space>ah :action swapClassAction<CR>oyum install sudo -y;yum install telnet -y;yum install unzip -y;<Esc>o<Esc>pV9kd
"nnoremap <Space>ah :action Artha"sHotRetransformCommandAction<CR>|:normal oyum install unzip -y;<CR>p"+yy
nnoremap <Space>aw :action ArthasWatch<CR>
nnoremap <Space>at :action ArthasTrace<CR>
nnoremap <Space>dc :action ArthasJadCommandAction<CR>
nnoremap <Space>ss :action com.jetbrains.plugins.remotesdk.console.RunSshConsoleAction<CR>
nnoremap <Space>dn F,vt,d
nnoremap <Space>db T(vf,ld
nnoremap <Space>dm F,vt)d
nnoremap <Space>vn F,vt,
nnoremap <Space>vb T(vf,l
nnoremap <Space>vm F,vt)
nnoremap <Space>ex va{<Bar>:action EditorSelectWord<CR>:action EditorSelectWord<CR>:action EditorSelectWord<CR>:action EditorSelectWord<CR>

原文链接: https://juejin.cn/post/7367948180543029298

文章收集整理于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除,如若转载,请注明出处:http://www.cxyroad.com/17707.html

QR code