岸波白野和咕哒子:一个牛人的vi设置 - join的日志 - 网易博客

来源:百度文库 编辑:偶看新闻 时间:2024/04/25 22:43:36

一个牛人的vi设置

linux使用   2010-01-03 10:25   阅读54   评论0   字号:    

[code]

"指定ctags搜寻tags的路径

set tag=tags;../tags;../../tags;../../../tags;../../../../../tags;../../../../../../tags;../../../../../../../../tags;

"指定一个tab键的缩进距离为4,默认为8

set tabstop=4 "when you click TAB,indent 4 character

"将tab键扩展为空格。例如这里你按一个tab键就相当于输入4个空格。这对python这种缩进对齐的语言很有用处

"有的朋友可能认为这样会造成删除一个tab的时候需要按4次backspace,不方便。其实只需要按ctrl-d就可以了

set expandtab "use replace

"当文件为c和cpp时不将tab展开成空格

au Filetype c,cpp set noexpandtab

"将背景设置为dark,这会使你vi中的文字看上去比较亮。另一种是light模式,会使文字比较暗

set background=dark "this let comment line more light

"当你输入')','}',']'时,自动和前一个与之对应的'(','{','['匹配(用emacs的朋友肯定很熟悉这个功能)

set showmatch " let '(','{','[' can auto match by ')','}',']'

"设置匹配时间,太长了会让人觉得慢

set matchtime=2 " set matchtime = 10ms

"在normal模式时显示命令。命令显示在右下角

set showcmd

"显示行号

set nu "show line number at front

"智能搜索。在你搜索时,匹配你己经键入的字符。如果你认为已经找到需要的内容了,按enter键结束

set incsearch "when you serach, searching characters which you have entered

"当文本超过80个字符自动断行。它不会自动截断代码,但会截断注释。我就是用它来限制我每行注释不超过80个字符

set textwidth=80 "warp when more than 80 characters

"用set list命令可以查看文本中的tab键和空格键。但默认的符号太丑了,这个将tab键的显示换成 >---

set listchars=tab:>-,trail:- "when you enter 'set list', TAB will shown as '>---'

"在右下角显示当前光标所在的行号和列号

set ruler

"始终在屏幕下方显示状态栏。状态栏会显示文件名称、光标位置等等信息(有点类似emacs中那个)

set laststatus=2 "show status in bottom

"有些时候vim,特别是vim7安装后backspace键失灵。下面这个语句就是解决这个问题的

set bs=2 "this fix backspace cannot use in vim70

"高亮显示搜索结果

set hlsearch

"自动完成。在输入模式输入#b或者#e敲space键,就会用/*********或***********/替换。感觉没什么用

iab #b /*************************************************************************

iab #e **************************************************************************/

"打开智能缩进。这个是vi三种缩进中最聪明的一种。对写程序很方便

set cindent shiftwidth=4

filetype indent on

"key mapping table

"高亮搜索后,被选中的文本会一直高亮,这里定义快捷键ctrl-h,消除高亮

nmap :noh

"ctrl-c,打开vi自带的简易计算器

imap =

"用于cscope,当用cscope创建了tags后,在你光标所在的函数上

"按ctrl-] ctrl-[会跳转到该函数的调用处

map :cs f 3

"NOTICE: default is forntly delete in insert mode

"下面6个映射用于在不退出输入模式的情况下移动光标

"具体方法就是同时按下ctrl和光标移动键(h or j or k or l)

"crtl-b,ctrl-w等同于normal模式下的b和w(前移一个单词和后移一个单词)

"注意,ctrl-h在输入模式下默认等同于backspace键(这和在shell下是一样的)

"另外,ctrl-e在输入模式默认是按照下一行的内容输入,很有用,所以注释掉了的映射

"最后,这6个映射对用小键盘上下左右移动光标的朋友无用

imap h

imap j

imap k

imap l

"imap e

imap b

imap w

"buffer operation

"缓冲区操作快捷键。用emacs的朋友都知道emacs下各缓冲区间切换是很方便的,vi中也可以这样做

"这些快捷键特别适合在一个vi窗口中编辑多个文件

"ctrl-n 切换到下一缓冲区

nmap :bn

"ctrl-p 切换到上一缓冲区

nmap :bp

"ctrl-l 显示所有缓冲区

nmap :ls

"ctrl-k 删除当前缓冲区

nmap :bd

"下面这个映射用于跳转到指定缓冲区。在用ctrl-l查看了所有缓冲区列表后,按t,再输入刚才列表中显示的缓冲区编号,

"回车即可跳到指定缓冲区

nmap t :b

"open preview window

"和ctags配合使用。用ctags创建了tags文件后,在你要查看定义的函数或变量上按

"shift-p shift-p 会在屏幕顶端打开一个占屏幕1/5的窗口,显示定义

