Vim
Vim是一個終端文本編輯器。作為vi的一個擴展版本,它具有以下附加功能:語法高亮,全面的幫助系統,本地腳本(Vim script),文本選擇的可視模式和文件比較(vimdiff(1))。以及有限功能的工具,如 rview(1) 和 rvim(1)。
安裝[編輯 | 編輯原始碼]
安裝下面兩個軟件包中的一個:
用法[編輯 | 編輯原始碼]
有關如何使用Vim的基本概述,請遵循vim教程運行vimtutor(控制台版本)或gvimtutor(圖形界面版本)。
Vim包含了一個廣泛的幫助系統,可以用:h subject
命令來訪問。subject可以是命令,配置選項,熱鍵綁定,插件等。使用:h
命令(不帶任何subject)來獲取幫助系統的相關信息以及在不同的主題之間切換。
配置[編輯 | 編輯原始碼]
Vim的用戶特定配置文件位於主目錄~/.vimrc
,當前用戶的Vim文件位於~/.vim/
;全局配置文件為/etc/vimrc
,全局Vim文件是位於/usr/share/vim/
的 defaults.vim
和 archlinux.vim
。
對於 gVim,用戶特定的配置文件為 ~/.gvimrc
,全局配置文件為 /etc/gvimrc
。
- 常用的功能,如語法高亮在
defaults.vim
中啟用,當沒有~/.vimrc
時加載。將let skip_defaults_vim=1
添加到/etc/vimrc
以完全禁用加載defaults.vim
。[1]。或者,若要啟用defaults.vim
,即便~/.vimrc
存在,請參見 vim 中的:h defaults
。 - gVim 同時加載 Vim 和 gVim 的配置文件,而 Vim 只加載 Vim 的配置文件。
剪貼板[編輯 | 編輯原始碼]
Vim命令如 :yank
或 :put
通常使用未命名寄存器,默認情況下對應於 ""
寄存器。如果 +clipboard
功能可用且它的值包含 unnamed
,那麼 Vim yank, delete, change 和 put 操作(通常會轉到未命名寄存器)將使用剪貼板寄存器 "*
替代,對應於 X 中的 PRIMARY
緩衝區。
要更改默認寄存器,您可以 :set clipboard=unnamedplus
使用 "+
寄存器。"+
剪貼板寄存器對應於X中的 CLIPBOARD
緩衝區。應該注意,clipboard
選項可以設置為逗號分隔的值。如果您 :set clipboard=unnamedplus,unnamed
,那麼除了 "+
寄存器之外,yank 操作還會將被拉取的文本複製到 "*
寄存器(但是,delete, change 和 put 操作仍然只在 "+
寄存器上操作)。
欲見更多信息,請參見 :help 'clipboard'
。
可以為 clipboard
功能設置其他值。您可以使用 :help clipboard-unnamed
進入幫助主題,查找可為此功能設置的第一個有效值,然後查找所有其他有效值的幫助。
語法高亮[編輯 | 編輯原始碼]
啟用語法高亮(Vim支持許多語言的語法高亮):
:filetype plugin on :syntax on
自動換行顯示[編輯 | 編輯原始碼]
wrap
默認是開啟的,這會使Vim在一行文本的長度超過窗口寬度時,自動將放不下的文本顯示到下一行。wrap
只會影響文本的顯示,文本本身不會被改變。
自動換行顯示一般在該行窗口能容納下的最後一個字符發生,即使剛好是在一個單詞的中間。更為智能的自動換行顯示可以用linebreak
來控制。當用set linebreak
開啟時,自動換行發生在字符串選項breakat
中列出來的字符之後。默認情況下,breakat
包含空格和一些標點符號(參考:help breakat
)。
被換行的字符一般在下一行的開頭開始顯示,沒有任何相應的縮進。breakindent 指示Vim在換行時將縮進考慮在內,因而新行將與原本要顯示的文本有相同的縮進。breakindent
行為可以用breakindentopt
選項來調整,比如說在Python文件中,新行將在原本縮進的基礎上再縮進4個空格(更多細節參考:help breakindentopt
):
autocmd FileType python set breakindentopt=shift:4
使用鼠標[編輯 | 編輯原始碼]
Vim可以使用鼠標,但只在某些終端上起作用:
要開啟這個功能,將下面這行代碼加入~/.vimrc
中:
set mouse=a
mouse=a
選項在 defaults.vim
中已被設置。
跨行移動光標[編輯 | 編輯原始碼]
默認情況下,在行首按←
或者在行尾按→
不能將光標移動至上一行或下一行。
如要改變默認行為,將set whichwrap=b,s,<,>,[,]
加至你的~/.vimrc
文件中。
文件合併[編輯 | 編輯原始碼]
Vim自帶了一個文件差異編輯器(一個用來顯示多個文件之間的差異還可以方便的將其合併的程序)。用vimdiff來啟動它——指定所需文件即可:vimdiff file1 file2
。以下是vimdiff-specific命令的清單。
行為 | 快捷鍵 |
---|---|
下一差異 | ]c
|
上一差異 | [c
|
差異導入 | do
|
差異導出 | dp
|
打開摺疊 | zo
|
關閉摺疊 | zc
|
重新掃描文件 | :diffupdate
|
窗口切換 | Ctrl+w+w
|
技巧和建議[編輯 | 編輯原始碼]
顯示行號[編輯 | 編輯原始碼]
使用:set number
來顯示行號。默認顯示絕對行號,可用:set relativenumber
開啟相對行號。當兩種顯示方式同時開啟時,當前行顯示絕對行號,其它行顯示相對行號。
使用:line number
or line numbergg
跳轉到指定行號。跳轉都記錄在一個跳轉列表中,更多細節參考:h jump-motions
。
拼寫檢查[編輯 | 編輯原始碼]
Vim有拼寫檢查的功能,用下面的命令開啟:
set spell
Vim默認只安裝了英語字典(在 /usr/share/vim/vim82/spell/
)。更多字典可以通過搜索 vim-spell
在官方軟件倉庫中找到。其他字典可以在Vim的FTP archive中找到。把下載的字典文件存入~/.vim/spell/
中,並使用以下命令啟用::setlocal spell spelllang=en_us
(將en_us
換成所需的字典的名稱)。
行為 | 快捷鍵 |
---|---|
下一個拼寫錯誤 | ]s
|
上一個拼寫錯誤 | [s
|
拼寫糾正建議 | z=
|
拼寫正確,添加到用戶正確字典 | zg
|
在會話中當作正確拼寫 | zG
|
拼寫錯誤,添加到用戶錯誤字典 | zw
|
在會話中當作正確拼寫 | zW
|
重新進行拼寫檢查 | :spellr
|
- 如果需要針對兩種語言進行拼寫檢查(例如英語與德語),在
~/.vimrc
或/etc/vimrc
中添加set spelllang=en,de
並重啟Vim即可。 - 您可以通過使用FileType插件和用於文件類型檢測的自定義規則,為任意文件類型(例如.txt)啟用拼寫檢查。 要對以.txt結尾的任何文件啟用拼寫檢查,請創建文件
/usr/share/vim/vimfiles/ftdetect/plaintext.vim
,並將autocmd BufRead,BufNewFile *.txt set filetype=plaintext
插入該文件。接下來,將autocmd FileType plaintext setlocal spell spelllang=en_us
插入到~/.vimrc
或/etc/vimrc
中,然後重新啟動Vim。一定要編輯這一行(特別是*.txt
),以包括用於拼寫檢查的文件類型。
- 如果想只對LaTeX(或TeX)文檔起用拼寫檢查,在
~/.vimrc
或/etc/vimrc
添加autocmd FileType tex setlocal spell spelllang=en_us
,重啟Vim即可。至於非英語語言,替換上述語句中的en_us
為相應語言代碼即可。
保存運行狀態[編輯 | 編輯原始碼]
通常,退出 vim
會丟棄所有不重要的信息,如打開的文件、命令行歷史記錄、刪除的文本等。可以通過以下方式配置保存這些信息。
viminfo 文件[編輯 | 編輯原始碼]
viminfo
文件可用於存儲命令行歷史、查找字符串歷史、輸入行歷史、寄存器內容、文件標記、文件內的位置標記、最後的查找/替換模式(在會話中使用 n
和 &
的查找模式)、緩衝區列表以及您可能定義的任何全局變量。要使 viminfo
模式可用,您安裝的 vim
版本必須使用 +viminfo
功能進行編譯。
通過在 ~/.vimrc
文件中添加特定內容可以配置保存在 viminfo
文件中的內容,以下是一個示例:
set viminfo='10,<100,:100,%,n~/.vim/.viminfo
其中每個參數前面都有一個標識符:
'q : q 是记住的编辑过的文件数 <m : m 为每个寄存器保存的行数 :p : p 是记住的历史命令行数 % : 保存和恢复缓冲区列表 n...: viminfo 文件的完整路径名称(注意,这是一个字面上的 "n")
請參閱官方的 viminfo 文檔,了解當前的 viminfo
文件當會話信息更新時如何修改它,比如從當前會話中的幾個緩衝區中退出。
會話文件[編輯 | 編輯原始碼]
會話文件可用於保存隨時間變化的任意數量的特定會話的狀態。一個不同的會話文件可以用於您感興趣的每個會話或項目。要使該模式可用,您安裝的vim
版本必須使用+mksession
功能進行編譯。
在會話中,:mksession[!] [my_session_name.vim]
將 vim 腳本寫入當前目錄中的 my_session_name.vim
,如果不提供文件名,則默認為 Session.vim
。可選的 !
將刪除具有相同名稱和路徑的已經存在的會話文件。
從終端啟動 vim 時,可以恢復 vim
會話:
$ vim -S [my_session_name.vim]
或者在已經打開的會話緩衝區中運行 vim 命令:
:source my_session_name.vim
vim文檔中詳細介紹了保存的內容以及會話文件選項的其他細節。此處有註釋過的 示例。
記錄光標位置[編輯 | 編輯原始碼]
Vim可以記錄上次打開某一文件時的光標位置,並在下次打開同一文件時將光標移動到該位置。要開啟該功能,在配置文件~/.vimrc
中加入以下內容:
augroup resCur autocmd! autocmd BufReadPost * call setpos(".", getpos("'\"")) augroup END
參見 Vim wiki 上的 Restore cursor to file position in previous editing session
用 vim 替代 vi[編輯 | 編輯原始碼]
創建一個別名,如下:
alias vi=vim
或者,如果你想輸入sudo vi
而得到vim
,安裝vi-vim-symlinkAUR,它將移除vi
並用一個符號連結vim
代替。您還可以自己創建這個符號連結,並將其放置在 path 中比 /usr/bin
更高的位置,以使其更為優先。
DOS/Windows回車問題[編輯 | 編輯原始碼]
打開MS-DOS或Windows下創建的文本文件時,經常會在每行行末出現一個^M
。這是因為Linux使用Unix風格的換行,用一個換行符(LF)來表示一行的結束,但在Windows、MS-DOS中使用一個回車符(CR)接一個換行符(LF)來表示,因而回車符就顯示為^M
。
可使用下面的命令刪除文件中的回車符:
:%s/^M//g
注意,^
代表控制字符。輸入^M
的方法是按下Ctrl+v,Ctrl+m
。
另一個解決方法是,安裝 dos2unix包,然後執行 dos2unix <文件名>
。
fileformat
設置。set ff=unix
以轉化DOS/Windows行尾為Unix行尾。要做到相反,只要 set ff=dos
,就可以將Unix行尾轉換成DOS/Windows行尾。gVim窗口底部的空格[編輯 | 編輯原始碼]
如果窗口管理器設置為忽略窗口大小提示,gVim會將非功能區域填充為GTK主題背景色。
解決方案是調整gVim在窗口底部保留的空間大小。將下面的代碼加入 ~/.vimrc
中:
set guiheadroom=0
Vim 作為 pager[編輯 | 編輯原始碼]
如果使用腳本,那麼 Vim 可以用作 terminal pager,這樣您就可以獲得各種Vim功能,如顏色方案。
Vim 附帶了 /usr/share/vim/vim90/macros/less.sh
腳本,您可以為其創建別名。注意,該腳本不支持 less(1) § OPTIONS 中提到的任何命令行標誌。
另外,還有 vimpager包 Vim 腳本。要更改默認 pager,請導出 PAGER
環境變量。注意,並非所有命令行標誌都受支持;GitHub上提供了支持的標誌列表。
高亮搜索結果[編輯 | 編輯原始碼]
為了突出顯示在搜索中匹配的第一個字符串,請在 ~/.vimrc
中添加以下行:
set incsearch
為了突出顯示在搜索中匹配的所有字符串,在 ~/.vimrc
中添加以下行:
set hlsearch
- 設置
hlsearch
將突出顯示所有匹配項,直到進行更多搜索。這種行為可能是不被希望的,因此要在下次搜索之前暫時禁用高亮顯示,請運行:nohlsearch
。如果您發現自己經常運行此命令,請考慮將其綁定到按鍵。 - 當在其他命令(如
s
或g
)中匹配正則表達式時,也會觀察到這種行為。
插件[編輯 | 編輯原始碼]
向Vim添加插件可以提高您的效率。 插件可以改變Vim的界面,添加新命令,代碼完成支持,使用Vim集成其他程序和實用程序,添加對其他語言的支持等等。
安裝[編輯 | 編輯原始碼]
使用內置包管理器[編輯 | 編輯原始碼]
Vim 8增加了原生加載第三方插件的可能性。可以通過在 ~/.vim/pack
中存儲第三方軟件包來使用此功能。這個文件夾的結構與典型的插件管理器的結構略有不同,典型的插件管理器通常每個插件只有一個目錄。下面是一個典型的安裝過程和目錄結構(以 Tim Pope 的 vim-surround 插件為例) :
$ mkdir -p ~/.vim/pack/tpope/start
需要注意的是,~/.vim/pack/tpope
是一個包目錄,它在 Vim文檔中被寬鬆定義為包含一個或多個插件的目錄。插件存儲庫不應下載到此目錄。包目錄的名稱也是任意的。您可以選擇將所有插件保存在一個包目錄中,或者如我們的示例中所示,使用作者的 GitHub 名稱 tpope
。
包目錄可以包含以下子文件夾:
start
- 這個子文件夾中的插件將在 Vim 啟動時自動加載。這是最常用的位置。opt
- 這個子文件夾中的插件可以按需加載,方法是在 Vim 中發出:packadd
命令。
現在切換到 start
文件夾並檢出插件存儲庫:
$ cd ~/.vim/pack/tpope/start $ git clone https://tpope.io/vim/surround.git
這會創建一個額外的子文件夾 ~/.vim/pack/tpope/start/surround
,插件文件就放在這個子文件夾中。
接下來,如果插件包含幫助文件,請更新幫助索引:
$ vim -u NONE -c "helptags surround/doc" -c q
啟動 Vim 時,插件將自動加載。除了特定於插件的選項外,不需要對 ~/.vimrc
進行任何更改。
使用插件管理器[編輯 | 編輯原始碼]
插件管理器允許以類似的方式安裝和管理插件,而與在何種平台上運行 Vim 無關。它本身是一個插件,其功能是作為其他 Vim 插件包管理器。
- Vundle 是現在最流行的 Vim 插件管理器,從 vundleAUR 或 vundle-gitAUR 獲取。
- Vim-plug 是一個極簡的 Vim 插件管理器,有許多的特性,比如按需插件加載和並行升級,從 vim-plugAUR 或 vim-plug-gitAUR 獲取。
- pathogen.vim 是一個簡單的用於管理 Vim 的 runtimepath 的插件,從 vim-pathogenAUR 或 vim-pathogen-gitAUR 獲取。
- Dein.vim 是一個替代 NeoBundle 的插件管理器,從 vim-deinAUR 或 vim-dein-gitAUR 獲取。
使用 Arch 軟件庫[編輯 | 編輯原始碼]
vim-plugins包組包組下有許多插件。 使用pacman -Sg vim-plugins
來列出可用的插件,然後你可用 pacman 安裝。
著名的插件[編輯 | 編輯原始碼]
cscope[編輯 | 編輯原始碼]
Cscope是用於瀏覽項目的工具。 通過導航到字/符號/函數並調用 cscope(通常使用快捷鍵),它可以找到:調用函數的函數,函數定義等等。
將 cscope 默認文件複製到 Vim 將自動讀取的位置:
mkdir -p ~/.vim/plugin wget -P ~/.vim/plugin https://cscope.sourceforge.net/cscope_maps.vim
~/.vim/plugin/cscope_maps.vim
中取消下列行的註釋來啟用 cscope 快捷鍵:
set timeoutlen=4000 set ttimeout
創建一個文件,該文件包含了你希望 cscope 索引的文件的清單(cscope 可以操作很多語言,下面的例子用於尋找 C/C++ 中的 .c、.cpp和.h 文件):
cd /path/to/projectfolder/ find . -type f -print | grep -E '\.(c(pp)?|h)$' > cscope.files
創建 cscope 將讀取的數據文件:
cscope -bq
$CSCOPE_DB
變量指向 cscope.out
文件,並導出。默認快捷鍵:
Ctrl-\ and c: 查找调用指定函数的函数 d: 查找指定函数调用的函数 e: 查找指定 egrep 模式 f: 查找指定文件 g: 查找指定定义 i: 查找指定文件 #including 的文件 s: 查找指定 C 符号 t: 查找指定的字符串
可隨意改變這些快捷鍵。
#Maps ctrl-c to find functions calling the function nnoremap <C-c> :cs find c <C-R>=expand("<cword>")<CR><CR>
Taglist[編輯 | 編輯原始碼]
Taglist 提供源碼文件的結構概覽,使你能更高效的瀏覽不同語言的源文件。
安裝 vim-taglistAUR 包。
將下列設置添入文件~/.vimrc
:
let Tlist_Compact_Format = 1 let Tlist_GainFocus_On_ToggleOpen = 1 let Tlist_Close_On_Select = 1 nnoremap <C-l> :TlistToggle<CR>
常見問題[編輯 | 編輯原始碼]
gVim運行緩慢[編輯 | 編輯原始碼]
GTK 3 GUI 下 vim 可能比 GTK 2 下運行緩慢(參閱 FS#51366)。可安裝gvim-gtk2AUR來避免該問題。
參閱[編輯 | 編輯原始碼]
官方資源[編輯 | 編輯原始碼]
教程[編輯 | 編輯原始碼]
- vim 入門教程
- 中文版《A Byte of Vim》
- vi參考指南
- vi-Vim 圖解教程
- Vim 簡介與教程
- Open Vim - Vim 學習工具集合
- Vim 漸進式教程
- 學習 Vim 在 2014
- 有效率進行文本編輯的七個習慣
- 基本 Vim 技巧
視頻[編輯 | 編輯原始碼]
- Vimcasts - .ogg 格式的視頻教程。
- Vim Tutorial Videos - 從入門到精通,各種視頻教程
速查表[編輯 | 編輯原始碼]
- https://devhints.io/vim
- https://vim.rtorr.com/ - 一個移動友好的 Vim 速查表 - 原始碼
遊戲[編輯 | 編輯原始碼]
配置範例[編輯 | 編輯原始碼]
- nion's
- 來自 Amir Salihefendic 的一個詳細配置
- Bart Trojanowski
- Steve Francia 的 Vim 發行版
- Vim Awesome - Vim 插件
- W4RH4WK 的 Vim 配置文件
- 來自 askapache 的快速 vimrc/色彩方案
- 基礎 vimrc
- Usevim