这篇文章是看《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删除当前字符并进入插入模式 等同于 cl
S删除当前行并进入插入模式 等同于 ^C
I光标移至行首,并进入插入模式,等同于 ^i
A光标移至行尾,并进入插入模式,等同于 $a
o下方插入一行 等同于 A<CR>
O上方插入一行 等同于 ko
daw删除一个单词
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 删除不保留副本
设置删除而非剪切

  1. nnoremap <leader>d "_d
  2. vnoremap <leader>d "_d

"" 匿名寄存器
"+系统剪切板
"*选择专用寄存器

vim 和 系统剪贴板打通
首先vim版本需要支持 clipboard vim --version | grep clipboard 要有 + 号
然后设置

  1. 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,不太清楚啥原因

  1. ~/.vim/vimrc
  2. set clipboard=unnamed
  3. ~/.zshrc
  4. alias 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 all
option + 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实用哲学

  1. 先学会盲打,再学习vim
  2. 理想的范式,一键移动,一键执行

参考

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