vim配置与使用

date: 2013.05.23; modification:2018.05.16

目录:

1 配置技巧

1.1 vim切换buffer(文件/tab)后仍然保留undo

set hidden

这样在切换buffer(文件/tab)的时候, 之前编辑的文件就只是切换到后台, 而不是关掉, 所以再切换回来, undo历史仍然在, 可以undo.

1.2 指定.swp文件存放路径

当设置了set hidden后, 多buffer切换文件后, 会对每个buffer都产生一个.swp, 这在有些时候会很烦人, 所以可以用如下配置将其指定到特定的目录中(按照从左到右顺序, 找到哪个就存在哪里).

set directory=./.vimswp,/tmp

注意: 以上指定的目录必须事先就存在, vim不会自动去创建它.

不过这种设置我发现有个问题, 就是同名的文件, 只会当打开第一个文件的时候, 会产生.swp, 后面的就不会产生了, 这样后面的编辑如果被意外中断了(如断电), 下次打开就不会提示recover了. 目前该问题我还没有找到解决方法, 如果谁有方法, 烦请发送到页面底部的邮箱告知我, 多谢.

1.3 清除undo历史

配置了set hidden之后的另外一个问题, 就是: 以前我利用切buffer undo历史会清空的特性, 当我需要清除undo历史(比如代码写到某个节点, 已经调通并提交, 需要继续再往下写的时候, 以后再undo的时候, 就不希望回退到在此之前的版本)的时候, 就直接切换到其他文件再切换回来就好了. 但是set hidden之后这样就不行了, 为此, 我在vimrc中增加了如下命令配置:

command! -nargs=0 Cud :set undoreload=0 | edit

这样当需要的时候, 执行一下:Cud命令就好了. ^_^

1.4 vim退出并在下次打开后仍然保留上次的undo历史

" Persistent undo
set undofile
set undodir=$HOME/.vimcache/undo
set undolevels=1000
set undoreload=10000

1.5 map

1.5.1 不同模式下的键盘映射

使用下表中不同形式的map命令,可以针对特定的模式设置键盘映射:

Command Normal Visual Operator Pending Insert Only Command Line
命令 常规模式 可视化模式 运算符模式 插入模式 命令行模式
:map y y y
:nmap y
:vmap y
:omap y
:map! y y
:imap y
:cmap y

1.5.2 清除map

inoremap <esc> <nop>

2 使用技巧

2.1 文件操作

2.2 编辑

2.3 查找

2.4 vim设置窗口title

set title titlestring=MyTitle

2.5 刷新语法高亮

有时候, 上下滚屏后, 会造成语法高亮部分丢失, 如果文件不是很大, 可以考虑全文同步syntax:

syntax sync fromstart

2.6 启动时设置窗口标题

gvim -c 'set titlestring=dss' filename

3 vim中编译, 以及quickfix使用

3.1 使用

vim编译默认是找当前目录下的Makefile来执行命令, 这个默认行为的局限比较大, 适用场景有限, 所以我把它改为了固定调用某个脚本, 这样个需要make的地方, 我都自己建个该脚本去进行具体的编译工作.

set makeprg=./m.sh

这样每次在vim执行make时, 都会去调用当前目录下的m.sh.

3.2 quickfix常用命令:

:cp   跳到上一个错误 ( :help :cp )
:cn   跳到下一个错误 ( :help :cn )
:cl   列出所有错误 ( :help :cl )
:cl    列出所有错误 ( :help :cl )
:cw    如果有错误列表, 则打开quickfix窗口 ( :help :cw )
:col   到前一个旧的错误列表 ( :help :col )
:cnew  到后一个较新的错误列表 ( :help :cnew )

3.3 errorformat自定义

vim中make时, vim会根据其默认的配置, 到make的log中寻找编译错误, 并依据这些错误信息进行跳转. 这些默认配置的匹配项即在errorformat中记录, 可以用set errorformat?命令来查看该选项的值, 可以看到, 它是一个很长的列表.

例一, 忽略warning, 配置如下(可以将次行加入.vimrc中):

set errorformat^=%-G%f:%l:\ %.%#warning:%m

该行配置具体为:

4 常见问题

  1. gvim启动图形界面时报告warning,能启动图形界面但无法正常显示中文菜单

    错误信息: (gvim:3868): Gtk-WARNING **: Invalid input string

    原因: Ubuntu 10.04 Lucid Lynx默认安装将会把中文区域设置为zh_CN.utf8, 而GVim能识别的中文区域设置为zh_CN.utf-8. 因此GVim会在启动时报错, 且无法正常加载中文菜单.

    解决方案:

    cd /usr/share/vim/vim72/lang
    sudo ln -s menu_zh_cn.utf-8.vim menu_zh_cn.utf8.vim
  2. Error: Required vim compiled with +python

    sudo apt-get install vim-nox-py2 vim-gnome-py2

  3. gvim报错dbus

报错内容:

** (gvim:21148): WARNING **: Couldn't register with accessibility bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.

解决: 启动gvim前, 执行:

export NO_AT_BRIDGE=1