gvim设置参考
2023-06-04 16:57:34 阿炯

(g)vi[m]中可供用户定制的选项非常多,作为在windows平台下的移植版本使用者有必要了解这此。下面简单列出了一些最常用的配置项,可以根据自己的需要将这些内容添加到的 .vimrc 中。vim-gtk(n)、vim-gnome约等于gvim。

1、基本设置

set nocp
该命令指定让 vim 工作在不兼容模式下。在 vim 之前,出现过一个非常流行的编辑器叫 vi。vim 许多操作与 vi 很相似,但也有许多操作与 vi 是不一样的。如果使用“:set cp”命令打开了兼容模式开关的话,vim 将尽可能地模仿 vi 的操作模式。也许有许多人喜欢“最正统的 vi”的操作模式,对于初学者来说,vi 里许多操作是比较不方便的。如vim里允许在 Insert 模式下使用方向键移动光标,而 vi 里在 Insert 模式下是不能移动光标的,必须使用 ESC 退回到 Normal 模式下才行。vi 里使用 u 命令可以撤消一次先前的操作,再次按下 u 时,将撤消“撤消”这个动作本身,也就是我们常说的“重复”(redo)。而 vim 里可以使用 u 命令撤消多步操作,“重复”使用的快捷键是 Ctrl + R。

使用兼容模式后,vim 将放弃这些新的功能,尽量模仿 vi 的各种操作方式。只有在不兼容模式下,才能更好地发挥 vim 自身的特点。Bram 爷爷强烈推荐大家使用 vim 的不兼容模式,滇狐也是这样推荐的。请务必在你的 .vimrc 中的第一行写上:“set nocp”。

set ru
该命令打开 vim 的状态栏标尺。默认情况下,vim 的状态栏标尺在屏幕底部,它能即时显示当前光标所在位置在文件中的行号、列号,以及对应的整个文件的百分比。打开标尺可以给文件的编辑工作带来一定方便。

set hls
搜索时高亮显示被找到的文本。该指令的功能在 vimtutor 中已经有过介绍,这里就不多说了。其实似乎许多人并不喜欢这个功能。

set is
搜索时在未完全输入完毕要检索的文本时就开始检索。

syntax on
打开关键字上色。进行程序设计的朋友应该都知道关键字上色是什么东西,因此这里就不多说了。不进行程序设计的朋友不妨也打开这个功能,虽然不一定能够用得着,但这个功能其实也是很好玩的。

set backspace=indent,eol,start
设想这样一个情况: 当前光标前面有若干字母,我们按下 i 键进入了 Insert 模式,然后输入了 3 个字母,再按 5 下删除(Backspace)。默认情况下,vim 仅能删除我们新输入的 3 个字母,然后喇叭“嘟嘟”响两声。如果我们“set backspace=start”,则可以在删除了新输入的 3 个字母之后,继续向前删除原有的两个字符。

再设想一个情况: 有若干行文字,把光标移到中间某一行的行首,按 i 键进入 Insert 模式,然后按一下 Backspace。默认情况下,喇叭会“嘟”一声,然后没有任何动静。如果“set backspace=eol”,则可以删除前一行行末的回车,也就是说将两行拼接起来。

当设置了自动缩进后,如果前一行缩进了一定距离,按下回车后,下一行也会保持相同的缩进。默认情况下不能在 Insert 模式下直接按 Backspace 删除行首的缩进。如果“set backspace=indent”,则可以开启这一项功能。

上述三项功能,可以根据需要选择其中一种或几种,用逗号分隔各个选项。建议把这三个选项都选上。

set whichwrap=b,s,<,>,[,]
默认情况下,在 vim 中当光标移到一行最左边的时候,我们继续按左键,光标不能回到上一行的最右边。同样地,光标到了一行最右边的时候,我们不能通过继续按右跳到下一行的最左边。但是,通过设置 whichwrap 可对一部分按键开启这项功能。如果想对某一个或几个按键开启到头后自动折向下一行的功能,可以把需要开启的键的代号写到 whichwrap 的参数列表中,各个键之间使用逗号分隔。以下是 whichwrap 支持的按键名称列表:

b:在 Normal 或 Visual 模式下按删除(Backspace)键。

