文章目录
- vim设计哲学
- vim的模式
- 什么是可视模式
- 光标移动
- 动作(motion)
- 操作符(operator)
- 操作符(operator)+动作(motion)实际使用
- 大小写转换
- easymotion
- vim-surround
- TIPS
- ideavim的使用
vim设计哲学
vim被称为编辑器之神。它的成名就是因为文本操作非常的高效。
vim通过划分不同的模式,使按键在不同的模式下有不同的作用。这样的好处就是可以使用更少的键完成同样的操作。
操作符就是说告诉vim我们要干什么,而动作就是告诉vim怎么干。
在这两个因素的作用下就使我们的开发变得非常高效!
vim的模式
vim有如下四种模式:
这几种模式之间可以相互转换,例如在普通模式和插入模式之间有如下几种转换的方法
o代表的是open a new line
i代表的是insert
a代表的是append
注意这里的jj和CapsLock需要在配置文件中进行映射,否则不一定会生效
在普通模式和可视模式之间进行转化的途径如下:
普通模式和命令模式的转换途径如下:
什么是可视模式
这里我们多提一句什么是可视模式:
在 Vim 中,可视模式用于选择文本,这与在 GUI 文本编辑器中通过鼠标单击并拖动以选择文本操作来选择文本的 Vim 等效。
Vim 中的可视模式允许您选择文本,但可视模式的不同子集将很有用,具体取决于您要如何选择文本。
Vim 中有 3 个可视模式子集:
- Visual [Character] 模式:用于选择单个字符
- 视觉线模式:用于一次选择整条线
- 可视块模式:用于选择块状矩形形状的文本
如果要切换到可视模式,则需要先进入普通模式:
- 视觉模式:(v小写’v’)
- 视觉线模式:(V大写“V”)
- 视觉块模式:Ctrl + v
当你切换到可视模式时,Vim 会给你一些细节,它将显示您处于哪种模式以及您选择的文本数量。
进入可视模式后,选择从光标点开始,您可以使用导航键 h/j/k/l 移动它,w/e/b 键跳过单词。
当您对选择感到满意时,您可以执行删除、拉取和替换等操作。
光标移动
以字母为单位
在普通模式下光标向上下左右移动的按键如下:
这个不用记,自己多用几遍就熟了
以单词为单位
这里我们一般b、e用的多:
- b代表begin
- e代表end
行首、行尾的跳跃
字符间的跳跃
;
和,
我们可以简单地理解为前一个、后一个
动作(motion)
首先我们来区分一下i(insert)和a(around)的区别,我们可以通过如下几个例子来理解:
然后我们来看一下一些基本的动作(motion):
操作符(operator)
操作符就是告诉vim我们要干什么,这里我们说说最常用的几个操作符;
操作符(operator)+动作(motion)实际使用
下面我们举几个例子:
如果我们要修改HelloWorld,我们可以使用:c iw
如果我们要修改泛型,可以使用c iw
或者 c i<
如果我们要删除泛型,可以使用d i<
,d iw
或者d a<
如果我们要删除返回值,可以使用d i{
或者d iB
B是bracket的缩写
删除两行,使用2dd
- 删除到s:
d fs
- 修改到s:
c fs
- 复制到s:
y fs
也就是操作符配合我们的^
和$
使用
如果要删除、修改、复制整个文件,就是操作符配合e
使用:
d ie
c ie
y ie
如果要对html中的标签进行操作,我们可以动作t,例如现在我们想删除并编辑div内的所有内容:
我们可以把光标移到div中,然后按c it
即可
我们将当前单词进行选中然后复制:v iw y
大小写转换
相关操作如下图:
easymotion
leader在这里我们设定为空格space键
vim-surround
TIPS
测试环境:vscode
我们要查看当前函数的定义:g d
(go to definition)
调回来使用:ctrl -
有些方法上鼠标悬浮会有注释,如果你想看的话可以使用:g h
跳转标签页:
往前跳:g T
往后跳:g t
往后跳四个:4 g t
跳转到左边的项目栏:
command 1
如果是分页的跳转则使用:
command 2
或者在命令行使用:
tabn
、tabp
ideavim的使用
ideavim是一个基于IntelliJ平台的vim插件
我们第一次使用的时候除了安装ideavim插件之外,可以把easymotion这个插件也下载了。
然后我们点击右下角的那个绿色的V字,再点击open打开我们的ideavimrc配置文件。
一开始打开是空的,我们可以自己进行配置,也可以使用如下的配置文件;
"==========================================
" Author: hank.zhao
" Version: 0.1
" Email: hxzhenu@gmai.com
" Desc: my ideavim config file
"==========================================
" set leader key
nnoremap <SPACE> <Nop>
let mapleader = " "
" search
set hlsearch
set incsearch
set smartcase
set ignorecase
set showmode
set de=on
set scrolloff=5
" plugins
set ideamarks
set easymotion
set surround
set argtextobj
set multiple-cursors
" Remap multiple-cursors shortcuts for Mac
nmap <C-n> <Plug>NextWholeOccurrence
xmap <C-n> <Plug>NextWholeOccurrence
nmap <C-x> <Plug>SkipOccurrence
xmap <C-x> <Plug>SkipOccurrence
nmap <C-p> <Plug>RemoveOccurrence
xmap <C-p> <Plug>RemoveOccurrence
nmap <S-C-n> <Plug>AllWholeOccurrences
xmap <S-C-n> <Plug>AllWholeOccurrences
set exchange
set highlightedyank
set textobj-entire
set keep-english-in-normal-and-restore-in-insert
set NERDTree
set ReplaceWithRegister
" basic key mapping
nnoremap L $
vnoremap H ^
nnoremap H ^
vnoremap L $
nnoremap ; :
nnoremap ` ,
inoremap jk <esc>
" nerdtre
map <leader>e :action SelectInProjectView<CR>
nnoremap <leader>d :NERDTreeFocus<CR>
""" Idea specific settings ------------------
set ideajoin
set idearefactormode=keep
" clear the highlighted search result
nnoremap <Leader>sc :nohlsearch<CR>
" easymotion
map <leader>f <Plug>(easymotion-s)
" Window operation
nnoremap <leader>ww <C-W>w
nnoremap <leader>wd <C-W>c
nnoremap <leader>wj <C-W>j
nnoremap <leader>wk <C-W>k
nnoremap <leader>wh <C-W>h
nnoremap <leader>wl <C-W>l
nnoremap <leader>ws <C-W>s
nnoremap <leader>w- <C-W>s
noremap <leader>wv <C-W>v
nnoremap <leader>w\| <C-W>v
" copy and paste
noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>P "0p
vnoremap Y "+y
" Tab operation
nnoremap tn gt
nnoremap tp gT
" Insert mode shortcut
inoremap <C-h> <Left>
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-l> <Right>
inoremap <C-a> <Home>
inoremap <C-e> <End>
inoremap <C-d> <Delete>
" Quit normal mode
nnoremap <Space>q :action CloseProject<CR>
nnoremap <Space>Q :qa!<CR>
" edit vimrc
nnoremap <leader>ve :e ~/.ideavimrc<CR>
nnoremap <leader>vw :w!<CR>
nnoremap <leader>vs :source ~/.ideavimrc<CR>
" intellij built in key map
nnoremap <leader>a :action GotoAction<CR>
nnoremap <leader>b :action Bookmarks<CR>
nnoremap <leader>c :action GotoClass<CR>
"nnoremap <leader>e :action SearchEverywhere<CR>
"nnoremap <leader>f :action FindInPath<CR>
nnoremap <leader>gc :action Git.CompareWithBranch<CR>
nnoremap <leader>ga :action Annotate<CR>
nnoremap <leader>gh :action Vcs.ShowTabbedFileHistory<CR>
nnoremap <leader>nj :action NewClass<CR>
nnoremap <leader>nt :action Kotlin.NewFile<CR>
nnoremap <leader>r :action RecentFiles<CR>
" build and compile code
nnoremap <leader>mr :action Maven.Reimport<CR>
"toggle something
"toggle track vim action Id
nnoremap ta :action VimFindActionIdAction<CR>
" run and debug
nnoremap ,d :action Debug<CR>
nnoremap ,r :action Run<CR>
nnoremap ,c :action CompileDirty<CR>
nnoremap ,b :action ToggleLineBreakpoint<CR>
nnoremap ,v :action ViewBreakpoints<CR>
nnoremap ,s :action Stop<CR>
" navigation
nnoremap gs :action GotoSuperMethod<CR>
nnoremap gb :action JumpToLastChange<CR>
nnoremap gi :action GotoImplementation<CR>
nnoremap gd :action GotoDeclaration<CR>
nnoremap gf :action FileStructurePopup<CR>
" code actions
nnoremap U :action FindUsages<CR>
nnoremap R :action RenameElement<CR>
nnoremap == :action ReformatCode<CR>
vnoremap = :action ReformatCode<CR>
nnoremap -- :action OptimizeImports<CR>
nnoremap cc :action CommentByLineComment<CR>
vnoremap cc :action CommentByLineComment<CR>
接下来我们稍微解释一下这个配置文件;
这里配置的是搜索的一些内容,例如什么高亮搜索,模糊搜索,忽略大小写搜索等,我们可以来试一下:
我们搜索leader默认是忽略大小写的,但是我们如果使用的是驼峰那就可以严格匹配:
然后进行了插件的配置:
这个easy是让我们快速抵达想要到的地方,例如我们现在想快速到达下图位置:
两个空格+ f + 相关字符 然后按照提示选择即可
surround插件的作用就是让你快速在某一部分的周围做出操作,这里不做出具体介绍,可以自行在网上查看教程。
接下来是一些基础按键的映射;
- nnoremap代表normal模式
- vnoremap代表visual模式
这里配置的是取消高亮 空格+sc 也就是searchclear
然后是一些窗口操作;
这里是复制粘贴到剪切板的操作
切换导航栏的操作