idea使用Vim的技巧大全分享
作者:老梁Java
一、前言
vim的基础命令我这边不多做介绍,直接给两个比较大而全的直观图,照着一个个命令看下去基本命令就学了一遍了,我会着重介绍我在idea编写代码过程中比较常用的命令,毕竟在idea写代码和在vim编辑器里写代码还是有很大区别的,idea本身自带了很多功能,不需要依赖vim更加方便
二、插件推荐
- 在idea用vim推荐下载如下几个插件,很多文章也推荐了这两个插件,但都没具体介绍
IdeaEasyMotion
对于不想用鼠标移动的用户来讲,这是个快速定位的神器,入下图所示,通过快捷键<ll>w
显示所有单词的开头,输入对应的字母就可以将光标定位到那个单词的开头,接下去若要修改,直接cw
就删掉这个单词进入插入模式修改了
这里<ll>
代表了两个<leader>
在配置文件用let mapleader=" "
来表示这个字符,我习惯用空格来作为leader
IdeaVimExtension
这个插件就是用来支持vim操作idea的
action
动作的,下面会介绍如何使用action
三、开发常用命令
v
系列viw
选中光标所在的单词,通常配合c
进行单词的快速修改,也就是viwc
直接修改一个单词变成插入模式直接写,相比于idea的变量重命名快捷键,这个的好处就是不管是变量,类名,方法名都可以直接快速选中单词直接改
viw
:选择当前光标所在的单词(word),不包括周围的空格或标点。vis
或vi'
:选择单引号内的文本(不包括单引号本身)。vin
或vi"
:选择双引号内的文本(不包括双引号本身)。vib
或vi(
或vi)
:选择圆括号内的文本(不包括圆括号本身)。viB
或vi{
或vi}
:选择大括号内的文本(不包括大括号本身)。vi[
或vi]
:选择方括号内的文本(不包括方括号本身)。vit
:选择HTML标签内的文本(不包括标签本身)
以上方法对应了选中对应两个相同符号范围内的字符串,比如选中双引号内的字符串
c
系列
ciw
==viwc
相比于viwc
这种可视化选择修改,ciw
更加直接,会直接修改光标所在的单词,直接进入插入模式并删除单词
v
系列的所有命令都可以改成c
开头,效果等同于vi?c
hjkl
移动- 在vim编辑器中,本来移动和定位也是vim语法比较擅长的一项,但在idea中实际上鼠标的移动更方便进行光标的定位,特别是对mac来讲更加如此,手指划拉一下比
hjkl
的移动更有性价比,所以对vim的移动,感兴趣的学下就好了,没必要在实际开发中用它
- 在vim编辑器中,本来移动和定位也是vim语法比较擅长的一项,但在idea中实际上鼠标的移动更方便进行光标的定位,特别是对mac来讲更加如此,手指划拉一下比
r
替换x
删除- idea中command+R进行快速替换就够用了,所以
:%s/a/b/g
这种方式的替换就没必要了,但我们常常会遇到单个字母写错或者多写的情况,这种情况下,快速的修补方案用r和x就比较有性价比了 - 选中指定字母,按
r
,接下去你按任意字母,该字母就会替换为指定字母 - 选中指定字母,按
x
,直接删除这个字母,不会进入插入模式
- idea中command+R进行快速替换就够用了,所以
自定义删除指定参数
自定义命令需要在ideavimrc文件里写入,入口在
我自定义的命令如下,前三个是删除,后三个是选择
"光标在多个参数的第一个参数任意位置,执行直接删参数 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)
四、action
重点介绍下如何使用idea的action实现用vim的快捷键调用idea的功能
找到命令
首先我们要知道对应功能的action是什么名字,使用命令
:actionlist [pattern]
以下举例,打开terminal控制台,找到激活控制台命令,根据关键词terminal搜索,复制命令后action执行
执行命令
:action [指令]
固话命令
对于有些命令,我们希望通过快捷键就可以便捷的执行,那么我们可以写入
.ideavimrc
文件写入命令
在文件底部直接添加如下命令
nnoremap <Space>te :action ActivateTerminalToolWindow<CR>
接下去在普通模式下按
空格+te
则可以快捷打开Terminal
常用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
命令
六、我的配置
" .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>
以上就是idea使用Vim的技巧大全分享的详细内容,更多关于idea使用Vim的资料请关注脚本之家其它相关文章!