VIM技巧

[vi的设置可以在vimrc下]
  syntax on
  set  expandtab
  set  shiftwidth=4
  set  softtabstop=4
  set  tabstop=4
  set  number
  set  cindent
  set  autoindent
  ctrl+w切换
  e edit
  :r!command 将command输出引入到文件中
  :n1,n2 w!command 输出到command中
  /xxx和?xxx搜索方向不同

 

[vim在行后面插入字符]

:1,$s//(.*/)//1"/g

 

[vim列模式]

C-v Imain<ESC>

 

[tags]

ctags -R .

C-] C-t

set tags=../tags

 

============================================

Tag文件需要遵循一定的格式,由Exuberant Ctags生成的tag文件,缺省是如下格式:

{tagname} {TAB} {tagfile} {TAB} {tagaddress} {term} {field} ..  
  • {tagname} - 标识符名字,例如函数名、类名、结构名、宏等。不能包含制表符。
  • {tagfile} - 包含 {tagname} 的文件。它不能包含制表符。
  • {tagaddress} - 可以定位到 {tagname}光标位置的 Ex 命令。通常只包含行号或搜索命令。出于安全的考虑,vim会限制其中某些命令的执行。
  • {term} - 设为 ;” ,这是为了兼容Vi编辑器,使Vi忽略后面的{field}字段。
  • {field} .. - 此字段可选,通常用于表示此{tagname}的类型是函数、类、宏或是其它。

在{tagname}、{tagfile}和{tagaddress}之间,采用制表符(TAB符,即C语言中的”/t”)分隔,也就是说{tagname}、{tagfile}的内容中不能包含制表符。

Tag文件的开头可以包含以”!_TAG_”开头的行,用来在tag文件中加入其它信息。vim能够识别两种这样的标记,经常用到的是”_TAG_FILE_SORTED”标记,例如:

!_TAG_FILE_SORTED<Tab>1<Tab>{anything} 

上面这个标记说明tag文件是经过排序的,并且排序时区分了大小写,对排序的tag,vim会使用二分法来进行查找,大大加快了查找速度;如果值为0,则表示tag文件未经排序;如果值为2,则表示tag文件是忽略大小写排序的。

