vim ideaVim配置与使用

ideaVim的配置

"" Source your .vimrc
"source ~/.vimrc

"" -- 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

"默认leader
let mapleader = "\<space>"

"" -- 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)
" Hello, world!
" Hello,,,,good world!

" Find more examples here: https://jb.gg/share-ideavimrc


"语法高亮
syntax on
"显示行号
set number relativenumber
"显示光标所在位置的行号和列号
set ruler                   "在右下角显示光标的位置
set wrap                      "自动折行
set shiftwidth=4    "转移,变动,移动 > < 移动的步进
set tabstop=4       "tab缩进,显示的空格长度
set softtabstop=4   "编辑模式按退格键时,光标回退的空格长度,即一个tab
set expandtab                  "将tab替换为相应数量空格
set smartindent         "自动缩进,有时候并不是你想要的
set backspace=2         "启用退格键的删除功能"
set co=5 "个命令设置了autoindent和cindent选项,并将cinwidth设置为5。这意味着在代码块内,Vim将自动缩进5列"
"设置取消备份 禁止临时文件生成
set nobackup
set noswapfile
" 为IdeaVim插件增加自动切换为英文输入法的功能,
" idea 需要安装 IdeaVimExtension plugin
set keep-english-in-normal
"设置匹配模式 类似当输入一个左括号时会匹配相应的那个右括号
set showmatch
"共享剪切板,Vim 的剪切板和系统的剪切板是隔离的。设置之后可以共享。
" set clipboard+=unnamedplus
" set clipboard^=unnamed,unnamedplus
"set laststatus=2   "命令行为两行
"set fenc=utf-8     "文件编码
"set mouse=a        "启用鼠标
set mouse=""
"monse =true
set mouse=""

"set ignorecase     "忽略大小写
set cursorline     "突出显示当前行
"set cursorcolumn   "突出显示当前列
set fdm=marker
"显示工具栏
"set guioptions-=T
set guioptions+=T
"jk退出insert模式
inoremap jk <ESC>
nnoremap gl $
nnoremap gh ^
nnoremap <leader>a 0

"Idea action 配置
" 重命令元素
nnoremap <Leader>re :action RenameElement<CR>
nnoremap <Leader>gi :action GotoImplementation<CR>
"nnoremap <Leader>im :action ImplementMethods<CR>
"nnoremap <Leader>rv :action IntroduceVariable<CR>
"nnoremap <Leader>cr :action CopyReference<CR>
"nnoremap <Leader>em :action ExtractMethod<CR>
"nnoremap <Leader>sw :action SurroundWith<CR>

"basemap
"source $cnfpath/nvim/cnf/basemap.vim


"""""""""""""""""""""
" 自动设置
"""""""""""""""""""""

"""""""""""""""""""""
" 通用设置
"""""""""""""""""""""
"解决中文输入法
"在ibus里面添加代码 .config/ibus/rime/build/stroke.schema.yaml
"识别不同的文件格式
set nocompatible "is support old vim
filetype on
filetype indent on
filetype plugin on
filetype plugin indent on
autocmd FileType text setlocal textwidth=78
"monse =true
"noremap <ScrollWheelUp>      <nop>
"noremap <S-ScrollWheelUp>    <nop>
"noremap <C-ScrollWheelUp>    <nop>
"noremap <ScrollWheelDown>    <nop>
"noremap <S-ScrollWheelDown>  <nop>
"noremap <C-ScrollWheelDown>  <nop>
"noremap <ScrollWheelLeft>    <nop>
"noremap <S-ScrollWheelLeft>  <nop>
"noremap <C-ScrollWheelLeft>  <nop>
"noremap <ScrollWheelRight>   <nop>
"noremap <S-ScrollWheelRight> <nop>
"noremap <C-ScrollWheelRight> <nop>
"总是显示状态栏
set laststatus=1
"状态行显示的内容 statue
"set statusline=%a%n\ %F\%m%r%w\ \ %{''.(&fenc!=''?&fenc:&enc).''}\ %{(&bomb?\",BOM\":\"\")}\ [%l,%v][%p%%]
" 不保存不提示
set hidden


"高亮
syntax enable " 开启语法高亮功能
"syntax on
set number
"相对行号
set relativenumber
"set norelativenumber
"显示状态select模式下显示选中的行数
set showcmd
" 搜索高亮
set hlsearch
exec "nohlsearch"
"组合键要连续快速"
nnoremap <Space><CR> :nohlsearch<CR>
"搜索实时预览
set incsearch

