Vim

简介

我是 Vim 爱好者(但不排斥Emacs),这里收录一些Vim相关的文字。

Vim 是什么?如何下载、安装之类的本身很简单,而且网络上有诸多的介绍,这里不再赘述。至于为什么使用 Vim?我就不劝你了。

传说Vim的学习曲线很陡,确实如此。不过越是陡峭,只要持续付出,每前进一点,就越是有成倍的提升,这是好事。

来源 ^2^

这里是 我的个人vim项目 ,包含有配置文件、部分插件及根据自身习惯改写的资源文件。项目目录结构基本保持和vim安装目录一致,另外有一个 Addons目录 ,主要用来放置和vim有关,但不适合放在Vim安装目录中的资源或工具文件。

我的大部分设置及插件都可以从 _vimrc 中看出端倪,另外也可以参考我写的部分 涉及vim的文章 已失效

精准广告投放

另外我发起了一个 *“Vim 脚本 文档中文计划”* ,欢迎有热忱、有兴趣的朋友参与。

希望相互交流学习,可以加入 *Vim 的 GTalk 群*

教程

选项(Options)

编码(Encoding)

" encoding
set encoding=utf-8
set termencoding=utf-8
if has('win32')
    set fileencoding=chinese
else
    set fileencoding=utf-8
endif
"set fileencodings=ucs-bom,utf-8,chinese,latin-1
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set langmenu=zh_CN.utf-8
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
language messages zh_cn.utf-8

可以参考:

字体(fonts)

if has("win32")
    set guifont=Courier_New:h12:cANSI
    "set guifontwide=YouYuan:h11:cGB2312
endif

Windows gvim 启动时默认激活最大化。

au GUIEnter * simalt ~x

参考 :h gui-win32-maximized 其他操作系统可以参考 在kde中让gvim自动最大化在Gnome下让GVIM自动最大化

设置宽度不明的文字(如 “”①②→ )为双宽度文本 参考

set ambiwidth=double

高亮光标所在行(我选择不改变前景和背景色,只加了一条下划线):

set cursorline
hi cursorline guibg=NONE gui=underline

注:高亮当前行在一定程度上会影响 Vim 的性能,降低缓冲区更新速度。

diff 模式下:

  1. 同步两侧的光标位置;
  2. 设置 <F7> 和 <F8> 分别跳转到上一个不同、下一个不同处,如果不是 diff 模式,则分别设置为 QucikFix 的上一条、下一条信息行。
" @see http://vim.wikia.com/wiki/Selecting_changes_in_diff_mode
if &diff
    let g:origCursorPos=getpos('.')
    autocmd WinEnter * :call setpos('.', g:origCursorPos)
    autocmd WinLeave * :let g:origCursorPos=getpos('.')
    nmap <F7> [c
    nmap <F8> ]c
else
    map <F7> :cp<cr>
    map <F8> :cn<cr>
endif

有一个办法可以让 Vim 的默认寄存器和系统剪贴板共享,在 vimrc 中加入:

" share system clipboard.
set clipboard+=unnamed

由于 Vim 寄存器比系统剪贴板强大太多,为了避免共享时相互干扰,我自己没有这样做。

另外,我不推荐,但是如果你希望 Vim 启动时自动进入插入模式,可以在 vimrc 中加入:

" Set default mode:insert.
exe "startinsert"

映射(Mapping)

普通模式,可视模式和选择模式下使用 <Tab> 和 <Shift-Tab> 键来缩进文本。在可视模式和选择模式下,可以自动恢复选中的文本。

" Normal Mode, Visual Mode, and Select Mode,
" use <Tab> and <Shift-Tab> to indent
" @see http://c9s.blogspot.com/2007/10/vim-tips.html
nmap <tab> v>
nmap <s-tab> v<
vmap <tab> >gv
vmap <s-tab> <gv

选中一段文字并全文搜索这段文字

vnoremap  *  y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR>
vnoremap  #  y?<C-R>=escape(@", '\\/.*$^~[]')<CR><CR>

自动补全成对的括号、引号

"inoremap ( ()<ESC>i
inoremap ( <c-r>=OpenPair('(')<CR>
inoremap ) <c-r>=ClosePair(')')<CR>
"inoremap { {}<ESC>i
inoremap { <c-r>=OpenPair('{')<CR>
inoremap } <c-r>=ClosePair('}')<CR>
"inoremap [ []<ESC>i
inoremap [ <c-r>=OpenPair('[')<CR>
inoremap ] <c-r>=ClosePair(']')<CR>
"inoremap < <><ESC>i
inoremap < <c-r>=OpenPair('<')<CR>
inoremap > <c-r>=ClosePair('>')<CR>
function! OpenPair(char)
    let PAIRs = {
                \ '{' : '}',
                \ '[' : ']',
                \ '(' : ')',
                \ '<' : '>'
                \}
    let ol = len(split(getline('.'), a:char, 1))-1
    let cl = len(split(getline('.'), PAIRs[a:char], 1))-1
    if ol==cl
        return a:char . PAIRs[a:char] . "\<Left>"
    else
        return a:char
    endif