================================================

  在浏览和修改稍微复杂的程序时候,确实source insight是个非常好的工具。转到Linux以后,我一直在找替代工具。最先是等anjuta,结果苦苦等到了一个鸡肋的2.02。然后,认真配置了下wine,用wine把si跑了起来,只是si的开发有些非常规,就算在win下面,中文注视等都是类似半角汉字的那样,而且,在实际使用中,快速查找参考的功能,有bug,曾经搞得我冒汗。试想下,你在一堆源码里面通篇修改了一个变量的处理方式,等一个星期以后,发现si原来的搜索不全,有2个需要修改的地方漏了,不冒汗才怪。(anjuta也有类似的问题)。
  我当初使用vi,纯粹是为了能在任何时候(比如tty下面)都有个熟悉的编辑器而已。偶尔一次看到了别人的vim的截图,发现支持一些函数列表,就赶紧搜索了一下,首先找到了一个中文的vim在线帮助(我已经贴论坛了http://forum.ubuntu.org.cn/about27617.html&sid=0577f1936d33b3cc9b1e34b85233ebc9),有了中文帮助,当然中国人才最能理解其中的命令的确切含义,不想读英文帮助,半懂而已。想起以前,看fvwm的英文帮助,是何等的艰难。这下终于开始了逐篇的阅读。才慢慢熟练了:h查找帮助的方法。通过2天的奋斗,几乎读完了在线帮助,搜索了几个小时的vim.org的插件。才发现vim竟然完全可以达到si的常用的那些非常有特色的功能。虽然界面还是有些简陋。
  下面列举一下我认为需要实现的si的功能:
  1。函数和变量的定义的即时浏览。这个是非常有用的功能。成千的变量,对于C/C++来说,一个类型错误都可能导致极难发现的问题,运行时出现无法预料的结果。vim里面使用taglist实现的。并且多个文件的列表都在一起,还可以按照类型折叠,以便于浏览。
  2。变量调用的通篇搜索。涉及到一个全局变量的时候,可能10来个文件包括。排错的时候,需要一个一个的地方去认真确认的。在vim.org搜索的结果是,中文都支持不好,因为多数使用外部的grep。后来憋了很久,仔细研究了别人的插件,自己写个简单的,调用vimgrep,这样中文就显示完美了。
  3。函数和类/结构成员的补全。我的结构经常是2到3层的套用,加上经常用到相对地址的宏定义,经常是一个变量一长串的。自己输入真的苦难,有点想碰死的感觉。vim本身就带了全能补全,就是C-x C-o,我把这个绑定到F8就是了。vim.org里面的一些补全的插件,我都试过,发现就本身的这个好。
  4。方便的快速查找。一个变量不要输入,光标定位后,按键就可以上下搜索。vim里面直接就是#*索引当前词,我还加了mark插件和设置了incsearch参数和hlsearch参数。就更加直观了。
  5。文件内部的函数和变量列表。长长的文件,几十个函数的时候,没有一个列表,会头晕的。这里使用taglist插件实现就是。
  6。函数和变量的上下层调用的结构关系图。这个在vim的字符方式下,还是比较不直观的。不好实现。
  7。函数和不同变量的颜色定义,包括字体,阴影效果以及定义的继承性能。这个是GUI的强项。vim还作不到这么好。
  接着就说说vim的配置。
  其实vim的配置很简单,而且规范。插件,比如*.vim文件放到~/.vim/plugins下面;文档放到~/.vim/doc里面;颜色配置放到~/.vim/syntax里面。主配置文件就是~/.vimrc。下面先列出vimrc文件。比较简单。
  ------------------------------
  
  
   代码:
  
  
   $● cat ~/.vimrc
   " 开启语法高亮
   syntax on
   " 设置文字编码自动识别
   set fencs=utf-8,cp936
   " 使用鼠标
   set mouse=a
   " 设置高亮搜索
   set hlsearch
   " 输入字符串就显示匹配点
   set incsearch
   " 输入的命令显示出来,看的清楚些。
   set showcmd
   " Tlist的内部变量。函数列表。
   let Tlist_Use_Right_Window=1
   let Tlist_File_Fold_Auto_Close=1
   " 打开当前目录文件列表
   map <F3> :Explore<CR>
   " 函数和变量列表
   map <F4> :TlistToggle<CR>
   " 搜索当前词,并打开quickfix窗口
   map <F5> :call Search_Word()<CR>
   " 全能补全
   inoremap <F8> <C-x><C-o>
   " 没事,鼠标画线玩的。
   " noremap <F9> :call ToggleSketch()<CR>
   " 启动函数变量快速浏览的时间设置
   set updatetime=100
  
  
  -------------------------------
  列出现在使用的插件。其中AutoExplorer和Search_Word,一个是在线帮助里面的,一个是我自己写的。其他的都是vim.org下的。下载的插件如果是压缩包,把里面的*.vim文件放出来就是,下次启动vim,这些功能就自动被读入并执行了。本身*.vim文件里面就都有用法帮助的。
  
  
   代码:
  
  
   $● l ~/.vim/plugin/
   AutoExplorer.vim EnhancedCommentify.vim Search_Word.vim tabbar.vim
   bufexplorer.vim mark.vim sketch.vim taglist.vim
  
  
  我自己写的那个简单得很。
  
  
   代码:
  
  
   $● cat ~/.vim/plugin/Search_Word.vim
   " au! QuickFixCmdPre *.[ch] call Search_Word()
   func Search_Word()
   let w = expand("<cword>") " 在当前光标位置抓词
   exe "vimgrep " w " *.c *.h"
   exe 'copen'
   endfun
  
  
  插件说明:
  
  
  
   引用:
  
  
   插件名称 说明 主要按键
   -------------------------------------------------
   EnhancedCommentify 当前行或者多行可视模式下的注释/反注释 /x
   SuperTab 在插入状态使用TAB键补全,现在被自己定义的F8代替了 <TAB>
   taglist 函数和变量定义的窗口,并可以双击跳转 :TlistToggle绑定到F4
   tabbar 用标签窗口形式,显示打开的文件 Alt-1,2切换
   AutoExplorer help里面剔出的快速浏览函数和变量的定义
   bufexplorer 浏览打开的缓冲文件 /be /bv /bs
   mark 不同颜色标记当前词,支持多次高亮标记 /m
   sketch 可切换到鼠标画线,好玩的功能而已 F9绑定
   Search_Word 自己写的简单的函数,搜索当前词,在quickfix窗口显示 F5绑定

 

[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 <space> replace <Tab>
"当文件为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 <Space>**************************************************************************/

"打开智能缩进。这个是vi三种缩进中最聪明的一种。对写程序很方便
set cindent shiftwidth=4
filetype indent on


"key mapping table
"高亮搜索后,被选中的文本会一直高亮,这里定义快捷键ctrl-h,消除高亮
nmap <C-h> <Esc>:noh<cr>
"ctrl-c,打开vi自带的简易计算器
imap <C-c> <C-R>=
"用于cscope,当用cscope创建了tags后,在你光标所在的函数上
"按ctrl-] ctrl-[会跳转到该函数的调用处
map <C-]><C-[> :cs f 3 <cword><cr>
"NOTICE: default <C-h> 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在输入模式默认是按照下一行的内容输入,很有用,所以注释掉了<c-e>的映射
"最后,这6个映射对用小键盘上下左右移动光标的朋友无用
imap <C-h> <C-o>h
imap <C-j> <C-o>j
imap <C-k> <C-o>k
imap <C-l> <C-o>l
"imap <C-e> <C-o>e
imap <C-b> <C-o>b
imap <C-f> <C-o>w
"buffer operation
"缓冲区操作快捷键。用emacs的朋友都知道emacs下各缓冲区间切换是很方便的,vi中也可以这样做
"这些快捷键特别适合在一个vi窗口中编辑多个文件
"ctrl-n 切换到下一缓冲区
nmap <silent><C-n> :bn<cr>
"ctrl-p 切换到上一缓冲区
nmap <silent><C-p> :bp<cr>
"ctrl-l 显示所有缓冲区
nmap <C-l> :ls<cr>
"ctrl-k 删除当前缓冲区
nmap <C-k> :bd<cr>
"下面这个映射用于跳转到指定缓冲区。在用ctrl-l查看了所有缓冲区列表后,按t,再输入刚才列表中显示的缓冲区编号,
"回车即可跳到指定缓冲区
nmap t :b<Space>
"open preview window
"和ctags配合使用。用ctags创建了tags文件后,在你要查看定义的函数或变量上按
"shift-p shift-p 会在屏幕顶端打开一个占屏幕1/5的窗口,显示定义
"用shift-p shift-c可以关闭该窗口
"这个窗口在vi中称为预览窗口
map PP :ptag <C-R><C-W><cr><C-w><C-w>
nmap PC :pclose<cr>
"当一行很长,屏幕中一行显示不下时,vi会把自动把文本在屏幕断成几行。这时你无法用上下键移动到
"中间的行去(因为vi的光标移动依据逻辑行而不是屏幕行)。下面两个映射“重载”了小键盘的上下键,
"只要是屏幕显示出的行,你都可以用它们在其中上下移动
map <Up> gk
map <Down> 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<cr>:call Do_make()<cr><cr><cr>
nmap C :cclose<cr>
nmap M :w<cr>:!make<cr><Esc>:copen<cr>
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 /<C-W>l"
  execute ":e! " . dst
  execute ":set pvw"
  execute "normal /<C-W>h"
endfunction

vmap <silent> <F7> :call Ruby_eval_vsplit()<cr>
nmap <silent> <F7> mzggVG<F7>`z
imap <silent> <F7> <ESC><F7>a
map  <silent> <S-F7> <C-W>l:bw<cr>
imap <silent> <S-F7> <ESC><S-F7>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("<args>")
"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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值