s:在 Normal 或 Visual 模式下按空格键。

h:在 Normal 或 Visual 模式下按 h 键。

l:在 Normal 或 Visual 模式下按 l 键。

<:在 Normal 或 Visual 模式下按左方向键。

>:在 Normal 或 Visual 模式下按右方向键。

~:在 Normal 模式下按 ~ 键(翻转当前字母大小写)。

[:在 Insert 或 Replace 模式下按左方向键。

]:在 Insert 或 Replace 模式下按右方向键。

set encoding=utf-8
设置当前字符编码为 UTF-8。UTF-8 是支持字符集最多的编码之一,在 UTF-8 下进行工作,会带来许多方便之处。由于 vim 在运行过程中切换 encoding 会造成许多问题,如提示信息乱码、 register 丢失等,因此强烈建议在启动 vim 的时候把 encoding 设置为 UTF-8,在编辑非 UTF-8 的文件时,通过 fileencoding 来进行转码。

set langmenu=zh_CN.UTF-8
使用中文菜单,并使用 UTF-8 编码。如果没有这句的话,在非 UTF-8 的系统,如 Windows 下,用了 UTF-8 的 encoding 后菜单会乱码。

language message zh_CN.UTF-8
使用中文提示信息,并使用 UTF-8 编码。如果没有这句的话,在非 UTF-8 的系统,如 Windows 下用了 UTF-8 的 encoding 后系统提示会乱码。

set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
设置编码的自动识别。

set ambiwidth=double
防止特殊符号无法正常显示。在 Unicode 中许多来自不同语言的字符,如果字型足够近似的话,会把它们放在同一个编码中。但在不同编码中,字符的宽度是不一样的。例如中文汉语拼音中的 ā 就很宽,而欧洲语言中同样的字符就很窄。当 vim 工作在 Unicode 状态时,遇到这些宽度不明的字符时,默认使用窄字符,这会导致中文的破折号“——”非常短,五角星“★”等符号只能显示一半。因此,我们需要设置 ambiwidth=double 来解决这个问题。

set termencoding=cp936

filetype plugin indent on
开启文件类型自动识别,启用文件类型插件,启用针对文件类型的自动缩进。

2、编辑设置

在代码层数多了以后,默认tab一下缩进8个空格就有些浪费了,可以改为2个节省空间
set sw=2
自动缩进的时候,缩进尺寸为2个空格。

set ts=2
设定Tab宽度为2个字符。

set et
编辑时将所有 Tab 替换为空格。该选项只在编辑时将 Tab 替换为空格,如果打开一个已经存在的文件,并不会将已有的 Tab 替换为空格。如果希望进行这样的替换的话,可以使用这条命令“:retab”。

set smarttab
当使用 et 将 Tab 替换为空格之后,按下一个 Tab 键就能插入 4 个空格,但要想删除这 4 个空格,就得按 4 下 Backspace,很不方便。设置 smarttab 之后,就可以只按一下 Backspace 就删除 4 个空格了。

set spell
打开拼写检查。拼写有错的单词下方会有红色波浪线,将光标放在单词上,按z=就会出现拼写建议,按]s可以直接跳到下一个拼写错误处。

搜索或者替换后取消高亮的关键词
搜索和替换后关键词会高亮显示,搜索结束后也不会消失,要取消高亮,可以通过命令:noh
另类方法:可以搜索一个不存在字符的来让高亮取消,如/RealNotExist

整体缩进一段代码
先得到要缩进的开始行号和结束行号(比如开始行3 结束行9),然后用
3,9> 向右增加一个tab的缩进
3,9<< 向左减少2个tab的缩进

关闭上方工具栏
set guioptions-=T

有时不知道光标在多少行,或一眼看不到行号,可以用这个来突出当前行
set cursorline "突出光标所在的当前行

常用命令
插入:iaos
移动:hjkl wb HML gg G
删除:x dd n1,n2d
复制:yy nyy dd ndd p P

断行设置
set tw=78
设置光标超过 78 列的时候折行。

set lbr
不在单词中间断行。设置了这个选项后,如果一行文字非常长,无法在一行内显示完的话,它会在单词与单词间的空白处断开,尽量不会把一个单词分成两截放在两个不同的行里。

