我的快捷键设置思路和IdeaVim的配置分享

date
Mar 3, 2024
slug
keymap
status
Published
tags
技术
summary
最近在整理自己的IdeaVim的配置,正好看到了一些比较不错的文章,也借机整理下自己关于快捷键的思路,快捷键从本质上来说,是为了更好的记住,提升做事情的效率,快捷键不会单独存在,一般来说是一个功能键(修饰键)+一个其他字符组合起来
type
Post
最近在整理自己的IdeaVim的配置,正好看到了一些比较不错的文章,也借机整理下自己关于快捷键的思路,快捷键从本质上来说,是为了更好的记住,提升做事情的效率,快捷键不会单独存在,一般来说是一个功能键(修饰键)+一个其他字符组合起来,我们先看下Mac下的修饰键:
  • ⌘Command
  • ⇧Shift
  • ⌥Option
  • ⌃Control
一个好的快捷键应该满足几个条件:
  • 尽可能少的组合
  • 尽可能容易记忆
  • 尽可能减少和其他软件(系统)的冲突
我们人脑的记忆思路来记忆快捷键主要有以下几种形式:
  • 首字母法:例如Command+c,就是copy
  • 但是在一些设置中如果只使用Command+英文首字母,可能就会产生冲突,这个时候可以尝试下中文首字母,例如静音的快捷键,如果使用Command+m(mute)就会冲突,但是如果使用Command+j(jingyin)就会避免冲突
  • 联想位置:窗口管理的快捷键我永远只会记住少数的几个,但是如果使用键盘的QWASZX来作为快捷键调节窗口就会比较具象
    • Control-Q 和 Control-W:左上角、右上角
    • Control-A 和 Control-S:左半边、右半边
    • Control-Z 和 Control-X: 左下角、右下角
  • 使用意向
    • 加减号:+,
    • 左右方括号:[, ]
    • 左右三角方括号:<, >
    • 没关系的符号:\ , ;, ', /
根据以上的这些底层思想,我通过IDEA自带的快捷键和Vim的快捷键设置,大概说下我的快捷键思路是:
  • 优先使用好用的Command快捷键,例如Command+e等只有一个字母的快捷键保留下来
  • 其次使用冲突比较少的一个修饰键:Control,通过Control来设置
  • 通过Leader Key来补充一些快捷键,例如对于重构的场景比较多,我会使用空格键作为Leader Key来设置
    • 空格+r(refactoring):出发重构
    • 空格+v:提取函数
  • 最后使用组合键:例如Command+Shift的组合

使用案例(具体配置)

LeaderKey:空格

let mapleader=" " nnoremap <Leader>o :<C-u>action RecentProjectListGroup<CR>

Go to Declaration

IDEA 自身就提供了非常多的快捷来在代码之间跳转,比如:
  • 跳转到变量,方法,类的定义
  • 跳转到 Super 类
  • 跳转到方法被调用的地方
  • 跳转到实现的地方
  • 跳转到文件
  • 跳转到测试类
在我的工作流里面,为了方便记忆,统一使用 g 作为简记符(表示 go)。比如 gd 表示 go to definition
nnoremap gd :action GotoDeclaration
这里的 GotoDeclaration 是 IntelliJ 的一个 action,一个 IntelliJ 的 Action 对应着 IntelliJ 的一个功能。上面的定义就表示在 Normal 模式下定义新的 keymap gd,表示的是在 Normal 模式下,按下 gd 就会执行 IDEA 的 action GotoDeclaration
" go to somewhere (g in normal mode for goto somewhere) nnoremap ga :<C-u>action GotoAction<CR> nnoremap gc :<C-u>action GotoClass<CR> nnoremap gd :<C-u>action GotoDeclaration<CR> nnoremap gs :<C-u>action GotoSuperMethod<CR> nnoremap gi :<C-u>action GotoImplementation<CR> nnoremap gf :<C-u>action GotoFile<CR> nnoremap gm :<C-u>action GotoSymbol<CR> nnoremap gt :<C-u>action GotoTest<CR> nnoremap gb :<C-u>action Back<CR> nnoremap gf :<C-u>action Forward<CR>

Toggle Actions

我使用 t 加上一个字母作为 Toggle 动作的开始方便记忆(t 就表示 toggle)。
比如下面的第一条的 ta,表示的就是 Toggle Annotate,在 IDEA 主编辑区域经常看这行代码是谁提交的,那么会使用右击序号空白处,然后选择 Annotate,这个操作可以简化成直接在 Vim 模式的阅读模式下按下 ta

查看 IDEA 支持的 Action

在安装 IdeaVim 之后,可以在 normal 模式下使用如下命令查看 IDE 支持的 action:
:actionlist [pattern]
如果要搜索对应的 action 可以直接加上模糊词来搜索,比如 :actionlist declaration 来搜索相关的内容。

