帶上你的Vim,走!

首發自簡書git

每一個Vimer都有本身的一個配置,猶如每一個劍客都有本身的一把劍(應該是吧)。(爭取)做爲一個傳說中的全棧開發者,換機器就像換衣服同樣頻繁;在「異國他鄉」的機器上,是否懷念那一套屬於你的指法呢?下面會講一下我在 Windows 上打包Vim的一些經驗。帶上你的Vim,走!github

下面講到的配置主要出自我自用的Vim配置VimConf,感興趣的能夠參考!vim

圖文無(大)關

一鍵裝機之Vimrc

Vim的幾乎全部配置均可以保存在一個vimrc文件中,所以把vimrc同步起來,直接拷貝到相應位置並指定,則能夠恢復相應的Vim配置。因此不少Vimer的作法是創建一個Github倉庫保存vimrc,在新的機器上只要Clone該倉庫就能夠將配置同步到該機器上。服務器

獲得配置文件後,還須要將該文件拷貝到對應的位置並應用,且可能還須要其餘一些輔助文件。所以,爲了一勞永逸,通常都會添加一個初始化腳本進行「一鍵安裝」。而Linux和Windows上配置文件的位置還不太同樣,所以,每每就須要各自一個腳本了。markdown

下面講講在Clone了配置文件後,Windows下的腳本文件應該幹些啥。curl

首先你得有GVim

where gvim > NUL 2> NUL
if %ERRORLEVEL% NEQ 0 (
    echo GVim is needed >&2
    set /A ret=1
    goto :end
)
for /f "tokens=*" %%i in ('where gvim 2^> NUL') do set vim_folder=%%i
if /I "%vim_folder:~-3%" EQU "bat" (
    findstr /b /c:"set VIM_EXE_DIR=" "!vim_folder!" > tmp\vim_folder.txt 2> NUL
    set /p vim_folder=<tmp\vim_folder.txt
    set vim_folder=!vim_folder:~16!
) else (
    call :get_parent_dir "%vim_folder%" vim_folder
)
if not exist "%vim_folder%\gvim.exe" (
    echo Failed to locate GVim
    set /A ret=1
    goto :end
)
echo Found GVim in %vim_folder%

經過where gvim得到當前GVim可執行文件的路徑。有多是一個啓動腳本GVim.bat,所以須要進一步分析該腳本,獲取GVim的真實路徑。工具

沒有GVim就沒有一切了,因此必須安裝好GVim。this

其次你得有Git

where git > NUL 2> NUL

一樣,沒有Git也就沒有一切了,因此必須安裝好Git。url

更新子模塊

個人vimrc中包含了一個配色子模塊 Detorte,所以這裏須要初始化該模塊。spa

git submodule update --init > NUL 2> NUL

執行後,配置根目錄下的detorte目錄會包含配色方案的相關文件,下面須要將這些文件拷貝到指定位置。

拷貝配色方案

由於我使用的是本身的配色方案,因此這裏須要將其拷貝到指定的位置,以便Vim能檢測到該方案。

set detorte_folder=%vimfiles_folder%\colors
xcopy /Y /i detorte\colors %detorte_folder% /s /e > NUL 2> NUL

安裝Vundle

我使用的是Vundle進行Vim插件管理,因此爲了以後能安裝Vim插件,這裏須要把Vundle下載並安裝好。咱們直接從Vundle的Github上Clone到指定目錄%vimfiles_folder%\bundle\Vundle.vim,這樣,後面能夠直接在Vim中使用Vundle了。

set vundle_repo=https://github.com/VundleVim/Vundle.vim.git
set vundle_folder=%vimfiles_folder%\bundle\Vundle.vim
if not exist %vundle_folder% (
    git clone %vundle_repo% %vundle_folder% > NUL 2> NUL
    if %ERRORLEVEL% NEQ 0 (
        echo Failed to clone Vundle.vim >&2
        set /A ret=1
        goto :end
    )
)

安裝小工具

咱們還須要一些小工具來輔助Vim這個大殺器。一個方便的作法是專門使用一個Github倉庫來保存這些小工具。

Curl

Vundle須要使用curl.exe來進行插件的搜索,因此咱們須要下載curl.exe。咱們會將這些須要的小工具提早下載並上傳到一個Github倉庫中,這裏call :clone_win_utils會將該倉庫下載到一個臨時目錄中。另外,須要將可執行文件拷貝到Vim的安裝目錄中,Vim才能檢測獲得。

if not exist "%vim_folder%\curl.exe" (
    call :clone_win_utils
    if !ERRORLEVEL! NEQ 0 (
        set /A ret=1
        goto :end
    )
    copy /Y %win_utils_folder%\curl.exe "%vim_folder%\" > NUL 2> NUL
    if !ERRORLEVEL! NEQ 0 (
        echo Failed to copy curl.exe, make sure you run this script as Administrator
        set /A ret=1
        goto :end
    )
)

Ag

ag.exe是一個比grep更好用的文件查找工具,在Windows下開發更是讓人慾罷不能。另外,Vim的不少插件也會能夠經過使用Ag來進行加速。和Curl相似,咱們也是經過提早準備好的倉庫下載該工具,而後拷貝到Vim的目錄。