set fo+=mB
打开断行模块对亚洲语言支持。m 表示允许在两个汉字之间断行,即使汉字之间没有出现空格。B 表示将两行合并为一行的时候,汉字与汉字之间不要补空格。该命令支持的更多的选项请参看用户手册。


支持'世俗'的复制(Accessing the system clipboard)https://vim.fandom.com/wiki/Accessing_the_system_clipboard
终端下的vi(m)的复制操作是无法将内容复制到系统的缓冲区(system clipboard)的,因此也就无法直接使用ctrl+v来将内容粘贴到其它地方,不过通过设定将可以实现此功能,这同样需要版本的加持。
macOS and Windows:
set clipboard=unnamed

On Linux (vim 7.3.74+):
set clipboard=unnamedplus

$ vim --version | grep clipboard

再vim编辑器复制内容再粘贴到外部文本编辑器中。

Under Windows, the * and + registers are equivalent. For X11 systems, though, they differ. For X11 systems, * is the selection, and + is the cut buffer (like clipboard).

So for copying something to the clipboard register you type "*y and then to put you type "*p.

复制当前行:"*yy
复制包括光标所在后在的5行:"*5yy
复制从当前行到文尾:"*yG

如果在支持鼠标的视窗界面下,通过如下设置就可将(g)vim设置为与常用的文件编辑器支持鼠标操作
if has('mouse')
   set mouse=a
endif

可以还可能支持ctrl+c功能
vmap <C-c> "+y


C/C++ 编码设置

set sm
显示括号配对情况。打开这个选项后,当输入后括号(包括小括号、中括号、大括号)的时候,光标会跳回前括号片刻,然后跳回来,以此显示括号的配对情况。

set cin
打开C/C++风格的自动缩进。打开了自动缩进后,在编码的时候我们可以使用“V”命令选中一段文本后,按“=”将这段文本重新调整缩进格式,在一定程度上起到代码美化的作用。

另外打开了自动缩进后,在使用 TERM 下的 vim 的时,粘贴代码时常常会出现版式混乱的现象。那是因为 TERM 并不知道你现在正在粘贴代码,它直接“粘贴”动作向 vim 解释为键入,因此 vim 便按照设置的自动缩进格式为你的代码调整了缩进。不幸的是,粘贴进去的代码中本身已经包含了缩进,因此便出现了版式混乱的情况。在 gvim 中就不会出现这个问题,因为它能够知道你现在正在粘贴。

知道了这个症状的来由,解决方案也就显而易见了: 在粘贴的时候把所有自动缩进都关闭,粘贴完毕之后再打开。一个个手工关闭自动缩进未免过于繁琐,vim 为我们提供了一个很好用的命令,只要输入“:set paste”,就可以关闭所有自动缩进。粘贴完毕后再输入“:set nopaste”就可以重新打开原有的自动缩进设置了。

set ai
打开普通文件类型的自动缩进。该自动缩进不如 cindent 智能,但它可以为你编辑非 C/C++ 文件提供一定帮助。

3、其它设置

set selectmode=
不使用 selectmode。

set keymodel=
不使用“Shift + 方向键”选择文本,“Shift + 方向键”代表向指定方向跳一个单词。如果你喜欢这项功能的话,可以使用“set keymodel=startsel,stopsel”打开它。

set selection=inclusive
指定在选择文本时,光标所在位置也属于被选中的范围。如果指定 selection=exclusive 的话,可能会出现某些文本无法被选中的情况。

set wildmenu
在命令模式下使用 Tab 自动补全的时候,将补全内容使用一个漂亮的单行菜单形式显示出来。

colo torte
选择 torte 配色方案。vim 里内置了许多关键字上色的配色方案,另外还可以到网上下载更多配色方案,或是自己编写。点击“编辑”→“调色板”,就能列出所有支持的配色方案。可以把“调色板”子菜单剪下来,然后慢慢选择,挑出一个最喜欢的配色方案来。

折叠

此步骤主要为了美观或在特定场合隐藏部分信息。将光标定位到需要折叠的那一行,然后按Esc键进入普通模式
输入zf2,再按回车,
zf表示折叠,2表示向下折叠2行。

