一、前言
vim的基础命令我这边不多做介绍,直接给两个比较大而全的直观图,照着一个个命令看下去基本命令就学了一遍了,我会着重介绍我在idea编写代码过程中比较常用的命令,毕竟在idea写代码和在vim编辑器里写代码还是有很大区别的,idea本身自带了很多功能,不需要依赖vim更加方便
二、插件推荐
- 在idea用vim推荐下载如下几个插件,很多文章也推荐了这两个插件,但都没具体介绍
-
IdeaEasyMotion
对于不想用鼠标移动的用户来讲,这是个快速定位的神器,入下图所示,通过快捷键
w
显示所有单词的开头,输入对应的字母就可以将光标定位到那个单词的开头,接下去若要修改,直接
cw
就删掉这个单词进入插入模式修改了这里
代表了两个
在配置文件用
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 dn F,vt,d "光标在多个参数的第一个参数任意位置,执行直接删参数 nnoremap db T(vf,ld nnoremap dm F,vt)d nnoremap vn F,vt, nnoremap vb T(vf,l nnoremap vm F,vt)
四、action
重点介绍下如何使用idea的action实现用vim的快捷键调用idea的功能
-
找到命令
首先我们要知道对应功能的action是什么名字,使用命令
:actionlist [pattern]
以下举例,打开terminal控制台,找到激活控制台命令,根据关键词terminal搜索,复制命令后action执行
-
执行命令
:action [指令]
-
固话命令
对于有些命令,我们希望通过快捷键就可以便捷的执行,那么我们可以写入
.ideavimrc
文件 -
写入命令
在文件底部直接添加如下命令
nnoremap te :action ActivateTerminalToolWindow
接下去在普通模式下按
空格+te
则可以快捷打开Terminal
-
常用action
" 这三个都是arthas的命令,结合快捷键快速复制命令 nnoremap aw :action ArthasWatch nnoremap at :action ArthasTrace nnoremap dc :action ArthasJadCommandAction
以上三个是我用的比较多的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 ideavim/doc/IdeaVim Plugins.md at master · JetBrains/ideavim · GitHub
" Highlight copied text
Plug ‘machakann/vim-highlightedyank’
" Commentary plugin
Plug ‘tpope/vim-commentary’set easymotion
“” – Map IDE actions to IdeaVim – GitHub - JetBrains/ideavim: IdeaVim – A Vim engine for JetBrains IDEs
“” Map \r to the Reformat Code action
"map \r (ReformatCode)“” Map d to start debug
"map d (Debug)“” Map \b to toggle the breakpoint on the current line
"map \b (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键乱移动
nnoremapnnoremap " ciw""hp
"jk退出insert模式
"inoremap jk
"inoremap jj
"inoremap“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”““基础篇””“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”
“–普通模式下使用回车键,向下/向上 增加一行
nmap o
“nmap O
“debug神器
nmap :action StepOver
nmap :action Resume
nmap :action StepOut
nmap :action ForceStepInto
“移动专精
nnoremap %
vmap
vmap 10zh
vmap 10zl
noremap vin vi”
“移动专精
“imap ja
“imap ka
“imap 10zhi
“imap l10zla
imap
imap
imap
imap
noremap o
imap o
“imap
“左右视野
nnoremap zH 50zh
nnoremap zL 50zl
“^符号太难按了 map gh ^ map gl
“代码提示
“imap :action HippieCompletiona
“imap :action HippieBackwardCompletiona
xnoremap < >gv
“”””””””””””””””“”“”“”“”“”“”“”“”“”“”““重构篇””“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”
" 设置leader键"
let mapleader=" "
“元素名称重构
noremap re ^W:action RenameElement
“移动重构
noremap mv :action Move
“成员变量转换为静态变量重构(配合移动重构有奇效)
noremap ms :action MakeStatic
“静态变量转换为成员变量重构
noremap ci :action ConvertToInstanceMethod
“内联重构(合并无效变量无效方法)
noremap il :action Inline
“抽取方法重构
noremap em :action ExtractMethod
“抽取接口重构
noremap ei :action ExtractInterface
“字段的访问限制
noremap ef :action EncapsulateFields
“引入临时变量
noremap iv :action IntroduceVariable
“引入常量
noremap ic :action IntroduceConstant
“引入方法参数
noremap ip :action IntroduceParameter
“引入字段
noremap if :action IntroduceField
“引入参数对象(指定参数)
noremap po :action IntroduceParameterObject
“方法下放到子类
noremap pd :action MemberPushDown
“方法上移到父类
noremap pu :action MembersPullUp
“文件名称重构
noremap RF :action RenameFile
“修改方法签名
noremap cs :action ChangeSignature
“抽取类
noremap ec :action ExtractClass
“匿名类到内部类
noremap ai :action AnonymousToInner
“””””””””””””””””””””“”“”“”“”“”“”“”“”“跳转篇”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”"
“特殊变量跳转
nnoremap ts mmm:action GotoSymbol<cr> "url地址跳转 noremap <space>tu mm
m:action Toolkit.GotoService
“动作跳转
nnoremap ta mmm:action GotoAction<cr> "文件跳转 noremap <space>tf mm
m:action GotoFile
“测试类跳转
noremap tt mmm:action GotoTest<cr> "java类跳转 noremap <space>tc mm
m:action GotoClass
“文本跳转
noremap tp mmm:action FindInPath<cr> "跳转下个报错处 noremap <space>ne mm
m:action GotoNextError
“跳转上个报错处
noremap pe mmm:action GotoPreviousError<cr> "从子类方法跳到父类的方法 noremap <space>gs mm
m:action GotoSuperMethod
“跳到方法实现
noremap gi mmm:action GotoImplementation<cr> "跳转到下个改动处 noremap <space>g, mm
m:action JumpToLastChange
“跳转到上个改动处
noremap g; mmm:action JumpToNextChange<cr> "最近查看文件间相互跳转 noremap <space>rf mm
m:action RecentFiles
“最近改动文件间相互跳转
noremap rF mmm:action RecentChangedFiles<cr> "项目之间的跳转(上一个) noremap <space>nw :action NextProjectWindow<cr> "项目之间的跳转(下一个) noremap <space>pw :action PreviousProjectWindow<cr> "跳转 需要安装AceJump插件 noremap <space>tj mm
m:action AceWordAction
noremap jp mm`m:action AceDeclarationAction
“”””””””””“”“”“”“”“”“”“”“”“”“”“”“”“”““SQL篇””“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”
"sql提交
noremap sc :action Console.Transaction.Commit
"sql回滚
noremap sr :action Console.Transaction.Rollback
"sql执行
noremap se :action Console.Jdbc.Execute
"sql执行计划
noremap ep :action Console.Jdbc.ExplainPlan
"sql-raw执行计划
noremap EP :action Console.Jdbc.ExplainPlan.Raw“打开数据库日志窗口,前提安装了MyBatis Log Plugin插件
noremap sl :action TailMyBatisLog0
noremap SL :action ActivateMyBatisLogToolWindow
noremap AL :action TailMyBatisLog0:action ActivateMyBatisLogToolWindow
“””“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“运行篇”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”"
“设置运行配置
nnoremap rc :action RunConfiguration
“debug上次运行的类
noremap dd :action Debug
“统计单元测试覆盖率运行上个类
noremap cc :action Coverage
“统计单元测试覆盖率运行当前(now)类
noremap cn :action RunCoverage
“项目停止运行
noremap sp :action Stop
“””””””“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“Debug篇”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”"
"开启或关闭当前行断点
noremap bp :action ToggleLineBreakpoint
"debug时快速计算表达式
noremap qe :action QuickEvaluateExpression
"debug强制返回
noremap fr :action Debugger.ForceEarlyReturn
"添加新的debug观察
noremap daw :action Debugger.AddToWatch
"debug强制运行到光标处
noremap fc :action ForceRunToCursor
"安装了JRebel且在JRebel debug下才生效,热更新
noremap hs :action Hotswap
"安装了JRebel的debug运行
noremap DD :action JRebel Debug
"去除所有断点在当前文件中
noremap rab :action Debugger.RemoveAllBreakpointsInFile
"去除所有断点
noremap raB :action Debugger.RemoveAllBreakpoints
"弹出帧
noremap df :action Debugger.PopFrame
"显示当前断点位置
noremap pp :action ShowExecutionPoint
"流追踪技术
noremap ds :action StreamTracerAction
"哑断点技术
noremap mb :action XDebugger.MuteBreakpoints
"条件断点编辑
noremap eb :action EditBreakpoint“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”““窗口篇””“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”
"激活maven窗口
noremap AM :action ActivateMavenToolWindow
"激活database窗口
noremap AD :action ActivateDatabaseToolWindow
"激活todo的窗口
noremap AT :action ActivateTODOToolWindow
"激活Favorites的窗口
noremap AF :action ActivateFavoritesToolWindow
"激活project的窗口
noremap AP :action ActivateProjectToolWindow
"激活git的窗口
noremap AG :action ActivateVersionControlToolWindow
"激活服务的窗口
noremap AS :action ActivateServicesToolWindow
"激活Breakpoints的窗口.
noremap AB :action ViewBreakpoints
"激活Rest的窗口(需要安装插件)
noremap AR :action ActivateRestServicesToolWindow
"激活debug的运行窗口
nnoremap wd :action ActivateDebugToolWindow
"激活run的运行窗口
nnoremap wr :action ActivateRunToolWindow
"隐藏窗口(windows hide)
nnoremap wh :action HideActiveWindow
"窗口最大化windows max
nnoremap mm :action MaximizeToolWindow
"隐藏所有窗口
noremap ha :action HideAllWindows
noremap :action HideAllWindows
"激活窗口,选中当前位置
noremap si :action SelectInProjectView
“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”““信息篇””“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”
“弹出警告信息
noremap ed :action ShowErrorDescription
“弹出类型信息
noremap ti :action ExpressionTypeInfo
“弹出参数信息
noremap pi :action ParameterInfo
“快速显示当前方法信息
noremap jd :action QuickJavaDoc
“弹出文件结构信息
noremap fs mm`m:action FileStructurePopup
“显示maven的依赖层级信息
noremap sd :action ShowUmlDiagram
“弹出方法调用层级信息
noremap ch :action CallHierarchy
“查找引用了当前方法的文件信息
nnoremap fu :action FindUsages
“查找方法内使用该变量的引用信息
nnoremap su :action ShowUsages
“弹出方法结构信息
noremap mh :action MethodHierarchy
“弹出项目结构信息
noremap ps :action ShowProjectStructureSettings
“””””””””””””“”“”“”“”“”“”“”“”“”“”“”“”“项目篇”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”"
“关闭项目
noremap cP :action CloseProject
noremap CP :action CloseProject
“打开项目
noremap oP :action OpenFile
noremap OP :action OpenFile
“新建项目
noremap nP :action NewProject
noremap NP :action NewProject
“””””“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“实用工具篇”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”"
"代码环绕
noremap sw :action SurroundWith
"整理代码
noremap = :action ReformatCode
"弹出菜单
noremap sm :action ShowPopupMenu
"保存模板
noremap st :action SaveAsTemplate
"复制当前文件的绝对路径
noremap cap :action CopyAbsolutePath
"复制当前文件名
noremap ccp :action CopyContentRootPath
"优化导入
noremap oi :action OptimizeImports
"改变视图
nnoremap cv :action ChangeView
"关闭到只剩当前tab栏
noremap co :action CloseAllEditorsButActive
"g4文件生成代码(需要安装anltr4插件)
"noremap ag :action antlr.Generate:action antlr.Generate
"显示字节码
noremap bc :action ByteCodeViewer
"快速翻译(需要安装翻译插件)
noremap qq :action $TranslateTextComponent
"替换翻译(需要安装翻译插件)
noremap tr :action $TranslateAndReplaceAction
noremap gfu :action GenerateFullRestUrl
"添加到收藏文件
"noremap atf :action AddToFavorites
"复制文件元素
noremap cE :action CopyElement
"新建文件元素
noremap nE :action NewElement
"删除当前文件元素
noremap dE :action SafeDelete
nnoremap cp :action CheckinProject
"idea智能提示
nnoremap :action ShowIntentionActions
"跳转下个报错处(这个与idea智能提示配起来,炒鸡爽)
nnoremap :action GotoNextError
"新建类,比nE快
noremap nc :action NewClass
"打开项目设置
noremap ps :action ShowProjectStructureSettings
"露出文件夹
noremap ri :action RevealIn
"代码生成
noremap ga :action Generate
"删除未修改的tab
noremap cu :action CloseAllUnmodifiedEditors
"Codota查找类似代码,需要提前安装Codota插件
noremap oc :action OpenCodotaSearch
"Codota激活窗口,需要提前安装Codota插件
noremap AC :action ActivateCodotaToolWindow
"Codota激活窗口,需要提前安装Codota插件
noremap cl :action CodotaLeanSearchCrossRefAction
"CSDN万能工具,需要提前安装CSDN插件
noremap csdn :action SearchByCSDN
"大小写,驼峰,下划线,中划线转换
noremap uu :action de.netnexus.CamelCasePlugin.ToggleCamelCase
"替换
noremap rp :action ReplaceInPath
"查看代码git作者
noremap us :action Annotate
"打开ddl语句
noremap dl :action DatabaseView.OpenDdlInConsole
"大小写切换,必须要先安装插件
noremap u :action de.netnexus.CamelCasePlugin.ToggleCamelCase
" 显示git菜单
nnoremap gm :action Git.Menu
nnoremap te :action ActivateTerminalToolWindow
" 一键提交到test环境
nnoremap mrt :action com.github.novotnyr.idea.gitlab.quickmr.CreateMergeRequestAction
" 一键提交到uat环境
nnoremap mru :action com.github.novotnyr.idea.gitlab.quickmr.CreateMergeRequestAction2
nnoremap ah :action swapClassActionoyum install sudo -y;yum install telnet -y;yum install unzip -y;opV9kd
“nnoremap ah :action Artha"sHotRetransformCommandAction|:normal oyum install unzip -y;p”+yy
nnoremap aw :action ArthasWatch
nnoremap at :action ArthasTrace
nnoremap dc :action ArthasJadCommandAction
nnoremap ss :action com.jetbrains.plugins.remotesdk.console.RunSshConsoleAction
nnoremap dn F,vt,d
nnoremap db T(vf,ld
nnoremap dm F,vt)d
nnoremap vn F,vt,
nnoremap vb T(vf,l
nnoremap vm F,vt)
nnoremap ex va{:action EditorSelectWord:action EditorSelectWord:action EditorSelectWord:action EditorSelectWord
这是一个从 https://juejin.cn/post/7367948180543029298 下的原始话题分离的讨论话题