標籤:

Vim 折騰記

原文地址:http://www.ahonn.me/2017/02/1...

昨天在微信讀書上面看到了池建強的《MacTalk 人生元編程》,然後花了差不多一天看完,其中有篇有關於 Vim 的文章提起了我對這個編輯器的再一次興趣(對的,我對它感興趣很多次了,每次都懶..)。

一直懶得去慢慢配置它,又不想用別人的配置。自己用的編輯器還是想自己折騰,然後今天就趁著我對這個還有點熱度趕緊折騰起來。

MacVim

其實在命令行裡面直接寫代碼還有有些不習慣的,所以選了 MacVim 這個 GUI 版本。這樣又可以與其他編輯器一樣單獨打開,想小改代碼的時候又可以直接打開命令行搞。

在 MacTalk 的文章裡面有提到 Vim 中文版本的幫助文檔,遂下載之。果然還是中文的比較淺顯易懂。

以前看別人的 .vimrc 配置,裡面有些編輯器的基本配置,也不知道是哪裡查的。原來這些配置可以在編輯器中輸入 :help options 進行查看。

縮進

關於縮進的配置,主要設置了 autoindent, smartindent 和 expandtab 這三個選項。

  • autoindent 選項根據上一行決定新行的縮進

  • smartindent 選項智能自動縮進

  • expandtab 選項將 tab 轉換為空格

set autoindentnset smartindentnset expandtabn

行號

顯示行號是硬需求,但是與其他編輯器不同,在 vim 上還有相對行號。

set numbernset relativenumbern

插件

顯而易見,手動安裝 vim 插件是很麻煩很麻煩的。與 sublime text 之類的類似,vim 同樣有類似的插件管理器 Vundle。

創建文件夾 ~/.vim 和配置文件 ~/.vimrc,並安裝 Vundle:

$ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundlen

為了方便管理再新建一個 .vimrc.bundles 來單獨存放插件列表:

set nocompatible " be iMproved, requirednfiletype off " requriednset rtp+=~/.vim/bundle/vundle/nncall vundle#begin()nn" Let Vundle manage VundlenBundle gmarik/vundlenn" .... 其他插件nncall vundle#end()n" requirednfiletype plugin indent onn

以後添加插件的時候只需要在這個文件裡面添加一行:

Bundle xxxn

安裝插件輸入 :BundleInstall 命令即可,卸載插件時刪除對應的配置並運行 :BundleClean 刪除插件。

括弧補全

第一次用的時候,輸入 ( 居然沒有自己蹦出來另外一個 )。這不科學,講道理這個是一定要的。

發現很多人用的是 delimitMate ,添加 Bundle delimitMate 到 .vimrc.bundles,運行 BundleInstall。

安裝完直接就可以自動補全括弧了。

Emmet

很多瀏覽器都支持 Emmet 插件,vim 同樣也有。但這個 Emmet 是第三方的,叫 Emmet.vim。

安裝完之後主要是設置一下出發的快捷鍵,默認的快捷鍵是 Ctrl + y。

我把快捷鍵修改成 Ctrl + e 比較順手。

" Emmet.vimnlet g:user_emmet_expandabbr_key = <c-e>n

目錄樹

目錄樹就基本上也就是使用 NERDTree。

開啟目錄樹的快捷鍵修改為 Ctrl + b,然後當 vim 只剩目錄樹顯示的時候自動退出。

" NERDTree nmap <c-b> :NERDTreeToggle<CR>nautocmd vimenter * NERDTreenautocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") &&b:NERDTreeType == "primary") | q | endifn

補全

補全用的就是大名鼎鼎的 YouCompleteMe 了。

關於這個插件網上有很多插件,我就不啰嗦了。這裡主要是抄的百度 EFE 的配置:

" YouCompleteMen" http://efe.baidu.com/blog/vim-javascript-completion/#youcompletemenlet g:ycm_min_num_of_chars_for_completion = 3 nlet g:ycm_autoclose_preview_window_after_completion=1nlet g:ycm_complete_in_comments = 1nlet g:ycm_key_list_select_completion = [<c-n>, <Down>]nlet g:ycm_key_list_previous_completion = [<c-p>, <Up>]n" Use tabnfunction! TabFunction ()n let line = getline(.)n let substr = strpart(line, -1, col(.)+1)n let substr = matchstr(substr, "[^ t]*$")n if strlen(substr) == 0n return "<tab>"n endifn return pumvisible() ? "<c-n>" : "<c-x><c-o>"nendfunctionninoremap <tab> <c-r>=TabFunction()<cr>nnlet g:ycm_semantic_triggers = {n css: [ re!^s{2}, re!:s+],n html: [ </ ],n }n

總結

折騰了一下午,終於算是搞定了。其實過程還是蠻好玩的,有機會還想寫寫插件玩玩。拋棄 VS Code,開始 Vim 之旅。


推薦閱讀:

打造Python開發工具——vim+zsh+tmux
SpaceVim 模塊化狀態欄
從零開始配置跨平台多人合作LaTeX論文寫作環境
vim 中文輸入解決方案
Stack Overflow:幫助一百萬開發者退出 Vim

TAG:Vim |