转载edyfox的vimrc设置
时间:2006-06-19 来源:colois
==================================================
ZZ from http://edyfox.codecarver.org
==================================================
VIM 中可供用户定制的选项非常非常多, 作为初学者, 我们没有必要了解这么多东西。下面, 滇狐简单列出了一些最常用的配置项, 大家可以根据自己的需要将这些内容添加到自己的 .vimrc 中。
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
搜索时在未完全输入完毕要检索的文本时就开始检索。 vimtutor 对该命令也有过介绍, 滇狐并不喜欢这个功能, 因此滇狐自己的配置文件里是没有这条命令的。 但是周围有朋友很喜欢这个, 因此滇狐还是将它列在这里。 - 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 模式下按右方向键。
- b
- set encoding=cp936
设置当前字符编码为简体中文。 这里还有一段能够自动判断文件的 encoding, 自动选择合适的编码的 .vimrc 代码, 感兴趣的话可以放到自己的配置文件中使用:
" Encoding settings
if has("multi_byte")
" Set fileencoding priority
if getfsize(expand("%")) > 0
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
else
set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
endif
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Use cp936 to support GBK, euc-cn == gb2312
set encoding=cp936
set termencoding=cp936
set fileencoding=cp936
elseif v:lang =~ "^zh_TW"
" cp950, big5 or euc-tw
" Are they equal to each other?
set encoding=big5
set termencoding=big5
set fileencoding=big5
elseif v:lang =~ "^ko"
" Copied from someone's dotfile, untested
set encoding=euc-kr
set termencoding=euc-kr
set fileencoding=euc-kr
elseif v:lang =~ "^ja_JP"
" Copied from someone's dotfile, unteste
set encoding=euc-jp
set termencoding=euc-jp
set fileencoding=euc-jp
endif
" Detect UTF-8 locale, and replace CJK setting if needed
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
2 文本编辑设置
- set sw=4
自动缩进的时候, 缩进尺寸为 4 个空格。 - set ts=4
Tab 宽度为 4 个字符。 - set et
编辑时将所有 Tab 替换为空格。
该选项只在编辑时将 Tab 替换为空格, 如果打开一个已经存在的文件, 并不会将已有的 Tab 替换为空格。 如果希望进行这样的替换的话, 可以使用这条命令“:retab”。
3 断行设置
- set lbr
不在单词中间断行。 设置了这个选项后, 如果一行文字非常长, 无法在一行内显示完的话, 它会在单词与单词间的空白处断开, 尽量不会把一个单词分成两截放在两个不同的行里。 - set fo+=mB
打开断行模块对亚洲语言支持。 m 表示允许在两个汉字之间断行, 即使汉字之间没有出现空格。 B 表示将两行合并为一行的时候, 汉字与汉字之间不要补空格。 该命令支持的更多的选项请参看用户手册。
4 C/C++ 编码设置
- set sm
显示括号配对情况。 打开这个选项后, 当输入后括号 (包括小括号、中括号、大括号) 的时候, 光标会跳回前括号片刻, 然后跳回来, 以此显示括号的配对情况。 - set cin
打开 C/C++ 风格的自动缩进。 打开了自动缩进后, 在编码的时候我们可以使用“V”命令选中一段文本后, 按“=”将这段文本重新调整缩进格式, 在一定程度上起到代码美化的作用。
另外, 打开了自动缩进后, 在使用 TERM 下的 vim 的时, 粘贴代码时常常会出现版式混乱的现象。 那是因为 TERM 并不知道你现在正在粘贴代码, 它直接“粘贴”动作向 vim 解释为键入, 因此 vim 便按照设置的自动缩进格式为你的代码调整了缩进。 不幸的是, 粘贴进去的代码中本身已经包含了缩进, 因此便出现了版式混乱的情况。 在 gvim 中就不会出现这个问题, 因为它能够知道你现在正在粘贴。
知道了这个症状的来由, 解决方案也就显而易见了: 在粘贴的时候把所有自动缩进都关闭, 粘贴完毕之后再打开。 一个个手工关闭自动缩进未免过于繁琐, vim 为我们提供了一个很好用的命令, 只要输入“:set paste”, 就可以关闭所有自动缩进。 粘贴完毕后再输入“:set nopaste”就可以重新打开原有的自动缩进设置了。 - set cino=:0g0t0(sus
设定 C/C++ 风格自动缩进的选项, 这里简要介绍一下这段代码里用到的选项的含义, cino 支持的选项还很多, 更多选项请看用户手册。
// :0
//
// switch 语句之下的 case 语句缩进 0 个空格,也就是说不缩进,与 switch 块平
// 齐,使用这样风格:
switch (x)
{
case 1:
a = b;
break;
default:
}
// g0
//
// class、struct 等之下的访问权限控制语句,如 public、protected、private 等,
// 相对 class、struct 等所在的块缩进 0 个空格,与 class 等块平齐,使用这样的
// 风格:
class foo
{
public:
int a;
private:
int b;
};
// t0
//
// 如果函数返回值与函数名不在同一行,则返回值缩进 0 个空格,也就是说不缩进,如
// 下所示:
// set cino=t4
int
func1()
{
}
// set cino=t0
int
func()
{
}
// (sus
//
// 当一对括号跨越多行时,其后的行缩进前面 sw 指定的距离,效果如下:
int a = (1 + 2 + 3
+ 4 + 5 + 6
+ 7 + 8) * 9;
- set ai
打开普通文件类型的自动缩进。 该自动缩进不如 cindent 智能, 但它可以为你编辑非 C/C++ 文件提供一定帮助。
5 其它设置
- set selectmode=
不使用 selectmode。 - set mousemodel=popup
当右键单击窗口的时候, 弹出快捷菜单。 - set keymodel=
不使用“Shift + 方向键”选择文本, “Shift + 方向键”代表向指定方向跳一个单词。 如果你喜欢这项功能的话, 可以使用“set keymodel=startsel,stopsel”打开它。 - set selection=inclusive
指定在选择文本时, 光标所在位置也属于被选中的范围。 如果指定 selection=exclusive 的话, 可能会出现某些文本无法被选中的情况。 - colo torte
选择 torte 配色方案。 VIM 里内置了许多关键字上色的配色方案, 另外你还可以到网上下载更多配色方案, 或是自己编写。 点击“编辑”→“调色板”, 就能列出所有支持的配色方案。 你可以把“调色板”子菜单剪下来, 然后慢慢选择, 挑出一个你最喜欢的配色方案来。
6 图形界面设置
- set nowrap
指定不折行。 如果一行太长, 超过屏幕宽度, 则向右边延伸到屏幕外面。 如果使用图形界面的话, 指定不折行视觉效果会好得多。 - set guioptions+=b
添加水平滚动条。 如果你指定了不折行, 那为窗口添加一个水平滚动条就非常有必要了。 - set guifont=Courier\ 9
设置图形界面下的字体。 你可以点“编辑”→“选择字体”, 然后在对话框中选出你喜欢的字体与字号, 选择完毕后, 先按几下 ESC 确认处在 Normal 模式下, 然后输入这条命令:“:set guifont?” 回车后 gvim 屏幕最下方会显示出你当前所用的字体的名称与字号。 将获得的结果写到配置文件里面就可以了, 需要注意一点, 如果字体名称里面含有空格的话, 在抄的时候需要在所有空格前面加一个斜杠。
7 条件选择
同一个配色方案, 在 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
====================================================================
以下是滇狐自己的 .vimrc, 有许多根据滇狐自己的习惯做的设置, 如果你要在自己机器上使用的话,请根据你自己的习惯作出相应修改。
另外, 这份 .vimrc 里面有许多设置是针对插件的, 只有安装了相应插件后,这些配置才会起作用。 这里有滇狐使用的全部插件打包,如果需要的话可以直接下载, Linux 用户将该压缩包解压到 $HOME 目录下即可使用, Windows 用户可以将压缩包解压后, 将解压得到的 .vim 文件夹改名为 vimfiles,然后复制到 VIM 的安装路径下, 覆盖原有文件。
"=============================================================================
" General settings
"=============================================================================
set nocp
set ru
set cin
set sm
set ai
set sw=4
set ts=4
set et
set cino=:0g0t0(sus
set lbr
set hls
set backspace=indent,eol,start
set whichwrap=b,s,<,>,[,]
set fo+=mB
set selectmode=
set mousemodel=popup
set keymodel=
set selection=inclusive
set matchpairs+=<:>
" for gdbvim
set noshowcmd
" Encoding settings
if has("multi_byte")
" Set fileencoding priority
if getfsize(expand("%")) > 0
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
else
set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
endif
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Use cp936 to support GBK, euc-cn == gb2312
set encoding=cp936
set termencoding=cp936
set fileencoding=cp936
elseif v:lang =~ "^zh_TW"
" cp950, big5 or euc-tw
" Are they equal to each other?
set encoding=big5
set termencoding=big5
set fileencoding=big5
elseif v:lang =~ "^ko"
" Copied from someone's dotfile, untested
set encoding=euc-kr
set termencoding=euc-kr
set fileencoding=euc-kr
elseif v:lang =~ "^ja_JP"
" Copied from someone's dotfile, unteste
set encoding=euc-jp
set termencoding=euc-jp
set fileencoding=euc-jp
endif
" Detect UTF-8 locale, and replace CJK setting if needed
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
" Cursor movement
nnoremap <Down> gj
nnoremap <Up> gk
vnoremap <Down> gj
vnoremap <Up> gk
inoremap <Down> <C-o>gj
inoremap <Up> <C-o>gk
nnoremap <End> g$
nnoremap <Home> g0
vnoremap <End> g$
vnoremap <Home> g0
inoremap <End> <C-o>g$
inoremap <Home> <C-o>g0
nmap <C-F4> :confirm bd<CR>
vmap <C-F4> <ESC>:confirm bd<Enter>
omap <C-F4> <ESC>:confirm bd<Enter>
map! <C-F4> <ESC>:confirm bd<Enter>
" Move lines
nmap <C-Down> :<C-u>move .+1<CR>
nmap <C-Up> :<C-u>move .-2<CR>
imap <C-Down> <C-o>:<C-u>move .+1<CR>
imap <C-Up> <C-o>:<C-u>move .-2<CR>
vmap <C-Down> :move '>+1<CR>gv
vmap <C-Up> :move '<-2<CR>gv
" Toggle line number
nmap <C-F12> :set nu!<CR>
imap <C-F12> <C-o>:set nu!<CR>
" Toggle spell check
" For VIM7 only
nmap <C-F11> :set spell!<CR>
imap <C-F11> <C-o>:set spell!<CR>
syntax on
if (has("gui_running"))
set nowrap
set guioptions+=b
colo torte
else
set wrap
colo ron
endif
"colois自己搞的一些配置 "设置字体 "可以现在gvim菜单里面选择设置字体,然后用:set guifont? 记下输出结果 "如果字体名称有空格,必须使用"\"来进行转意 "比如set guifont=Bitstream\ sans\ vera set guifont=Consolas:h12
set nu
colorscheme evening
filetype plugin on "map 相关 "map 命令有许多变化形式,每种变化形式所定义的键只在某些模式下有效,而在其它模式 "下无效。你需要根据情况使用正确的变化形式:
":nmap 键只对普通模式有效
":imap 键只对插入模式有效
":vmap 键只对可视模式有效
":cmap 键只在命令行下有效
":map 键在普通模式和可视模式都有效
":map! 键在插入模式和命令行下都有效 "还要注意,如果你定义 :map d di 这将引起循环定义错误。这时,你需要使 "用 :noremap d di 来定义。同样,noremap 也有对不同模式的变化形式。 "比如,你想在文件的每一行的倒数第二个字符处插入字符串“abc”,你可以定义
":nmap $hiabcj
"在普通模式下按一次 将会:光标移到行末,光标左移一格,进入插入模式,输入“a
"bc”,退回到普通模式,光标下移一行。不停地按 将解决问题。这是我临时处理多
"行重复操作的常用手段,当然,这是一种笨办法。:-) 而上文写到的对 的定义
"则是 map 更复杂的用法。你还可以定义
":map :w:!gcc -o %< -I/usr/include/qt -lqt %
":map :!./%<
"实现按 编译当前文件,按 执行。 "在当前目录打开命令提示符
nmap <F12> :shell <CR>
"tab相关
nmap tn :tabnew <CR>
nmap tc :tabclose <CR>
nmap tl :tabprevious <CR>
nmap th :tabnext <CR>
"#include相关
imap #\ #include <><LEFT>
imap #c #include <stdlib.h><CR>#include <stdio.h><CR>#include <string.h><CR>
imap #C #include <iostream><CR>using namespace std;<CR>
"noremap #c #include <stdlib.h> #include <stdio.h> #include <string.h><CR>
============================================================================
" Plugins settings
" ============================================================================
" Sketch
command -nargs=0 ToggleSketch call ToggleSketch()
" WinManager
" let g:winManagerWindowLayout = "FileExplorer"
" Tlist
let Tlist_Use_Right_Window=1
let Tlist_File_Fold_Auto_Close=1
" A
let g:alternateNoDefaultAlternate=1
" VIM7 doesn't support this.
"let g:alternateExtensions_{"aspx"} = "aspx.cs,aspx.CS"
"let g:alternateExtensions_{"aspx.cs"} = "aspx,ASPX"
" LateXSuite
filetype plugin on
set grepprg=grep\ -nH\ $*
" Viki
let g:vikiNameSuffix=".viki"
augr viki
au!
au BufRead,BufNewFile *.viki set filetype=viki
augr END
"=============================================================================
" Functions
"=============================================================================
function TextWork()
set nocin
set nosm
set noai
set tw=78
set sw=8
set ts=8
set nowrap
endfunction
function NoTextWork()
set cin
set sm
set ai
set tw=0
set sw=4
set ts=4
if (!has("gui_running"))
set wrap
endif
endfunction
function CodeWork()
call NoTextWork()
WManager
Tlist
endfunction
function TimeStamp()
let curposn= SaveWinPosn()
%s/\$Date: .*\$/\=strftime("$Date: %Y-%m-%d %H:%M:%S$")/ge
%s/Last Change: .*$/\=strftime("Last Change: %Y-%m-%d %H:%M:%S")/ge
%s/Last Modified: .*$/\=strftime("Last Modified: %Y-%m-%d %H:%M:%S")/ge
" Replace once and never update.
%s/Created: *$/\=strftime("Created: %Y-%m-%d %H:%M:%S")/ge
call RestoreWinPosn(curposn)
endfunction
function AutoTimeStamp()
augr tagdate
au!
au BufWritePre,FileWritePre * call TimeStamp()
augr END
endfunction
call AutoTimeStamp()
function NoAutoTimeStamp()
augr tagdate
au!
augr END
endfunction
"=============================================================================
" Commands
"=============================================================================
command -nargs=0 TextWork call TextWork()
command -nargs=0 NoTextWork call NoTextWork()
command -nargs=0 CodeWork call CodeWork()
command -nargs=0 TimeStamp call TimeStamp()
command -nargs=0 AutoTimeStamp