"忽略大小写
set ignorecase
"set noignorecase
"智能大小写
"set smartcase
"使光标始终和上下边缘相距3行
set scrolloff=8
"按键间隔 change key wait time neterror
"set notimeout
set timeoutlen=500
set viewoptions=cursor,folds,slash,unix
"注释
set formatoptions=tcrqn
"分平
set splitright
set splitbelow
"关闭显示模式 IVNC  statusbar
set noshowmode
"启动画面
set shortmess+=c
"优化滚动性能
"set ttyfast
"在执行宏命令时,不进行显示重绘;在宏命令执行完成后,一次性重绘,以便提高性能。
set lazyredraw
"bell
set visualbell

"列长度标尺
set colorcolumn=80
"自动更新时间
set updatetime=1000
"允许光标出现在最后一个字符的后面
set virtualedit=block
"记录光标配置
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif


"状态列的行数,预设一行,建议设成两行
set cmdheight=2

"与windows共享剪贴板
"set clipboard+=unnamed

set history=10

"""""""""""""""""""""
" 排版设置
"""""""""""""""""""""
" tab-py
set expandtab
"把制表符显示为^I ,用$标示行尾 TAB会被显示成 ">—" 而行尾多余的空白字符显示成 "-"
set list
set listchars=tab:>-,trail:-
set indentexpr=
" 退格不换行 del any
set backspace=indent,eol,start

" 下线
set cursorline
"当设置成 expandtab 时,缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进
set expandtab
" vim中默认的缩进为8个空格 set ts=4
set tabstop=4
set shiftwidth=4
set softtabstop=4
"自动缩进
set autoindent
"set paste
set nopaste
"nnoremap  <F7> :set paste<CR>
"nnoremap  <F8> :set autoindent<CR>

"show tab
set showtabline=2
"自动换行
set wrap
set tw=0
nnoremap <Space>n :set nowrap<CR>
nnoremap <Space>N :set wrap<CR>
nnoremap <leader>sp :set paste<CR>
nnoremap <leader>sP :set nopaste<CR>
"操作:za,打开或关闭当前折叠;zM,关闭所有折叠;zR,打开所有折叠

"indent方式,vim会自动利用缩进进行折叠,我们可以使用现成的折叠成果.
"我们可以在(括号)折叠处输入以下命令:

"zc 折叠
"zC 对所在范围内所有嵌套的折叠点进行折叠
"zo 展开折叠
"zO 对所在范围内所有嵌套的折叠点展开
"[z 到当前打开的折叠的开始处。
"]z 到当前打开的折叠的末尾处。
"zj 向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
"zk 向上移动到前一折叠的结束处。关闭的折叠也被计入。
"折叠方式 indent 所有 diff无更改折叠 syntax marker  manual手动
set foldmethod=indent
nnoremap <leader>zc2 :set foldlevel=2<CR>
nnoremap <leader>zc3 :set foldlevel=3<CR>
nnoremap <leader>zc4 :set foldlevel=4<CR>
nnoremap <leader>zc5 :set foldlevel=5<CR>
nnoremap <leader>zC :set foldlevel=99<CR>
"开启折叠
set foldlevel=99
set foldenable
"关闭折叠
"set nofoldenable
"nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
"Fill space between windows 在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\

"显示标尺 :statusBar态行上显示光标所在位置的行号和列号
"set ruler
set rulerformat=%20(%2*%<%f%=\ %m%r\ %3l\ %c\ %p%%%)

    "缩进
"map <Tab> >>
"map <S-Tab> <
" key notation
"

" 不是leader键不管用, 是我按键的时候太慢了,导致没有触发成功
"行首 行未
"nnoremap <leader>a 0
"nnoremap <leader>' $
"nnoremap <leader>l 0

"inoremap jk <ESC>
"vnoremap jk <ESC>

"分屏
nmap sv :set splitright<CR>:vsplit<CR>
nmap ss :set splitbelow<CR>:split<CR>

nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
"nmap <space>h <C-w>h
"nmap <space>j <C-w>j
"nmap <space>k <C-w>k
"nmap <space>l <C-w>l
nmap <DOWN> :res +5<CR>
nmap <UP> :res -5<CR>
nmap <RIGHT> :vertical resize+5<CR>
nmap <LEFT> :vertical resize-5<CR>