重新命名 Action

~/.ideavimrc 文件中可以给 Action 其名字,比如
command! Reformat action ReformatCode
在 action 后面的 ReformatCode 是一个合法的 ActionName,通过上面的语句就重新起了一个新的名字叫做 Reformat。这样就可以通过 :Reformat 来调用

切换标签页

切换标签页
nnoremap <TAB> :action PreviousTab<CR> nnoremap <s-TAB> :action NextTab<CR>

编辑器分屏

Vim 的命令 :e, :sp, :vsp 是支持的。
也可以直接使用快捷键 <C-W>s, <C-W>v, <C-w>c 来实现对编辑器的分屏。
<C-W>w 可以快速在不同的 Panel 之间切换。
我想要达到的效果是和我在终端中使用 Tmux+Vim 类似,使用 Ctrl+h/j/k/l 来进行分屏。
首先要到设置中把可能的快捷键冲突解决,比如 Ctrl+H 原来被我映射成 Find in Path,现在我使用 gp (go to path) 作为快捷键触发。
然后将 作为 Leader 快捷键。
" screen management " Vertical split screen nnoremap <c-\> :action SplitVertically<CR> nnoremap <c--> :action SplitHorizontally<CR> nnoremap <c-=> :action Unsplit<CR> nnoremap <c-m> :action MoveEditorToOppositeTabGroup<CR>nnoremap <c-h> <c-w>h nnoremap <c-l> <c-w>l nnoremap <c-j> <c-w>j nnoremap <c-k> <c-w>k
这样就实现了 IDEA 内部的快速分屏。
记得去设置中将 Ctrl + h/j/k/l 的默认快捷键移除,否则可能会有冲突。

Cmd 组合

  • Cmd+a/c/v/x/z
  • Cmd+w 关闭当前的文件
  • Cmd+e 最近的文件
  • Cmd+t Refactor this 重构
  • Cmd+n Generate 快速生成模板代码
  • Cmd+o File Structure 当前文件的文件结构
  • Cmd+b 跳转到定义
  • Cmd+[/]

重构

nnoremap <leader>r :action Refactorings.QuickListPopupAction<CR> nnoremap <Leader>= :action ReformatCode<CR> nnoremap <leader>i :action OptimizeImports<CR>

终端

