Showing posts with label vi. Show all posts
Showing posts with label vi. Show all posts

Monday, January 11, 2010

linux vi(vim)常用命令汇总

更多精彩请到 http://www.139ya.com


首先介绍一下 vim vi 是 unix/linux 下极为普遍的一种文本编辑器, 大部分机器上都有 vi 有各种变种, 在不同的机器上常用不同的变种软件 其中 vim 比较好用也用得比较广泛 vim 是 Vi IMproved 的缩写, 表示更好的 vi 本文就说些其中比较有用, 比较常用的命令, 若能熟练运用这些命令, 那么会发现编辑文件很大帮助,尤其是做开发的人员,能快速的提高开发效率

说明:
以下的例子中 xxx 表示在命令模式下输入 xxx 并回车
以下的例子中 :xxx 表示在扩展模式下输入 xxx 并回车
小括号中的命令表示相关命令
在编辑模式或可视模式下输入的命令会另外注明

1 查找

/xxx(?xxx) 表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
向上查找其中xxx可以是正规表达式,关于正规式就不多说了
一般来说是区分大小写的, 要想不区分大小写, 那得先输入
:set ignorecase
查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找

*(#) 当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的
下(上)一个单词 同样, 再输入 n 查找下一个匹配处, 输入 N 反方
向查找

g*(g#) 此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而
是匹配包含该单词的所有字符串

gd 本命令查找与光标所在单词相匹配的单词, 并将光标停留在文档的非
注释段中第一次出现这个单词的地方

% 本命令查找与光标所在处相匹配的反括号, 包括 () [] { }

f(F)x 本命令表示在光标所在行进行查找, 查找光标右(左)方第一个x字符
找到后:
输入 ; 表示继续往下找
输入 , 表示反方向查找

2 快速移动光标
在 vi 中, 移动光标和编辑是两件事, 正因为区分开来, 所以可以很方便的进行光标定
位和编辑 因此能更快一点移动光标是很有用的

w(e) 移动光标到下一个单词
b 移动光标到上一个单词

0 移动光标到本行最开头
^ 移动光标到本行最开头的字符处
$ 移动光标到本行结尾处

H 移动光标到屏幕的首行
M 移动光标到屏幕的中间一行
L 移动光标到屏幕的尾行
gg 移动光标到文档首行
G 移动光标到文档尾行
c-f (即 ctrl 键与 f 键一同按下) 本命令即 page down
c-b (即 ctrl 键与 b 键一同按下, 后同) 本命令即 page up

'' 此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查
找到某个单词后, 再输入此命令则回到上次停留的位置

' 此命令相当好使, 它移动光标到上一次的修改行

` 此命令相当强大, 它移动光标到上一次的修改点

3 拷贝, 删除与粘贴
在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴 其中拷贝与删除是与光标移动命令
结合的, 看几个例子就能够明白了

yw 表示拷贝从当前光标到光标所在单词结尾的内容
dw 表示删除从当前光标到光标所在单词结尾的内容
y0 表示拷贝从当前光标到光标所在行首的内容
d0 表示删除从当前光标到光标所在行首的内容
y$ 表示拷贝从当前光标到光标所在行尾的内容
d$ 表示删除从当前光标到光标所在行尾的内容
yfa 表示拷贝从当前光标到光标后面的第一个a字符之间的内容
dfa 表示删除从当前光标到光标后面的第一个a字符之间的内容

特殊地:
yy 表示拷贝光标所在行
dd 表示删除光标所在行
D 表示删除从当前光标到光标所在行尾的内容

关于拷贝, 删除和粘贴的复杂用法与寄存器有关, 可以自行查询

4 数字与命令
在 vi 中数字与命令结合往往表示重复进行此命令, 若在扩展模式的开头出现则表示行
号定位 如:

5fx 表示查找光标后第5个x字符

5w(e) 移动光标到下五个单词

5yy 表示拷贝光标以下 5 行
5dd 表示删除光标以下 5 行

y2fa 表示拷贝从当前光标到光标后面的第二个a字符之间的内容

:12,24y 表示拷贝第12行到第24行之间的内容
:12,y 表示拷贝第12行到光标所在行之间的内容
:,24y 表示拷贝光标所在行到第24行之间的内容 删除类似

5 快速输入字符
在 vi 中, 不要求你输入每一个字符, 可以有很多种方法快速输入一些字符
使用 linux/unix 的同学一定有一个经验, 在命令行下输入命令时敲入头几个字符再按
TAB 系统就会自动将剩下的字符补齐, 假如有多个匹配则会打印出来 这就是著名的命令
补齐(其实windows中也有文件名补齐功能) vi 中有许多的字符串补齐命令, 非常方便

c-p(c-n) 在编辑模式中, 输入几个字符后再输入此命令则 vi 开始向上(下)搜
索开头与其匹配的单词并补齐, 不断输入此命令则循环查找 此命令
会在所有在这个 vim 程序中打开的文件中进行匹配

c-x-l 在编辑模式中, 此命令快速补齐整行内容, 但是仅在本窗口中出现的
文档中进行匹配

c-x-f 在编辑模式中, 这个命令表示补齐文件名 如输入:
/usr/local/tom 后再输入此命令则它会自动匹配出:
/usr/local/tomcat/

abbr 即缩写 这是一个宏操作, 可以在编辑模式中用一个缩写代替另一个
字符串 比如编写java文件的常常输入 Systemoutprintln, 这很
是麻烦, 所以应该用缩写来减少敲字 可以这么做:
:abbr sprt Systemoutprintln
以后在输入sprt后再输入其他非字母符号, 它就会自动扩展为System
outprintln

6 替换
替换是 vi 的强项, 因为可以用正规表达式来匹配字符串以下提供几个例子

:s/aa/bb/g 将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
:s/\/bb/g 将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词
:%s/aa/bb/g 将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/aa/bb/g 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/^/#/ 将从12行到23行的行首加入 # 字符
:%s= *$== 将所有行尾多余的空格删除
:g/^\s*$/d 将所有不包含字符(空格也不包含)的空行删除

Wednesday, May 27, 2009

Winxp下 gvim 编程环境搭建

更多精彩请到 http://www.139ya.com


Winxp下 gvim 编程环境搭建 : http://blog.csdn.net/minico/archive/2007/12/15/1938050.aspx

Winxp下 gvim 编程环境搭建

更多精彩请到 http://www.139ya.com

1.官方网站下载最新的gvim7.1 win32,然后选择完全安装;我是安装在d:\vim目录下面,安装后的目录结构如下:
D:\VIM
├─vim71
│ ├─autoload
│ ├─colors
│ ├─compiler
│ ├─doc
│ ├─ftplugin
│ ├─indent
│ ├─keymap
│ ├─lang
│ ├─macros
│ ├─plugin
│ ├─spell
│ ├─syntax
│ ├─tools
│ └─tutor
└─vimfiles
├─after
├─autoload
├─colors
├─compiler
├─doc
├─ftdetect
├─ftplugin
├─indent
├─keymap
├─plugin
└─syntax

2.安装常用插件:
vimdoc http://vcd.gro.clinux.org (中文)
安装 直接安装即可,安装时会自动搜索到vim的安装位置,然后安装到相应的目录
使用 :h
说明 中文帮助文档
taglist http://www.vim.org/scripts/script.php?script_id=273
安装 解压到vim71目录下面
使用 :Tlist
说明 需要Ctags产生的tags文件配合
WinManager http://www.vim.org/scripts/script.php?script_id=95
安装 解压到vim71目录下面
使用 wm,这个命令是通过在_vimrc中配置后才能有,具体配置见后面的_vimrc文件
说明 此插件的作用是将TagList窗口和netrw窗口整合起来
Ctags http://ctags.sourceforge.net
安装 解压到vim71目录下面
使用 ctags -R --c++-kinds=+p --fields=+iaS --extra=+q src
在对C++文件进行补全时,OmniCppComplete插件需要在标签文件中包含C++的额外信息,因此上面的ctags命令不同于以前我们所使用的,它专门为C++语言生成一些额外的信息.
说明 其实只是一个ctags.exe文件,用来产生tags文件供其它插件使用
MiniBufExplorer http://www.vim.org/scripts/script.php?script_id=159
安装 将minibufexpl.vim放 到vim71/plugin 文件夹中即可;
使用 打开多个文件后,自动在顶端出现文件标签,双击鼠标或者Ctrl+tab键可以切换文件;
说明  
grep http://www.vim.org/scripts/script.php?script_id=311
安装 将grep.vim放 到vim71/plugin 文件夹中即可;
使用 安装后会在菜单=》工具中增加search子菜单,也可以用命令:grep或者按照后面给出的_vimrc文件映射快捷键F3
说明 需要windows版本的grep.exe程序配合;
到http://unxutils.sourceforge.net/下载unxutils工具包里面包含grep.exe,把grep.exe放到系统c:\windows\system32下面即可。
omnicppcomplete http://www.vim.org/scripts/script.php?script_id=1520
安装 解压到vimfiles目录下面;
使用 配合后面的supertab插件,使用Tab键进行自动完成;
说明 如果要对c++文件进行自动完成,需要生成tag文件时用特殊的选项,见后面的_vimrc配置文件
a http://www.vim.org/scripts/script.php?script_id=31
安装 将a.vim放 到vim71/plugin 文件夹中即可;
使用 :A
说明 在源文件和头文件之间进行切换
Supertab http://www.vim.org/scripts/script.php?script_id=1643
安装 将supertab.vim放 到vim71/plugin 文件夹中即可;
使用 配合前面的omnicppcomplete插件,使用Tab键进行自动完成;
说明  
NERD_commenter http://www.vim.org/scripts/script.php?script_id=1218
安装 解压到vim71目录下面
使用 http://xiaobo.spaces.live.com/blog/cns!5ec21dee9b73c1a8!814.entry
说明  
lookupfile http://www.vim.org/scripts/script.php?script_id=1581
安装 解压到vimfiles目录下面;
使用 根据后面的_vimrc配置文件,使用F5键打开搜索窗口;Tab键进行选择
说明 依赖于插件genutils
genutils http://www.vim.org/scripts/script.php?script_id=197
安装 解压到vimfiles目录下面;
使用 这个插件提供了一些通用的函数,可供其它的脚本使用
说明 供lookupfile插件使用

clearcase http://p.blog.csdn.net/images/p_blog_csdn_net/minico/EntryImages/20081123/gvim.JPG
安装 解压到vimfiles目录下面;
使用 这个插件提供一些常用的clearcase命令
说明 无
3._vimrc配置文件

set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let eq = ''
if $VIMRUNTIME =~ ' '
if &sh =~ '\ let cmd = '""' . $VIMRUNTIME . '\diff"'
let eq = '"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction

"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
" Add by minico---begin
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

"设置帮助语言
set helplang=cn,en

"把gui的工具栏去掉(要去掉,把等号前面的加号变成一个减号即可)
set guioptions+=T

"把gui的右边的滑动条去掉
set guioptions+=r

"把gui的左边的滑动条去掉
set guioptions-=L

"把gui的菜单去掉
set guioptions+=m
filetype on
let Tlist_Show_Menu = 1

" 这项必须设定,否则出错,配置taglist的ctags路径
"let Tlist_Ctags_Cmd = 'D:\Vim\vim71\ctags.exe'


"设置Taglist
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1

" 使用F8打开Taglist
nnoremap :TlistToggle

"设置窗口大小和位置
set lines=80
set columns=200
winpos 0 0

"设置tags文件路径
set tags=G:\lwip\tags

"设置文件浏览器窗口显示方式
"通过WinManager插件来将TagList窗口和netrw窗口整合起来
let g:winManagerWindowLayout='FileExplorer|TagList'
nmap wm :WMToggle

"设置SuperTab,用tab键打开cppcomplet的自动补全功能。
let g:SuperTabRetainCompletionType=2
let g:SuperTabDefaultCompletionType=""

"显示行号
set number

"打开语法高亮显示功能
syntax enable
syntax on

"设置主题颜色
colorscheme desert

"则可以用切换到上下左右的窗口中去
let g:miniBufExplMapWindowNavVim = 1

"按F12时在一个新的buffer中打开c\h文件
nnoremap :A

"用F3调用grep查找当前光标所在处的字符串
nnoremap :Grep

"为了使用智能补全,打开文件类型检测,关闭VI兼容模式
filetype plugin indent on
set nocp

"关掉智能补全时的预览窗口,这样可以防止闪屏现象
set completeopt=longest,menu

"====================Lookupfile 相关设置========================================

let g:LookupFile_MinPatLength = 2 "最少输入2个字符才开始查找
let g:LookupFile_PreserveLastPattern = 0 "不保存上次查找的字符串
let g:LookupFile_PreservePatternHistory = 1 "保存查找历史
let g:LookupFile_AlwaysAcceptFirst = 1 "回车打开第一个匹配项目
let g:LookupFile_AllowNewFiles = 0 "不允许创建不存在的文件
if filereadable("./filenametags") "设置tag文件的名字
let g:LookupFile_TagExpr = '"./filenametags"'
endif
"nmap lk LookupFile "映射LookupFile为,lk
"nmap ll :LUBufs "映射LUBufs为,ll
"nmap lw :LUWalk "映射LUWalk为,lw

"有了上面的定义,当我输入”,lk”时,就会在tag文件中查找指定的文件名;
"当输入”,ll”时,就会在当前已打开的buffer中查找指定名字的buffer;
"当输入”,lw”时,就会在指定目录结构中查找。

"在用lookupfile插件查找文件时,是区分文件名的大小写的,
"如果想进行忽略大小写的匹配,把下面这段代码加入你的vimrc中,
"就可以每次在查找文件时都忽略大小写查找了:

" lookup file with ignore case
function! LookupFile_IgnoreCaseFunc(pattern)
let _tags = &tags
try
let &tags = eval(g:LookupFile_TagExpr)
let newpattern = '\c' . a:pattern
let tags = taglist(newpattern)
catch
echohl ErrorMsg | echo "Exception: " . v:exception | echohl NONE
return ""
finally
let &tags = _tags
endtry

" Show the matches for what is typed so far.
let files = map(tags, 'v:val["filename"]')
return files
endfunction
let g:LookupFile_LookupFunc = 'LookupFile_IgnoreCaseFunc'

"====================Lookupfile 相关设置 end========================================

"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
" Add by minico---end
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Friday, May 8, 2009

vim+ctags+gdb+cgdb+putty+cygwin+winscp

更多精彩请到 http://www.139ya.com


http://blog.chinaunix.net/u/11786/showart_1887454.html

http://easwy.com/blog/archives/vim-cscope-ctags/

有图: http://rickey-nctu.blogspot.com/2009/02/vim-taglist.html


首先说说编辑器,以前一直都是用UE写程序,UE确实很强大,可惜要money,当然你可以用什么破解版或者绿色版,不过一般外企都不允许的,所以还是老实点,学学免费而且强大的vim和emacs(这个还不是很熟)吧。

vim是vi的扩展,在windows叫gvim,linux、cygwin都有,unix有些可能还是老的vi。

vim的cool功能:多屏显示(这个时候有人刚好路过看到你的界面,会问:这是啥工具,cool)
Ctrl+w, n 新建一个窗口,在原窗口下面
Ctrl+w, o 关闭其他窗口
Ctrl+w, v 分为左右两屏,打开的是同一个文件,其中一个改动,另外一个也跟着改动,cool
Ctrl+w, h/j/k/l 在上下左右的窗口移动

ctags:在linux/cygwin环境下使用vim+ctags是不错的选择
在.vimrc中加入:
set tags=tags;
set autochdir
在最外层目录执行"ctags -R *", 可以实现ctags在不同目录的跳转了。
在vim中打开源代码,使用Ctrl+] Ctrl+t就可以自由自在的在代码中跳转,爽吧。


再说说调试器:
gdb分屏指令:(win)height, 输入之后可以看到源代码在上半屏,gdb命令在下半屏,而且上半屏可以用上下键和PageUP,PageDown操作;

cgdb: gdb的加强版,默认就有上下分屏
在代码窗口: i:焦点切换到gdb窗口 o:打开文件选择框 空格:设置或取消断点
在gdb窗口: 按ESC焦点切换到代码窗口

抛弃SecureCRT,投入putty的怀抱,原因很简单一个收费,一个免费,并且putty的功能貌似更强大。

另外cygwin默认是使用windows的cmd窗口,非常恶心,可以用putty代替它,新建一个putty的快捷方式,把命令修改为putty.exe -cygterm - 就可以了。

cygwin上安装scp:这个问题搞了我半天,原来只要装了ssh就有了,怪不得找不到。
有个叫winscp的也不错,又多一个选择,类似于ftp工具,很方便,而且免费。

附:vimrc

Friday, March 6, 2009

vim 配合ctags实现函数原型快速定位

更多精彩请到 http://www.139ya.com

转自: http://www.fire3.cn/category/computer/vim-computer


vim 配合ctags实现函数原型快速定位

ctags可以分析程序生成tag文件为vim所用,从而在编写程序时实现函数原型、数据结构声明等快速跳转,很是方便。

首先确定你的Linux系统里安装了ctags。没有的话,请先安装ctags。如果是Debian或者Ubuntu系统,直接在终端上运行:

sudo apt-get install ctags

装好ctags后,找一个源码目录,在终端上运行如下命令,会生成一个tags文件。

ctags -R

然后打开vi,输入类似如下的指令,tags=后面为刚才生成的tags文件的全路径名。

:set tags=/Your/Path/To/tags

然后就可以尝试跳转了。如果是经常使用的工程,将上面的set一行写在你的.vimrc文件里即可。

常用跳转方法:

  • 光标处Ctrl-]键:跳到光标所在单词的tag。
  • Ctrl-T键:跳回原来的位置。
  • g]键(先按g再按]):如果有同名的多个tag,可以用这两个键进行跳转,会提示选择序号。

Tuesday, February 17, 2009

ctags和vim- -

更多精彩请到 http://www.139ya.com

转自: http://hi.baidu.com/original/blog/item/2cf8d53f00b7fcc27d1e71f0.html

[/home/brimmer/src]$ ctags -R

"-R"表示递归创建,也就包括源代码根目录下的所有子目录下的源程序。"tags"文件中包括这些对象的列表:

l #define定义的宏

l 枚举型变量的值

l 函数的定义、原型和声明

l 名字空间(namespace

l 类型定义(typedefs

l 变量(包括定义和声明)

l 类(class)、结构(struct)、枚举类型(enum)和联合(union

l 类、结构和联合中成员变量或函数

VIM用这个"tags"文件来定位上面这些做了标记的对象,下面介绍一下定位这些对象的方法:

1) 用命令行。在运行vim的时候加上"-t"参数,例如:

[/home/brimmer/src]$ vim -t foo_bar

这个命令将打开定义"foo_bar"(变量或函数或其它)的文件,并把光标定位到这一行。

2) vim编辑器内用":ta"命令,例如:

:ta foo_bar

3) 最方便的方法是把光标移到变量名或函数名上,然后按下"Ctrl-]"。用"Ctrl-o"退回原来的地方。

注意:运行vim的时候,必须在"tags"文件所在的目录下运行。否则,运行vim的时候还要用":set tags="命令设定"tags"文件的路径,这样vim才能找到"tags"文件。

在函数中移动光标

[{ 转到上一个位于第一列的"{"

}] 转到下一个位于第一列的"{"

{ 转到上一个空行

} 转到下一个空行

gd 转到当前光标所指的局部变量的定义

* 转到当前光标所指的单词下一次出现的地方

# 转到当前光标所指的单词上一次出现的地方

Vim 的创造者是一名计算机程序员,因此这就不奇怪 Vim 中有许多帮助编写程序的功能:
跳转到标识符被定义和使用的地方;在另一个窗口中预览有关的声明等等。在下一章中还
会介绍更多的功能。

*29.1*  使用标签

什么是标签?标签就是一个标识符被定义的地方。一个例子就是 C 或者 C++ 程序中的函
数定义。标签列表可以保存在一个标签文件中。Vim 可以通过它来从任何地方跳转到该标签,
也就是一个标识符被定义的地方。
在当前目录下为所有的 C 文件生成标签文件,使用下面的这个命令:

ctags *.c

"ctags" 是一个独立的程序。大多数 Unix 系统上都已经安装了它。如果你还没有安装,
可以在这里找到 "Exuberant ctags":

http://ctags.sf.net

现在你可以使用下面的命令跳转到一个函数定义的地方:

:tag startlist

这个命令会找到函数 "startlist",即使该函数是在另一个文件中。
CTRL-] 命令会跳转到当前光标下单词的标签。这样浏览毫无头绪的 C 代码会变得更容
些易。举个例子,假设你在函数 "write_block" 中。你可以看到它调用了函数
"write_line"。但 "write_line" 做了什么呢?将光标置于调用 "write_line" 的地方然
后按 CTRL-],你就跳转到了这个函数的定义的地方了。
"write_line" 函数调用了 "write_char"。你需要知道它做了什么。将光标定位到调
用 "write_char" 的地方然后按 CTRL-],你就到了定义"write_char" 的地方。

+-------------------------------------+
|void write_block(char **s; int cnt) |
|{ |
| int i; |
| for (i = 0; i < cnt; ++i) |
| write_line(s[i]); |
|} | |
+-----------|-------------------------+
|
CTRL-] |
| +----------------------------+
+--> |void write_line(char *s) |
|{ |
| while (*s != 0) |
| write_char(*s++); |
|} | |
+--------|-------------------+
|
CTRL-] |
| +------------------------------------+
+--> |void write_char(char c) |
|{ |
| putchar((int)(unsigned char)c); |
|} |
+------------------------------------+

":tags" 命令显示你经过的标签列表:
:tags
# TO tag FROM line in file/text
1 1 write_line 8 write_block.c
2 1 write_char 7 write_line.c
>

现在介绍向回跳转。 CTRL-T 命令跳转到上一个标签。在上例中,你会回到 "write_line"
函数调用 "write_char" 的地方。
这个命令接受一个计数参数,用来表示跳转回去的标签个数。你已经向前跳转,现在
又跳转了回去。现在我们再一次向前跳转。下面的命令跳转到标签列表中最上面的标签:

:tag

你可以在前面加上要向前跳转的标签个数。比如:":3tag"。 CTRL-T 同样可以加上一个
计数参数。
通过这些命令,你可以用 CTRL-] 延着调用树向前跳转, 用 CTRL-T 向回跳转,用
":tags" 命令显示当前位置。

分 割 窗 口

":tag" 命令会将当前窗口的文件替换为包含新函数的文件。怎样才能同时查看两个文件
呢?你可以使用 ":split" 命令将窗口分开然后再用 ":tag" 命令。Vim 有个缩写命令可
以做到这些:

:stag tagname

使用下面的命令可以分割当前窗口并跳转到光标下的标签:

CTRL-W ]

如果指定了计数参数,新窗口将包含指定的那么多行。

多 个 标 记 文 件

如果在多个目录中都有文件,你可以在每一个目录下创建一个标签文件。Vim 只能跳转到
那个目录下的标签。
通过设定 'tags' 选项,你可以使用多个相关的标签文件。 比如:

:set tags=./tags,./../tags,./*/tags

这会使 Vim 找到当前文件所在目录及其父目录和所有子目录下的标签文件。
这已经是不少的标签文件了,但也许仍不够。比如,当编辑 "~/proj/src" 目录下的
一个文件时,你无法找到 "~/proj/sub/tags" 目录下的标签文件。对这种情况,Vim
提供了一个查找整个目录树下标签文件的方法,比如:

:set tags=~/proj/**/tags

单 个 标 记 文 件

当 Vim 在多个地方查找标签文件时,你会听到硬盘在格格作响。这样会有点慢。在这种
情况下,你最好将这些时间花在生成一个大的标签文件上。你可以要等一会儿。
这得借助上面提到的 "Exuberant ctags" 程序。它有一个选项可以搜索整个目录树:

cd ~/proj
ctags -R .

这样做的好处是 "Exuberant ctags" 可以识别多种文件类型,它不仅适用于 C 和 C++
程序,还适用于 Eiffel 甚至 Vim 脚本。请参考 ctags 文档进行调整所用参数。
现在你只需要告诉 Vim 你的标签文件在何处:

:set tags=~/proj/tags

多 个 匹 配

当一个函数(或类中的方法)被定义多次, ":tags" 命令会跳转到第一处。如果在当前
文件中存在匹配,那它将会被首先使用。
你现在可以跳转到同一个标签的其它匹配处:

:tnext

重复执行这个命令可以找到更多的匹配。如果存在很多匹配,你可以选择要跳转到哪一
个:

:tselect tagname

Vim 会为你展示一个选择列表:

# pri kind tag file
1 F f mch_init os_amiga.c
mch_init()
2 F f mch_init os_mac.c
mch_init()
3 F f mch_init os_msdos.c
mch_init(void)
4 F f mch_init os_riscos.c
mch_init()
Enter nr of choice ( to abort):

你现在可以输入要跳转到的匹配代号(在第一列)。其它列的信息可以让你知道匹配在何
处被定义。

可以用这些命令在各匹配的标签间移动:

:tfirst 到第一个匹配
:[count]tprevious 向前 [count] 个匹配
:[count]tnext 向后 [count] 个匹配
:tlast 到最后一个匹配

如果没有指定,[count] 省缺为一。

猜 测 标 签 名

命令行补全是避免输入长标签名的好办法。只需输入开始的一部分然后按

:tag write_

你会得到第一个匹配。如果这不是你想要的,重复输入 直到你找到正确的匹配。
有时你只知道一个函数名的一部分,或是你有很多以相同字符串开头而结尾不同的标
记。这时你可以告诉 Vim 使用一个模式来查找标签。

假设你要跳转到一个包含 "block" 的标签。首先输入:

:tag /block

现在再利用命令行补全功能:输入 。Vim 会找到所有包含 "block" 的标签并使用
第一个匹配。
标签名前面的 "/" 告诉 Vim 这不是一个确定的标签名而是一个模式。你可以利用有
关查找模式的所有特性。举个列子,假设你要选择所有以 "write_" 开头的标签:

:tselect /^write_

"^" 指定标签以 "write_" 开头,否则在中间含有 "write_" 的标签名也会被找到。类似
地,"$" 指定标签名结尾处的匹配。

标 签 浏 览 器

CTRL-] 可以让你跳转到光标所在标识符的定义处,因此你可以利用标识符的列表来形成
一个目录。这里给出一个例子。
首先生成一个标识符列表(需要 Exuberant ctags):

ctags --c-types=f -f functions *.c

现在打开 Vim 并在一个垂直分割窗口中编辑这个文件:

vim
:vsplit functions

窗口中包含一个所有函数的列表。其它的东西可以被忽略。用 ":setlocal ts=99" 命令
使其显示得更清晰些。
在这个窗口中,定义一个 mapping:

:nnoremap 0yew:tag "

移动光标至要跳转到函数的所在行,输入 。Vim 会在另一个窗口中跳转到所选择
的函数定义处。

相 关 杂 项

你可以设定 'ignorecase' 选项来忽略标签名里的大小写。

'tagbsearch' 选项标明标签文件是否经过排序。省缺是假定为标签文件已排序,这样会
使查找更快,但如果文件没有被排序是无法工作的。

'taglength' 选项可用来告诉 Vim 一个标签的有效字符个数。

当你使用 SNiFF+ 程序时,你可以利用 Vim 的有关接口 |sniff| 。SNiFF+ 是一个商业
软件。

Cscope 是一个自由软件。它不仅可以找到一个标识符被声明的地方,还可以找到标识符
被使用的地方。 请参考 |cscope|。

*29.2*  预览窗口

当编辑含有函数调用的代码时,你需要使用正确的调用参数。要获知所要传递的值,你可以
查看这个函数是如何定义的。标签机制对此十分适用。如果定义可在另一个窗口内显示那
就更好了。对此我们可以利用预览窗口。
打开一个预览窗口来显示函数 "write_char":

:ptag write_char

Vim 会打开一个窗口,跳转到 "write_char" 标签。然后它会回到原来的位置。这样你可
以继续输入而不必使用 CTRL-W 命令。
如果函数名出现在文本中,你可以用下面的命令在预览窗口中得到其定义:

CTRL-W }

有一个脚本可以自动显示光标处的标签定义。请参考 |CursorHold-example| 。

用下面的命令关闭预览窗口:

:pclose

要在预览窗口中编辑一个指定的文件,用 ":pedit" 。这在编辑头文件时很有用,比如:

:pedit defs.h

最后, "psearch" 可用来查找当前文件和任何包含文件中的单词并在预览窗口中显示匹
配。这在使用没有标签文件的库函数时十分有用。例如:

:psearch popen

这会在预览窗口中显示含有 popen() 原型的 "stdio.h" 文件:

FILE *popen __P((const char *, const char *));


*29.3* 在代码间移动

因为程序代码是结构化的,Vim 可以识别其中的有关项目。一些特定的命令可用来完成相
关的移动。
C 程序中经常包含类似下面的代码:

#ifdef USE_POPEN
fd = popen("ls", "r")
#else
fd = fopen("tmp", "w")
#endif

有时会更长,也许还有套嵌。将光标置于 "#ifdef" 处按 %。Vim 会跳转到"#else"。继
续按 % 会跳转到 "#endif"。再次按下 % 又回到原来的 "#ifdef"。
当代码套嵌时,Vim 会找到相匹配的项目。这是检查你是否忘记了一个 "#endif" 的
好办法。
当你在一个 "#ifdef" - "#endif" 块内的某个位置,你可以用下面的命令回到开始
处:

[#

如果你的位置不是在 "#if" 或 "#ifdef" 之后, Vim 会鸣音。用下面命令可以跳转到下
一个 "#else" 或 "#endif":

]#

这两个命令会跳过它所经过的 "#if" - "#endif" 块。
例如:

#if defined(HAS_INC_H)
a = a + inc();
# ifdef USE_THEME
a += 3;
# endif
set_width(a);

如果光标在最后一行,"[#" 会移动到第一行。中间的 "#ifdef" - "#endif" 块被跳过。

在 代 码 块 内 移 动

C 代码块包含在 {} 中,有时一个代码会很长。要跳转到外部代码块的开始处,用 "[["
命令。用 "][" 找到结尾处。(前提是 "{" 和 "}" 都在第一列。)
"[{" 命令跳转到当前代码块的开始处。它会跳过同一级别的 {} 对。"]}" 跳转到结尾。
一点概述:

function(int a)
+-> {
| if (a)
| +-> {
[[ | | for (;;) --+
| | +-> { |
| [{ | | foo(32); | --+
| | [{ | if (bar(a)) --+ | ]} |
+-- | +-- break; | ]} | |
| } <-+ | | ][
+-- foobar(a) | |
} <-+ |
} <-+

当编写 C++ 或 Java 代码时,外部代码块是类,而下一级的 {} 是方法。在类内部用
"[m" 可以找到前一个方法的开始。"]m" 会找到下一个方法的开始。

另外,"[]" 向后移动到一个函数的结尾,"]]" 向前移动到一个函数的结尾。函数的结尾
指的是处在第一列的 "}"。

int func1(void)
{
return 1;
+----------> }
|
[] | int func2(void)
| +-> {
| [[ | if (flag)
start +-- +-- return flag;
| ][ | return 2;
| +-> }
]] |
| int func3(void)
+----------> {
return 3;
}

不要忘了你还可以用 "%" 在匹配的 (), {} 和 [] 间移动。这在它们相距很多行时仍然
适用。

在 括 号 内 移 动

"[(" 和 "])" 命令"[}" 和 "]}" 类似,只不过它们适用于 () 对而不是 {} 对。

[(
<--------------------------------
<-------
if (a == b && (c == d || (e > f)) && x > y)
-------------->
-------------------------------->
])

在 注 释 间 移 动

移动到一个注释的开始用 "[/";向前移动到注释的结尾用 "]/"。这只对 /* - */ 注释
有效。

+-> +-> /*
| [/ | * A comment about --+
[/ | +-- * wonderful life. | ]/
| */ <-+
|
+-- foo = bar * 3; --+
| ]/

*29.4* 查找全局标识符

你在编辑一个 C 程序,想要知道一个变量是被声明为 "int" 还是 "unsigned"。一个快
速的方法是使用 "[I" 命令来查找。
假设光标在单词 "column" 处。输入:

[I

Vim 会列出它所找出的匹配行,不仅在当前文件内查找,还会在所有的包含文件中查找。
结果如下所示:

structs.h
1: 29 unsigned column; /* column number */

相对使用标签文件或预览窗口的好处是包含文件也被搜索。大多数情况下都能找到正确
的声明。即使标签文件已经过期或者你没有为包含文件建立标签也不会影响结果。
但是一些准备工作是必要的,否则 "[I" 就没法工作。首先,'include' 选项必须指
定文件是如何被包含的。省缺值适用于 C 和 C++。对其它的语言,你需要自己设定。

定 位 包 含 文 件

Vim 会找到 'path' 选项指定路径中的包含文件。如果缺少某个目录,一些包含文件
将不会被找到。你可以用这个命令来查看:

:checkpath

它会列出不能找到的包含文件,以及被找到的包含文件。一个输出样例:

--- Included files not found in path ---

vim.h -->



文件 "io.h" 被当前文件包含但无法找到。"vim.h" 可以找到,这样 ":checkpath" 跟进
这个文件并检查其中的包含文件。结果显示无法找到 "vim.h" 包含的 "functions.h" 和
"clib/exec_protos.h" 文件。

Note:
Vim 不是一个编译器。它无法识别 "#ifdef" 语句。这就是说所有的
"#include" 语句都会被使用,即使它在 "#if NEVER" 之后。

给 'path' 选项增加一个目录可以修正无法找到文件的错误。一个好得参考是 Makefile。
注意那些包括 "-I" 的条目,比如 "-I/usr/local/X11"。要增加这个目录,用:

:set path+=/usr/local/X11

如果有很多的子目录,你可以用 "*" 通配符。例如:

:set path+=/usr/*/include

这会找到 "/usr/local/include" 以及 "/usr/X11/include" 目录下的文件。

如果你的工程项目的包含文件都在一个套嵌的目录树下,"**" 就非常有用。它会搜索所
有的子目录。例如:

:set path+=/projects/invent/**/include

这会找到这些目录下的文件:

/projects/invent/include
/projects/invent/main/include
/projects/invent/main/os/include
etc.

还有其它的可能性。更多信息,请查看 'path' 选项。
如果你想查看找到的包含文件,用这个命令:

:checkpath!

你会得到一个(很长)的包含文件列表。为使它更短些,Vim 会对已经找到的文件显示
"(Already listed)" 而不再重新显示一遍。

跳 转 到 匹 配

"[I" 产生一个每项只有一行文本的列表。如果你想要进一步的查看第一项,你可以这个
命令来跳转:

[

你也可以使用 "[ CTRL-I", 因为 CTRL-I 和按 效果一样。

"[I" 产生的列表在每行的开头都有一个序号。如果你要跳转到第一项外的其它项,首先
输入序号:

3[

会跳转到列表中的第三项。记住你可以用 CTRL-O 跳回到原来的地方。

相 关 命 令

[i 只列出第一项匹配
]I 只列出光标下面的项目
]i 只列出光标下面的第一项匹配

查 找 宏 定 义 标 识 符

"[I" 命令查找任何标识符。只查找 "#define" 定义的宏,用:

[D

同样,这会在所有的包含文件中查找。 'define' 选项指定 "[D" 所查找的预定义样式。
你需要改变它值来适用于 C 或 C++ 以外的语言。
"[D" 相关命令:

[d 只列出第一项匹配
]D 只列出光标下面的项目


*29.5* 查找局部标识符

"[I" 命令查找所有的包含文件。要在当前文件中查找并跳转到光标处单词被首次使用的
地方,用:

gD

提示:Goto Definition。这个命令对查找局部(C 语言中的 "static") 声明的变量或函
数很有用。例如(光标在 "counter" 处):

+-> static int counter = 0;
|
| int get_counter(void)
gD | {
| ++counter;
+-- return counter;
}

要进一步的缩小查找范围,只在当前函数内查找,用这个命令:

gd

这会回到当前函数的开始处寻找光标处单词首次出现的地方。实际上,它是向后找到一个
在第一列 '{' 上面的空行,然后再从那里向前查找标识符。例如(光标位于 idx 上):

int find_entry(char *name)
{
+-> int idx;
|
gd | for (idx = 0; idx < table_len; ++idx)
| if (strcmp(table[idx].name, name) == 0)
+-- return idx;
}


]d 只列出光标下面的第一项匹配

/* a short comment */ <-+


你可以用 'previewheight' 选项指定预览窗口打开时的高度。

转:vim插件 ctags 和 taglist 的安装和使用

更多精彩请到 http://www.139ya.com

转自: http://kelaocai.javaeye.com/blog/105853


1.ctags
(1)到http://ctags.sourceforge.net/下载ctags源码ctags-5.6.tar.gz
http://prdownloads.sourceforge.net/ctags/ctags-5.6.tar.gz
(2)解压并安装
tar zxvf ctags-5.6.tar.gz
cd ctags-5.6
./configure && make && make install
(3)使用
[/home/brimmer/src]$ ctags -R

"-R"表示递归创建,也就包括源代码根目录下的所有子目录下的源程序。"tags"文件中包括这些对象的列表:
l 用#define定义的宏
l 枚举型变量的值
l 函数的定义、原型和声明
l 名字空间(namespace)
l 类型定义(typedefs)
l 变量(包括定义和声明)
l 类(class)、结构(struct)、枚举类型(enum)和联合(union)
l 类、结构和联合中成员变量或函数
VIM用这个"tags"文件来定位上面这些做了标记的对象,下面介绍一下定位这些对象的方法:

1) 用命令行。在运行vim的时候加上"-t"参数,例如:
[/home/brimmer/src]$ vim -t foo_bar
这个命令将打开定义"foo_bar"(变量或函数或其它)的文件,并把光标定位到这一行。
2) 在vim编辑器内用":ta"命令,例如:
:ta foo_bar
3) 最方便的方法是把光标移到变量名或函数名上,然后按下"Ctrl-]"。用"Ctrl-o"退回原来的地方。
注意:运行vim的时候,必须在"tags"文件所在的目录下运行。否则,运行vim的时候还要用":set tags="命令设定"tags"文件的路径,这样vim才能找到"tags"文件。

在函数中移动光标
[{ 转到上一个位于第一列的"{"
}] 转到下一个位于第一列的"{"
{ 转到上一个空行
} 转到下一个空行 ([ and ] 也分别是两个指令)
gd 转到当前光标所指的局部变量的定义
* 转到当前光标所指的单词下一次出现的地方
# 转到当前光标所指的单词上一次出现的地方
Vim 的创造者是一名计算机程序员,因此这就不奇怪 Vim 中有许多帮助编写程序的功能:
跳转到标识符被定义和使用的地方;在另一个窗口中预览有关的声明等等。
(ctags使用部分参考了 文章“ctags和vim”,原文在
http://hi.baidu.com/original/blog/item/2cf8d53f00b7fcc27d1e71f0.html
更多使用也请参考原文)


2. taglist
能够列出源文件中的tag(function, class, variable, etc)并跳转.
注意:taglist依赖于ctags,所以要先装ctags,否则taglist装了也没法用!
(1)到http://vim.sourceforge.net/scripts/script.php?script_id=273
下载taglist_42.zip,即
http://vim.sourceforge.net/scripts/download_script.php?src_id=6416
(2)解压得到两个文件
# unzip -d taglist taglist_42.zip
# cd taglist
# tree
.
|-- doc
| `-- taglist.txt
`-- plugin
`-- taglist.vim
(3)安装
cp doc/taglist.txt /usr/share/vim/vim61/doc/
cp plugin/taglist.vim /usr/share/vim/vim61/plugin/
(4)配置和使用
cd /usr/share/vim/vim61/doc/
启动vim,用 “:helptags .”来配置好帮助文件
重启vim,用“:TlistToggle”来打开和关闭taglist窗口。
可以用“:help taglist”来获得更多帮助信息

使用tag文件和taglist插件

更多精彩请到 http://www.139ya.com

转自: http://doc.linuxpk.com/53495.html

http://doc.linuxpk.com/53499.html

使用VIM开发软件项目 - (5) 使用tag文件和taglist插件

本节所用命令的帮助入口:
:help ‘tags’
:help :tag
:help :tags
:help CTRL-]
:help CTRL-T
:help vimgrep
:help cw
:help pattern

尽管相关的文章已经很多了,但tag文件实在是太有用了,所以还是啰嗦一次。

Tag文件(标签文件)无疑是开发人员的利器之一,有了tag文件的协助,你可以在VIM查看函数调用关系,类、结构、宏等的定义,可以在任意标签中跳转、返回……相信使用过Source Insight的人对这些功能并不陌生,而在VIM中,此功能的实现依赖于tag文件。

对于程序来说,Tag文件中保存了诸如函数、类、结构、宏等的名字,它们所处的文件,以及如何通过Ex命令跳转到这些标签。它是一个纯文本文件,因此你可以手工的编辑它,也可以使用脚本对其进行操作。

通常我们使用名为ctags的程序来生成这样的tag文件。VIM能直接使用ctags程序所生成的tag文件。在UNIX系统下的ctags功能比较少,所以一般我们使用Exuberant Ctags(在大多数Linux系统上,它是缺省的ctags程序),它能够支持多达33种程序语言,足以满足我们开发的需要了。如果你的系统上未安装此程序,请到http://ctags.sourceforge.net下载。

EMACS则使用etags来生成tag文件,如果希望VIM也能支持etags的tag文件格式,需要在编译VIM时加入” +emacs_tags”选项。

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

{tagname} {TAB} {tagfile} {TAB} {tagaddress} {term} {field} ..



{tagname} 标识符名字,例如函数名、类名、结构名、宏等。不能包含制表符。

{tagfile} 包含 {tagname} 的文件。它不能包含制表符。

{tagaddress} 可以定位到 {tagname}光标位置的 Ex 命令。

{term} 设为“;"”。这是为了兼容Vi编辑器,使Vi忽略后面的{field}字段。

{field} .. 此字段可选,通常用于表示此{tagname}的类型是函数、类、宏或是其它。

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

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

!_TAG_FILE_SORTED1{anything}



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

之所以在这里介绍tag文件的格式,是因为我们在后面提到的lookupfile插件中,会自己生成tag文件。



虽然ctags有为数众多的选项,但通常我们所使用的非常简单。还是以VIM 7.0的代码为例,我们执行:

cd ~/src/vim70
ctags –R src



上面这条命令会在~/src/vim70/目录下生成一个名为tags的文件,这个文件中包含~/src/vim70/src/目录下所有.c、.h文件中的标签。它一个文本文件,你可以用VIM打开它看一下。此文件缺省按区分字母大小写排序,所以直接可以被VIM使用。



现在我们进入VIM,执行下面的命令:
:cd ~/src/vim70 "切换当前目录为~/src/vim70
:set tags=tags "设置tags选项为当前目录下的tags文件



现在,我们设置好了tags选项,接下来我们使用它:

:tag VimMain



你会看到VIM打开了src/main.c文件,并把光标定位到第167行VimMain上。

我们知道,一般主程序的函数名为main,如果你尝试下面的命令:

:tag main
# pri kind tag file
1 F f main src/xxd/xxd.c
main(argc, argv)
2 FS d main src/if_python.c
46
Choice number ( cancels):



这里并没有src/main.c文件,怎么回事呢?这是因为ctags并不是编译器,它在处理编译预处理指令受到局限,因此并没有生成src/main.c中main()函数的标签。你可以在生成tag文件时给ctags指定参数来解决这个问题。

或者你可以用”:grep”或”:vimgrep”来查找main(这已经超出本文的范围了,因此只给出例子,在后续的文章再做讲解):

:cd ~/src/vim70
:vimgrep /\/ src/*.c
:cw



这时下面的窗口将显示出来,在quickfix窗口中找到我们想跳转的位置(本例中是src/main.c),按回车,就可以跳到对应的位置了。

如果你只记得部分的标签名,那么可以使用“tag”命令的搜索模式,你可以输入一个VIM正则表达式来表示你所查找的名字,如:

:tag /\C\<\k\+ain\>
# pri kind tag file
1 F f VimMain src/main.c
VimMain
2 F d bindtextdomain src/vim.h
483
3 F d bindtextdomain src/vim.h
502
4 F d bindtextdomain src/vim.h
504
5 F f main src/xxd/xxd.c
main(argc, argv)
6 F d textdomain src/vim.h
488
7 F d textdomain src/vim.h
510
8 F d textdomain src/vim.h
512
9 FS d bindtextdomain src/gui_gtk.c
54
10 FS d bindtextdomain src/gui_gtk_x11.c
37
11 FS f cmdsrv_main src/main.c
cmdsrv_main(argc, argv, serverName_arg, serverStr)
12 FS d main src/if_python.c
46
13 FS d textdomain src/gui_gtk.c
51
14 FS d textdomain src/gui_gtk_x11.c
34
Choice number ( cancels):



这表示我想查找一个以一个或多个keyword开始的标签,此标签以ain做为结尾,在查找时区分大小写。要读懂这个正则表达式,请“:help pattern”。


VIM会保存一个跳转的标签栈,以允许你在跳转到一个标签后,再跳回来,可以使用“:tags”命令查找你处于标签栈的哪个位置。

我们经常用到的tag跳转命令见下(一般只需要知道CTRL-]和CTRL-T就可以了):

:tag {ident} "跳转到指定的标签
:tags "显示标签栈
CTRL-] "跳转到当前光标下的标签
CTRL-T "跳到标签栈中较早的标签




如果想了解更多命令,可以“:help 29.1”(强烈建议程序员完整的阅读usr_29.txt和usr_30.txt)。

如果想更深入了解tag命令和相关知识,可以“:help tagsrch”。

我之前写的一篇关于ctags和cscope的文章,参见:Vim + Cscope/Ctags


没想到写了这么长……看来taglist插件要在下篇文章中介绍了。


本节所用命令的帮助入口:
:help helptags
:help taglist.txt

上篇文章介绍了在VIM中如何使用tag文件,本文主要介绍如何使用taglist插件。

想必用过Source Insight的人都记得这样一个功能:SI能够把当前文件中的宏、全局变量、函数等tag显示在Symbol窗口,用鼠标点上述tag,就跳到该tag定义的位置;可以按字母序、该tag所属的类或scope,以及该tag在文件中出现的位置进行排序;如果切换到另外一个文件,Symbol窗口更新显示这个文件中的tag。

在VIM中的taglist插件所实现的就是上述类似的功能,有些功能比SI弱,有些功能比SI更强。而且,taglist插件仍在不断完善中!
要使用taglist插件,必须满足:

1. 打开VIM的文件类型自动检测功能;
2. 系统中装了Exuberant ctags工具,并且taglist能够找到此工具(因为taglist需要调用它来生成tag文件);
3. 你的VIM支持system()调用;

在本系列第3篇文章(vimrc初步)中,我们使用了VIM自带的示例vimrc,这个vimrc中已经打开了文件类型检测功能;在上篇文章中,我们也已用到了Exuberant ctags;system()调用在一般的VIM版本都会支持(只有suse Linux发行版中出于安全考虑,关闭了此功能),所以我们已经满足了这三个条件。

现在我们到http://www.vim.org/scripts/script.php?script_id=273下载最新版本的taglist plugin,目前版本是4.3。

下载后,把该文件在~/.vim/目录中解压缩,这会在你的~/.vim/plugin和~/.vim/doc目录中各放入一个文件:

plugin/taglist.vim – taglist插件

doc/taglist.txt - taglist帮助文件

注:windows用户需要把这个插件解压在你的$VIM/vimfiles或$HOME/vimfiles目录。


使用下面的命令生成帮助标签(下面的操作在VIM中进行):

:helptags ~/.vim/doc



生成帮助标签后,你就可以用下面的命令查看taglist的帮助了:

:help taglist.txt



Taglist提供了相当多的功能,我的vimrc中这样配置:

""""""""""""""""""""""""""""""
" Tag list (ctags)
""""""""""""""""""""""""""""""
if MySys() == "windows" "设定windows系统中ctags程序的位置
let Tlist_Ctags_Cmd = 'ctags'
elseif MySys() == "linux" "设定linux系统中ctags程序的位置
let Tlist_Ctags_Cmd = '/usr/bin/ctags'
endif
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口



这样配置后,当你输入“:TlistOpen”时,显示如下窗口:


在屏幕右侧出现的就是taglist窗口,你从中可以看到在main.c文件中定义的所有tag:宏、定义、变量、函数等;你也可以双击某个tag,跳到该tag定义的位置;你还可以把某一类的tag折叠起来(使用了VIM的折行功能),方便查看,就像图中macro和variable那样。更多的功能,请查看taglist的帮助页,本文也会介绍一些常用功能。


下面介绍常用的taglist配置选项,你可以根据自己的习惯进行配置:



- Tlist_Ctags_Cmd选项用于指定你的Exuberant ctags程序的位置,如果它没在你PATH变量所定义的路径中,需要使用此选项设置一下;

- 如果你不想同时显示多个文件中的tag,设置Tlist_Show_One_File为1。缺省为显示多个文件中的tag;

- 设置Tlist_Sort_Type为”name”可以使taglist以tag名字进行排序,缺省是按tag在文件中出现的顺序进行排序。按tag出现的范围(即所属的namespace或class)排序,已经加入taglist的TODO List,但尚未支持;

- 如果你在想taglist窗口是最后一个窗口时退出VIM,设置Tlist_Exit_OnlyWindow为1;

- 如果你想taglist窗口出现在右侧,设置Tlist_Use_Right_Window为1。缺省显示在左侧。

- 在gvim中,如果你想显示taglist菜单,设置Tlist_Show_Menu为1。你可以使用Tlist_Max_Submenu_Items和Tlist_Max_Tag_Length来控制菜单条目数和所显示tag名字的长度;

- 缺省情况下,在双击一个tag时,才会跳到该tag定义的位置,如果你想单击tag就跳转,设置Tlist_Use_SingleClick为1;

- 如果你想在启动VIM后,自动打开taglist窗口,设置Tlist_Auto_Open为1;

- 如果你希望在选择了tag后自动关闭taglist窗口,设置Tlist_Close_On_Select为1;

- 当同时显示多个文件中的tag时,设置Tlist_File_Fold_Auto_Close为1,可使taglist只显示当前文件tag,其它文件的tag都被折叠起来。

- 在使用:TlistToggle打开taglist窗口时,如果希望输入焦点在taglist窗口中,设置Tlist_GainFocus_On_ToggleOpen为1;

- 如果希望taglist始终解析文件中的tag,不管taglist窗口有没有打开,设置Tlist_Process_File_Always为1;

- Tlist_WinHeight和Tlist_WinWidth可以设置taglist窗口的高度和宽度。Tlist_Use_Horiz_Window为1设置taglist窗口横向显示;

在taglist窗口中,可以使用下面的快捷键:

跳到光标下tag所定义的位置,用鼠标双击此tag功能也一样
o 在一个新打开的窗口中显示光标下tag
显示光标下tag的原型定义
u 更新taglist窗口中的tag
s 更改排序方式,在按名字排序和按出现顺序排序间切换
x taglist窗口放大和缩小,方便查看较长的tag
+ 打开一个折叠,同zo
- 将tag折叠起来,同zc
* 打开所有的折叠,同zR
= 将所有tag折叠起来,同zM
[[ 跳到前一个文件
]] 跳到后一个文件
q 关闭taglist窗口
显示帮助

可以用“:TlistOpen”打开taglist窗口,用“:TlistClose”关闭taglist窗口。或者使用“:TlistToggle”在打开和关闭间切换。在我的vimrc中定义了下面的映射,使用“,tl”键就可以打开/关闭taglist窗口:

map tl :TlistToogle

Taglist插件还提供了很多Ex命令,你甚至可以用这些命令创建一个taglist的会话,然后在下次进入VIM时加载此会话。

Taglist插件还可以与winmanager插件协同使用,这将在下篇文章中介绍。

Monday, February 9, 2009

gvim和vim中使用内置的grep命令搜索字符串,然后窗体跳转

更多精彩请到 http://www.139ya.com

gvim和vim中使用内置的grep命令搜索字符串,然后窗体跳转,超爽!!!

:copen打开一个面板跟踪窗
然后grep -r main *之后执行:nmap :.ccp
然后F12就可以实现自动跳转了n好用,或者直接鼠标双击也行,就是来回切,比较麻烦
:cclose关闭面板跟踪窗
(注::grep为vim和gvim内置命令,所以windows下和linux下都可以正常使用)

Wednesday, September 10, 2008

Vi指令大全



---------------------------------------------------------------------------------------------
进入vi的命令

vi filename: 打开或新建文件,并将光标置于第一行首
vi +n filename: 打开文件,并将光标置于第n行首
vi + filename: 打开文件,并将光标置于最后一行首
vi +/pattern filename: 打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename: 在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename....filename: 打开多个文件,依次进行编辑


---------------------------------------------------------------------------------------------

移动光标类命令

h: 光标左移一个字符
l: 光标右移一个字符
space: 光标右移一个字符
Backspace: 光标左移一个字符
k或Ctrl+p: 光标上移一行
j或Ctrl+n: 光标下移一行
Enter: 光标下移一行
w或W : 光标右移一个字至字首
b或B : 光标左移一个字至字首
e或E : 光标右移一个字至字尾
): 光标移至句尾
(: 光标移至句首
}: 光标移至段落开头
{: 光标移至段落结尾
nG: 光标移至第n行首
n+: 光标下移n行
n-: 光标上移n行
n$: 光标移至第n行尾
H: 光标移至屏幕顶行
M: 光标移至屏幕中间行
L: 光标移至屏幕最后行
0: 光标移至当前行首
$: 光标移至当前行尾


---------------------------------------------------------------------------------------------

屏幕翻滚类命令

Ctrl+u: 向文件首翻半屏
Ctrl+d: 向文件尾翻半屏
Ctrl+f: 向文件尾翻一屏
Ctrl+b: 向文件首翻一屏
nz: 将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。


---------------------------------------------------------------------------------------------

插入文本类命令

i: 在光标前
I: 在当前行首
a: 光标后
A: 在当前行尾
o: 在当前行之下新开一行
O: 在当前行之上新开一行
r: 替换当前字符
R: 替换当前字符及其后的字符,直至按ESC键
s: 从当前光标位置处开始,以输入的文本替代指定数目的字符
S: 删除指定数目的行,并以所输入文本代替之
ncw或nCW: 修改指定数目的字
nCC: 修改指定数目的行


---------------------------------------------------------------------------------------------

删除命令

ndw或ndW: 删除光标处开始及其后的n-1个字
do: 删至行首
d$: 删至行尾
ndd: 删除当前行及其后n-1行
x或X: 删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u: 删除输入方式下所输入的文本


---------------------------------------------------------------------------------------------

搜索及替换命令

/pattern: 从光标开始处向文件尾搜索pattern
?pattern: 从光标开始处向文件首搜索pattern
n: 在同一方向重复上一次搜索命令
N: 在反方向上重复上一次搜索命令
:s/p1/p2/g: 将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g: 将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g: 将文件中所有p1均用p2替换


---------------------------------------------------------------------------------------------

选项设置

all: 列出所有选项设置情况
term: 设置终端类型
ignorance: 在搜索中忽略大小写
list: 显示制表位(Ctrl+I)和行尾标志($)
number: 显示行号
report: 显示由面向行的命令修改过的数目
terse: 显示简短的警告信息
warn: 在转到别的文件时若没保存当前文件则显示NO write信息
nomagic: 允许在搜索模式中,使用前面不带“\”的特殊字符
nowrapscan: 禁止vi在搜索到达文件两端时,又从另一端开始


---------------------------------------------------------------------------------------------

最后行方式命令

:n1,n2 co n3: 将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d: 将 n1行到n2行之间的内容删除
:w: 保存当前文件
:e filename: 打开文件filename进行编辑
:x: 保存当前文件并退出
:q: 退出vi
:q!: 不保存文件并退出vi
:!command: 执行shell命令command
:n1,n2 w!command: 将文件中n1行至n2行的内容作为command的输入并执行之,
 若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command: 将命令command的输出结果放到当前行


---------------------------------------------------------------------------------------------

寄存器操作

"?nyy: 将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyw: 将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyl: 将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
"?p: 取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd: 将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中