"快速移动
" nmap J 4j
nmap K 4k
nmap H 4h
nmap L 4l
vnoremap J 4j
vnoremap K 4k
vnoremap H 4h
vnoremap L 4l
inoremap <C-h> <Left>
inoremap <C-l> <Right>
inoremap <C-k> <Up>
inoremap <C-j> <Down>
inoremap <C-b> <PageUp>
inoremap <C-f> <PageDown>
"inoremap <C-d> <DELETE>
inoremap <C-d> <Backspace>

"vnoremap <space>
"vnoremap <space>


nnoremap <Leader><space> 30j
nnoremap <Leader>b 30

"只有复制动作才同步到系统剪贴板,可以通过自定义映射来实现
nnoremap y "+y
vnoremap y "+y

"快速复制粘贴
vnoremap <Leader>c "+y
vnoremap <space>1y "9y
vnoremap <space>2y "8y
vnoremap <Leader>v "+p
vnoremap <Leader>x "+x

nnoremap <Leader>1p "9p
nnoremap <Leader>2p "8p
nnoremap <Leader>o "0p
nnoremap <Leader>c viw"+y
nnoremap <Leader>y viw"0y
" nnoremap <Leader>v "+p
nnoremap <Leader>v viw"+p
nnoremap <Leader>p "+p
nnoremap <Leader>d "_diw
nnoremap <Leader>x viwc

" 普通模式下快速搜索复制的内容,不稳定,有时可能会无效
"  test nnoremap <C-=> /<C-R>+<CR>
inoremap <C-p> <C-r>+

" cnoremap:表示在命令行模式(包括搜索模式)下定义映射。
" 如果你想定义一个快捷键来自动插入某个寄存器的内容,可以通过 Vim 的映射功能模拟输入。例如:
cnoremap <C-p> <C-r>+
"多文件切换"
nnoremap <Tab> :bn<cr>

nnoremap <Leader>l :tabn<cr>
nnoremap <Leader>h :tabprev<cr>

" 映射 Find 功能
nmap <Leader>f :action Find<CR>

"如何触发多行光标,

"
function! CopyCode()
    :set paste
    :"+p
    :set nopaste
    "silent! call PhpCsFixerFixFile()
endfunction

"imap <C-V>        "+gP
"map <C-V> "+p
"noremap i H
"回车键映射为空行"
nmap <CR> o<Esc>

"保存文件
map S :w<CR>
"禁用s删除
map s <nop>
"推出
map Q :q<CR>
"刷新
map <Leader>R :source ~/.config/nvim/init.vim<CR>
map E :e<CR>
" 取消行号
"map N :set nu<CR>
"map n :set nonu<CR>
"fzf
"nnoremap <Leader>f :Files<CR>
"nnoremap <Leader>F :Rg<CR>
"nnoremap <Leader>t :Lines<CR>
"nnoremap <Leader>h :History<CR>
"nnoremap <Leader>b :Buffers<CR>
"tab切换
nnoremap bl :bn<CR>
nnoremap bd :call BufferDel()<CR>
"tab切换
nnoremap bh :bp<CR>


function! BufferDel()
    :bp|bd #
    "silent! call PhpCsFixerFixFile()
endfunction

"copy path
"nnoremap <Leader>p :let @+=expand('%:p')<CR>

"nnoremap <Leader>P :let @+=expand('%:t')<CR>
"复制当前文件的绝对路径
"noremap <Leader>p  :action CopyAbsolutePath<CR>
"复制当前文件名
"noremap <Leader>P  :action CopyContentRootPath<CR>


"svn
"nmap  <Leader>su :!svn up<CR>
"nmap  <Leader>si :call Svnci()<CR>
"nmap  <Leader>sd :!svn diff %<CR>
"nmap  <Leader>go :!git checkout %<CR>
"nmap  <Leader>sr :!svn revert %<CR>
"nmap  <Leader>st :!svn st %<CR>

"" reload
set idearefactormode=keep
set ideajoin

"打开报错, AceJump已经集成了,再打开无法识别, 并且会导致ideavim插件失效"
"set easymotion
"nmap <leader>s <Plug>(easymotion-sn)
"nmap <Leader>w <Plug>(easymotion-overwin-w)

"set NERDTree
"map tt :NERDTreeToggle<CR>
"map tf :NERDTreeFind<CR>
"let NERDTreeMapOpenExpl = ""
"let NERDTreeMapUpdir = ""
"let NERDTreeMapUpdirKeepOpen = ""
"let NERDTreeMapOpenSplit = "s"
"let NERDTreeOpenVSplit = "v"
"let NERDTreeMapActivateNode = "l"
"let NERDTreeMapOpenInTab = "t"
"let NERDTreeMapPreview = "p"
"let NERDTreeMapCloseDir = "h"
"let NERDTreeMapChangeRoot = "r"


