和 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