"用shift-p shift-c可以关闭该窗口

"这个窗口在vi中称为预览窗口

map PP :ptag

nmap PC :pclose

"当一行很长,屏幕中一行显示不下时,vi会把自动把文本在屏幕断成几行。这时你无法用上下键移动到

"中间的行去(因为vi的光标移动依据逻辑行而不是屏幕行)。下面两个映射“重载”了小键盘的上下键,

"只要是屏幕显示出的行,你都可以用它们在其中上下移动

map gk

map gj

"打开高亮,等同syntax enable

syntax on   

"关闭和vi兼容(很多功能都需要这个选项)

set nocp

"默认设置

if version>=600

        filetype plugin indent on

endif

"配色方案,我现在使用的是koehler

"colorscheme desert3

"colorscheme peachpuff

"colorscheme torte

"colorscheme morning

colorscheme koehler

"colorscheme murphy

"colorscheme delek

"colorscheme ron

"this script use to excute make in vim and open quickfix window

"本帖子的主题

nmap B :w:call Do_make()

nmap C :cclose

nmap M :w:!make:copen

function Do_make()

   let filename = bufname("%")

   let suffix_pos = stridx(filename, ".c")

   if suffix_pos == -1

       return

   else

      let target = strpart(filename,0,suffix_pos)

   endif

   let target = "make " . target

   execute target

   execute "copen"

endfunction

"set find file path. such as use 'gf'

"设置搜需include文件的路径。我尽可能的设置的深一点。这样你基本上可以在你程序的include名上按gf跳到该文件去

"输入模式的ctrl-n或ctrl-p也会在这些路径中的include文件中去寻找不全内容

set path =.,/usr/include,./include,./../include,./../../include,./../../../include,./../../../../include,,

"This allow run script in vim and output to a new window

"下面这段脚本可以在不离开vi情况下执行你写的shell脚本

"方法是把你要执行的代码在visual模式下选中,按f7

"这个脚本不是我写的,感觉不是很好用。

function! Ruby_eval_vsplit() range

  let src = tempname()

  let dst = tempname()

  execute ": " . a:firstline . "," . a:lastline . "w " . src

  execute ":silent ! ruby " . src . " > " . dst . " 2>&1 "

  execute ":pclose!"

  execute ":redraw!"

  execute ":spl"

  execute "normal \l"

  execute ":e! " . dst

  execute ":set pvw"

  execute "normal \h"

endfunction

vmap :call Ruby_eval_vsplit()

nmap mzggVG`z

imap a

map   l:bw

imap a

"据说是显示c和cpp文件中多余的空格,但感觉没用。

"可能是我编译时的VIM_HATE_SPACE_ERROR选项没打开

if $VIM_HATE_SPACE_ERROR != '0'

    let c_space_errors=1

endif

"下面这个脚本是用于在vi中的扩展模式下(就是按了冒号进入的那个模式),输入Editfile,在输入部分文件

"名,可以用tab键自动补全文件名和路径。或者输入你要打开的文件名,但不跟路径,可以自动寻找到文件并打开。

"这需要和我另一个python的脚本一起使用,python脚本用于创建ftags文件做为不全的来源。

"这个只对大项目,文件多的时候有用,不用去记文件的路径。但这个脚本功能还不很全,想写全了再发出来,这里先

"注释掉

"fun OpenFile(f_name)

"    let bracket_b = stridx(a:f_name, "(")

"    let bracket_e = stridx(a:f_name, ")")

"    let len = bracket_e - bracket_b - 1

"    let f_path = ""

"

"    "if user input is a full file name

"    if bracket_b == -1

"        let file_list = split(system("cat ftag"), "\n")

"        let sea_name = a:f_name . "("

"        for item in file_list

"            let file_pos = stridx(item, sea_name)

"            if file_pos == 0

"                let bracket_b = stridx(item, "(")

"                let bracket_e = stridx(item, ")")

"                let len = bracket_e - bracket_b - 1

"                let f_path = strpart(item, bracket_b+1, len)

"                break

"            endif

"        endfor

"        

"        if f_path != ""

"            let ex_str = "vi " . f_path

"            execute ex_str

"        else

"            echo "No ftags found!"

"        endif

"    else

"        let f_path = strpart(a:f_name, bracket_b+1, len)

"        let ex_str = "vi " . f_path

"        execute ex_str

"    endif

"   

"endfun

"com -nargs=1 -bang -complete=custom,EditFileComplete EditFile :call OpenFile("")

"fun EditFileComplete(A,L,P)

"    let file_list = split(system("cat ftag"), "\n")

"    let ret_list = []

"    for item in file_list

"        let file_pos = stridx(item, a:A)

"        if file_pos == 0

"            call add(ret_list, item)

"        endif

"    endfor

"    let lines = join(ret_list, "\n")

"    return lines

"endfun

[/code]