wjohn1483.github.io
  • Posts
  • Archive
  • Audio to Scene
  • Give Feedback
  • About

Vim Plugins

 
  • Tool
  • Mar 09, 2020

這邊記錄一下我目前所使用的Vim plugin以及它們的功能。

市面上有很多Integrated Development Environment (IDE)來幫助你開發,像是Xcode、Visual Studio、Intellij、Pycharm、Sublime等等,然而在終端機上的文字編輯器,應該大多都是用vim來開發,而vim本身也有很多神人開發的套件,讓你可以在vim裡面做到像上面IDE一樣的操作,底下介紹一下我目前所使用的一些套件。

目前我所使用的設定檔,原先是來自於timss/vimconf,看star數也蠻多人推薦amix/vimrc,你也可以去網路上找你心目中所屬的設定檔。

vim-plug

vim-plug是一個vim套件的管理工具,使你可以直接打上vim plugin repo的名字就能安裝至你的vim上,像是

Plug 'ervandew/supertab'

在宣告好想要安裝的套件以後,打開vim,再打上:PlugInstall就會將宣告的套件安裝在[user name]/.vim/bundle裡面。如果想要移除某個套件,只需要在設定檔將套件的宣告移除,並在vim裡面打上:PlugClean,相當的方便。

Plugins

接下來介紹一下我覺得好像不錯用的套件們,大多的套件只需要像底下這樣宣告,並且:PlugInstall就能安裝完成了。

Plug '[plugin name]'

ervandew/supertab

一個可以讓你用tab自動完成各種東西的套件,可以用tab完成function、variable等等。

ycm-core/YouCompleteMe

也是一個自動完成各種東西的套件,只是安裝起來沒有像supertab那樣簡單,不僅需要宣告在設定檔裡,還需要安裝其他程式語言,像是go、nodejs等,詳細的安裝流程可以參考官方的GitHub。

我會在設定檔裡面多加底下的設定,使你可以按下enter就可以選擇自動完成的東西(預設好像是按Ctrl + y),另一個設定是讓你能用<Leader>g跳到function定義的部分。

if exists('g:plugs["YouCompleteMe"]')
    let g:ycm_autoclose_preview_window_after_completion=1
    let g:ycm_key_list_stop_completion = ['<C-y>', '<CR>']
    nnoremap <Leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR>
endif

itchyny/lightline.vim

讓vim可以有status bar,讓你知道現在是處理什麼樣的檔案、在Normal mode、Visual mode還是Insert mode等。

bling/vim-bufferline

在status bar裡面顯示目前開啟的所有檔案。

mbbill/undotree

undotree會紀錄你對這個檔案的操作,使你可以隨時退回先前的版本,有點像簡易版的git。

nanotech/jellybeans.vim

vim的color schema。

tomtom/tcomment_vim

幫助你快速將程式碼comment起來的套件,在Visual mode選定好區塊以後,打上gc便能將選取的區塊都comment起來,更多的使用方法可以參考上方連結裡面的文件。

somini/vim-autoclose

自動幫你將括號或是其他該成雙成對的東西補齊的套件。

tpope/vim-eunuch

讓你能在vim裡面直接使用Unix指令的套件,像是:SudoEdit、:Rename等等,詳細的指令可以參考上方連結。

tpope/vim-fugitive

讓你能在vim裡面直接操作git指令的套件。

tpope/vim-surround

使你可以快速改變括號的套件,像是將

"Hello world!"

迅速改成

'Hello world!'

更多的指令請參考上面連結。

junegunn/vim-easy-align

能迅速將程式碼對齊的套件,使用方式為,在Visual mode選好想對齊的區塊,打上ga[分隔符號]啟動,還可以設定選擇要靠左、靠右對齊,詳細的使用方式可以參考上面的網址。

honza/vim-snippets / sirver/ultisnips

能快速補齊程式碼的套件,像是打上def test[tab]就會自動幫你將function的架構打出來。

mhinz/vim-startify

一個好看的vim開始畫面。

mhinz/vim-signify

顯示檔案裡面有哪些部分與git上的有所差異。

vim-syntastic/syntastic

幫你做語法檢查的套件,我自己會加上底下這行,令<Leader>c當作快捷鍵。

noremap <silent><Leader>c  :SyntasticCheck<CR>

dense-analysis/ale

也是做語法檢查的套件,與syntastic不同的是,ale是asynchronous的執行,所以在開啟、寫入檔案的時候不會卡住。

在安裝好ale在vim上面以後,仍會需要安裝各個語言的linter,ale才能把linter的訊息顯示在vim上,一般的gcc、python通常都已經先安裝在作業系統裡了,底下列一些常用語言的linter安裝指令。

# Markdown
gem install mdl
# SQL
npm i -g sql-lint

另外,我自己會加上底下的設定,以在各個error當中跳轉。

nnoremap <Leader>d :ALEDetail<CR>
nnoremap <Leader>cn :ALENext<CR>
nnoremap <Leader>cp :ALEPrevious<CR>

如果發現到ALE可能沒有在執行的話,可以試著在用vim開啟程式碼以後,在vim裡面打:ALEInfo來看目前ALE能抓到的linter和實際使用的linter,也能在.vimrc裡面設定ALE根據不同的語言用哪種特定的linter,底下是一個簡單的範例。

let g:ale_linters = {
\   'python': ['pylint', 'mypy'],
\   'java': ['javac'],
\   'sql': ['sql-lint'],
\}

milkypostman/vim-togglelist

裝這個套件主要是為了配合ale而安裝的,上面的ale會在每一行標註該行的warning和error,雖說ale可以做到把所有error都統一在一個列表裡顯示出來,但它沒有做可以toggle的指令,而這個套件就是設定快捷鍵來做這件事情。

