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
tabstop
,ts
:檔案中的實際製表符的(最大)寬度,預設為 8。softtabstop
,stp
:在編輯模式中,按 Tab 鍵會插入空格符或\t
的混合(如果設定了expandtab
那麼只插入空格)來實現stp
的寬度,\t
顯示的寬度為ts
的值。sts 為 0 時,此設定無效。expandtab
,et
:在插入模式,Tab 鍵只會插入空格而不是\t
,會影響 retab 的效果。當設定了 compatible 時,此值會重置。noexpandtab
,et
:和expandtab
,noet
相反。shiftwidth
:行首縮排的寬度,和smarttab
smarttab
,sta
:插入模式下,游標在行首時,Tab 鍵會根據shiftwidth
的值來插入空格和\t
的組合。tabstop
或softtabstop
使用在其他地方的 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