再来将鼠标点到想要那一行(折叠完成后也可以直接按字母j),再次输入zf3,
zf表示折叠,3表示向下折叠3行,按回车,效果又出来了。

重复操作,直到所有的相关行都折叠完。

在手工折叠方式下,保存与加载文件时不会保存加载折叠信息,
这时只需输入一条命令,切换到普通模式(就是按一下Tab上方的~键)。

然后输入:mkview
下次打开文件时只需输入:loadvie就能让折叠样式回来。
感觉很麻烦?没关系,有简便方法。
找到安装Vim的根目录里面的配置文件_vimrc,
用文本编辑器打开此文件,在最后添加如下命(可直接复制粘贴进去)。

set foldmethod=manual "manual为手工折叠方式,不能自动保存折叠信息
au BufWinEnter *.* silent loadview  "每次退出时自动保存折叠信息 主要针对手工折叠
au BufWinLeave *.* silent mkview  "每次打开时自动载入折叠信息 ,主要针对手工折叠

保存并关闭配置文件
下次保存时会自动保存折叠信息,无需输入:mkview与:loadview了。
如果想要查看这些折叠行,这就要用到折叠命令了,
切换到普通模式(就是按一下Tab上方的~键),
将鼠标点到要打开的帐号上,然后输入zo(字母)就可以打开了,
需要关闭就输入zc就OK了(还是在普通模式下)。

折叠命令(普通模式下):
zf2:表示向下折叠2行
zf2G:然后回车,表示从光标所在行开始往下折叠2行数据
zd:表示删除折叠
zD:表示删除折叠及嵌套的折叠
zE:表示删除所有折叠
zo:表示打开光标处的折叠
zO(字母o的大写):对所在范围内所有嵌套的折叠点展开
zc:表示关闭光标处的折叠
zC(字母c的大写):对所在范围内所有嵌套的折叠点进行折叠
zj:表示移动到下一个折叠
zk:表示移动到上一个折叠

"设置代码折叠功能,用空格键控制折叠开关:
set foldenable
set foldmethod=indent
nnoremap @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo'


4、图形界面设置

winpos 99 99 "设置初始界面位置(X,Y)
set lines=39 columns=99 "设置初始界面大小

set nowrap
指定不折行。如果一行太长,超过屏幕宽度,则向右边延伸到屏幕外面。如果使用图形界面的话,指定不折行视觉效果会好得多。

set mousemodel=popup
当右键单击窗口的时候,弹出快捷菜单。

set guioptions+=b
添加水平滚动条。如果你指定了不折行,那为窗口添加一个水平滚动条就非常有必要了。

set guifont=Bitstream\ Vera\ Sans\ Mono\ 9
设置图形界面下的字体。可以点“编辑”→“选择字体”,然后在对话框中选出你喜欢的字体与字号,选择完毕后,先按几下 ESC 确认处在 Normal 模式下,然后输入这条命令:“:set guifont?” 回车后 gvim 屏幕最下方会显示出你当前所用的字体的名称与字号。将获得的结果写到配置文件里面就可以了,需要注意一点,如果字体名称里面含有空格的话,在抄的时候需要在所有空格前面加一个斜杠。

增加多标签模式
习惯了其他编辑工具的多标签,很不习惯gvim的每次打开一个文件就打开一个编辑器,所以做了这个设置,
可以用命令 :tab new 打开多标签,但是这样很不舒服,所以增加右键菜单快捷菜单方式,
直接地注册表的HKEY_CLASSES_ROOT\*\shell下添加项“用 vim 编辑”,
(这里在键值中可以写入“用 gVim 多标签编辑(&g)” 括号内为设置g为快捷键)
再在项“用 vim 编辑”下添加子项“command”,在其右边窗口把其键值设定为:
"d:\freeoa\vim91\gvim.exe" -p --remote-tab-silent "%1"
配置文件中增加
set showtabline=2
set tabpagemax=25

设置字体与配色方案(风格)
点“编辑”-->“选择字体”,然后在字体列表中选择一个合适的字体和字号,然后确认。
如果想每次都使用这个这个字体就需要加到启动文件中:
set guifont=Courier\ New:h13:cANSI
set guifont=Source_Code_Pro:h11

