这篇文章是看《Vim实用技巧》整理的一些笔记,以及日常使用vim的小技巧的收录,保持更新
VIM
查找
f{char}查找,;向前查找 ,向后查找跳转到指定字符之上. F反向查找t 查找字符,光标落在前一位,T 反向查找dt. 删除到 . 字符为止*查找当前光标下的单词
移动
hjkl 左下上右移动0 移动到行头^ 移动到本行第一个不是blank的字符$ 移动到行尾g_ 移动到行尾最后一个不是blank的字符fa 移动到本行下一个为a的字符处(;跳转到下一个,,跳转到上一个)ta 移动光标到a字符的前一个字符处zz 把当前行放在屏幕中间zt 把当前行放在屏幕最上方zb 把当前行移动到当前屏幕的尾部gg 跳转到第一行行首G 跳转到最后一行H 跳转到当前屏幕第一行M 跳转到当前屏幕中间L 跳转到当前屏幕尾部% 括号匹配移动,(,{,[,需要先把光标移动到括号上*匹配光标当前所在的单词
w向前一个单词,光标落在词首W移动的是一个词串,以空格为分隔b向后一个单词,光标落在词首e向前一个单词,光标落在词尾ge向后一个单词,光标落在词尾
gk 向上移动一个屏幕行gj 向下移动一个屏幕行g^ 移动到屏幕行开头g$ 移动到屏幕行结尾
一行文字占了多个可视行时比较有用
m{letter}标记当前光标位置`{letter} 回跳到光标处
增删改
C删除当前字符到行尾,并进入插入模式,效果等同于 c$s删除当前字符并进入插入模式 等同于 clS删除当前行并进入插入模式 等同于 ^CI光标移至行首,并进入插入模式,等同于 ^iA光标移至行尾,并进入插入模式,等同于 $ao下方插入一行 等同于 A<CR>O上方插入一行 等同于 kodaw删除一个单词daW删除一个单词,以空格作为单词切分c3w 修改3个单词dap删除整个段落gUaw把单词变为大写guaw把单词变为小写g~aw单词大小写翻转p 分为行模式和字符模式,取决于你复制的东西是什么
行模式
p粘贴到光标所在行的下一行,P粘贴到上一行,当复制多行后一般会使用P
gP粘贴完以后,光标移动到被粘贴行的下一行的行首,行模式P粘贴相对于gP的好处是光标会在第二个复制的行上,方便直接修改
字符模式
p粘贴到当前字符之后,P粘贴到当前字符之前。gp 和 gP的差别是光标停留位置。gp是在被粘贴字符的最后一个字符,gP是被粘贴最后一个字符后面,当前粘贴后要做一些修改时,需要注意找到合适光标的位置
可视模式
V选中行ctrl+v 选中列o 调整选区的两端U 选中直接变为大写。普通模式下要用gU,让标签中变为大写 gUit。可视模式不太适合需要重复执行的操作u 选中直接变为小写~翻转大小写v/xx 选中从当前光标到xx 字符,然后可以执行删除或其他编辑操作。通过查找进行移动/选区
命令模式
[range] delete [x]剪切指定行到寄存器 x 中[range] yank [x]复制指定行到寄存器x中[line] put [x]在指定行粘贴寄存器x的内容[range] copy {address}将指定范围内容拷贝到 {address} 之下[range] move {address}将指定范围内容移动到 {address} 之下:3,35 normal A; ex 命令对相应行执行普通模式的命令
寄存器
reg "0 查看寄存器0 的内容"0复制专用寄存器, 复制的时候既会存到无名寄存器,也会存到”0"_黑洞寄存器 "_diw 删除不保留副本
设置删除而非剪切
nnoremap <leader>d "_dvnoremap <leader>d "_d
"" 匿名寄存器"+系统剪切板"*选择专用寄存器
vim 和 系统剪贴板打通
首先vim版本需要支持 clipboard vim --version | grep clipboard 要有 + 号
然后设置
set clipboard=unnamedplus
效果是系统粘贴版的东西能直接 p粘贴, y复制的东西能直接 ctrl +v
https://advancedweb.hu/working-with-the-system-clipboard-in-vim/
https://stackoverflow.com/questions/30691466/what-is-difference-between-vims-clipboard-unnamed-and-unnamedplus-settings
ideavim中设置了 set clipboard=unnamedplus是生效的,但是mac自带的vim不生效,查了下mac上一般推荐使用macvim,因为mac上的剪切板会有很多奇怪的行为
使用MacVim,并打通剪切板,这里测试 set clipboard=unnamedplus并不work,不太清楚啥原因
~/.vim/vimrcset clipboard=unnamed~/.zshrcalias vim='/Applications/MacVim.app/Contents/MacOS/Vim'
粘贴系统剪贴板的东西,为了避免错位应该使用 set paste
宏
.重复上次操作q{register} 录制宏q 结束录制:reg {register} 查看宏内容@{register} 执行某个宏@@ 执行某个最近执行的宏10@@执行10次最近执行的宏
串行执行宏 10@@
并行执行宏 行模式高亮选中,再执行:normal @@ 这样是并行执行的,并且某行执行失败不会影响其他行
文件操作
:100,200w filename 保存某些行到新文件:100,200w! filename 保存某些行到新文件 覆盖文件的形式保存
IDEA常用快捷键
快捷移动和删除
ctrl-w 删除前一个单词ctrl-u删除到行首ctrl-k删除到行尾ctrl-a到行首ctrl-e到行尾
在使用IdeaVim后有一些快捷键会和vim冲突,需要根据自己习惯进行设置
窗口分屏
ctrl + 1左右切分窗口ctrl + 2上下切分窗口ctrl + 3把当前窗口移到对面ctrl + 4unsplit alloption + tab 鼠标在窗口之间跳转cmd + shift + []在一个split内切换窗口
IdeaVim
在idea中使用vim,通过ideavim插件来实现,ideavim中也内置了一些vim插件,列表如下
https://github.com/JetBrains/ideavim/wiki/Emulated-plugins
注意需要安装3个前置插件参照https://github.com/AlexPl292/IdeaVim-EasyMotion 否则配置了map key会不生效
常用插件
easymotion
argtextobj
multiple-cursors
surround
Vim实用哲学
- 先学会盲打,再学习vim
- 理想的范式,一键移动,一键执行
参考
https://www.bilibili.com/video/BV164411P7tw ideavim插件配置
https://www.bilibili.com/video/BV164411P7tw vim 上古神器
参考配置
https://www.jianshu.com/p/fd82bbed2c25
https://github.com/einverne/dotfiles/blob/master/idea/.ideavimrc
https://github.com/zhaohongxuan/dotfiles/blob/master/.ideavimrc