""" Terminal nnoremap <c-t> :action ActivateTerminalToolWindow<CR> nnoremap <leader>t :action Terminal.OpenInTerminal<CR>

系统的一些设置

这个我觉得用Command比较好,zc我一直不习惯
nnoremap zc :action CollapseRegion<CR> nnoremap zo :action ExpandRegion<CR> nnoremap <leader>zc :action CollapseAllRegions<CR> nnoremap <leader>zo :action ExpandAllRegions<CR> Command+[+] Command+[-] Command+Shift+[+] Command+Shift+[-]
还有注释:
nnoremap <leader>c :action CommentByLineComment<CR> 可以用Command+/
RecentFiles
nnoremap <c-r> :action RecentFiles<CR> 可以用Command+E

必须安装的插件

  • IdeaVim,用来在 IDEA 中模拟 Vim 下的操作

2024 IdeaVim配置

" ================================================================================================ " = 基础设置 ===================================== " ================================================================================================ " 共享系统粘贴板 set clipboard+=unnamed set clipboard+=ideaput " 忽略大小写 set igcase " 上下方保留5行预览代码 set scrolloff=5 " 设置命令历史记录条数 set history=200 " 显示当前行号 set number " 显示相对行号 set relativenumber " 打开增量搜索模式,随着键入即时搜索 set incsearch " 搜索高亮 set hlsearch " 保证normal模式是英文键盘 " set keep-english-in-normal nnoremap \e :e ~/.ideavimrc<CR> nnoremap \r :action IdeaVim.ReloadVimRc.reload<CR> """ The Escape button map <C-c> <Esc> """ The Leader Ker let mapleader=" " nnoremap <Leader>o :<C-u>action RecentProjectListGroup<CR> """ Distraction Free Mode nnoremap <c-z> :action ToggleDistractionFreeMode<CR> """ Terminal " nnoremap <c-t> :action ActivateTerminalToolWindow<CR> nnoremap <leader>t :action Terminal.OpenInTerminal<CR> """ Navigation """ windows management nnoremap <c-\> :action SplitVertically<CR> nnoremap <c--> :action SplitHorizontally<CR> nnoremap <c-=> :action Unsplit<CR> nnoremap <c-m> :action MoveEditorToOppositeTabGroup<CR> sethandler <c-j> a:vim sethandler <c-k> a:vim nnoremap <c-h> <c-w>h nnoremap <c-l> <c-w>l nnoremap <c-j> <c-w>j nnoremap <c-k> <c-w>k nnoremap <TAB> :action PreviousTab<CR> nnoremap <s-TAB> :action NextTab<CR> nnoremap <Leader>q :action CloseContent<CR> nnoremap <Leader>qa :action CloseAllEditors<CR> """ Editing source code set ideajoin set idearefactormode=keep vnoremap < <gv vnoremap > >gv nnoremap [[ :action MethodUp<CR> nnoremap ]] :action MethodDown<CR> " show information " nnoremap <c-i> :<C-u>action QuickJavaDoc<CR> """ Refactorings nnoremap <leader>r :action Refactorings.QuickListPopupAction<CR> nnoremap <Leader>= :action ReformatCode<CR> nnoremap <Leader>v :action IntroduceVariable<CR> nnoremap <Leader>m :action ExtractMethod<CR> nnoremap <Leader>f :action IntroduceField<CR> nnoremap <Leader>n :action RenameElement<CR> nnoremap <Leader>s :action ChangeSignature<CR> nnoremap <Leader>c :action IntroduceConstant<CR> nnoremap <Leader>mv :action Move<CR> nnoremap <Leader>p :action IntroduceParameter<CR> nnoremap <Leader>fp :action IntroduceFunctionalParameter<CR> nnoremap <leader>i :action OptimizeImports<CR> nnoremap <leader>l :action Inline<CR> nnoremap <c-r> :action RecentLocations<CR> noremap <leader>h :action LocalHistory.ShowHistory<CR> nnoremap ge :action GotoNextError<CR> nnoremap gE :action GotoPreviousError<CR> nnoremap <c-i> :action ImplementMethods<CR> """ Searching and Source Code Navigation nnoremap <c-/> :action FindInPath<CR> nnoremap <c-a> :action GotoAction<CR> nnoremap <c-f> :action GotoFile<CR> nnoremap <leader>u :action FindUsages<CR> nnoremap <leader>h :action CallHierarchy<CR> nnoremap <leader>b :action ShowNavBar<CR> nnoremap <c-s> :action FileStructurePopup<CR> nnoremap gc :action GotoClass<CR> nnoremap gi :action GotoImplementation<CR> nnoremap gd :action GotToDeclaration<CR> nnoremap gp :action GotToSuperMethod<CR> nnoremap gt :action GotoTest<CR> nnoremap gb :action Back<CR> nnoremap gf :action Forward<CR> """ Tool windows nnoremap <c-p> :action JumpToLastWindow<CR> nnoremap <c-x> :action HideAllWindows<CR> """ Running and Debugging nnoremap ,c :action RunClass<CR> nnoremap ,f :action ChooseRunConfiguration<CR> nnoremap ,t :action ActivateRunToolWindow<CR> nnoremap ,u :action Rerun<CR> nnoremap ,f :action RerunFailedTests<CR> nnoremap ,b :action ToggleLineBreakpoint<CR> nnoremap ,d :action ContextDebug<CR> nnoremap ,n :action ActivateDebugToolWindow<CR> " ================================================================================================ " = 插件 ===================================== " ================================================================================================ " https://github.com/JetBrains/ideavim/wiki/IdeaVim-Plugins """ Plugin Plug 'easymotion/vim-easymotion' " map <leader>F <Plug>(easymotion-s) " map <leader>f <Plug>(easymotion-f) map ; <Plug>(easymotion-prefix) "Turn on case insensitive feature let g:EasyMotion_smartcase = 1 "Use upper target labels and type as a lower case let g:EasyMotion_use_upper = 0 " move to character nmap f <Plug>(easymotion-s2) xmap f <Plug>(easymotion-s2) omap f <Plug>(easymotion-s2) " move to word nmap F <Plug>(easymotion-bd-w) xmap F <Plug>(easymotion-bd-w) omap F <Plug>(easymotion-bd-w) " move to line " nmap gl <Plug>(easymotion-bd-jk) " xmap gl <Plug>(easymotion-bd-jk) " omap gl <Plug>(easymotion-bd-jk) " Press `f` to activate AceJump nnoremap f :<C-u>action AceAction<CR> " Press `F` to activate Target Mode " 在 Target 模式下会跳转到目标,并选中目标整个Word" nnoremap F :<C-u>action AceTargetAction<CR> " Press `g` to activate Line Mode " nnoremap g :action AceLineAction<CR> Plug 'justinmk/vim-sneak' Plug 'terryma/vim-multiple-cursors' map mc <A-n> map mx <A-x> map mp <A-p> Plug 'tpope/vim-surround' Plug 'preservim/nerdtree` " map <c-t> :NERDTree<CR> Plug 'michaeljsmith/vim-indent-object'

Reference

If you have any questions, please contact me.