1. 程式人生 > >Linux 中的 vim 的配置

Linux 中的 vim 的配置

和 vim 相關的檔案

① ~/.viminfo

如果我們在 vim 中查詢過字串,那麼這個字串就會被反白:
在這裡插入圖片描述

退出後,再次以 vim 來編輯這個檔案是,該查詢過的字串還是反白狀態,而且第二次進入該檔案時,游標就出現在上次退出的那一行。這是因為這些操作記錄被儲存在了 ~/.viminfo 這個檔案中。

② ~/.vimrc

vim 的操作環境可以通過配置檔案來規定,整體的 vim 設定值放在 /etc/vimrc 檔案中,鳥哥不建議我們修改它,可以修改 ~/.vimrc 檔案(預設不存在,需要手動建立)。如下是我的配置值:

我的 vim 的基本配置(~/.vimrc):

" 基本設定
set nu                      "顯示行號
set bg=dark            "底色色調
set laststatus=2      "最下面的狀態列顯示兩行
syntax on               "語法高亮
set hlsearch	          "高亮度反白
set autoindent        "自動縮排
set smartindent     "和 autoindent 配合,在特殊符號後有自動縮排

" Tab 設定
set tabstop=4 softtabstop=0 expandtab shiftwidth=4 smarttab

" 自動配對設定
inoremap ( ()<Esc>i
inoremap [ []<Esc>i
inoremap " ""<Esc>i
inoremap ' ''<Esc>i
inoremap { {<CR>}<Esc>O

臨時設定可以在 vim 中使用 set 命令,如:

:set nu
:set nonu

vim 中的 Tab 設定

製表符 \t,在 c 語言的 printf 函式中是 8 個字元寬度。而我們在使用有些編輯器時,習慣按 Tab 鍵輸入製表符顯示 4 個字元寬度,在其他編輯器上開啟時,\t 被當作 8 個字元寬度顯示出來又會看起來很奇怪,因此有一種解決方案就是使用多個空格符來實現製表符的顯示效果,這樣在不同的編輯器中顯示效果相同。vim 編輯器就提供了這種設定。

具體的選項含義,可以在 vim 中使用命令 :help 'optionname' 來檢視(例如 :help smarttab

)。

  • tabstopts:檔案中的實際製表符的(最大)寬度,預設為 8。
  • softtabstopstp:在編輯模式中,按 Tab 鍵會插入空格符或 \t 的混合(如果設定了 expandtab 那麼只插入空格)來實現 stp 的寬度,\t 顯示的寬度為 ts 的值。sts 為 0 時,此設定無效。
  • expandtabet:在插入模式,Tab 鍵只會插入空格而不是 \t,會影響 retab 的效果。當設定了 compatible 時,此值會重置。
  • noexpandtabet:和 expandtabnoet 相反。
  • shiftwidth:行首縮排的寬度,和 smarttab
    配合使用。
  • smarttabsta:插入模式下,游標在行首時,Tab 鍵會根據 shiftwidth 的值來插入空格和 \t 的組合。tabstopsofttabstop 使用在其他地方的 Tab。Backspace 會刪除行首 shiftwidth 對應的空格或 \t。

推薦設定

① 製表符寬度為 8,但行首用按 Tab 鍵用 4 個空格縮排 4 個字元,其他位置按 Tab 鍵也用空格實現製表符寬度:

set tabstop=8 softtabstop=0 expandtab shiftwidth=4 smarttab

② (我的配置)製表符寬度為 4,行首用按 Tab 鍵用製表符縮排 4 個字元,其他位置按 Tab 鍵用空格實現製表符寬度:

set tabstop=4 softtabstop=0 expandtab shiftwidth=4 smarttab

示例

我們來用 vim 編輯一段常見的程式碼:

#include <stdio.h>

int main()
{
	printf("hello, world\n");
	return 0;
}

① 使用 vim 預設的設定

set tabstop=8 softtabstop=0 noexpandtab shiftwidth=8

在這裡插入圖片描述

我們看一下字元編碼,使用 od -t oCc hello.c 命令:

0000000 043 151 156 143 154 165 144 145 040 074 163 164 144 151 157 056
          #   i   n   c   l   u   d   e       <   s   t   d   i   o   .
0000020 150 076 012 012 151 156 164 040 155 141 151 156 050 051 012 173
          h   >  \n  \n   i   n   t       m   a   i   n   (   )  \n   {
0000040 012 011 160 162 151 156 164 146 050 042 150 145 154 154 157 054
         \n  \t   p   r   i   n   t   f   (   "   h   e   l   l   o   ,
0000060 040 167 157 162 154 144 134 156 042 051 073 012 011 162 145 164
              w   o   r   l   d   \   n   "   )   ;  \n  \t   r   e   t
0000100 165 162 156 040 060 073 012 175 012
          u   r   n       0   ;  \n   }  \n
0000111

預設模式 Tab 鍵輸入 \t,在編輯器中佔 8 個字元位置。

② 使用模式一的配置

set tabstop=8 softtabstop=4 shiftwidth=4 noexpandtab

在這裡插入圖片描述

0000000 043 151 156 143 154 165 144 145 040 074 163 164 144 151 157 056
          #   i   n   c   l   u   d   e       <   s   t   d   i   o   .
0000020 150 076 012 012 151 156 164 040 155 141 151 156 050 051 012 173
          h   >  \n  \n   i   n   t       m   a   i   n   (   )  \n   {
0000040 012 040 040 040 040 160 162 151 156 164 146 050 042 150 145 154
         \n                   p   r   i   n   t   f   (   "   h   e   l
0000060 154 157 054 040 167 157 162 154 144 134 156 042 051 073 012 040
          l   o   ,       w   o   r   l   d   \   n   "   )   ;  \n    
0000100 040 040 040 162 145 164 165 162 156 040 060 073 012 175 012
                      r   e   t   u   r   n       0   ;  \n   }  \n
0000117

我們發現行首的 Tab 鍵啟用了 shiftwidth 的值,輸入的是 4 個 \040(空格),在編輯器中也就顯示了 4 個字元的位置。

③ 第二種設定

set tabstop=4 shiftwidth=4 noexpandtab

在編輯器中的效果和第 ② 個一樣,編碼如下:

0000000 151 156 143 154 165 144 145 040 074 163 164 144 151 157 056 150
          i   n   c   l   u   d   e       <   s   t   d   i   o   .   h
0000020 076 012 012 151 156 164 040 155 141 151 156 050 051 012 173 012
          >  \n  \n   i   n   t       m   a   i   n   (   )  \n   {  \n
0000040 011 160 162 151 156 164 146 050 042 150 145 154 154 157 054 040
         \t   p   r   i   n   t   f   (   "   h   e   l   l   o   ,    
0000060 167 157 162 154 144 134 156 042 051 073 012 011 162 145 164 165
          w   o   r   l   d   \   n   "   )   ;  \n  \t   r   e   t   u
0000100 162 156 040 060 073 012 175 012
          r   n       0   ;  \n   }  \n
0000110

括號自動補全的設定

vim 中有一個對映的語法inoremap {lhs} {rhs},將按鍵序列 {lsh} 對映為 {rhs}。可以用來實現符號的自動配對。

inoremap ( ()<Esc>i
inoremap [ []<Esc>i
inoremap " ""<Esc>i
inoremap ' ''<Esc>i
inoremap { {<CR>}<Esc>O
符號縮寫 含義
<CR> Carriage Return,即回車符
<Esc> Escape,即 ESC 按鈕

更多符號的含義請參考 https://vi.stackexchange.com/questions/10174/how-to-map-num-keys