預設<Leader>l會toggle location list,把所有error列出來,在行數按下enter就會跳轉到那邊,<Leader>q會打開quickfix window。

majutsushi/tagbar

當你有使用ctags或cscope先對目錄底下的程式碼先做索引的話,可以使用tagbar在vim裡面顯示所有的tag。

mileszs/ack.vim

在vim裡面使用grep或是ag(The Silver Searcher)來搜尋特定字詞的套件,我自己會放以下的設定來建立快捷鍵,打上ack[space]會自動替換成Ack!,在Normal mode中打上<Leader>a會去搜尋游標當下所在的字詞。

if executable('ag')
    let g:ackprg = 'ag --vimgrep'
endif
cnoreabbrev ack Ack!
nnoremap <Leader>a :Ack!<CR>

scrooloose/nerdtree

樹狀的檔案瀏覽器。

ctrlpvim/ctrlp.vim

使你可以在vim裡面打上Ctrl + p便能搜尋目錄底下的檔案名稱。

junegunn/fzf / junegunn/fzf.vim

功能與上面的ctrlpvim/ctrlp.vim幾乎雷同,只是底層是用fzf來做搜尋,我個人比較偏好這個套件,需要使用底下的設定來複寫Ctrl + p的預設快捷鍵。

if exists('g:plugs["fzf.vim"]')
    nmap <c-p> :FZF<CR>
endif

terryma/vim-expand-region

讓你可以透過+和_來簡單的擴大或縮小選取的範圍,可以看連結內的demo。

godlygeek/tabular

讓你可以方便的對齊你的程式碼,可以看這邊的demo,我自己會加上底下的設定來建立快捷鍵。

if exists('g:plugs["tabular"]')
    cnoreabbrev tab Tab
endif

其功能跟上面的junegunn/vim-easy-align蠻相近的。

mg979/vim-visual-multi

讓vim擁有像Sublime那樣的多個游標的功能,在plugin的GitHub說明裡,安裝時有多加branch。

Plug 'mg979/vim-visual-multi', {'branch': 'master'}

roxma/vim-paste-easy

在電腦上複製程式碼,想直接貼到vim裡面的時候有可能會有格式跑掉的問題,這個套件可以幫你自動在貼上前set paste。

更多資訊可以參考上面附的GitHub連結或是這裡。

lervag/vimtex

在vim裡面實時編譯latex檔案,建議搭配PDF閱讀器Zathura一起使用,在mac上面安裝Zathura可以透過brew。

brew tap zegervdv/zathura
brew install xdotool
brew install girara --HEAD
brew install zathura --HEAD
brew install zathura-pdf-poppler
mkdir -p $(brew --prefix zathura)/lib/zathura
ln -s $(brew --prefix zathura-pdf-poppler)/libpdf-poppler.dylib $(brew --prefix zathura)/lib/zathura/libpdf-poppler.dylib
mkdir -p ~/.config/zathura
echo "set selection-clipboard clipboard" >> ~/.config/zathura/zathurarc

安裝好Zathura以後,記得要在.vimrc裡面設定用Zathura打開PDF檔。

" VimTex
if exists('g:plugs["vimtex"]')
    let g:vimtex_view_method = 'zathura'
    let g:vimtex_view_general_viewer = 'zathura'
    let g:vimtex_quickfix_open_on_warning = 0
    let g:vimtex_view_general_options = '--synctex-forward @line:@col:@tex'
endif

安裝完成了以後,用vim打開.tex的檔案,按快捷鍵\ll就會啟動實時編譯了,按\lt會顯示table of content,讓你可以快速地在文件中移動。

這篇文章裡頭有講述作者如何使用各種技巧來讓用Latex做筆記變得相當容易,有興趣可以看看。

sheerun/vim-polyglot

整合了多個語言的語言包,可以一次安裝完成,不用對每個語言個別去下載對應的語言包。

Tips

紀錄一下常用到的快捷鍵。

查看現在所開啟檔案的相對/絕對路徑

想要查看檔案的相對路徑時,可以按下<Ctrl-G>。

若是想要看絕對路徑的話,可以按下1 <Ctrl-G>。

快速執行現在開啟的檔案

在Intellij裡面有快捷鍵可以執行現在打開的檔案,而vim也可以透過自行設定快捷鍵來對現在開啟的檔案做一些操作,我們可以在.vimrc裡面設定nnoremap搭配檔名當作變數。

nnoremap <Leader>c :!cat %\|pbcopy<CR>

在上面的例子當中,我將<Leader>c對應到cat %|pbcopy的指令,是我可以用快捷鍵將現在的檔案複製進剪貼簿裡面,其中%指的是現在開啟的檔案路徑。

將對文件的操作錄製起來並回放

在vim裡面有個功能是可以錄製使用者對文件的操作,並在錄製好以後進行多次回放,像是如果對某一行程式碼進行了複雜的修改,而這些修改需要套用至多行的話,可以嘗試看看這個做法。

在Normal mode的狀態下打qa,vim應該會出現類似下面的訊息

recording @a

指的是現在正在錄製,結果會放在a這個macro裡面。

如果要停止錄製的話,回到Normal mode按q就行,可以打:echo @a來看看剛剛錄製的東西長怎樣,要回放的話打@a就會開始執行剛剛錄製的動作,在前面加上數字可以控制回放幾次,99@a會回放99次。

快速轉大小寫

只要將想要轉大小寫的文字在Visual mode框起來,按下~就可以了。

PREVIOUSGradient Descent和Learning Rate
NEXTAttention Is All You Need
Search