endfunction
function! ClosePair(char)
    if getline('.')[col('.') - 1] == a:char
        return "\<Right>"
    else
        return a:char
    endif
endf

inoremap ' <c-r>=CompleteQuote("'")<CR>
inoremap " <c-r>=CompleteQuote('"')<CR>
function! CompleteQuote(quote)
    let ql = len(split(getline('.'), a:quote, 1))-1
    " a:quote length is odd.
    if (ql%2)==1
        return a:quote
    elseif getline('.')[col('.') - 1] == a:quote
        return "\<Right>"
    else
        return a:quote . a:quote . "\<Left>"
    endif
endfunction

普通模式下使用空格键。

" <Space> key at normal model.
nmap <Space> i<Space><Esc>l

插入模式下使用 Meta 键(Windows下是Alt键)+自定义快捷键来移动光标。

" use Meta key(Windows:Alt) to move cursor in insert mode.
" Note: if system install "Lingoes Translator",
"   you will need change/disabled hot key.
noremap! <M-j> <Down>
noremap! <M-k> <Up>
noremap! <M-h> <left>
noremap! <M-l> <Right>

使用 Windows Explorer 打开当前文件所在文件夹,并选中当前文件。

" Open Windows Explorer and Fouse current file.
"                                      %:p:h     " Just Fold Name.
if has("win32")
nmap <F6> :!start explorer /e,/select, %:p<CR>
imap <F6> <Esc><F6>
command -nargs=0 Explor :!start explorer /e,/select, %:p
command -nargs=0 Explorer :!start explorer /e,/select, %:p
endif

切换 Quickfix 窗口的打开和关闭状态。

nmap <F4> :cw<CR>

默认隐藏菜单栏和工具栏,可以通过 <F12> 切换显示和隐藏。

" Toggle Menu and Toolbar
" @see http://liyanrui.is-programmer.com/articles/1791/gvim-menu-and-toolbar-toggle.html
set guioptions-=m
set guioptions-=T
map <silent> <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>

在保存文件时自动去除无效空白,包括行尾空白和文件最后的空行。

" Remove trailing whitespace when writing a buffer, but not for diff files.
" From: Vigil
" @see http://blog.bs2.to/post/EdwardLee/17961
function RemoveTrailingWhitespace()
    if &ft != "diff"
        let b:curcol = col(".")
        let b:curline = line(".")
        silent! %s/\s\+$//
        silent! %s/\(\s*\n\)\+\%$//
        call cursor(b:curline, b:curcol)
    endif
endfunction
autocmd BufWritePre * call RemoveTrailingWhitespace()

外观(Theme,Color Scheme)

半透明效果,Linux下可以在终端使用Vim。

Syntax

Indent & Formats

插件(Plugins)

来源

技巧 (Tips)

打开、保存文件时,显示文件选择对话框,更多可以 :h browse

:browse w<cr>
:bro e<cr>

其他技巧 (Tips)

Cheat Sheet

集合

Vim 脚本开发

延伸阅读

原生 Vim

Vim Like

Vim Games

书籍(Books)


Learning the Vi and Vim

Vim Cookbook - by Steve Oualline Vim Recipes

社区

幽默 & 文化

来源

來源

来源 ^2^

大图 来源

来源

via: Vim vs. Emacs

来源

via: REAL PROGRAMMERS

请在 Vim 中输入命令: :help! 或使用缩写 :h!

请在 Vim 中输入命令: :h 42 探索生命的意义。

请在 Vim 中输入命令: :h howto 并看文档的最后。

世界上的程序员分三种,
  一种使用 Emacs,
  一种使用 Vim,
  剩余的是其它。
给人一条 Vim 命令,
他能折腾一晚上;
告诉他怎么自定义 Vim 命令,
他能捣腾一辈子.
                -- Emacs

《大腕》编辑器版:

..周围同事不是用 Vim 就是 Emacs , 你要是用一 UltraEdit,你都不好意思跟人家打招呼…
  什么插件呀,语法高亮呀,拼写检查呀,能给它开的都给它开着,就是一个字儿:酷。
你说这么牛B一东西,怎么着学会也得小半年吧。
半年!入门都远着呢,能学会移动光标就不错了,你还别说耗不起,就这还只是左右移动
对我来说 Vi 是禅,
  使用 Vi 就是使用禅。
每个命令都是心印,
  这对用户来说是深奥的,
  对未入门者来说是无法了解的。
每次使用它你都能发现真理。
                --Satish Reddy
商业化产品可能是有用的,
但最好的东西往往是免费的,
空气,水,Vim。