set surround" cia
set argtextobj
"set visual-multi
set multiple-cursors
""" remap multiple-cursors
""" 避免了<A-n>键与Navigate导航栏的按键冲突
nmap <C-n> <Plug>NextWholeOccurrence
xmap <C-n> <Plug>NextWholeOccurrence
" nmap g<C-A-n> <Plug>NextOccurrence
" xmap g<C-A-n> <Plug>NextOccurrence
" nmap <C-x> <Plug>SkipOccurrence
" xmap <C-x> <Plug>SkipOccurrence
" nmap <C-p> <Plug>RemoveOccurrence
" xmap <C-p> <Plug>RemoveOccurrence

"let multi_cursor_use_default_mapping=0
"let multi_cursor_next_key='<C-n>'
"let multi_cursor_prev_key='<C-p>'
"let multi_cursor_skip_key='<C-x>'
"let multi_cursor_quit_key='<Esc>'


" 重构重命名
"nnoremap <leader>r :action RenameElement<CR>
" 格式化当前文件
"nnoremap <leader>cf :action ReformatCode<CR><esc>
"文件跳转
"noremap <Space>tf mm`m:action GotoFile<CR>

" quick java doc
"nnoremap <leader>q :action QuickJavaDoc<CR>
"搜索任何位置 b
"noremap <Leader>f :action SearchEverywhere<CR>
"文本搜索
"noremap <Leader>B :action FindInPath<CR>
"打开最新文件列表
"noremap <Leader>b :action RecentFiles<CR>

"改变视图symotion-sn)
"nnoremap <Space>cv :action ChangeView<CR>
"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>
"跳转 需要安装AceJump插d大幅度件
"noremap <Space>tj mm`m:action AceWordAction<CR>
"noremap <Space>jp mm`m:action AceDeclarationAction<CR>
"跳转下个报错处
"noremap <Leader>ne mm`m:action GotoNextError<CR>
"跳转上个报错处
"noremap <Leader>pe mm`m:action GotoPreviousError<CR>
"java类跳转
"noremap <Space>tc mm`m:action GotoClass<CR>
"从子类方法跳到父类的方法
"noremap <Space>gs mm`m:action GotoSuperMethod<CR>
"跳到方法实现
"noremap <Leader>ii mm`m:action GotoImplementation<CR>
"跳回方法实现
"noremap <Leader>ij mm`m:action GotoDeclaration<CR>
"new function
"noremap <Leader>nf mm`m:action ExtractMethod<CR>
"new code block
"noremap <Leader>sw mm`m:action SurroundWith<CR>
"noremap <Leader>im mm`m:action ImplementMethods<CR>
"万能重构"
"打开函数列表
"noremap <Leader>T mm`m:action ActivateStructureToolWindow<CR>

"noremap <Leader>u mm`m:action LocalHistory<CR>

"Ter common+T

" 全选文本/选择文本要借助visual模式"

ideaVim使用

idea中快捷键和vim命令优先哪个?

1. 优先使用 IDEA 原生快捷键的场景

  • IDE 专属功能

    • 重构操作:如 Ctrl+T(重构菜单)、Shift+F6(重命名)、Ctrl+Alt+V(提取变量)等。

    • 导航操作Ctrl+B(跳转到定义)、Ctrl+Alt+←/→(导航历史记录)、Ctrl+E(最近文件)等。

    • 工具集成:调试(Shift+F9)、版本控制(Alt+~)、数据库操作等。

    • 代码生成Alt+Insert(生成代码)、Ctrl+O(重写方法)等。

    • 需要图形化交互的功能‌:
      • 例如版本控制(Alt+9 打开 Git 面板)、数据库工具、插件功能等,直接用快捷键或鼠标更直观。
    • 团队协作‌:
      • 如果团队统一使用 IDEA 快捷键,保持一致性能减少沟通成本。
  • 效率优势

    • IDEA 原生快捷键直接关联 IDE 底层功能,响应更快,无需经过插件转换。

    • 某些复杂操作(如多光标编辑 Ctrl+Shift+Alt+J)没有等效的 Vim 命令。


