我的_vimrc文件
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" User configuration
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" turn off nice effect on status bar title
let performance_mode=0
let use_plugins_i_donot_use=0
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"我们对Vim的描述都假设它是在增强模式下, 所以并不能完全与Vi兼容
"所以首先确保关闭了 "compatible" 选项
set nocompatible
"定义当前的操作系统, 使用不同的系统时, 需要手动修改返回值
"返回值可以为 "win32" / "unix"/ "mac"
function! MySys()
return "win32"
endfunction
"在Vim中执行一些过滤操作需要知道一些shell的有关情况
"如果在使用过滤程序时遇到问题, 可以考虑检查下面一些选项的设置:
" "shell" 指定Vim用于运行过滤程序的shell
" "shellcmdflag" 该shell的参数
" "shellquote" 用于分隔shell与过滤程序时成对包围起过滤程序
" 的字符
" "shellxquote" 用于分隔shell与过滤程序和重定向符号时成对包
" 围起过滤程序和重定向符号的字符
" "shelltype" shell的类型(只对Amiga有用
" "shellslash" 在命令中使用反斜杠(只对MS-Windows)这样的
" 系统有用
" "shellredir" 用于将命令输出重定向到文件的字符串
"
"在Unix上使用过滤程序很少会碰到问题, 因为有两种shell: 'sh'派和
"'csh'派. Vim会检查 "shell" 选项看是否包含了'csh'并自动设置相关的
"选项.
"但在windows上,有很多不同的shell,所以你要手工调整这些选项来让过滤
"功能正常动作.请查看上面这些相关选项的帮助以了解更多信息
if MySys() == "unix" || MySys() == "mac"
"在Unix和类Unix操作系统中使用 "bash" 作为 "shell"
set shell=bash
else
"如果是在windows下使用cygwin, 则修改为cynwin的路径
"set shell=E:cygwininsh
endif
"设置冒号命令和搜索命令的命令历史列表的长度
"历史记录的基本思想是可以用上下箭头键来找回用过的命令.
"
"实际上有四个历史记录, 这里将要提到的是冒号命令历史记录和 "/"
"及 "?" 的搜索命令历史记录, "/" 和 "?"都是搜索命令,所以它们共享
"同一个历史记录, 另外的两类历史记录分别是关于表达式和input()
"函数的输入内容的
"
"假设你用过一次 ":set" 命令, 接着用过10次其他的冒号命令之后又
"想要重复这个 ":set" 命令,你可以按下 ':' 然后按10次上箭头键<Up>,
"更快的办法是:
" ":set<Up>"
"Vim会回到上一次你以'se'开头的命令去,这样你离':set'命令就更
"近了一些,至少一不用按10次上箭头<Up>了(除非这中间的10个冒号
"也都是':set'命令).
"
"上箭头键<Up>会根据目前的键入的命令部分去跟历史记录进行比较,
"只有符合的才会被列出来.如果没有找到,你还可以用下箭头<Down>
"回到刚才输入的部分命令进行修改,或者用Ctrl-U命令全部删除后
"重来.
"
"要查看所有的历史记录,用命令:
" ":history"
"列出的是冒号的历史记录,要查看搜索命令的历史记录,用:
" ":history /"
"
"Ctrl-P效果如同<Up>,唯一的不同是它不会根据你已经键入的部分区
"遍历历史,类似地,<Down>对应物事Ctrl-N"和下箭头键.Ctrl-P代表
"previous,Ctrl-N代表Next
set history=400
"这段命令开启了Vim的三种职能:
"
"1. 自动识别文件类型
"你开始编辑一个文件时,Vim就会自动识别它是何种类型的文件,比
"如说你打开了'main.c',Vim就会根据它的'.c'扩展名知道它是一个
"类型为 "c" 的C语言源程序文件,当你编辑一个文件其第一行是
"'#!bin/sh'时,Vim又可以据此判断它是一个类型为 "sh" 的shell脚
"本文件
"
"2. 用文件类型plugin脚本
"不同的文件类型需要搭配适合它的编辑选项.比如说你在编辑一个
" "c" 文件,那么打开 "cindent" 新非常有用,这些对某种文件类型来
"说最常用的选项可以放在一个Vim中交文件类型plugin的脚本里.
"你还可以加上你自己写的,请参考 "write-filetype-plain".
"
"3. 使用缩进定义文件
"编辑程序的时候,语句的缩进可以让它自动完成.Vim为众多不同的
"文件类型提供了相应的缩进方案.请参考 "filetype-indent-on" 和
" "indentexpr" 选项
filetype on
if has("eval") && v:version>=600
filetype plugin on
filetype indent on
endif
"设置当正在编辑的文件被外部的其它程序所修改后自动在Vim加载
if exists("&autoread")
set autoread
endif
"可以为不同模式分别打开鼠标:
" "n" 普通模式
" "v" 可视模式
" "i" 插入模式
" "c" 命令行模式
" "h" 编辑帮助文件时,所有前面的模式
" "a" 所有前面的模式
" "r" hit-enter 和 more-prompt 提示时
if exists("&mouse")
set mouse=a
endif
"定义 "mapleader"变量
"要定义一个使用 "mapleader" 变量的映射,可以使用特殊字串
" "<Leader>".它会被 "mapleader" 的字符串所替代.如果
" "mapleader" 未设置或为空,则用反斜杠代替,例如:
" ":map <Leader>A oanother line<Esc>"
"和下面一样:
" :map \A oanother line<Esc>
"但是当:
" :let mapleader = ","
"时,又相当于:
" :map ,A oanother line<Esc>
"
"注意: "mapleader" 的值仅当定义映射时被使用.后来改变的
" "mapleader" 不会影响到已定义的映射
let mapleader = ","
let g:mapleader = ","
"设置快速保存
"
" "nmap"表示普通模式下的映射定义,
" ":map" 和 ":map!" 命令为多个模式定义和回显映射.在 Vim 中你可
"以使用 ":nmap", ":vmap", ":omap", ":cmap" 和 ":imap" 命令来对每
"个不同的模式分别定义映射.
"当列出映射时,前面两栏的字符表示 (可有多个):
" 字 符 模 式
" "<Space>" 普通、可视、选择和操作符等待
" "n" 普通
" "v" 可视和选择
" "s" 选择
" "x" 可视
" "o" 操作符等待
" "!" 插入和命令行
" "i" 插入
" "l" 插入、命令行和 Lang-Arg 模式的 ":lmap" 映射
" "c" 命令行
"
" ":xa!" 保存所有修改过的缓冲区,甚至包括只读的,但后退出Vim.不过,
"如果有无名或者其它元婴写入失败的缓冲区,Vim仍然不会退出.
"
" ":w!" 和 ":w" 类似,但即使 "readonly" 已置位或者有其他原因写入被拒
"绝,还是强制写入.
"注意:这可能会改变文件的权限和所有者,或者破坏(符号)连接.但在
" "cpoptions" 里加上 "W" 标志位可以避免这一点.
nmap <leader>x :xa!<cr>
nmap <leader>w :w!<cr>
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Colors and Font
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"打开语法高亮:
" ":syntax enable"
"实际上,它只是执行如下命令:
" ":source $VIMRUNTIME/syntax/syntax.vim"
"
" ":syntax enable" 命令会保持你当前的色彩设置.这样,不管在使用此
"命令的前后,你都可以用 ":highlight" 命令设置你喜欢的颜色.如果你
"希望Vim用缺省值覆盖你自己的,只要用:
" ":syntax on"
if MySys()=="unix"
if v:version<600
if filereadable(expand("$VIM/syntax/syntax.vim"))
syntax on
endif
else
syntax on
endif
else
syntax on
endif
"国际化设置
" "multi_byte" 指韩国语和其他多字节语言支持
if has("multi_byte")
" "fileencodings" 缺省为 "ucs-bom",这是一个字符编码的列表,开始
"编辑已存在的文件时,参考此选项.如果文件被读入,Vim尝试使用本
"列表第一个字符编码.如果检测到错误,使用列表的下一个.如果找
"到一个能用的编码,设置 "fileencoding" 为该值.如果全部失败,
" "fileencoding" 设为空字符串,这意味着使用 "encoding" 的值.
"
"警告:转换可能导致信息的丢失!如果 "encoding" 为 "utf-8" (或者某
"个其它的Unicode变种),那么转换的结果通过逆转换很有可能产生
"相同的文本.相反,如果 "encoding" 不是 "utf-8",一些非ASCII的字符
"可能会丢失.
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
" "v:lang" 运行环境当前的消息locale设置.它使得Vim脚本能得到当
"前使用的语言.技术细节:这就是LC_MESSAGES的值.该值和系统有关.
"
" "=~" 为匹配正则表达式,详细介绍如下表:
" 使用 "ignorecase" 匹配大小写 忽略大小写 ~
"等于 "==" "==#" "==?"
"不等于 "!=" "!=#" "!=?"
"大于 ">" ">#" ">?"
"大于等于 ">=" ">=#" ">=?"
"小于 "<" "<#" "<?"
"小于等于 "<=" "<=#" "<=?"
"匹配正规表达式 "=~" "=~#" "=~?"
"不匹配正规表达式 "!~" "!~#" "!~?"
"相同实例 "is"
"不同实例 "isnot"
"
"设置CJK环境的编码选择
if v:lang =~ "^zh_CN"
set encoding=cp936
set termencoding=cp936
set fileencoding=cp936
elseif v:lang =~ "^zh_TW"
set encoding=big5
set termencoding=big5
set fileencoding=big5
elseif v:lang =~ "^ko"
set encoding=euc-kr
set termencoding=euc-kr
set fileencoding=euc-kr
elseif v:lang =~ "^ja_JP"
set encoding=euc-jp
set termencoding=euc-jp
set fileencoding=euc-jp
endif
"在必要的时候,使用utf-8替代CJK的设置
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
endif
endif
if has('gui_running')
set guifont=InConsolata:h14
endif
" "ambiwidth" 缺省为 "single"
"只有在 "encoding" 和 "utf-8" 或别的Unicode编码时才有效.告诉Vim怎
"么处理东亚二义性宽度字符类(East Asian Width Class Ambiguous)(例
"如欧元符号,注册记号,版权记号,希腊字母,西里尔字母等等)
"
"目前有两个可能的选择:
" "single": 使用和US-ASCII字符相同的宽度.多数用户希望如此.
" "double": 使用US-ASCII字符两倍的宽度
"
"在一些 CJK 字体里,这些字符的字形宽度完全由它们在传统的CJK编码
"里占据字节的数目决定.那些编码中,欧元,注册记号,希腊/西里尔字母
"等占据两个字节,因而它们在这些字体里用'宽'字形显示.这也包括文本
"文件里制表用的一些画线字符.因此如果GUI Vim使用CJK字体,或者在使
"用CJK字体的终端(模拟器)(包括带有 "-cjkwidth" 选项的xterm)里运
"行Vim,应把该选项设为 "double",这样可以匹配这些字体里Vim实际看
"到相关字形的宽度.在Windows 9x/ME 或 Windows 2k/XP 上,如果系统
"locale 为 CJK locale,也应把本选项设为 "double"
if exists("&ambiwidth")
set ambiwidth=double
endif
" "guioptions" 选项只有在 Vim 的 GUI 版本才有效.它是字母的序
" 列,分别描述 GUI 应该使用的部件和选项.
" 建议使用 ":set" 的 "+=" 和 "-=" 特性,这可以避免未来版本增加
" 新的标志位时出现的问题.
"下面是合法的标志位字母:
" "a" 自动选择: 如果存在,无论什么时候启动可视模式或者扩展可
" 视区域,Vim 都试图成为窗口系统全局选择区的拥有者.这意
" 味着可以粘贴高亮的可视文本到其它应用程序甚至 Vim 自身.
" 如果因为在文本之上进行了操作,或者应用程序需要粘贴选择
" 区等原因使得可视区域被终止,高亮文本会被自动抽出到 "*"
" 选择寄存器里.这样,即使在可视模式结束以后,选择区仍然可
" 以被粘贴到别的应用程序.
" 如果不存在,Vim 不会成为窗口系统的全局选择区,除非使用
" "*" 寄存器进行抽出和删除操作,这时该选择区被显式地占有.
" 同样适用无模式的选择.
"
" "A" 自动选择无模式的选择.类似于 "a",但仅限于无模式的选择.
" "guioptions" 自动选择可视 自动选择无模式
" "" -- --
" "a" 是 是
" "A" -- 是
" "aA" 是 是
"
" "c" 简单的选择使用控制台对话框而不是弹出式对话框.
"
" "e" "showtabline" 要求时,加入标签页.
" "guitablabel" 可用来改变标签文本.
" 如果没有 "e",可能使用非 GUI 标签页行.
" 只有一些系统支持 GUI 标签页,现在包括 GTK, Motif,
" Mac OS/X 和 MS-Windows.
"
" "f" 前台: 不用 fork() 从启动外壳分叉出本 GUI 进程.用于
" 需要等待编辑器完成的程序 (例如,e-mail 程序).你也可
" 以用 "gvim -f" 或 ":gui -f" 来在前台启动 GUI.
" 注意: 在 vimrc 文件里设置本选项.读入 gvimrc 文件时
" 分叉操作可能已经发生.
"
" "i" 使用 Vim 图标.GTK 和 KDE 上它出现在窗口的左上角.在
" 非 GTK 的环境上,因为 X11 的限制,它是黑白的.要得到
" 彩色图标,见 "X11-icon"
"
" "m" 使用菜单栏
"
" "M" 不执行系统菜单脚本 "$VIMRUNTIME/menu.vim".
" 注意:本标志位必须在 ".vimrc" 文件里加入,在打开语法
" 或文件类型识别之前 (执行 "gvimrc" 文件时,系统菜单
" 已经载入;而 ":syntax on" 和 ":filetype on" 命令同
" 样会载入菜单).
"
" "g" 灰色菜单项: 使得不活动的菜单项变灰.如果没有包含 "g",
" 不活动的菜单项完全不显示.
" 特例: Athena 总会使用灰色的菜单项.
"
" "t" 包含可撕下的菜单项.目前只用于 Win32, GTK+ 和
" Motif 1.2 GUI.
"
" "T" 包含工具栏.目前只用于 Win32, GTK+, Motif, Photon
" 和 Athena GUI.
"
" "r" 右边的滚动条总是存在.
"
" "R" 如有垂直分割的窗口,右边的滚动条总是存在.
"
" "l" 左边的滚动条总是存在.
"
" "L" 如有垂直分割的窗口,左边的滚动条总是存在.
"
" "b" 底部的 (水平) 滚动条总是存在.它的大小取决于最长的可
" 见行,或者如果包含 'h' 标志位的话,光标所在的行.详情
" 可见 "gui-horiz-scroll"
"
" "h" 限制水平滚动条的大小为光标所在行的长度,以减少计算量.
" 是的,如果你真的想要,左右两边都可以有滚动条.详情可见
" "gui-scrollbars"
"
" "v" 对话框使用垂直的按钮布局.如果不包含,倾向使用水平布
" 局,但如果空间不够,还是用垂直的布局.
"
" "p" 使用 X11 GUI 的指针回调.有些窗口管理器需要.如果光标
" 不闪烁或者在一定场合下变空,考虑增加此标志位.必须在
" 启动GUI 之前完成.在你的 "gvimrc" 里设置.在 GUI 启动
" 后增加或删除不会有任何效果.
"
" "F" 增加信息页脚.只适用于 Motif.见 "gui-footer".
if has("gui_running")
set guioptions-=m " 关闭菜单栏
set guioptions-=T " 关闭工具栏
set guioptions-=l " 关闭左边滚动条
set guioptions-=L " 关闭垂直分隔窗口左边滚动条
set guioptions-=r " 关闭右边滚动条
set guioptions-=R " 关闭垂直分隔窗口右边滚动条
if MySys()=="win32"
" "autocmd" / "au" 定义自动命令
"注意: ":autocmd" 命令不能有其他命令紧跟其后,因为"|"
"命令是该命令的一个组成部分.
"
" ":au[tocmd] [group] {event} {pat} [nested] {cmd}"
"把 {cmd} 加到 Vim 在匹配 {pat} 模式的文件执行 {event}
"事件时自动执行的命令列表.Vim 把 {cmd} 加到已有的自动
"命令之后,从而使自动命令的执行顺序与其定义的顺序相同.
"关于 [nested],参见 "autocmd-nested".
"注意 ":autocmd" 的参数里的特殊字符 (例如, "%", "<cword>")
"在定义时不会被扩展,而是在事件发生并执行 {cmd} 的时候才
"进行.唯一的例外是 "<sfile>" 在定义时扩展.
"
" "GUIEnter" 成功启动 GUI 并打开窗口后自动命令事件.用
" gvim 的时候,它在 VimEnter 之前发生.在 .gvimrc 里可用
" 它来定位窗口:
" ":autocmd GUIEnter * winpos 100 50"
"
" "si" / "simalt" 模拟 Alt-{key} 组合键.
" ":si[malt] {key}"
" {仅适用 Win32 版本}
"
"正常情况下,为了增加键映射 (map) 的数量,Vim 控制所有
"Alt-{key} 组合键.但是这样做可能与用 Alt-{key} 访问菜单
"的标准方法冲突.一个快速的解决办法是:设置 "winaltkeys"
"选项的值为 "yes".但是这样阻止了所有与Alt 键有关的映射.
"另一个办法是:设置 "winaltkeys" 选项为 "menu".这样与菜
"单有关的快捷键有 Windows 管理,其余的与 Alt 相关的映射
"仍然好用.但这样又产生了对当前状态的依赖性.
"要解决这个问题,就要用 ":simalt" 命令告诉 Vim
"( "winaltkeys" 不要设置为 "yes") 虚拟一个 Windows 风
"格的 Alt 按键行为.你可以用它来映射 Alt 组合键 (或者任
"何其它键) 来产生标准的 Windows 操作.下面是一些例子:
" ":map <M-f> :simalt f<CR>"
"这个命令通过把 Alt-F 映射为模拟按键的 Alt 和 F,使你按
"下 Alt-F 时弹出 "文件" 菜单 (对于缺省的 Menu.vim 而言)
" ":map <M-Space> :simalt ~<CR>"
"这个命令通过映射 Alt-Space 弹出 Vim 窗口的系统菜单.
"注意: ~ 在 simalt 命令里代表 <Space> (空格).
" ":map <C-n> :simalt ~n<CR>"
"把 CTRL-N 映射成 Alt-Space + N.也就是打开窗口的系统菜
"单,然后按 N,最小化 Vim窗口
"
"这个选项是模拟弹出菜单中使用最大化的快捷键 "x"
if has("autocmd")
au GUIEnter * simalt ~x
endif
endif
" "colorscheme" / "colo" 载入色彩方案
" ":colo[rscheme] {name}"
"载入色彩方案 {name}.
"它会在 'runtimepath' 里搜索 "colors/{name}.vim",载入第一
"个找到的文件.
"要看到当前激活的色彩方案的名字 (如果有的话):
" ":echo g:colors_name"
"它不能递归调用,所以你不能在色彩方案脚本里使用 ":colorscheme"
"色彩方案载入后"激活 "ColorScheme" 自动命令事件.关于如何
"编写色彩方案文件的信息:
" ":edit $VIMRUNTIME/colors/README.txt"
if v:version > 601
colorscheme torte
endif
else
if v:version > 601
colorscheme torte
endif
endif
"当打开的文档中含有多种语言的时候,单一使用某一种文件类型的高亮
"方式必然会非常难看,比如说一个介绍J2EE的文件,里面必然有Java的代
"码,也会存在很多XML的代码,这个时候需要随时切换不同的高亮方案
map <Leader>1 :set syntax=java<CR>
map <Leader>2 :set syntax=c<CR>
map <Leader>3 :set syntax=xhtml<CR>
map <Leader>4 :set syntax=python<CR>
map <Leader>5 :set ft=javascript<CR>
map <Leader>0 :syntax sync fromstart<CR>
"用 "cursorline" 高亮光标所在的屏幕行.用于方便定位光标.屏幕刷新
"会变慢.
"激活可视模式时,为了容易看到选择的文本,不使用此高亮.
if has("gui_running")
if exists("&cursorline")
set cursorline
endif
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Fileformat
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" "fileformats" / "ffs"
"给出换行符(<EOL>)的格式,开始编辑新缓冲区或者读入文件到已有的缓
"冲区时,尝试这些格式:
" - 如果为空,总是使用 "fileformat"定义的格式.不自动设置该选项.
" - 如果设为一个名字,总是为打开的新缓冲区使用该格式,也为该缓
" 冲区相应地设置 "fileformat".文件读入已有的缓冲区时,使用
" "fileformats" 给出的名字,不管该缓冲区设定的 "fileformat"
" 是什么.
" - 如果给出多于一个以逗号分隔的名字,读入文件时会进行自动
" <EOL>检测.
" 开始编辑文件时,这样检查 <EOL>:
" 1. 如果所有行都以 <CR><NL> 结尾,而 "fileformats" 包含
" "dos" 的话, "fileformat" 设为 "dos".
" 2. 如果找到一个<NL>而 "fileformats" 包含 "unix"的话,
" "fileformat"设为 "unix".注意 如果找到的 <NL> 没有前
" 导 <CR>, "unix" 比 "dos" 优先.
" 3. 如果 "fileformats" 包含 "mac". "fileformat" 设为 "mac".
" 这意味着 "mac" 只有在没有给出 "unix" 或者在文件里没有
" 找到 <NL>,并且没有给出 "dos" 或者没有在文件里找到
" <CR><NL> 时才会使用.如果先选择 "unix",但第一个 <CR> 出
" 现在第一个 <NL> 之前,而文件里的 <CR> 比 <NL> 多的话,
" "fileformat" 也设为 "mac".
" 4. 如果还是不能设置 "fileformat",使用 "fileformats" 的第
" 一个名字.
" 读入文件到已有的缓冲区时,完成相同的步骤,但如同 "fileformat"
" 已经为该文件合适地设置过,不改变该选项.
"如果置位 "binary",不使用 "fileformats" 的值.
"
" 对于使用 DOS 类型的 <EOL> (<CR><NL>) 的系统来说,读入待执行的脚本
"( ":source" ) 或者 vimrc 文件时,可能进行自动 <EOL> 的检测:
" - 如果 "fileformats" 为空,没有自动检测.使用 DOS 格式.
" - 如果 "fileformats" 设为一到多个名字,进行自动检测.它基于文
" 件中的第一个 <NL>: 如果在它之前有一个 <CR>,使用 DOS 格式,
" 不然,使用 Unix格式.
" 另见 |file-formats|.
"为了后向兼容: 如果设置此选项为空字符串或者单一格式 (没有包含逗号),
"复位 "textauto",否则置位 "textauto".
"注意: 如果置位 "compatible",本选项被设为 Vi 的缺省值.相反,如果复位
" "compatible",本选项被设为 Vim 的缺省值.
set fileformats=unix,dos,mac
"给出当前缓冲区的 <EOL> 格式,用于从文件读入缓冲区和把缓冲区写回文件:
" "dos" <CR> <NL>
" "unix" <NL>
" "mac" <CR>
"
"MS-DOS,MS-Windows,OS/2 的缺省: "dos",
"Unix 缺省: "unix",
"Macintosh 缺省: "mac"
"
"如果使用 "dos",文件尾的 CTRL-Z 被忽略.
"见 "file-formats" 和 "file-read|"
"文件使用的字符编码见 "fileencoding".
"如果设置 "binary",忽略 "fileformat" 的值.文件输入/输出如同它被设为
" "unix" 那样.
"文件开始编辑时,如果 'fileformats' 非空而 'binary' 关闭,本选项被
"自动设置.
"开始编辑文件后,如果设置该选项, "modified" 选项被置位,因为文件被认为
"和当初写入时已经不同.
"本选项在 "modifiable" 关闭时不能改变.
"
"为了后向兼容: 如果本选项设为 "dos",置位 "textmode",否则,复位之.
"
"这里的意思是定义快速转换文件格式的快捷键映射
nmap <leader>fd :set ff=dos<cr>
nmap <leader>fu :set ff=unix<cr>
nmap <leader>fm :set fm=unix<cr>
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => VIM userinterface
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" "scrolloff" / "so" (缺省为 0) 光标上下两侧最少保留的屏幕行数
"这使你工作时总有一些可见的上下文.我们这里设置的主要用处其实是
"可以用鼠标单击屏幕的前N行或者后N行来直接进行屏幕的上下滚动.对
"于习惯了鼠标操作的用户来说将会非常的方便.
"
"如果你设置此选项为很大的值 (比如 999),光标所在的行将总定位在
"窗口的中间位置 (除非你非常靠近文件开始或者结束的地方,或者有长
"行回绕).
"水平滚动见 'sidescrolloff'.
"注意: 如果置位 'compatible',该选项被设为 0.
set so=0
" "wildmenu" / "wmnu" (缺省关闭) 命令行补全以增强模式运行
" {仅当编译时加入 "+wildmenu" 特性才有效}
" "wildmenu" 打开时,命令行补全以增强模式运行,按下 "wildchar"
" (通常是 <Tab>) 启动补全.这时,在命令行的上方显示可能的匹配,
" 然后高亮首个匹配 (如果有状态行,覆盖之).显示前项/后项匹配的
" 热键,如 <Tab> 或 CTRL-P/CTRL-N,移动高亮到合适的匹配上.
"
" 使用 "wildmode" 时,指定 "full" 会启用 "wildmenu" 模式.
" "longest" 和 "list" 则不会启动 "wildmenu" 模式.
"
" 如果多个匹配超过一行,在右侧显示 ">" 和/或在左侧显示 "<".需
" 要的话,滚动状态行.
"按下不用于选择补全项的键时,放弃 "wildmenu" 模式.
"
" "wildmenu" 激活时,下面的键有特殊含义:
" "<Left>" / "<Right>" 选择前项/后项匹配 (类似于
" CTRL-P/CTRL-N)
" "<Down>" 文件名/菜单名补全中: 移进子目录
" 和子菜单.
" "<CR>" 菜单补全中,如果光标在句号之后:
" 移进子菜单.
" "<Up>" 文件名/菜单名补全中: 上移到父目
" 录或父菜单.
"
"这使得控制台上有菜单可用 "console-menus"
"如果你喜欢 <Left> 和 <Right> 键移动光标而不是选择不同的匹
"配,用:
" ":cnoremap <Left> <Space><BS><Left>"
" ":cnoremap <Right> <Space><BS><Right>"
"
" "WildMenu" 高亮用于显示当前匹配 "hl-WildMenu".
set wildmenu
" "ruler" / "ru" (缺省关闭) 标尺
" {仅当编译时加入 "+cmdline_info" 特性才有效}
"显示光标位置的行号和列号,逗号分隔.如果还有空间,在最右端显
"示文本在文件中的相对位置:
" "Top" 首行可见
" "Bot" 末行可见
" "All" 首末两行都可见
" "45%" 文件中的相对位置
"如果设置 "rulerformat",它决定标尺的内容.
"每个窗口都有自己的标尺.如果窗口有状态行,标尺在那里显示.否
"则,它显示在屏幕的最后一行上.如果通过 "statusline" 给出状
"态行 (亦即,非空),该选项优先于 "ruler" 和 "rulerformat".
"如果显示的字符数不同于文本的字节数 (比如,TAB 或者多字节字
"符),同时显示文本列号 (字节数) 和屏幕列号,以连字符分隔.
"空行显示 "0-1"
"空缓冲区的行号也为零: "0,0-1"
"如果置位 "paste" 选项,本选项被复位.
"如果你不想一直看到标尺但想知道现在在哪里,使用 "g CTRL-G"
"注意: 如果置位 "compatible",该选项被复位
set ruler
" "cmdheight" / "ch" (缺省为 1) 命令行使用的屏幕行数
"有助于避免 "hit-enter" 提示.
"此选项值保存在每个标签页里,从而每个标签页可有不同的值.
set cmdheight=2
" ":nu" / ":number" 显示行号
" ":[range]nu[mber] [count] [flags]"
"和 ":print" 相同,但每行之前显示行号 (也参见 "highlight"
"和 "numberwidth" 选项).
set nu
" "lazyredraw" / "lz" (缺省关闭)
"如果置位本选项,执行宏,寄存器和其它不通过输入的命令时屏
"幕不会重画.另外,窗口标题的刷新也被推迟.要强迫刷新,使用
" ":redraw".
set lz
" "hidden" / "hid" (缺省关闭)
"如果关闭, "abandon" 放弃时卸载缓冲区.如果打开, "abandon"
"放弃时隐藏缓冲区.当然,如果缓冲区仍然在别的窗口里显示,
"它不会被隐藏.
"在缓冲区列表里移动的命令有时会隐藏缓冲区,即使关闭 "hidden"
"选项也是如此,条件是: 缓冲区被修改过, "autowrite" 关闭
"或者不能写入,并且使用 "!" 标志位.另见 "windows.txt".
"
"如果只想隐藏一个缓冲区,使用 "bufhidden" 选项.
" ":hide {command}" 为单个命令关闭本选项 ":hide".
"警告: 对隐藏缓冲区的修改很容易忘记. ":q!" 或 ":qa!" 时
"三思而后行!
set hid
" "backspace" / "bs" (缺省为 "")
"影响 <BS>,<Del>,CTRL-W 和 CTRL-U 在插入模式下的工作方
"式.它是逗号分隔的项目列表.每个项目允许一种退格删除的内
"容:
" 值 效果
" "indent" 允许在自动缩进上退格
" "eol" 允许在换行符上退格 (连接行)
" "start" 允许在插入开始的位置上退格;CTRL-W 和
" CTRL-U 到达插入开始的位置时停留一次.
"
"如果该值为空,使用 Vi 兼容的退格方式.
"
"为了和 5.4 及更早的版本后向兼容:
" 值 效果
" "0" 等同于 ":set backspace=" (Vi 兼容)
" "1" 等同于 ":set backspace=indent,eol"
" "2" 等同于 ":set backspace=indent,eol,start"
"
"如果你的 <BS> 或 <Del> 键不合你的期望,见 ":fixdel".
"注意: 如果置位 "compatible",该选项被设为 "".
set backspace=eol,start,indent
" "whichwrap" / "ww" (Vim 缺省: "b,s",Vi 缺省: "")
"使指定的左右移动光标的键在行首或行尾可以移到前一行
"或者后一行.连接这些字符,可以让所有指定的键都有此功能:
" 字符 键 模式
" "b" <BS> 普通和可视
" "s" <Space> 普通和可视
" "h" "h" 普通和可视 (不建议)
" "l" "l" 普通和可视 (不建议)
" "<" <Left> 普通和可视
" ">" <Right> 普通和可视
" "~" "~" 普通
" "[" <Left> 插入和替换
" "]" <Right> 插入和替换
"只允许光标键进行回绕.
"如果移动键和删除和改变操作符一起使用时,<EOL> 也被看作一个
"字符.这使得光标跨过行尾时, "3h" 和 "3dh" 效果不同."这也适
"用于 "x" 和 "X",因为它们分别和 "dl" 以及 "dh" 相同.如果这
"么用,你可能想用映射 ":map <BS> X"来使退格"键删除光标之前的
"字符.
"如果包含 'l',位于行尾时如果在操作符之后使用它,不会移动到下
"一行.这样 "dl", "cl", "yl" 等都能正常工作.
"注意: 如果置位 "compatible",本选项被设为 Vi 的缺省值.相反,
"如果复位 "compatible",本选项被设为 Vim 的缺省值.
set whichwrap+=<,>,h,l
" "incsearch" / "is" (缺省关闭)
"{仅当编译时加入 "+extra_search" 特性才有效}
"输入搜索命令时,显示目前输入的模式的匹配位置.
"匹配的字符串被高亮.如果该模式不合法或者没有匹配,不显示任何
"东西.屏幕会经常刷新,所以只有对快速终端,这才有意义.
"注意:会显示匹配,但如果找不到匹配和按 <Esc> 的时候,光标会回
"到原来的位置.你仍然需要用 <Enter> 完成搜索命令才会移动光标
"到匹配位置.
"编译时加入 "+reltime" 特性时,Vim 只会搜索大概半秒钟.如果模
"式太过复杂和/或有很多文本存在,不一定能找到匹配.这是为了避免
"Vim 在输入模式的时候挂起.
"
"可以用 "highlight" 的 "i" 标志位设置高亮.另见: "hlsearch".
" "CTRL-L" 可用来在命令行上给当前匹配之后增加一个字符.
" "CTRL-R" / "CTRL-W" 可用来在当前匹配的尾部增加单词,排除
" 已经输入的部分.
"注意: 如果置位 "compatible",该选项被复位.
set incsearch
"某些字符在模式中是按本义出现的.它们匹配自身.然而,当前面有一
"个反斜杠时,这些字符具有特殊的含义.
"
"另外一些字符即使没有反斜杠也代表特殊的意思,它们反而需要一个
"反斜杠来匹配按本义出现的自身.
"
"一个字符是否按本义出现取决于 "magic" 选项以及下面将解释的条
"目.
"使用 "\m" 会使得其后的模式的解释方式就如同设定了 "magic" 选
"项一样.而且将忽略 "magic" 选项的实际值.
"使用 "\M" 会使得其后的模式的解释方式就如同设定了 "nomagic"
"选项一样.
"
"使用 "\v" 会使得其后的模式中所有 '0'-'9','a'-'z','A'-'Z'
"和 '_' 之外的字符都当作特殊字符解释.
"使用 "\V" 会使得其后的模式中只有反斜杠有特殊的意义.
"
"示例:
"在这之后: \v \m \M \V 匹配
" 'magic' 'nomagic'
" $ $ $ \$ 匹配行尾
" . . \. \. 匹配任何字符
" * * \* \* 前面匹配原的任意次重复
" () \(\) \(\) \(\) 组成为单个匹配原
" | \| \| \| 分隔可选分支
" \a \a \a \a 字母字符
" \\ \\ \\ \\ 反斜杠 (按本义)
" \. \. . . 英文句号 (按本义)
" \{ { { { '{' (按本义)
" a a a a 'a' (按本义)
"
"{仅 Vim 支持 \m,\M,\v 和 \V}
"
"建议始终将 "magic"选项保持在缺省值 - "magic".这可以避免移
"植性的麻烦.要使模式不受该选项值的影响,在模式前面加上 "\m"
"或 "\M".
set magic
"设置Vim静音
" "errorbells" / "eb" (缺省关闭)
"错误信息响铃 (鸣叫或屏幕闪烁).只有对错误信息有意义.很多没有消息的错误
"也会使用该响铃 (比如,普通模式里按 <Esc>).
"
" "visualbell" / "vb" (缺省关闭)
"使用可视响铃代替鸣叫.显示可视响铃的终端代码由 "t_vb" 给出.如果既不想
"要响铃也不想要闪烁,使用 ":set vb t_vb=".
"注意: GUI 启动时,'t_vb' 复位为缺省值.你可能想在 |gvimrc| 里再次设置之.
"在 GUI 里, "t_vb" 缺省为 "<Esc>|f",反转显示 20 毫秒.如果你想使用别的
"时间,可设 "<Esc>|40f",其中 40 是毫秒计的时间.
"在 Amiga 上没有用,你总会得到屏幕闪烁.
set noerrorbells
set novisualbell
set t_vb=
" "showmatch" / "sm" (缺省关闭)
"插入括号时,短暂地跳转到匹配的对应括号.只有在屏幕上能看到匹配时才会进
"行跳转.显示匹配的时间用 "matchtime" 设置.
"如果没有匹配会响铃 (和匹配能否看到无关).置位 "paste" 时,复位本选项.
"如果 "cpoptions" 里没有 "m" 标志位,接着输入字符会立即把光标移动到它应
"该在的位置.
" "guicursor" 的 "sm" 域说明显示匹配时,如何设置光标形状和闪烁.
" "matchpairs" 选项可指定显示匹配所用的字符.用 "rightleft" 和 "revins"
"查找反方向的匹配.
"移动时要高亮匹配,另见 matchparen 插件 "pi_paren.txt".
set showmatch
" "matchtime" / "mat" (缺省为 5)
"如果置位 'showmatch',显示配对括号的十分之一秒数.
"注意 这不是毫秒数.
set mat=4
" "hlsearch" / "hls" (缺省关闭)
"{仅当编译时加入 "+extra_search" 特性才有效}
"如果有上一个搜索模式,高亮它的所有匹配.使用高亮的类型可以用 "highlight"
"选项的 "l" 位设置.缺省,使用 "Search" 高亮组.
"注意: 只有匹配的文本被高亮,位移此处不予考虑.
"另见: "incsearch" 和 ":match".
"
"如果你厌倦总是看到高亮匹配,用 ":nohlsearch" 或者 ":noh" 可以暂时关闭.
"一旦使用搜索命令,高亮会重新出现.
"
" "redrawtime" 指定寻找匹配会花费的最大时间.
"如果搜索模式可以匹配换行符,Vim 会试图高亮所有的匹配文本.不过,这依赖
"于搜索从哪里开始.如果是窗口的第一行,或者关闭折叠之下的第一行,那么从
"它们不会显示的上一行开始的匹配不会在新显示的行上继续.
"注意: 如果置位 "compatible",该选项被复位.
set hlsearch
""""""""""""""""""""""""""""""
" => Statusline
""""""""""""""""""""""""""""""
"格式化状态栏
if performance_mode
else
" "laststatus" / "ls" (缺省为 1)
"本选项的值影响最后一个窗口何时有状态行:
" "0" 永不
" "1" 只有在有至少两个窗口时
" "2" 总是
"如果你有多个窗口,有状态行会使屏幕看起来好一些,但它会占据一个屏幕行.
set laststatus=2
" "statusline" / "stl" (缺省为空)
"{仅当编译时加入 "+statusline" 特性才有效}"
"如果非空,本选项决定状态行的内容.另见 "status-line"
"
"此选项包含 printf 风格的 '%' 项目,中间可以间杂普通文本.每个状态行项
"目有如下形式:
" "%-0{minwid}.{maxwid}{item}"
"除了 {item} 以外,每个字段都是可选的.单个百分号可以用 "%%" 给出.最多
"可给出 80 个项目.
"
"如果此选项以 "%!" 开始,它用作表达式.计算此表达式的结果用作选项值.例
"如:
" ":set statusline=%!MyStatusLine()"
"返回值可以包含 %{} 项目,它还会被继续计算下去.
"
"如果计算选项时有错误,会把它清空以防将来继续出错.否则屏幕更新会陷入循
"环.
"
"注意 如果设置本选项 (并且 "laststatus" 为 2 的话), "ruler" 的唯一效
"果是控制 "CTRL-G" 的输出.
"
" 域 含义
" "-" 左对齐项目.如果 minwid 大于项目的长度,缺省是右对齐.
" "0" 数值项目前面用零填补. '-' 更优先.
" "minwid" 项目的最小宽度,以 '-' 和 '0' 补空.该值不能超过 50.
" "maxwid" 项目的最大宽度.如果超过,在文本项目的左侧截短,以'<'代
" 替.数值项目则往下移到 maxwid-2 个数位,然后跟 '>'number,
" 其中的 number 是丢失的数位,这非常类似于指数记法.
" "item" 单个字符的代码,下面给出描述.
"
"下面是可能状态行项目的描述.其中,"项目" 的第二个字符代表类型:
" "N" 代表数值型
" "S" 代表字符串型
" "F" 代表下面描述的标志位
" "-" 不适用
"
"项目 含义
"f S 缓冲区的文件路径,保持输入的形式或相对于当前目录.
"F S 缓冲区的文件完整路径.
"t S 缓冲区的文件的文件名 (尾部).
"m F 修改标志位,文本是 "[+]";若 "modifiable" 关闭则是 "[-]".
"M F 修改标志位,文本是 ",+" 或 ",-".
"r F 只读标志位,文本是 "[RO]".
"R F 只读标志位,文本是 ",RO".
"h F 帮助缓冲区标志位,文本是 "[help]".
"H F 帮助缓冲区标志位,文本是 ",HLP".
"w F 预览窗口标志位,文本是 "[Preview]".
"W F 预览窗口标志位,文本是 ",PRV".
"y F 缓冲区的文件类型,如 "[vim]".见 "filetype".
"Y F 缓冲区的文件类型,如 ",VIM".见 "filetype'".
" {仅当编译时加入 "+autocmd" 特性才有效}
"k S "b:keymap_name" 的值或使用 ":lmap" 映射时的 "keymap":
" "<keymap>".
"n N 缓冲区号.
"b N 光标所在字节的值.
"B N 同上,以十六进制表示.
"o N 光标所在字节在文件中的字节偏移,第一个字节为 1.
" 助记: 从文件开始的偏移 (Offset) (加上 1)
" {仅当编译时加入 "+byte_offset" 特性才有效}
"O N 同上,以十六进制表示.
"N N 打印机页号.(只用于 'printheader" 选项.)
"l N 行号.
"L N 缓冲区里的行数.
"c N 列号.
"v N 虚拟列号.
"V N 虚拟列号,表示为 -{num}.如果等于 "c" 的值,不显示.
"p N 行数计算在文件位置的百分比,如同 "CTRL-G" 给出的那样.
"P S 显示窗口在文件位置的百分比,类似于 "ruler" 描述的百分比.长度
" 总是为 3.
"a S 参数列表状态,就像缺省标题里的那样.({current} of {max})
" 如果参数列表里的文件数为零或一,空字符串.
"{ NF 计算 "%{" 和 "}" 之间的表达式,并返回其结果替代.注意 结束的
" "}" 之前没有 "%".
"( - 项目组的开始.可以用来为某组项目设置宽度和对齐.后面某处必须有
" "%)".
") - 项目组的结束.不能指定宽度域.
"T N 用于 'tabline': 标签页 N 标签的开始.最后一个标签之后用 "%T".
" 鼠标点击时用此信息.
"X N 用于 "tabline": 关闭标签页 N 标签的开始.最后一个标签之后用
" "%T".
" 例如: "%3Xclose%X",用 "%999X" 来代表 "关闭当前标签页" 那个符
" 号.鼠标点击时用此信息.
"< - 如果行过长,在什么地方截短.缺省是在开头.不能指定宽度域.
"= - 左对齐和右对齐项目之间的分割点.不能指定宽度域.
"# - 设置高亮组.必须后面跟名字,然后又是 "#".这样, "%#HLname#" 代
" 表高亮组 HLname.包括非当前窗口的状态行都使用相同的高亮组.
"* - 设置高亮组为 User{N},其中的 {N} 取自 minwid 域,比如 %1*.用
" %* 或者 %*0 可以恢复 normal 高亮.User{N} 和 StatusLine 的区
" 别也会应用到非当前窗口的状态行使用的 StatusLineNC 上.
" 数字 N 必须从 1 到 9.见 "hl-User1..9"
"
"显示标志位时,如果它紧跟在普通文本之后,Vim 删除之前的前导逗号.这使得
"下面例子里使用的标志位显示看起来很舒服.
"
"如果组内的所有项目都是空字符串 (比如,标志位没有设置) 而该组没有设置
"minwid,整个组成为空字符串.这使得下面这样的组完全从状态行上消失,如果
"没有标志位被置位的话.
" ":set statusline=...%(\ [%M%R%H]%)..."
"要小心,每次显示状态行时都要计算此表达式.当前缓冲区和当前窗口会临时设
"为目前要显示的状态行所属的窗口 (缓冲区),而表达式会使用此上下文计算.
"变量 "actual_curbuf" 被设为实际的当前缓冲区的 "bufnr()" 号.
"
"可能在沙盘 "sandbox" 里计算 "statusline" 选项.见 "sandbox-option".
"
"计算 "statusline" 时不允许修改文本或者跳到其它窗口 "textlock".
"
"如果状态行在你希望时没有更新 (如在设置完表达式里使用的某变量之后),设
"置选项可以强制进行更新而无须更改其值.例如:
" ":let &ro = &ro"
"
"如果结果全是数字,用作显示时把它作为数值处理.否则结果作为文本,并应用
"上面描述的规则.
"
"小心表达式里的错误.它们可能使 Vim 不可用!
"如果你被困住,按住 ':' 或 'Q' 来得到提示,然后退出并用 "vim -u NONE"
"来编辑 .vimrc 或者别的什么地方,以修正问题.
"
"示例:
"模拟 "ruler" 设置的标准状态行
" ":set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P"
"类似,但加上光标所在字符的 ASCII 值 (类似于 "ga")
" ":set statusline=%<%f%h%m%r%=%b\ 0x%B\ \ %l,%c%V\ %P"
"显示字节偏移和字节值,用红色标记已修改标志位.
" ":set statusline=%<%f%=\ [%1*%M%*%n%R%H]\ %-19(%3l,%02c%03V%)%O'%02b'"
" ":hi User1 term=inverse,bold cterm=inverse,bold ctermfg=red"
"如果载入的是压缩文件,显示 ,GZ 标志
" ":set statusline=...%r%{VarExists('b:gzflag','\ [GZ]')}%h..."
"并在 |:autocmd| 里:
" ":let b:gzflag = 1"
"或:
" ":unlet b:gzflag"
"还要定义此函数:
" ":function VarExists(var, val)"
" ": if exists(a:var) | return a:val | else | return '' | endif"
" ":endfunction"
set statusline=
set statusline+=%2*%-3.3n%0*\ "缓冲器名
set statusline+=%f\ "文件名
set statusline+=%h%1*%m%r%w%0* "标记符
set statusline+=[
if v:version >= 600
set statusline+=%{strlen(&ft)?&ft:'none'}, "文件类型
set statusline+=%{&encoding}, "编码类型
endif
set statusline+=%{&fileformat}] "文件格式
if filereadable(expand("$VIM/vimfiles/plugin/vimbuddy.vim"))
set statusline+=\ %{VimBuddy()} "添加VimBuddy插件
"这个插件会在状态栏上加一个笑脸,鼻子会随着光标移动而改变
endif
set statusline+=%= "左右对齐的分割点
set statusline+=%F\ "文件的完整路径
set statusline+=%2*0x%-8B\ "16进制表示当前字符
set statusline+=%-14.(%l,%c%V%)\ %<%P "偏移量
" special statusbar for special windows
if has("autocmd")
au FileType qf
\ if &buftype == "quickfix" |
\ setlocal statusline=%2*%-3.3n%0* |
\ setlocal statusline+=\ \[Compiler\ Messages\] |
\ setlocal statusline+=%=%2*\ %<%P |
\ endif
fun! FixMiniBufExplorerTitle()
if "-MiniBufExplorer-" == bufname("%")
setlocal statusline=%2*%-3.3n%0*
setlocal statusline+=\[Buffers\]
setlocal statusline+=%=%2*\ %<%P
endif
endfun
if v:version>=600
au BufWinEnter *
\ let oldwinnr=winnr() |
\ windo call FixMiniBufExplorerTitle() |
\ exec oldwinnr . " wincmd w"
endif
endif
" "titlestring" (缺省为 "") 设置窗口标题栏
"{仅当编译时加入 "+title" 特性才有效}
"如果此选项不为空,用来设置窗口的标题.只有在 "title" 选项打开时才会发
"生.
"只有终端支持设置窗口标题时才可用 (目前有 Amiga 控制台,Win32 控制台,
"所有的 GUI 版本和带有非空的 "t_ts" 选项的终端).
"如果 Vim 编译时定义 HAVE_X11,在可能的情况下恢复原来的标题 "X11".
"如果本选项包含 printf 风格的 "%" 项目,依照 "statusline" 使用的规则
"进行扩展.
"例如:
" ":auto BufEnter * let &titlestring = hostname() . "/" . expand("%:p")"
" ":set title titlestring=%<%F%=%l/%L-%P titlelen=70"
" "titlelen" 的值用来在可用空间的中间或右侧对齐项目.
"有的人喜欢文件名放在前面:
" ":set titlestring=%t%(\ %M%)%(\ (%{expand(\"%:~:.:h\")})%)%(\ %a%)"
"注意 "%{ }" 的使用,以及用于得到不含文件名的文件名路径的表达式.只有在
"必要时, "%( %)" 构造才会加入分隔的空格.
"注意: "titlestring" 使用特殊字符可能会使显示引起混乱 (比如,如果它包含
"CR 或者 NL 字符的话).
"{仅当编译时加入 "+statusline" 特性才有效}
if has('title') && (has('gui_running') || &title)
set titlestring=
set titlestring+=%f\ "文件名
set titlestring+=%h%m%r%w "标记符
set titlestring+=\ -\ %{v:progname} "程序名
endif
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Moving around and tab
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Map space to /
map <space> /
"为窗口跳转重新定义键映射
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l
"Tab configuration
map <leader>tn :tabnew %<cr>
map <leader>tc :tabclose<cr>
map <leader>tm :tabmove
if v:version>=700
set switchbuf=usetab
endif
if exists("&showtabline")
set stal=2
endif
"Moving fast to front, back and 2 sides ;)
imap <m-$> <esc>$a
imap <m-0> <esc>0i
imap <D-$> <esc>$a
imap <D-0> <esc>0i
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General Autocommand
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Switch to current dir
map <leader>cd :cd %:p:h<cr>
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Parenthesis/bracket expanding
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
vnoremap $1 <esc>`>a)<esc>`<i(<esc>
")
vnoremap $2 <esc>`>a]<esc>`<i[<esc>
vnoremap $3 <esc>`>a}<esc>`<i{<esc>
vnoremap $$ <esc>`>a"<esc>`<i"<esc>
vnoremap $q <esc>`>a'<esc>`<i'<esc>
vnoremap $w <esc>`>a"<esc>`<i"<esc>
"Map auto complete of (, ", ', [
"http://www.vim.org/tips/tip.php?tip_id=153
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General Abbrev
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Comment for C like language
if has("autocmd")
au BufNewFile,BufRead *.js,*.htc,*.c,*.tmpl,*.css ino $c /**<cr> **/<esc>O
endif
"My information
ia xdate <c-r>=strftime("%d/%m/%y %H:%M:%S")<cr>
"iab xname Amir Salihefendic
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Editing mappings etc.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Remap VIM 0
map 0 ^
"Move a line of text using control
nmap <M-j> mz:m+<cr>`z
nmap <M-k> mz:m-2<cr>`z
vmap <M-j> :m'>+<cr>`<my`>mzgv`yo`z
vmap <M-k> :m'<-2<cr>`>my`<mzgv`yo`z
if MySys() == "mac"
nmap <D-j> <M-j>
nmap <D-k> <M-k>
vmap <D-j> <M-j>
vmap <D-k> <M-k>
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Buffer realted
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Fast open a buffer by search for a name
"map <c-q> :sb
"Open a dummy buffer for paste
map <leader>q :e ~/buffer<cr>
"Restore cursor to file position in previous editing session
set viminfo='10,"100,:20,%,n~/.viminfo
"用 "rot13" 编码整个文件
" "gg" 到文件首行首字符, "V" 进入Visual-Line模式, "G"到文件末行首字符,
"这样就选中了整篇文章,然后 "g?" 就是用 "rot13" 编码整个文件
"
"关于 "rot13":
" "ROT13" 是一种简单的编码,它把字母分成前后两组,每组13个,编码和译码的
" 算法相同,仅仅交换字母的这两个部分,即:
" [a..m] --> [n..z] 和 [n..z] --> [a..m]
" "ROT13" 用简易的手段使得信件不能直接被识别和阅读,也不会被搜索匹配程
" 序用通常的方法直接找到.经常用于 USENET 中发表一些攻击性或令人不快的
" 言论或有简单保密需要的文章.
" 由于 "ROT13" 是自逆算法,所以,译码和编码是同一个过程.
map <F9> ggVGg?
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Files and backup
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" "backup" / "bk" (缺省关闭) 覆盖文件前创建一个备份.
"文件成功写入后保留该备份.如果你不想保留备份文件,但希望写入期间能有备
"份,复位该选项并置位 "writebackup" 选项(这是缺省行为).如果你完全不想
"要备份文件,同时复位两个选项 (如果你的文件系统差不多满了,这会有用).更
"多的解释可见 "backup-table".
"如果匹配 "backupskip" 模式,无论如何都不会建立备份.
"如果设置 "patchmode",备份文件会换名成为文件的旧版本.
"注意: 如果置位 "compatible",该选项被复位.
"
" "writebackup" / "wb" (有 "+writebackup" 特性时缺省打开,否则缺省关闭)
"覆盖文件前建立备份.文件成功写入后,除非 "backup" 选项也被打开,删除该备
"份.如果你的文件系统几乎已满,复位此选项. "backup-table" 还有相关的解释.
"如果 "backupskip" 模式匹配,无论如何都不会建立备份.
"注意: 如果置位 "compatible", 该选项被设为缺省值.
set nobackup
set nowritebackup
" "swapfile" / "swf" (缺省打开)
"缓冲区使用交换文件.如果不想为特定缓冲区使用交换文件,可以复位本选项.
"例如,包含即使 root 也不应得到的机密信息.要小心: 所有的文本都在内存:
" - 不要在大文件里使用.
" - 无法恢复!
"交换文件只有在 "updatecount" 不为零并且置位 "swapfile" 时才会存在.
"复位 "swapfile" 时,立即删除当前缓冲区的交换文件.如果置位 "swapfile"
"并且 "updatecount" 非零,立即建立交换文件.
"另见 "swap-file"和 "swapsync".
"
"此选项可以和 "bufhidden" 和 "buftype" 一起使用,指定特殊类型的缓冲区.
"见 "special-buffers"
set noswapfile
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Folding
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" "foldenable" / "fen" (缺省打开)
"{仅当编译时加入 "+folding" 特性才有效}
"如果关闭,所有的折叠都被打开.本选项用于在文本显示的完全打开折叠和保留
"折叠之间 (包括手动打开或关闭的折叠) 快速切换."zi" 命令切换本选项.
"如果 "foldenable" 关闭, "foldcolumn" 会保持空白.
"建立新折叠或者关闭折叠的命令置位本选项.见 "folding".
"
"折叠方法
"可用选项 "foldmethod" 来设定折叠方法.
"设置选项 "foldmethod" 为非 "manual" 的其它值时,所有的折叠都会被删除并
"且创建新的.如果设置成 "manual",将不去除已有的折叠.可以利用这一点来先
"自动定义折叠,然后手工调整.
"
"有 6 种方法来选定折叠:
" "manual" 手工定义折叠
" "indent" 更多的缩进表示更高级别的折叠
" "expr" 用表达式来定义折叠
" "syntax" 用语法高亮来定义折叠
" "diff" 对没有更改的文本进行折叠
" "marker" 对文中的标志折叠
"
"选取了折叠方式后,我们就可以对某些代码实施我们需要的折叠了,由于我使用
" "indent" 稍微多一些,故以它的使用为例:
"如果使用了 "indent"方式,vim会自动的对大括号的中间部分进行折叠,我们可
"以直接使用这些现成的折叠成果.
"在可折叠处(大括号中间):
" "zc" 折叠
" "zC" 对所在范围内所有嵌套的折叠点进行折叠
" "zo" 展开折叠
" "zO" 对所在范围内所有嵌套的折叠点展开
" "[z" 到当前打开的折叠的开始处
" "]z" 到当前打开的折叠的末尾处
" "zj" 向下移动.到达下一个折叠的开始处.关闭的折叠也被计入.
" "zk" 向上移动到前一折叠的结束处.关闭的折叠也被计入."
if exists("&foldenable")
set fen
set foldmethod=indent
endif
" "foldlevel" / "fdl" (缺省: 0) 设置代码折叠级别
"{仅当编译时加入 "+folding" 特性才有效}
"设置折叠级别: 高于此级别的折叠会被关闭.
"设置此选项为零关闭所有的折叠.更高的数字关闭更少的折叠.
" "zm", "zM" 和 "zR" 等命令设置此选项.
"见 "fold-foldlevel".
if exists("&foldlevel")
set fdl=0
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Text option
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" "expandtab" / "et" (缺省关闭)
"插入模式里: 插入 <Tab> 时使用合适数量的空格.如果 "autoindent" 打开,
" ">" 和 "<" 命令使用空格进行缩进. "expandtab" 打开时,要插入实际的制
"表,可用 CTRL-V<Tab>.另见 ":retab" 和 "ins-expandtab".
"注意: 如果置位 "compatible",该选项被复位.
set expandtab
" "shiftwidth" / "sw" (缺省为 8)
"(自动) 缩进每一步使用的空白数目.用于 "cindent", ">>", "<<" 等.
set shiftwidth=4
" "softtabstop" / "sts" (缺省为 0)
"执行编辑操作,如插入 <Tab> 或者使用 <BS> 时,把 <Tab> 算作空格的数目.
"感觉上,你就像使用单个 <Tab> 一样,而实际上使用的是空格和 <Tab> 的混
"合.这可以用来维持 "ts" 的设置为标准值 8 不变,但编辑时感觉就像它被设
"为 "sts" 那样.不过, "x" 这样的命令仍然会在实际的字符上操作.
"如果 "sts" 为零,关闭此特性.
"
"如果置位 "paste" 选项, "softtabstop" 被设为 0.
"另见 "ins-expandtab". 如果没有置位 "expandtab",通过使用 <Tab>,使空
"格数目减到最小.
" "cpoptions" 里的 "L" 标志位改变制表在 "list" 置位时的使用方式.
"注意: 如果置位 "compatible",该选项被设为 0.
set softtabstop=4
" "tabstop" / "ts" (缺省为 8)
"文件里的 <Tab> 代表的空格数.另见 ":retab" 命令和 "softtabstop" 选项.
"
"注意: 设置 "tabstop" 为不同于 8 的值可能使你的文件在很多地方看起来不
"正确 (比如,打印时).
"
"Vim 里有四个主要的使用制表的方法:
"1. 总是保持 "tabstop" 为 8,设置 "softtabstop" 和 "shiftwidth" 为 4
" (或 3 或任何你想要的) 然后用 "noexpandtab".这时,Vim 使用制表和空
" 格的混合,但输入 <Tab> 或 <BS> 键就像每个制表占用 4 (或 3) 个字符
" 一样.
"2. 设置 "tabstop" 和 "shiftwidth" 为想要的任何值,然后用 "expandtab".
" 这样,你总是插入空格.改变 "tabstop" 时绝不会影响排版.
"3. 设置 "tabstop" 和 "shiftwidth" 为想要的任何值,然后用 "modeline",
" 再次编辑时就会重新设置这些值.这只适用于总是使用 Vim 进行文件编辑
" 的情况.
"4. 永远把 "tabstop" 和 "shiftwidth" 设为相同的值,并用 "noexpandtab".
" 这样,就可以 (只适用于行首的缩进) 使用任何别人的制表位设置.不过,
" 如果你这么做,最好在第一个非空白字符之后想插入制表时以空格代替.否
" 则,改变 "tabstop" 时,注释等的对齐会不正确.
set tabstop=4
" "smarttab" / "sta" (缺省关闭)
"如果打开,行首的 <Tab> 根据 "shiftwidth" 插入空白. "tabstop" 或
" "softtabstop" 用在别的地方.<BS> 删除行首 "shiftwidth" 那么多的空白.
" 如果关闭,<Tab> 总是根据 "tabstop" 或 "softtabstop" 决定插入空白的数\
" 目. "shiftwidth" 只用于文本左移或右移 "shift-left-right".
" 插入空白的具体方式 (制表还是空格) 取决于 "expandtab" 选项.另见
" "ins-expandtab".如果没有置位 "expandtab",通过使用 <Tab>,使空格数目
" 减到最小.
" 注意: 如果置位 "compatible",该选项被复位.
set smarttab
" "linebreak" / "lbr" (缺省关闭)
"{仅当编译时加入 "+linebreak" 特性才有效}
"如果打开,Vim 会在 "breakat" 里的字符上,而不是在屏幕上可以显示的最后
"一个字符上回绕长行.和 "wrapmargin" 和 "textwidth" 不同,此处不会插入
"<EOL>,它只影响文件的显示方式,而不是其内容. "showbreak" 的值会出现在
"回绕行的前面.
"
"如果 "wrap" 选项关闭或 "list" 打开,不使用本选项.
"注意 <EOL> (屏幕上的) 之后的 <Tab> 字符在多数情况下.不会显示正确数量
"的空格.
set lbr
""""""""""""""""""""""""""""""
" => Indent
""""""""""""""""""""""""""""""
" "autoindent" / "ai" (缺省关闭) 启用自动缩进
"开启新行时 (插入模式下输入 <CR>,或者使用 "o" 或 "O" 命令),从当前行复
"制缩进距离.如果你在新行除了 <BS> 或 CTRL-D 以外不输入任何东西,然后输
"入 <Esc>,CTRL-O 或 <CR>,缩进又被删除.移动光标到其它行也有同样的效果,
"除非 "cpoptions" 里包含 'I' 标志位.
"如果打开自动缩进,排版 (用 "gq" 命令或者插入模式下到达了 "textwidth")
"使用第一行的缩进距离.
"打开 "smartindent" 或 "cindent" 时,缩进的修改方式有所不同.
"置位 "paste" 选项时, "autoindent" 选项被复位.
"{Vi 稍有不同: Vim 里输入 <Esc> 或 <CR> 删除缩进后,上下移动把光标放在
"删除的缩进之后;Vi 则把光标放在已删除的缩进的某处}.
set autoindent
" "smartindent" / "si" (缺省关闭) 开启新行的自动缩进
"{仅当编译时加入 "+smartindent" 特性才有效}
"开启新行时使用智能自动缩进.适用于 C 这样的程序,但或许也能用于其它语
"言. "cindent" 类似,它多数情况下更好,但更严格,见 "C-indenting".如果
"打开 "cindent", 置位 "si" 没有效果.
" "indentexpr" 是更高级的替代方案.
"通常,使用 "smartindent" 时也应该打开 "autoindent".
"
"在这些情况下自动插入缩进:
" - "{" 结束的行后.
" - "cinwords" 中的某个关键字开始的行后.
" - "}" 开始的行前 (只有使用 "O" 命令才会).
"在新行第一个输入的字符如果是 "}",该行使用匹配的 "{" 相同的缩进.
"在新行第一个输入的字符如果是 "#",该行的缩进被删除, "#" 被放到第一列.
"下一行上,恢复原来缩进.如果你不想这么做,使用下面的映射:
" ":inoremap # X^H#"
"其中的 ^H 用 CTRL-V CTRL-H 输入.
"使用 ">>" 命令时,'#' 开始的行不右移.
"注意: 如果置位 "compatible",复位 "smartindent".如果置位 "paste",关
"闭这里的智能缩进功能.
set si
" "cindent" / "cin" (缺省关闭) 打开自动 C 程序的缩进
"{仅当编译时加入 "+cindent" 特性才有效}
" "cinkeys" 说明如何设置插入模式下启动重新缩进的热键, "cinoptions"
"说明如何设置你喜欢的缩进风格.
"如果 "indentexpr" 非空,它否决 "cindent" 的设置.
"如果没有打开 "lisp",而 "indentexpr" 和 "equalprg" 都为空, "=" 操作
"符使用本算法缩进,而不调用外部程序.
"见 "C-indenting".
"
"如果你不喜欢 'cindent' 的工作方式,可以试试 "smartindent" 选项或者
" "indentexpr".
" 如果置位 "paste",不使用本选项.
" 注意: 如果置位 "compatible",本选项被复位.
if has("cindent")
set cindent
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Spell checking
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
map <leader>sn ]
map <leader>sp [
map <leader>sa zg
map <leader>s? z=
""""""""""""""""""""""""""""""
" => VIM
""""""""""""""""""""""""""""""
if has("autocmd") && v:version>600
au BufRead,BufNew *.vim map <buffer> <leader><space> :w!<cr>:source %<cr>
endif
""""""""""""""""""""""""""""""
" => HTML related
""""""""""""""""""""""""""""""
" HTML entities - used by xml edit plugin
let xml_use_xhtml = 1
"let xml_no_auto_nesting = 1
"To HTML
let html_use_css = 0
let html_number_lines = 0
let use_xhtml = 1
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => MISC
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Windows系统的换行符为\r\n,而Linux/Unix系统则为\n.因此,在Windows里编辑
"过的文本文件到了Linux/Unix里,每一行都会多出一个^M.
"命令中的 "^M" 是通过键入 <ctrl-v><enter> 或 <ctrl-v><ctrl-m> 生成的.
"可以在用以下命令清除该字符:
"noremap <leader>m :%s/\r//g<CR>
"设置 'omnifunc' 选项。如:
if has("autocmd")
au Filetype java setlocal omnifunc=javacomplete#Complete
au Filetype html setlocal omnifunc=htmlcomplete#CompleteTags
au FileType css setlocal omnifunc=csscomplete#CompleteCSS
au FileType c setlocal omnifunc=ccomplete#Complete
au FileType php setlocal omnifunc=phpcomplete#CompletePHP
au FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
endif
"进行Tlist的设置
"TlistUpdate可以更新tags
map <F3> :silent! Tlist<CR>
let Tlist_Ctags_Cmd="\"C:\\Program Files (x86)\\Vim\\vim74\\ctags.exe\""
let Tlist_Use_Right_Window=1
let Tlist_Show_One_File=0
let Tlist_File_Fold_Auto_Close=1
let Tlist_Exit_OnlyWindow=1
let Tlist_Process_File_Always=1
let Tlist_Inc_Winwidth=0
let g:showfuncctagsbin = "\"C:\\Program Files (x86)\\Vim\\vim74\\ctags.exe\""
"进行NerdTree的设置
map <F4> :silent! NERDTree<CR>
" 按F8按钮,在窗口的左侧出现taglist的窗口,像vc的左侧的workpace
"nnoremap <silent> <F8> :TlistToggle<CR><CR>
nnoremap <F10> :silent! TlistToggle<CR>
" :Tlist 调用TagList
let Tlist_Show_One_File=0 " 只显示当前文件的tags
let Tlist_Exit_OnlyWindow=1 " 如果Taglist窗口是最后一个窗口则退出Vim
let Tlist_Use_Right_Window=1 " 在右侧窗口中显示
let Tlist_File_Fold_Auto_Close=1 " 自动折叠
"Paste toggle - when pasting something in, don't indent.
"set pastetoggle=<F3>
"移除空行的缩进
map <F2> :%s/s*$//g<cr>:noh<cr>''
"Super paste
ino <C-v> <esc>:set paste<cr>mui<C-R>+<esc>mv'uV'v=:set nopaste<cr>
"To hex modle 转化为16进制方式显示
let s:hexModle = "N"
function! ToHexModle()
if s:hexModle == "Y"
%!xxd -r
let s:hexModle = "N"
else
%!xxd
let s:hexModle = "Y"
endif
endfunction
map <leader>h :call ToHexModle()<CR>
"Fast reloading of the _vimrc 快速重load配置文件
map <silent> <leader>ss :source c:\Program Files (x86)\Vim\_vimrc<CR>
"Fast editing of the _vimrc 快速打开编译配置文件
map <silent> <leader>ee :e c:\Program Files (x86)\Vim\_vimrc<CR>
"When _vimrc is edited, reload it
autocmd! bufwritepost _vimrc source c:\Program Files (x86)\Vim\_vimrc
"matchit 匹配%操作
:source C:\Program Files (x86)\Vim\vim74\macros\matchit.vim
"可视化的buffer操作
let g:bufExplorerDefaultHelp=1
let g:bufExplorerDetailedHelp=1
map <leader>be :BufExplorer <CR>
map <leader>bs :BufExplorerHorizontalSplit <CR>
map <leader>bv :BufExplorerVerticalSplit <CR>
"html.vim设置
:let g:html_indent_script1 = "inc"
:let g:html_indent_style1 = "inc"
:let g:html_indent_inctags="html,body,head,tbody,p"
"mapping 全能补全
"如果下拉菜单弹出,回车映射为接受当前所选项目,否则,仍映射为回车
"inoremap <expr> <CR> pumvisible()? "<C-Y>":"<CR>"
"如果下拉菜单弹出,CTRL-J映射为在下拉菜单中向下翻页,否则映射为CTRL-X CTRL-O
"inoremap <expr> <C-J> pumvisible()? "<PageDown><C-N><C-P>":"<C-X><C-O>"
"如果下拉菜单弹出,CTRL-K映射为在下拉菜单中向上翻页,否则不变
"inoremap <expr> <C-K> pumvisible()? "<PageUp><C-P><C-N>":"<C-K>"
set completeopt=longest,menu,preview
"SuperTab插件设置
let g:SuperTabDefaultCompletionType="<C-X><C-O>"
"vundle设置 这是一个用于自动下载、安装、管理、清除vim插件的工具
set nocompatible " be iMproved
filetype off " required!
set rtp+=~/vimfiles/bundle/vundle
let path='~/vimfiles/bundle'
call vundle#rc(path)
"let Vundle manage Vundle
"required! <br>
Bundle 'gmarik/vundle'
"original repos on github<br>Bundle 'mattn/zencoding-vim'
"vim-scritps repos
Bundle 'L9'
Bundle 'FuzzyFinder'
Bundle 'Mark'
Bundle 'bufexplorer.zip'
Bundle 'The-NERD-tree'
Bundle 'taglist.vim'
Bundle 'matrix.vim'
Bundle 'The-NERD-Commenter'
Bundle 'matchit.zip'
"Bundle 'AutoComplPop'
Bundle 'jsbeautify'
Bundle 'YankRing.vim'
Bundle 'autoclose'
"Bundle 'supertab'
Bundle 'csharp.vim'
Bundle 'sharp-Plugin-Added'
Bundle 'sharp-Indent'
Bundle 'python.vim'
Bundle 'Pydiction'
filetype plugin indent on "required!
"save session file
set sessionoptions-=curdir
set sessionoptions+=sesdir
noremap <F7> :mks! WorkingSession.vim<CR>:wviminfo Working.viminfo<CR>
noremap <F6> :source WorkingSession.vim<CR>:rviminfo Working.viminfo<CR>
"对搜索的设置
"map ft :call Search_Word()<CR>:cw<CR>
"function Search_Word()
"let w = expand("<cword>") " 在当前光标位置抓词
"execute "vimgrep " w " **"
"endfunction
"
"for Pydiction
let g:pydiction_location = '~/vimfiles/bundle/Pydiction/complete-dict'