vim 雜談 - 關於快速編輯

在vim中寫代碼, 並不是, 我們所見到的代碼都要一個個字元輸進去, 一定不是這樣的.

這篇, 讓我們來談談如何進行快速編輯.

當然, 一篇文章只能概述, 給大家一些參考, 具體每項都可以自行找相關資料. 很多外鏈, 莫跳丟了

注意, 其中會涉及到比較多的插件, 而 k-vim 用的是 vim-plug, 如果你用得是其他的插件管理工具, 自行轉換.

textobject

文本對象, 是進行快速編輯的基礎秘訣. 將一個單詞, 句子, 段落當成一個對象看待, 可以進行快速選中/替換/刪除等操作

有一篇文章解釋得很清楚 Vim Text Objects: The Definitive Guide

簡單說明

命令格式: 操作+範圍+對象n

對象

w - word單詞ns - sentence句子np - paragraph段落n " ) ] } > 等成對的nt - Tag標籤n

範圍

i - 在裡面na - 所有, 包括成對的引號等n

操作

d - 刪除nv - 選中nc - 替換n

例子, |代表游標位置

123(a|bc)456nndi) 刪除引號內的內容 => 123()456nda) 刪除引號內容, 包括引號 => 123456nvi) 選中引號內內容 abcn....n

textobject增強

vim自帶了很多文本對象, 但是還可以進一步增強, 例如, 以行l(line)/以文件e(entire file)/以縮進i(indent)

在 k-vim 中, 加了如下的幾個文本對象, 這樣, 在寫python代碼時, 你可以很方便的批量選中同一個縮進裡面的所有代碼塊, 即使代碼之間有空行.

" text objectn" 支持自定義文本對象nPlug kana/vim-textobj-usern" 增加行文本對象: l dal yal cilnPlug kana/vim-textobj-linen" 增加文件文本對象: e dae yae cienPlug kana/vim-textobj-entiren" 增加縮進文本對象: i dai yai cii - 相同縮進屬於同一塊nPlug kana/vim-textobj-indentn

還有很多插件, 提供了更加豐富的文本對象, 例如, 函數中的參數等. 可以根據需要自行加入

代碼補全

代碼補全, 是必需品, 也是提升效率的大殺器.

對比試用過非常多的補全插件之後, 最終選定了 YouCompleteMe. 快速提示/模糊匹配/跳轉到函數定義等等, 總之, 非常流暢, 體驗很好.

這個插件唯一缺點是: 太難裝. 沒錯, 就是太難裝, 對vim版本有要求, 然後在天朝這種網路環境下要拉接近300M的文件下來不是一件很容易的事情, 下完之後還得編譯>_<#

但是, 歷經千辛萬苦之後, 你會發現這是值得的, 有了 YCM, 寫代碼的速度和質量能提升非常非常非常非常多.

Plug Valloric/YouCompleteMen

相關配置: k-vim vimrc.bundles#L368

幾個常用快捷鍵,jd/,gd跳轉到定義處, ctrl+空格主動觸發補全(默認輸入2個字元以上自動補, 可以什麼都沒輸入觸發補全), ctrl+j/k或者ctrl+p/n進行補全上下選中

如果是golang, 使用 vim-go

代碼片段

代碼片段, 是代碼補全的互補. 當你預先定義一些常用的片段, 就能輸入關鍵字後, 觸發補全整個代碼片段

這裡推薦的插件是 ultisnips(代碼片段補全工具) 配合 vim-snippets(常用代碼片段, 包含各類預研)

" Group dependencies, vim-snippets depends on ultisnipsn" 代碼片段快速插入 (snippets中,是代碼片段資源,需要學習)n" Snippets are separated from the engine. Add this if you want them:nPlug SirVer/ultisnips | Plug honza/vim-snippetsn

相關配置: k-vim vimrc.bundles#L410

注意, ultisnips快捷鍵和YCM衝突, 所以配置兩個插件時需注意

舉個栗子: 輸入class 然後 Tab 觸發補全, 就能進行類似完形填空的流程, 一路輸入, 然後Tab到下一個框, 幾下就能完成一段代碼

當然, 可以自己添加補充代碼片段.

let g:UltiSnipsSnippetsDir = ~/.vim/UltiSnipsn

以python為例, 除了vim-snippets中帶的那些補全關鍵字, 我還配置了很多單字元直接補全python關鍵字(github python.snippets)

t -> Truenf -> Falsenn -> Nonenr -> returnnp -> printn....n