注意'='前后不要有空格,字体名称写出Courier_New:h14也可以,字体名称中有空格的要在空格前面加上'\'。

设置配色方案/风格
点“编辑”-->“配色方案”,然后选择自己喜欢的即可。启动配置文件的写法:
colo desert "配色方案
colorscheme darkblue

GVIM 有一个存放配色方案目录,方案名称就是在 ~/.vim/colors 目录下保存的文件名(不包含扩展名),当然可以换成其他名字。

同一个配色方案,在 gvim 下和字符界面的 vim 下效果大相径庭,这个看个人习惯,在 gvim 下可使用 torte 配色方案,在 vim 下使用 ron 配色方案。因此有必要针对 gvim 和 vim 进行不同的设置。另外,前面在 gvim 下不使用折行,开启水平滚动条,但在 vim 下,是没有滚动条可用的,因此还是有必要为 vim 保留自动折行。

条件选择设置的格式如下:
if (has("gui_running"))
" 图形界面下的设置
set nowrap
set guioptions+=b
colo torte
else
" 字符界面下的设置
set wrap
colo ron
endif


5、文件加密和解密

1).加密文件
用vi(m)建立文件或者打开文件
vim freeoa.txt

文件编辑完成后,在命令行输入:X (注意是大写的X),回车后会提示输入两次密码。此时文件已经加密完成了,可再次在命令行输入保存或者保存退出命令。至此文件加密完成,可以将文件打开测试一下。输入正确的密码可以正常打开。将文件复制到其他的主机上用(g)vim打开也是需要输入正确的密码才可能见其中的内容。因此如果忘记密码,那么这个文件无法打开了。在Win10,使用bash用vi或者vim编辑文件并加密和linux下是同样的效果。输入的密码会被一同加密并存储在文件中。

2).解密文件
解密文件的前提是需要能够用vi(m)正确的打开文件,只有7.3版本以上的Vim才支持文件加密。如果要删除加密文件的密码,只需要打开文件后输入“:X”,按回车键。这时候会提示输入两次密码,每次直接回车,即可解除该加密文件的密码。

警告信息提示保护文件的是弱加密方法,可以看怎么在 Vim 中设置一种强加密方法。

3).弱加密算法问题
为了查看加密方式(cm)集,键入如下:
:help 'cm'

输出样例:
'cryptmethod' *'cm'
'cryptmethod' string (默认 "zip")
全局或本地到缓冲区 |global-local|{not in Vi}
当缓冲区写进文件中所用的加密方式:
*pkzip*
zip  PkZip 兼容方式。一种弱加密方法,与 vim 7.2 及更老版本后向兼容。
*blowfish*
blowfish 河豚加密方式。中级强度加密方法但有实现上的瑕疵。需要 Vim 7.3 及以上版本,用它加密的文件不能被 Vim 7.2 及更老版本读取。它会添加一个 “种子”,当每次写入文件时,这个加密字节都不同,因此安全性也大幅提高。

可以像如下所示的那样给一个 vim 文件设置个新的加密方法(这里用 blowfish2 加密方法)

:setlocal cm=blowfish2
然后键入:wq后回车即可对编辑的文件设置使用强加密算法;关闭再打开对应的文件时应该就看不到那条警告信息了。也可以在打开 vim 文件之后来设置密码,用 :X 命令就能像上面所示的那样去设置一个加密密码。要用强加密方式及强密码来适当的保护那些可能包含了诸如用户名及密码、财务账户信息等机密信息的文本文件。

4).加密功能支持
请保持所使用的 vim 版本支持加密功能,可以使用 vim -version 命令进行查看。
# vim --version | grep -i +cryptv
+cryptv +linebreak +python/dyn +viminfo

blowfish2算法支持
要想支持 blowfish2 算法,vim-enhanced 软件包版本至少要为 7.4.401 版本;如果低于该版本则只能使用安全级别较低的"blowfish"算法。

临时设置相关加密算法
以下设置均在 vim 编辑器内设置,需要自行打开文件后执行以下扩展命令。

设置加密方法
:set cryptmethod=blowfish2

禁用备份:set nobackup

禁用临时文件写入:set nowritebackup

禁用 viminfo 文件:set viminfo=

禁用 .swp 文件创建:set noswapfile

