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被人說裝逼,怎麼辦?