if not exist "%vim_folder%\ag.exe" (
    call :clone_win_utils
    if !ERRORLEVEL! NEQ 0 (
        set /A ret=1
        goto :end
    )
    copy /Y %win_utils_folder%\ag.exe "%vim_folder%\" > NUL 2> NUL
    if !ERRORLEVEL! NEQ 0 (
        echo Failed to copy ag.exe, make sure you run this script as Administrator
        set /A ret=1
        goto :end
    )
)

Ctags

Ctags就不用多說了,用Vim的都懂!相似的處理方法。

if not exist "%vim_folder%\ctags.exe" (
    call :clone_win_utils
    if !ERRORLEVEL! NEQ 0 (
        set /A ret=1
        goto :end
    )
    copy /Y %win_utils_folder%\ctags.exe "%vim_folder%\" > NUL 2> NUL
    if !ERRORLEVEL! NEQ 0 (
        echo Failed to copy ctags.exe, make sure you run this script as Administrator
        set /A ret=1
        goto :end
    )
)

GNU Global

結合Ctags使用,可以反向查詢引用。相似的處理方法。

if not exist "%vim_folder%\gtags.exe" (
    call :clone_win_utils
    if !ERRORLEVEL! NEQ 0 (
        set /A ret=1
        goto :end
    )
    copy /Y %win_utils_folder%\global\ "%vim_folder%\" > NUL 2> NUL
    if !ERRORLEVEL! NEQ 0 (
        echo Failed to copy GNU Global, make sure you run this script as Administrator
        set /A ret=1
        goto :end
    )
)

markdown2ctags.py

這個Python腳本是爲了使Tagbar插件支持Markdown語法,從而顯示大綱的,在vimrc中會使用到。

copy /Y markdown2ctags.py %vimfiles_folder%\ > NUL 2> NUL

拷貝vimrc

這個不用解釋了吧?

set vimrc_file=%USERPROFILE%\_vimrc
copy /Y .vimrc %vimrc_file% > NUL 2> NUL

至此,啓動GVim,:VundleInstall安裝配置好的插件,就能夠好好享受那熟悉的手指健美操了。

一鍵部署

對於遠程桌面的服務器或者不能聯網的機器,上面提到的一鍵安裝就顯得不是很適用了。其實,咱們能夠在已經安裝好的機器上,生成一個「綠色」的GVim,帶上全部的配置和Vim插件,而後拷貝到別的機器上直接運行便可。win_init.cmd portable會在根目錄下生成一個包含GVim的壓縮包。下面,咱們詳細說一下其中的魔法。

mkdir %vim_portable_folder% 2> NUL

copy /Y .vimrc %vim_portable_folder%\_vimrc > NUL
set /A portable_ret=!portable_ret!+!ERRORLEVEL!

call :get_file_name "%vim_folder%" vim_exe_folder
xcopy /Y /i "%vim_folder%" "%vim_portable_folder%\!vim_exe_folder!" /s /e > NUL
set /A portable_ret=!portable_ret!+!ERRORLEVEL!

call :get_parent_dir "%vim_folder%" vim_install_folder
xcopy /Y /i "!vim_install_folder!\vimfiles" "%vim_portable_folder%\vimfiles" /s /e > NUL
set /A portable_ret=!portable_ret!+!ERRORLEVEL!

xcopy /Y /i "%vimfiles_folder%" "%vim_portable_folder%\vimfiles" /s /e > NUL
set /A portable_ret=!portable_ret!+!ERRORLEVEL!
  1. 新建一個目錄以存放綠色版的GVim;

  2. 拷貝vimrc;

  3. 拷貝GVim可執行文件所在的目錄(即主程序);

  4. 拷貝GVim的安裝目錄;

  5. 拷貝vimfiles目錄,主要是把Vundle安裝好的插件和咱們的Detorte配色拷貝上;

好了,如今將這個目錄打包好後拷貝到別的機器上就能有一份如出一轍的Vim配置了。

完美主義者

爲什麼不添加一個啓動快捷方式來啓動GVim呢?

下面的腳本會生成一個init.cmd腳本。在目的機器上運行該腳本一次,就會往系統盤添加一個啓動腳本。

(echo @echo off
     echo setlocal EnableExtensions
     echo set dest_gvim=C:\Windows\gvim.bat
     echo if exist "%%dest_gvim%%" EXIT /B 0
     echo set cur_dir=%%~dp0
     echo if /I "%%cur_dir:~-1%%" EQU "\" set cur_dir=%%cur_dir:~0,-1%%
     echo set exe_dir=%%cur_dir%%\!vim_exe_folder!
     echo echo @echo off ^> %%dest_gvim%%
     echo echo start "" "%%exe_dir%%\gvim.exe" %%%%* ^>^> %%dest_gvim%%
     echo pause
    ) >> "%init_cmd%"

結語

今後,Vimer和Vim幸福地生活在一塊兒!

可是,有一天,Vimer又不開心了,據說是要寫Markdown筆記?好吧,出門左轉:Vim與Markdown,實現鍵不離手!

相關文章
相關標籤/搜索