Vim - Arch Linux 中文维基

跳至內容

# Vim

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Vim，最近一次同步於 2023-02-22，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- 應用程式列表/文檔#Vi 風格的文本編輯器
- Neovim
- Emacs

Vim是一個終端文本編輯器。作為vi的一個擴展版本，它具有以下附加功能：語法高亮，全面的幫助系統，本地腳本（Vim script），文本選擇的可視模式和文件比較（vimdiff(1)）。以及有限功能的工具，如 rview(1) 和 rvim(1)。

## 安裝

安裝下面兩個軟體包中的一個：

- vim包——提供Python, Lua, Ruby 和 Perl解釋器支持，但沒有 GTK/X 支持
- gvim包——除了提供和 vim 一樣的功能外，還提供GTK/X支持。

注意：

- vim 包不包含 Xorg 支持。具體而言，Vim缺失 `+clipboard` 特性，因而不能夠使用 primary 和 clipboard 選擇緩衝區。gvim 同時提供命令行版本帶`+clipboard`的Vim。
- 非官方源herecura也提供數個Vim/gVim變種版本: `vim-cli`、`vim-gvim-common`、`vim-gvim-gtk3`、`vim-rt` 和 `vim-tiny`。

## 用法

有關如何使用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` 進入幫助主題，查找可為此功能設置的第一個有效值，然後查找所有其他有效值的幫助。

提示：

- 可以創建複製和粘貼操作的自定義快捷鍵。參見例如 [2] 用於綁定 `ctrl + c`，`ctrl + v` 和 `ctrl + x`。
- 當 vim 退出時，X 剪貼板會被刷新。要使 vim 選區在 X 剪貼板中持久化，您需要一個剪貼板管理器。或者，您可以將 `autocmd VimLeave * call system("echo -n $'" . escape(getreg(), "'") . "' | xsel --input --clipboard")` 添加到你的 `.vimrc`（需要 xsel包 包）。

### 語法高亮

啟用語法高亮（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可以使用滑鼠，但只在某些終端上起作用：

- 基於xterm/urxvt的終端模擬器
- 帶有gpm包的Linux控制台（更多細節請參閱控制台滑鼠支持）
- PuTTY。

要開啟這個功能，將下面這行代碼加入`~/.vimrc`中：

    set mouse=a

`mouse=a` 選項在 `defaults.vim` 中已被設置。

注意：如果可以訪問X伺服器，複製/粘貼將使用 `"*` 寄存器，參見剪貼板。按住`shift key`鍵可以使用 xterm 處理滑鼠按鈕。

### 跨行移動光標

默認情況下，在行首按`←`或者在行尾按`→`不能將光標移動至上一行或下一行。

如要改變默認行為，將`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

注意：如果將其設為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 Awesome。

### 安裝

#### 使用內置包管理器

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包 包。

將 cscope 默認文件複製到 Vim 將自動讀取的位置:

    mkdir -p ~/.vim/plugin
    wget -P ~/.vim/plugin https://cscope.sourceforge.net/cscope_maps.vim

注意：在 Vim 的 7.x 版本中，你可能需要在 `~/.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主頁
- Vim文檔
- Vim Wiki
- Vim腳本

### 教程

- 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 速查表 - 原始碼

#### 遊戲

- Vim Adventures
- VimGolf

### 配置範例

- nion's
- 來自 Amir Salihefendic 的一個詳細配置
- Bart Trojanowski
- Steve Francia 的 Vim 發行版
- Vim Awesome - Vim 插件
- W4RH4WK 的 Vim 配置文件
- 來自 askapache 的快速 vimrc/色彩方案
- 基礎 vimrc
- Usevim

#### 色彩方案

- Vivify
- Vim 色彩方案定製

分類：​

- 文本編輯器
- 終端應用程式

Vim
新增話題