Vim實用技巧

這篇文章是看《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 刪除不保留副本
設置刪除而非剪切

nnoremap <leader>d "_d
vnoremap <leader>d "_d

"" 匿名寄存器
"+系統剪切板
"*選擇專用寄存器

vim 和 系統剪貼板打通
首先vim版本需要支持 clipboard vim --version | grep clipboard 要有 + 號
然後設置

set clipboard=unnamedplus

效果是系統粘貼版的東西能直接 p粘貼, y複製的東西能直接 ctrl +v

//advancedweb.hu/working-with-the-system-clipboard-in-vim/
//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/vimrc
set clipboard=unnamed

~/.zshrc
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插件,列表如下
//github.com/JetBrains/ideavim/wiki/Emulated-plugins
注意需要安裝3個前置插件參照//github.com/AlexPl292/IdeaVim-EasyMotion 否則配置了map key會不生效

常用插件
easymotion
argtextobj
multiple-cursors
surround

Vim實用哲學

  1. 先學會盲打,再學習vim
  2. 理想的範式,一鍵移動,一鍵執行

參考

//www.bilibili.com/video/BV164411P7tw ideavim插件配置
//www.bilibili.com/video/BV164411P7tw vim 上古神器
參考配置
//www.jianshu.com/p/fd82bbed2c25
//github.com/einverne/dotfiles/blob/master/idea/.ideavimrc
//github.com/zhaohongxuan/dotfiles/blob/master/.ideavimrc