自己編譯vim
compile vim into user folder
前言
在NCTU+也待一段時間了,開發主機上的vim不知道為什麼總是在讀取自己的vimrc時會有錯誤訊息,無法使用,還有我用的插件(Neocomplete)需要vim有lua
support,而系統上的沒有,我必須找個辦法讓vim支援lua。
編譯vim其實不是什麼困難的事情,但對於沒有太多linux系統概念的新手了來說,觀念上還是存在一些落差需要彌補。所以這篇文章的目標是寫到讓當初的自己看得懂。並能讓讀者能夠知道自己在做什麼。還有如果需要更多編譯參數的話也知道該怎麼設定。
為什麼要自行編譯vim
這個小標題應該可以改成:「為什麼要自行編譯xxx?」,而xxx泛指所有類Unix上的套件服務。我大概想了幾個可能的情況:
- 系統的vim不支援想要的功能,但又沒有root權限,只能讀寫自己的家目錄QQ
- 系統套件管理程式支援的選項太少,例: Ubuntu 上的
apt-get
無法指定套件安裝的目錄,以及更細節的編譯內容(讓vim 有 lua support)。 (OSX,Arch linux的使用者應該就沒有這個問題) - 想在不要覆蓋系統版本vim的情況下用到新版的Vim。
我的需求大概就是三種情況下的總和。說完之後就快開始吧<3
0. 環境說明
- 系統 Ubuntu 12.04.5 LTS
- 我的家目錄:
/home/ianre657
之後如果寫到 /home/ianre657
的話,要自行代換成你的家目錄。
1. 檢查 vim 資訊
在Ubuntu上安裝Vim插件NeoComplete的時候,作者寫到vim 需要支援lua。
所以就先使用vim --verison
指令檢查一下目前vim的詳細資料。
$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Jan 27 2018 22:07:32)
引入修正: 1-1432
編譯者:ianre657@PLUS
超強版本 使用 GTK2 圖型界面。
目前可使用(+)與不可使用(-)的模組列表:
+acl +farsi +mouse_sgr -tag_any_white
+arabic +file_in_path -mouse_sysmouse -tcl
+autocmd +find_in_path +mouse_urxvt +termguicolors
-autoservername +float +mouse_xterm +terminal
+balloon_eval +folding +multi_byte +terminfo
+balloon_eval_term -footer +multi_lang +termresponse
+browse +fork() -mzscheme +textobjects
++builtin_terms +gettext +netbeans_intg +timers
+byte_offset -hangul_input +num64 +title
+channel +iconv +packages +toolbar
+cindent +insert_expand +path_extra +user_commands
+clientserver +job -perl +vertsplit
+clipboard +jumplist +persistent_undo +virtualedit
+cmdline_compl +keymap +postscript +visual
+cmdline_hist +lambda +printer +visualextra
+cmdline_info +langmap +profile +viminfo
+comments +libcall +python +vreplace
+conceal +linebreak -python3 +wildignore
+cryptv +lispindent +quickfix +wildmenu
+cscope +listcmds +reltime +windows
+cursorbind +localmap +rightleft +writebackup
+cursorshape +lua +ruby +X11
+dialog_con_gui +menu +scrollbind -xfontset
+diff +mksession +signs +xim
+digraphs +modify_fname +smartindent +xpm
+dnd +mouse +startuptime +xsmp_interact
-ebcdic +mouseshape +statusline +xterm_clipboard
+emacs_tags +mouse_dec -sun_workshop -xterm_save
+eval -mouse_gpm +syntax
+ex_extra -mouse_jsbterm +tag_binary
+extra_search +mouse_netterm +tag_old_static
在選項中的 +lua 代表著目前的vim是支援lua語言的。 雖然說我的已經支援了,但為了這篇文章還是重新編譯一次。
2. 下載Vim專案原始碼
Vim是開源軟體,所有的程式碼都放在網路上供人觀看。照理來說只要拿到原始程式碼之後就一定能產生出一個完全客製化的Vim程式。
而git 是一個版本管理程式,附帶的clone
參數會從後面的網址中載入網路上對應的另一個專案。
$ git clone https://github.com/vim/vim.git
$ cd vim
3. 設定 Makefile 編譯參數
gnu make
是一個在Linux存在很久,十分穩定的專案,最常見的用途是自動化編譯。
在一個大型專案中,程式為了方便管理一定會將原始碼依照功能拆分成不同檔案來編寫。make
程式會透過 Makefile
檔案中的設定來決定目標檔案的相關性以及編譯的順序。
在 vim資料夾中還有另外一個很重要的程式: configure
,他的目的是用來輔助設定。我們透過configure
程式來修改Makefile
的編譯參數,讓編譯完的程式有更多的功能。
$ ./configure --with-features=huge \
--enable-multibyte \
--enable-luainterp=yes \
--enable-fail-if-missing \
--prefix=/home/ianre657
記得修改--prefix=/home/ianre657
成你想要安裝的目錄名稱。
上面的這些參數其實都在/vim/src/Makefile的註解中有說明。(連 configure
程式的作用都有寫到),所以如果需要更多參數的話可以往Makefile裡面尋找。
--enable-fail-if-missing
參數最好加上去,這樣一來如果中途設定有出錯時程式會自動停下來,比較好debug。
3.5 安裝lua (沒有才需要裝)
要讓vim支援lua之前,電腦上至少也要有lua語言。
要確認一下的話可以使用lua -v
來查看版本資訊
$ lua -v
Lua 5.2.4 Copyright (C) 1994-2015 Lua.org, PUC-Rio
如果有跳出以上的資訊就可以直接跳第四步了。
如果系統沒有的話就又要自己在家目錄在裝一個可執行的lua了QQ。 (因為我沒有root權限無法更新)
curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gz
tar zxf lua-5.3.4.tar.gz
cd lua-5.3.4
這時後要注意,如果直接使用 make
編譯的話預設會裝在系統資料夾,所以要修改一下Makefile,把INSTALL_TOP修改成自己的家目錄。
INSTALL_TOP= /home/ianre657
(lua的專案資料夾跟vim不同,沒有configure這個輔助設定的程式,要自己去Makefile下面更改參數) 用完之後下一下make linux test 就可以了 (linux 會依據不同系統有不同的參數,要自己查一下)
試看看是否裝成功。
$ lua -v
Lua 5.2.4 Copyright (C) 1994-2015 Lua.org, PUC-Rio
在lua成功安裝之後,到vim的目錄下重新跑一下 configure
程式,不過這次要修改一下 lua的目錄:
新增參數:--with-lua-prefix=/home/ianre657
,其他的參數都跟之前一樣。
./configure --with-features=huge \
--enable-multibyte \
--enable-luainterp=yes \
--enable-fail-if-missing \
--with-lua-prefix=/home/ianre657 \
--prefix=/home/ianre657
4. 編譯
到vim的資料夾下,先下make distclean
(清除之前的檔案)
再用make install clean
安裝程式並刪除暫存檔。
make distclean
make install clean
安裝完之後用以下指令看看是否成功了
cd ~
./bin/vim --version
5. 修改使用者$PATH
變數
PATH環境變數決定我們打下指令時系統尋找程式的路徑順序。使用 echo $PATH
來查看目前的PATH變數。變數中用:
來作為不同路徑的分隔。
以 /usr/local/sbin:/usr/local/bin
為例,在下vim
時,系統會先查看/usr/local/sbin
有沒有叫做vim的程式,如果沒有的話之後才會繼續/usr/local/bin
資料夾。
我們的目標是讓系統預設先查看我們自己家目錄下的 bin
資料夾之後,才會查看系統預設的資料夾,這樣就可以達到覆蓋系統vim 的效果了。
把以下這行到家目錄下的 ~/.bashrc
或是 ~/.bash_profile
。(看你的系統)
# .bash_profile
export PATH="${HOME}/bin:${PATH}"
~/.bash_profile
是每次登入是bash shell會預設載入的腳本檔案。這樣做的話就可以在每次使用時都使用自己編譯的程式了。
而這裡看到的${HOME} 變數在系統上會被翻譯為當前使用者的家目錄(home directory)拉
用以下的語言來測試一下是否真的成功了,成功的話就收工拉<3
source ~/.bash_profile
vim --version