2. 优先使用 Vim 命令的场景

  • 文本编辑

    • 快速移动:w(按词跳转)、f{char}(行内查找)、/(全局搜索)等。

    • 高效编辑:ciw(修改当前词)、dt((删除到括号)、yy/p(复制粘贴)等。

  • 模式化操作

    • Vim 的 Normal 模式适合纯键盘流操作,减少鼠标依赖。

    • 宏录制(qa...q + @a)和重复命令(.)对批量操作更高效。


3. 平衡策略

(1) 混合使用
  • 核心原则

    • 编辑文本用 Vim(如移动、删除、替换)。

    • 操作 IDE 用快捷键(如调试、重构、版本控制)。

  • 示例流程

    1. 用 Ctrl+N 快速打开类。

    2. 用 Vim 的 gg=G 格式化代码。

    3. 用 Ctrl+Shift+A 调用 IDE 动作(如 "Commit File")。

    4. 用 :wq 保存并关闭文件。

(2) 自定义映射
  • 覆盖冲突

    • 若 Vim 命令与 IDEA 快捷键冲突(如 Ctrl+C),可在 ~/.ideavimrc 中重新映射:

      " 将 Ctrl+C 映射为复制(覆盖 Vim 的默认中断操作)
      nnoremap <C-c> y
  • 扩展 Vim 命令

    • 将常用 IDE 功能绑定到 Vim 命令:

      " 映射 :gd 跳转到定义(等效于 Ctrl+B)
      command! Gd action GotoDeclaration
(3) 渐进过渡
  • 新手建议

    1. 先掌握 IDEA 基础快捷键(如 Ctrl+Shift+A 搜索动作)。

    2. 逐步启用 Vim 模式,从简单命令(h/j/k/lddi/a)开始。

    3. 通过 :actionlist 查看 Vim 可调用的 IDE 操作,逐步替换快捷键。


4. 性能考量

  • 插件开销

    • IdeaVim 对性能影响极小,但过度复杂的配置(如正则表达式补全)可能降低响应速度。

  • 流畅性优先级

    • 高频操作(如保存 :w)建议保持 Vim 原生行为。

    • 低频复杂操作(如重构)直接用快捷键。


最终建议

  1. Vim 为主,快捷键为辅

    • 如果你已熟悉 Vim,优先用其编辑代码,仅对 IDEA 独有功能使用快捷键。

  2. 配置为王

    • 通过 ~/.ideavimrc 定制映射,例如将 Ctrl+S 映射到 :w,实现无缝保存。

  3. 场景化选择

    • 调试时用 Alt+F8 计算表达式(快捷键更快)。

    • 写代码时用 ci" 修改字符串内容(Vim 更高效)。

配置示例~/.ideavimrc):

" 将 Leader 键设为空格
let mapleader = " "

" 映射 Leader+p 触发 IDEA 的 "Recent Files"
nnoremap <Leader>p :action RecentFiles<CR>

" 用 ;; 退出 Insert 模式(避免频繁按 Esc)
imap ;; <Esc>
 

通过合理混合,既能保留 Vim 的编辑效率,又能发挥 IDEA 的智能功能。

vim与idea快捷键冲突

1、‌原生 Vim 环境

在 ‌原生 Vim‌ 中,Ctrl+e 的默认功能为:

  • 垂直向下滚动屏幕‌(保持光标位置不变)‌。
    • 常用于快速查看当前光标下方的内容,尤其在分屏或多行文本场景中。

2、‌IntelliJ IDEA 的 Vim 插件环境

若在 IntelliJ IDEA 中使用 ‌Vim 插件(IdeaVim)‌,Ctrl+e 的功能可能被 IDE 默认快捷键覆盖:

  1. 原生 Vim 行为被屏蔽
    • IDEA 默认将 Ctrl+e 绑定为 ‌显示最近打开文件列表‌,与 Vim 的滚动功能冲突‌
  2. 恢复 Vim 原生功能的方法
    • 在 IDEA 设置中修改快捷键冲突:
      • 路径:Settings > Keymap > Vim Emulator,将 Ctrl+e 的 Handler 设置为 Vim‌15‌。
    • 或通过 ~/.ideavimrc 配置文件自定义快捷键映射‌‌。

3、操作示例

场景操作步骤
IDEA 中恢复 Vim 的 Ctrl+e1. 打开 Settings → 搜索 Keymap → 找到 Vim Emulator → 将 Ctrl+e 的 Handler 设为 Vim → 重启 IDEA‌
快速查看下方代码(原生 Vim)直接按 Ctrl+e,屏幕向下滚动,光标位置不变‌‌。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值