引號括弧等及 html 標籤不全

另一個必須品, 當我們輸入引號( ""), 括弧(() [] {}) 以及 html的標籤<a>, 這類都是成對出現的,

當我們輸入一半, 自動補全另一半字元. 這裡用到的插件是 delimitMate 和 closetag.vim

" 自動補全單引號,雙引號等nPlug Raimondi/delimitMaten" 自動補全html/xml標籤nPlug docunext/closetag.vim, { for: [html, xml] }n

然後, 針對Python做了個優化, 可以快速補全docstring

"""n"""n

相關配置: k-vim vimrc.bundles#L442

之前一篇博客: VIM插件: DELIMITMATE(符號自動補全)

多游標編輯

在編輯一段代碼時, 例如, 想修改函數體內某個變數名, 除了用替換(查找+替換相對複雜), 還可以用 vim-multiple-cursors, 之前寫的一篇博客 VIM插件: MULTIPLE-CURSORS(多游標操作)

" 多游標選中編輯n" multiplecursorsnPlug terryma/vim-multiple-cursorsn

相關配置: k-vim vimrc.bundles#L518

配合 ctrlsf 插件, 搜索後多游標直接編輯保存, 簡直是重構神器, 後面細說

快速注釋

很多時候要注釋多行的代碼, 或者解開注釋. 你需要 nerdcommenter

你只需要 選中(shift+v+j/k) 然後 ,cc. 如果僅注釋當前行的話, 可以省了選中這一步, 直接,cc

解開注釋 ,cu(注意, 這裡的,等於<leader>鍵)

" quick editn" 快速注釋nPlug scrooloose/nerdcommentern

演示博客: VIM插件: NERDCOMMENTER(快速注釋)

修改環繞字元

場景: 給單詞加引號, 給十個單詞加引號, 刪除某一對引號/括弧, 加<h1></h1>將字元串括起來

用到兩個插件 vim-surround(負責環繞字元編輯) 和 vim-repeat(負責重複)

" 快速加入修改環繞字元n" for repeat -> enhance surround.vim, . to repeat commandnPlug tpope/vim-repeat | Plug tpope/vim-surroundn

吐槽下, vim-surround快捷鍵特別感人…..

博客說明: VIM插件: SURROUND & REPEAT(成對符號編輯)

對齊

偶爾的需求, 需要根據=或,或者空格, 將多行數據對齊, 之前的一篇博客說明 VIM插件: EASY-ALIGN(快速對齊)

" easyalignn" 快速賦值語句對齊nPlug junegunn/vim-easy-alignn

相關配置: k-vim vimrc.bundles#L466

去行尾空格

輕微強迫症, 忍不了每行代碼行尾沒用的空格

" trailingwhitespacen" 快速去行尾空格 [, + <Space>]nPlug bronson/vim-trailing-whitespacen

配了 ,+空格, 一鍵去除當前文件所有的行尾空格

" trailingwhitespace {{{n map <leader><space> :FixWhitespace<cr>n" }}}n

後面文章會提及vim中那些被動技能, 會提到如何配置保存時自動去除行尾空格

縮進

寫代碼時, 有時候要進行縮進, 選中後, 例如shift-v加jk上下選中多行, <或者>可以進行整體縮進, 但是遇到個問題, 有時候需要多次縮進, 而默認, 縮進一次後, 選中消失, 要操作, 得再次選中…..(>_<#)

增加如下配置, 縮進完自動選中, 可以再次縮進

" 調整縮進後自動選中,方便再次操作nvnoremap < <gvnvnoremap > >gvn

快速替換/刪除最近插入的內容

當我們插入一段內容, 然後切換到普通模式後, 相對插入的內容進行快速選中, 然後刪除或者替換, 可以

" 選中並高亮最後一次插入的內容nnnoremap gv `[v`]n

python開發

兩個插件推薦

" 改變編輯時縮進行為, 更友好的縮進nPlug hynek/vim-python-pep8-indentnn" import 排序, 強迫症福音nPlug fisadev/vim-isortn

預告: 下一篇, 將快速導航, 如何在項目維度導航跳轉


推薦閱讀:

vim中經常會寫print "a=%s"%a,這樣的代碼,可是每次都得現輸,怎麼快速輸入?直接替掉a
vim 末尾會自動添加

bin文件怎麼打開?
如何配置vimrc支持普通編輯器的操作?
用vim被人說裝逼,怎麼辦?

TAG:Vim | Vim插件 | vim代码补全 |