通过观察不同的编辑器可以发现,开发人员努力往编辑器身上加入他们认为用户需要的特性,藉此希望编辑器越来越好用,成为顶尖中的顶尖。但是还有一些编辑器勇于承认自己的不足,它们只希望能够尽量简单,对用户友好,能够快速地启动。
有了Vim编辑器,没有人能够决定谁才是用户的最佳选择。相反,用户可以根据自己的需要,对Vim进行大规模的修改,使它更符合自己的口味:力量掌握在用户手中,而不是编辑的开发人员。
有些设置和Vim的布局有关(比如配色和菜单),还有些可以帮助用户把Vim配置成最合适自己的编辑器。
这些方法主要针对下列配置操作:
- 修改字体
- 修改配色方案
- 个性化的高亮
- 更丰富的状态行
- 切换菜单与工具条
- 添加自己的菜单与工具条按钮
- 个性化的工作区
其中有些配置可用多种方法来实现,读者可以根据自己的喜好来选择。
配置文件的存放位置
配置文件的存放位置取决于Vim的安装目录,以及所使用的操作系统:
通常来说,用户只需要知道如何找到以下3个配置文件即可:
vimrcvimrc是Vim的主要配置文件,它有两个版本——全局的和个人的- 全局的
vimrc存放在Vim系统文件的安装目录,为了找到该目录,需要启动vim,并在普通模式下执行::echo $VIM。输出的内容有可能是:- Linux:
/usr/share/vim/vimrc - Window:
c:\program files\vim\vimrc
- Linux:
- 个人的
vimrc在用户的家目录,家目录的位置取决于用户所使用的操作系统。Vim主要是为Unix系统开发的,所以个人的vimrc会在文件名前加一个句号符号,从而隐藏起来。在Unix中,以句点开始的文件可以把文件隐藏起来,但在Microsoft Windows中不起作用,作为替代,在这些系统中vimrc的文件名以下划线开始。比如:- Linux:
/home/kim/.vimrc - Windows:
c:\Documents and Settings\kim\_vimrc
- Linux:
- 个人的vimrc配置会覆盖全局的vimrc配置效果,因此,即使用户没有权限修改全局vimrc,也可以通过修改个人的vimrc来得到自己想要的配置效果。
- 得到用户的家目录路径,只需要在Vim的普通模式下执行命令:
echo $HOME - 获取个人vimrc路径的另一个方法是在普通模式下执行:
echo $MYVIMRC vimrc文件包含ex(vi预处理器)命令,每行一个,在Vim启动过程中,会自动从该文件中读取配置命令。vimrc可以把其他文件作为配置信息的外部来源,在vimrc中,可以这样使用source命令:source /path/to/external file- 这种方法可以使vimrc保持简练,也可以使配置文件更加结构化。
gvimrc
gvimrc是专门给Gvim使用的配置文件,类似于vimrc,个人的gvimrc存放目录与vimrc相同,全局配置同样如此。比如:- Linux:
/linux/kim/.gvimrc和/usr/share/vim/gvimrc - Windows:
c:\Documents and Settings\Kim\_gvimrc与c:\Program Files\vm\gvimrc
- Linux:
- 特定于GUI的配置项只有Gvim才能使用。
- gvimrc不能替代vimrc,它仅仅是为了给Vim的GUI版本提供配置信息。换句话说,读者没必要把相同的配置同时写在vimrc与gvimrc两个文件中。
exrc
文件exrc只是为了保持对编辑器vi/ex的向后兼容。它的存放位置与vimrc相同(包括个人与全局),使用方法也一样,不过它很少被用到,除非用户把Vim设置成vi兼容模式。
更改字体
- 对于普通的Vim来说,更改字体通常没什么好做的,因为Vim的字体与终端字体一致,然而,对于Gvim,用户可以根据自己的需要随意地修改字体。
- 在Linux中,设置字体的主要命令是guifont,例如:
:set guifont=Courier\ 14 - 在Winows中修改字体用
:set guifont=Courier:14好像不行啊 - 如果不确定系统中是否存在某种字体,用户可以在命令的末尾再添加一种字体,两种字体间用逗号分开,例如:
:set guifont=Courier\ New\ 12, Arial\ 10 - 在WIndows,Linux(使用GTK+),Mac Os,或Photon的Gvim中,如果执行
:set guifont=*就可以打开一个字体选择窗口。 - 用户可以根据不同的文件类型(源代码文件,普通文本文件,日志文件等)设置不同的字体。例如,假设用户希望如果打开的是一个普通文件(.txt),就把字体设置成Arial,大小12。完成这个操作只需要在vimrc中添加:
autocmd BufEnter *.txt set guifont=Arial\ 12
修改配色方案
- 默认情况下,Vim的窗口颜色与打开它的控制台相同,但Vim还提供更改颜色的能力。
- 通常情况下,为了修改颜色,只需要修改配色方案即可,这些文件通常放在名为colors的目录中。
- 为了把配色方案修改成某个系统中已有的方案,执行:
:colorscheme schemename- 如果读者不太清楚系统中已经安装了哪些配色方案,请在输完
:colorscheme之后,再键入至少一个空格,然后就可以通过不断地按Tab键来浏览系统中可用的所有配色方案。
- 如果读者不太清楚系统中已经安装了哪些配色方案,请在输完
- 除了前景色与背景色,配色方案还会影响代码高亮,错误标记,以及文件中的其他可视化标记。
- 用户会发现有些配色方案非常类似,相互之间差别不大,这是因为很多配色方案都是由用户提供的,如果用户对某个配色方案不太满意,他可能会对方案中的某一条配置进行修改,然后再用另外一个名字重新发布。
个性化高亮
- 在Vim中,与高亮相关的最关键的技术是匹配(matching)。
- 通过匹配,Vim几乎可以标记字母,单词,数值,语句,和文本行的任意一种组合,用户甚至可以决定如何标记它们(例如用红色标记错误,用绿色标记重点内容)。
- 匹配通过下面这个命令完成:
:match group /pattern/- 命令带有两个参数,第一个参数是高亮文本时使用的色彩组名字。
- 第2个参数是待匹配的模式。模式是一个正则表达式,可以很简单,也可以很复杂——取决于用户想要匹配什么样的内容。
- 如果读者不太喜欢已有的色彩组,也可以自己定义一个,定义色彩组的命令是:
highlight MyGroup ctermbg=red guibg=red gctermfg=yellow guifg=yellow term=bold- 这个命令创建一个名为MyCroup的色彩组,红底黄字,在控制台(Vim)和GUI(Gvim)环境下都是如此。
ctermbg控制台环境下的背景色guibg:Gvim环境下的背景色ctermfg: 控制台环境下的文本颜色guifg:Gvim环境下的文本颜色gui:Gvim环境下的字体格式term:控制台环境下的字体格式
- 使用匹配命令时,给定的模式会一直匹配下去,直到执行一个新的匹配,或者执行下列命令:
match None - 匹配命令一次只能匹配一个模式,但是Vim另外提供了2个命令用于一次匹配至多3个模式。命令很容易记忆:
:2match:3match
示例
示例1: 用彩色标记某列后面的文字
在写邮件时,一条比较常见的规则是一行的长度不能超过74个字符(在某些古老的编程语言中,同样存在这样的规则)。在这种情况下,当用户在一行内写出的字符数超过了某个上限时,如果Vim能够发出提醒那就再好不过了。
下面这个命令就可以完成上面提供的功能:
:match ErrorMsg /\%>73v.\+/
执行该命令后,一行内的第73个字符之后的那些字符都会被标记成错误。匹配命令中含有一个正则表达式,这个表达式可以拆成:
\%>匹配该列之后的内容,列号紧跟在尖括号的右边73列号v只能工作在可见的列上面.\+匹配一个或多个任意的字符
…
更丰富的状态栏
- 在Vim窗口的底部,读者会发现两样东西:
- 命令行缓冲区(输入命令的地方)
- 状态行
- 在默认的配置中,Vim的状态栏非常简单,信息量也比较少,状态栏的右边显示的是光标当前所在位置的行号与列号,左边则是当前打开着的文件名(如果有的话)
- 当执行Vim命令时,状态栏就会消失,取而代之的是命令行缓冲区。
- 如果所执行的命令带有输出信息,那么这些信息就会出现在状态栏的右侧。对于简单的文本编辑来说,这样的状态行已经足够了。但是如果用户需要天天使用Vim来处理不同格式的文件,那么一条信息丰富的状态行将会提供很大的帮助。
- 配置状态行的命令:
:set statusline format- 命令行中的format表示一个格式字符串(就像C程序的printf),它描述了状态行的显示格式。
- 键入: help ‘statusline’,打开Vim的帮助系统,读者将会看到状态行可以包含相当多的信息,其中有些信息在日常工作中非常有用。
- 笔者的状态行信息包括:
- 正在编辑的文件名
- 正在编辑的文件的格式(比如Dos, Unix)
- 文件类型
- 光标所在位置的字符的ASCII码值与十六进制值
- 光标所在的行号与列号
- 文件的长度(以行为单位)
下面的命令可以让读者的Vim状态行包含上面提到的所有信息:
:set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [ASCII=\%03.3b]\ [HEX=\%02.2B]\ [POS=%04l,%04v]\ [%p%p]\ [LEN=%L]
- 确保状态行始终显示在倒数第2行的位置上
:set laststatus=2。执行完该命令后,读者就会发现命令行缓冲区有了自己的位置:窗口的最后一行。通过这条命令就可以保证状态行始终拥有自己的显示位置,而用户也就能一直看到文件的相关信息。 - 状态行会占编辑区的一部分空间,但是是否显示状态行由用户来决定。下面这条命令关闭状态行,直到当前会话结束:
:set laststatus=0
切换菜单与工具条
-
如果用户是在控制台中使用Vim,就会逐渐习惯没有菜单与工具条的窗口。但是如果用的是Gvim,就会发现窗口界面提供了菜单与工具条。
-
很多人认为应该把额外的空间分配给更重要的文本使用,而不是菜单与工具条。下面的代码把Gvim的组合键Ctrl + F2映射到菜单与工具条的切换操作上,如果读者喜欢这个功能的话,可以把这个代码写到vimrc中:
map <silent> <C-F2> :if &guioptions =~# 'T' <Bar>
\set guioptions-=T <Bar>
\set guioptions-=m <Bar>
\else <Bar>
\set guioptions+=T <Bar>
\set guioptions+=m <Bar>
\endif<CR>
-
为了完全移除菜单,添加:
:set guioptions-=m -
为了完全移除工具栏,添加:
:set guioptions-=T -
GUI的其他设置可以通过命令set guioptions完成,更多的信息可以参考:
help 'guioptions'
添加自定义菜单与工具条安妮
…
修改标签栏
- Vim从7.0开始支持标签页,标签页与其他应用程序中的标签不太一样——在Vim中,它是组织打开文件的一种方式,每一个标签都可以包含若干个缓冲区,甚至多个窗口。
- 有了标签页之后,原来的针对所有缓冲区或窗口的命令(例如:bufdo, :windo和:ball)将仅限于当前标签的窗口或缓冲区。
- **一般情况下,所有的标签页以一种标签列表的形式呈现在窗口的上方。**每一个标签页都有一个标签,默认是处于当前活动缓冲区的文件名。如果一个标签页同时打开了多个窗口,那么标签也会显示窗口的数量。
…
工作区定制
为光标添加视觉效果
有时候,用户正在编辑的文件可能带有多种颜色的语法高亮,这些颜色会干扰用户追踪光标的位置,如果可以标记出光标当前所在的行,那就方便多了。
- 第一种办法是命令
cursorline,它可以标记当前光标所在的行,比如把当前行的背景色设置成另一种颜色,而且不会破坏原来的语法高亮。为了打开它,执行:
:set cursorline
命令行所使用的颜色由色彩组Cursorline定义,用户可以设置成任意一种颜色或风格,比如:
:highlight Cursorline guibg=lightblue ctermbg=lightgray - 如果用户正在编辑的文件含有许多对齐的内容(比如用制表符分割的数据),那么自然地就会用到:
:set cursorcolumn。这个命令标记光标所在的列。 - 虽然cursorline与cursorcolumn是在vim本地实现的,但是仍会影响文件的滚动速度。
添加行号
在编译或调试代码时,错误信息通常会报告错误所在的行。为了定位到这一行,用户当然可以从第1行开始,一行一行地往下数,不过
- vim提供了更为直接的办法:XXX(XXX表示行号),用户就可以马上到达XXX行。
- 另一种办法是在普通模式(按Esc就可以切换到普通模式)下,执行XXXgg或XXXG(同样,XXX表示行号),但是,如果能随时随地地看到行号可能会更加方便,这时候就可以执行命令:
set number。- 执行完命令后,编辑器就会在窗口的左边显示每一行的行号,默认情况下行号占据了4个空格的看度,3个用于数字,1个用于空格。
- 用户可以修改行号占据的宽度,相应的命令是
:set numberwidth=width把width替换成你想要的列宽度。
拼写检查
-
打开拼写检查的命令是
:set spell。命令使用默认的语言(英语)打开拼写检查,如果想要使用其他语言,只需要把spellang设置成该语言的代号即可。比如::set spellang=de- 如果把spellang设置成某个还没安装的语言,Vim就会询问用户是否自动从Vim主页上下载对应的语言。
-
设置属性spellang时,给它同时带上多种语言即可,这样Vim就可以用多种语言来进行语言检查。
:set spellang=en,da,de,it- vim将会按照顺序,轮流根据每一种语言检查的拼写是否正确。如果单词对某一种语言来说是正确拼写的,那它就不会标记错误。
- 如果单词对某一种语言来说是正确拼写的,那它就不会被标记错误,当然,这就意味着如果有一个单词的拼写本来是错误的,可以碰巧它在另一中语言中是正确的,那么它也不会被当成错误的,这将会引入一个难以察觉的错误。
-
Vim和Gvim对错误单词的标记方法稍有不同。
- 在普通的Vim中,拼写错误的单词使用色彩组SpellBad标记(默认情况下是红底白字)
- 在Gvim中,拼写错误的单词用红色的波浪线标记,当然,这也可以通过设置色彩组来改变颜色。
-
无论用户是在什么时候碰到拼写错误的单词,都可以向Vim询问正确的拼写方式。为此需要把光标置于单词中,并切换到普通模式(按Esc),然后按
z=- 如果可以的话,Vim将会猜测用户试图输入的单词的正确形式,并给出一个候选列表。在每个单词的前面都有一个数字,如果其中有你想要的单词,就输入单词其那面的数字或单词本身,然后按Enter。
- vim会给出一长串的候选单词,除非用户把单词完全拼写错了,否则的话,单词的正确形式应该在候选单词的前5个中,如果用户不想看到一长串的列表,那么他就可以用命令
:set spellsuggest=width来限制列表的长度,其中width是列表的长度。
添加工具提示
**在Vim中,编辑区的工具提示称为balloons,只在当鼠标停在组成这个单词的某个字符的上方时,提示信息才会显示出来。**为了使用balloons,用户必须知道下面这几个命令:
- 第1个命令是在Vim中启用balloons:
:set ballooneval
…
使用缩写
- vim的设计哲学是:如果用户曾经为某件事情写过一次,那就不需要再写第二次。然而,如果用户发现自己正在一次又一次地输入同一个内容,那就说明他需要找到一个更好的办法。
- 为了避免多次输入同一个内容,用户可以使用缩写(abbreviations)。根据不同的使用模式,可以使用以下三个命令来创建缩写:
:abbreviate:创建在所有模式中均可使用的缩写:iabrev:创建只能在插入模式中使用的缩写:cabbrev::创建只能在命令行中使用的缩写
- 上面的三个命令都需要两个参数——文本的缩写形式与完整模式。
示例
用缩写来快速插入地址
在过去的几年我更换了几次住所,所以我的一个经常性的工作就是把新住址告诉给别人。为地址准备一个缩写并不会花上太多时间,有了缩写之后,就不能每次都把整个地址写出来。
命令的具体形式是:
:iabbrev myAddr 32 Lincoln Road, Birminham B27 6PA, United Kingdom
每当我想要输入自己的地址时,只需要键入myAddr,紧接着按一下空格键,Vim就会把myAddr自动扩展成完整的地址。
- vim非常聪明,它可以判断用户是在输入一个缩写词,还是仅仅在输入另一个单词的某个部分,所以它只会在输入缩写词并按了空格之后,才把缩写扩展为完整的字符串。如果在输完缩写此之后,紧跟着的是一个普通的字母,那么Vim就会知道用户并不是在输入某个缩写词,自然也就不会发生扩展。
- 为了避免每次都执行一次缩写命令,用户可以把它们放在VIMHOME的某个文件中,假设文件名就叫
abbreviations.vim,然后在文件vimrc使用命令source来使该文件是可读的。:source $VIM/abbreviations.vim- 每当用户需要一个新的缩写词时,可以先在编辑器中创建缩写词,然后再把它加入到文件
abbreviations.vim。
- 每当用户需要一个新的缩写词时,可以先在编辑器中创建缩写词,然后再把它加入到文件
- 也许读者已经意识到到,除了这些,缩写可以应用到其他有趣的地方,但无论如何,这里有一些例子,或许可以像你提供一些思路:
- 纠正常见的拼写错误
:iabbr teh the - 编程模板
:iabbr forx for(x=0;x<100;x++) {<cr><cr>} - 更短的命令
:cabbr csn colorscheme night
- 纠正常见的拼写错误
- 如果读者发现了一个新的缩写,或许它看起来有点古怪,刚开始的时候还有点麻烦,但是读者应该习惯了这一点,因为到最后将会发现,它可以帮助你节省大量的时间。
- 但是有时候缩写可能会比较恼人,因为它自作聪明地扩展了用户并不希望扩展的单词。比如用户有一个地址的缩写是addr,但是用户其实想写的是单词
addressed。在这种情况下,缩写功能会突然冒出来,用户也很难轻易地写出它所想要的单词。- 一种解决办法是在插入单词之前调用一个函数,该函数询问用户是否使用缩写扩展功能。
function! s:AbbrAsk(abbr,expansion)
let answer = confirm("user the abbreviation ‘“ . a:addr . “‘?’, “&Yes\n&No”, 1)
return answer == 1 ? a:expansion : a:abbr
endfunction
- 函数需要两个参数,第一个参数是缩写诩,第2个参数缩写词扩展后的形式,对我们的例子来说,该函数的用户是:
iabbrev <expr> addr <SID>AbbrAsk('addr', "your full address here")
修改按键绑定
-
虽然Vim中的快捷键绑定在最开始设计时都是力求使用方便且快速,但是在某种情况下,使用用户已经熟悉的快捷键可能会更快。
-
处理按键绑定的命令主要有:
:map:用于普通模式,插入模式,可视模式,与命令行模式:imap:只能用于插入模式cmap:只能用于命令行模式nmap:只能用于普通模式vmap只能用于可是模式
-
每个命令都需要两个参数,第一个参数是被绑定的按键,第二个参数是被绑定的命令。
-
假设用户不太习惯在普通模式下用命令
:w来保存文件,因为你已经习惯了Ctrl-S,并且想继续使用下去。解决这个问题的一个映射可以是::map <C-s> :w<cr>好像不行<C-s>这是组合键Ctrl+S在Vim中的表示方法。除了C(Ctrl)用户还可以用A(Alt)或M(Meta)。命令末尾的<cr>是真正执行命令的地方。如果缺了它,命令只会被显示在命令行中,而不会被执行。
-
除了
<cr>,还有其他一些用来表示按键的特殊记号,下面这张表显示了比较常见的记号:
| 记号 | 按键 |
|---|---|
| <BS> | 退格 |
| <Tab> | 制表符 |
| <CR> | 回车 |
| <Enter> | 回车 |
| <Retrun> | 回车 |
| <Esc> | 转义 |
| <Space> | 空格 |
| Up | 方向键,上 |
| <Down> | 方向键,下 |
| <Left> | 放向键,左 |
| <Right> | 方向键,右 |
| <F1>-<F12> | 功能键,F1到F12 |
| #1, #2,…,#9,#0 | 功能键,从F1到F10 |
| <Insert> | 插入 |
| <Del> | 删除 |
| <Home> | 返回到行的开始 |
| <End> | 返回到行的结束 |
| <PageUp> | 下一页 |
| \PageDown> | 上一页 |
- 如果用户只可能在插入模式下才会保存文件,而且在保存之后想要继续在插入模式下工作,那就执行:
:imap <C-s> <esc>:w<cr>a - 用户可能会遇到这样一种情况:组合键的第一个按键已经绑定到了Vim的某个功能上。举个例子,按键
$,它的功能是把光标一定到一行的末尾,用户可能希望为$1新绑定一个功能,为$2绑定另一个功能,如此等等。具体的形式是:
:map $1 :MyFunction1()<cr>
:map $2 :MyFunction2()<cr>
现在,如果用户按下了$,Vim就会等待一秒,等待另一个按键被按下,如果在这一秒之内没有按键按下,Vim就会执行原来的功能:把光标移到一行的末尾。相反,如果在1秒之内用户按下了1,Vim就会执行函数MyFunction1()。

1074

被折叠的 条评论
为什么被折叠?