如果需要持久永久保存配置,可将以上内容一并写入到~/.vimrc 文件内。
~/.vimrc
set cryptmethod=blowfish2
set nobackup
set nowritebackup
set viminfo=
set noswapfile


6、为三类临时文件:backup,undo,swap文件指定存放目录

此三类文件分别为备份、撤消、临时文件,作用分别为打开后编辑前的的备份原文件,编辑中的可回退步步骤文件,编辑器未正常关闭(崩溃)的中间文件(正常关闭则不会生成该文件);下文有对此三类文件的原文说明。默认是存放于当前目录下,不过对于管理或观感来说都不太友好;因此可能需要将它们放在一个合适的目录下。

Linux下可在具体的目录(家目录或临时目录)创立这三类文件的专用目录:
mkdir -p ~/.vim/{.backup,.undo,.swp}

在vim的配置文件加入
set undodir=~/.vim/.undo//
set directory=~/.vim/.swp//
set backupdir=~/.vim/.backup//

每类文件还可以提供候选的目录(从前向后依次查找,找到为止,候选目录以英文的逗号分隔):
set backupdir=.backup/,~/.backup/,/tmp//
set directory=.swp/,~/.swp/,/tmp//
set undodir=.undo/,~/.undo/,/tmp//

在Windows下,在路径中使用'\\'来取代'/',如用_backup取代.backup。
set backupdir=.\_backup,.,c:\temp
set directory=.,.\_backup,c:\temp
set backupdir=$TEMP,$TMP,.
set backupdir=$VIMRUNTIME\\temp\\

对于Unix和Win32,如果一个目录以两个路径分隔符结尾,则对应的文件名将从文件的完整路径构建,所有路径分隔符都会替换为百分号“%”。这将确保文件名在该类目录中的唯一性。如:
/home/freeoa/Projects/README.md will be /tmp/%home%freeoa%Projects%README.md


Swap file
.myfile.txt.swp is a swap file, containing the unsaved changes.
While editing a file, you can see which swap file is being used by entering :sw .
The directory option is available in both Vim and Vi.

Backup file
myfile.txt~ is a backup file — the version of myfile.txt before your edited it.
Backups are controlled by the settings of two options: backup and writebackup. Where and how backups are created are controlled by four other options: backupskip, backupcopy, backupdir, and backupext.

Undo file
.myfile.txt.un~ is an undo file, containing the undo trees of the file edited.
This option is also Vim only.

都不想此三类文件被创建
可以在配置文件中关闭它们:
set nobackup
set noswapfile
set noundofile

如果backup和writebackup选项皆为关闭(即nobackup和nowritebackup),Vim不会为编辑会话生成备份文件。如果backup为启用状态,Vim将删除所有旧备份并为当前文件创建新的备份。如果backup是关闭状态,而writebackup是打开状态,Vim会在编辑会话期间创建一个备份文件,编辑结束后删除备份文件。

临时不生成备份文件(~文件)
:set nobackup


7、示例配置文件

下面给出一个推荐 (G)vim 配置文件,里面没有太多个性化的设置,方便大家进一步扩展:
set nocp

" Tab related
set ts=4
set sw=4
set smarttab
set et
set ambiwidth=double

" Format related
set tw=78
set lbr
set fo+=mB

" Indent related
set cin
set ai
set cino=:0g0t0(susj1

" Editing related
set backspace=indent,eol,start
set whichwrap=b,s,<,>,[,]
set mouse=a
set selectmode=
set mousemodel=popup
set keymodel=
set selection=inclusive

" Misc
set wildmenu
set spell

" Encoding related
set encoding=utf-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

" File type related
filetype plugin indent on

" Display related
set ru
set sm
set hls
if (has("gui_running"))
set guioptions+=b
colo torte
set nowrap
else
colo ron
set wrap
endif
syntax on

"===============================
" Platform dependent settings
"===============================

if (has("win32"))

"-------------------------------
" Win32
"-------------------------------

if (has("gui_running"))
set guifont=Bitstream_Vera_Sans_Mono:h9:cANSI
set guifontwide=NSimSun:h9:cGB2312
endif

else

if (has("gui_running"))
set guifont=Bitstream\ Vera\ Sans\ Mono\ 9
endif

endif