[Vim Protips] I like to move it – 上下移動某一行

Posted on

我的 Vim 有個功能,是從別的編輯器/IDE 抄來的:

按著 Shift 上下移動,就能移動某行程式碼。

選取 n 行再按著 Shift 上下移動,甚至能一次移動多行。

這樣的好處也很明顯,就不用再 DD(delet a line)然後再 y(yank),可以直接上下移動該行程式碼,操作速度上快很多,也蠻順手的。

config 裡的設定也很簡單,把這段放在 ~/.vimrc 裡面就好。

" move line up/down
nnoremap <S-DOWN> :m .+1<CR>==
nnoremap <S-UP> :m .-2<CR>==
inoremap <S-DOWN> <Esc>:m .+1<CR>==gi
inoremap <S-UP> <Esc>:m .-2<CR>==gi
vnoremap <S-DOWN> :m '>+1<CR>gv=gv
vnoremap <S-UP> :m '<-2<CR>gv=gv

若不想要用 shift 而想要用其他的,就只要把 <S-UP><S-DOWN> 中的 S 改成對應的字就好,ctrl 是 C,其他我就不太確定了。

記得之前在研究的時候還有看到很多別種寫法(有的也很 hack,直接 ddjy 之類的XD),我自己測試的結果上面這段是最好用也最穩定的,而且就算是在 insert mode 和 visual mode 也都能運作得很優雅。

在 visual mode 也能運作的意思就是,我們可以先 shift+v 選取 n 行,再按 shift+up/down 就能一次移動多行,這超級方便的啊。

另外還有個附加效果:在移動的時候,我的編輯器還會自動幫選中的行進行縮排。有時候要做 beautify 就直接選取然後移上移下就完成了。雖說這效果還不確定是不是因為我的其他設定值所導致的,還沒有去研究,之後再考慮要不要抓時間查看看。

Update: 後來經過 telegram 的朋友提醒,發現自動進行縮排的是指令後面的 == 的效果。

I like to move it move it~

其他連結