C:\Program Files (x86)\Vim\vimfiles官網給的範例是用 .vim 路徑,下載時要注意一下路徑的不同。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik2L9CBR_q7InxSZrAEs04lufKg4FyaF3WjxnU2-_T028Ph1PH30SINw_bF_dWkeo0AJoi3KzliXaRoC7MLPgzjnuz_YyYsmhcbr7PG8-FGJNLlmbvd3uegPzTIKdHBeafLtNzZ96rEfVY/s1600/Image+3.png) ## 第三步:下載 YouCompleteMe Vundle.vim 裝好後就是照著[官網範例](https://github.com/VundleVim/Vundle.Vim#quick-start)將你想裝的 Plugin,包含 YouCompleteMe 寫到 _vimrc 設定檔中,然後執行 `:PluginInstall`,接著就等 Vundle 將 YouCompleteMe 原始碼抓下來了。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinAvtAUHOBFwAYhvkLfdDlxv9HWboT_Ex7lBZJn7UDIuPsb9RKPgiqP0WaBSrsw0QwAK3hAWCRugHNoevAOq6vZNj2qKOrhttjGJoD0FqvAozFADFWK_pgXd2oqqfHdFzabJMEUvIcG5Nz/s1600/Image+6.png) 安裝過程中我出現了無法存取 temp 資料夾下檔案的問題,結果是因為權限不足,用管理者權限開啟 gvim 後執行 `:PluginInstall` 就可以了。 ## 第四步:編譯 YouCompleteMe 原始碼 因為在第一步已經將 YouCompleteMe 編譯所需套件安裝好,所以 Vundle 將 YouCompleteMe 原始碼抓下來後,在 YouCompleteMe 目錄下執行 `install.py --all`,就會開始編譯 YouCompleteMe 了,--all 選項是將 YouCompleteMe 對各種語言的自動完成都打開,例如 C/C++ 或 java 等等。 當然,不一定你套件裝完然後 `install.py --all` 跑下去就可以直接開始編譯沒問題了,例如我裝的最新版 cmake 要搭配 Visual Studio 2019 的 build tool,不能用 YouCompleteMe 官網上寫的 Visual Studio 2017,不過如果有問題,通常都會顯示錯誤訊息,這時就只能照著錯誤訊息的提示一步一步解決,搭建好你的編譯環境。 等到 YouCompleteMe 編譯完成,沒意外的話,就可以開始使用,享受它強大的自動補完功能了。
## 一些常見問題 ### Unable to detect a .tern-project file vim 開起來時可能會發現顯示 Unable to detect a .tern-project file 的 warning,只要照[官網](https://github.com/ycm-core/YouCompleteMe#javascript-and-typescript-semantic-completion)的指示,將 `third_party/ycmd/third_party/tern_runtime/node_module` folder 刪除即可 ### 安裝 NERDTree 後發現 vim 結束時 YCM daemon 沒有跟著結束 YCM daemon 基本上就是一個 python process,沒有正常跟著 vim 結束的話,系統中會看到很多孤立的 python.exe 占用系統資源,經過 debug 發現 YCM 註冊一個 handler 到 vim 的 VimLeave 中,當 VimLeave trigger 時執行該 event 然後結束 YCM。但是安裝 NERDTree 後會發現 VimLeave 沒有被呼叫了。 確切來說是 NERDTree README 的一個 autocmd 造成 VimLeave 失效,這個 autocmd 會讓 NERDTree 是最後一個 vim 視窗時結束 vim,我想應該每個裝 NERDTree 的人都會用才對。
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif在 github 有人提出 [issue](https://github.com/preservim/nerdtree/issues/1108),只要在加個 nested 就可以解了。
autocmd bufenter * nested \ if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif