十多年实战总结linux下vim编辑由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“linux使用vi编辑文件”。
Linux 下Vim+ctags编辑,查看代码和编辑代码,运用熟练比可视化软件工具编写快很多。边看边操作,以后也要经常养成用命令的习惯。忘记了就查阅。很棒的,值得收藏。首先简介下vim一些命令,然后再介绍Vim+ctags做代码开发。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文件的常常输入 System.out.println, 这很
是麻烦, 所以应该用缩写来减少敲字.可以这么做:
:abbr sprt System.out.println
以后在输入sprt后再输入其他非字母符号, 它就会自动扩展为System.out.println
6.替换
替换是 vi 的强项, 因为可以用正规表达式来匹配字符串.以下提供几个例子.:s/aa/bb/g
将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
:s/
将光标所在行出现的所有 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
将所有不包含字符(空格也不包含)的空行删除.7.多文件编辑
在一个 vim 程序中打开很多文件进行编辑是挺方便的.:sp(:vsp)文件名
vim 将分割出一个横(纵)向窗口, 并在该窗口中打开新文件.从 vim6.0 开始, 文件名可以是一个目录的名称, 这样, vim 会
把该目录打开并显示文件列表, 在文件名上按回车则在本窗口打
开该文件, 若输入 O 则在新窗口中打开该文件, 输入 ? 可以看
到帮助信息.:e 文件名
vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会要求保存.c-w-w
vim 分割了好几个窗口怎么办? 输入此命令可以将光标循环定位
到各个窗口之中.:ls
此命令查看本 vim 程序已经打开了多少个文件, 在屏幕的最下方
会显示出如下数据:
%a
“usevim.html”
行 162
#
“xxxxxx.html”
行 0
其中:
表示打开的文件序号, 这个序号很有用处.%a
表示文件代号, % 表示当前编辑的文件,# 表示上次编辑的文件
“usevim.html”
表示文件名.行 162
表示光标位置.:b 序号(代号)
此命令将指定序号(代号)的文件在本窗口打开, 其中的序号(代号)
就是用 :ls 命令看到的.:set diff
此命令用于比较两个文件, 可以用
:vsp filename
命令打开另一个文件, 然后在每个文件窗口中输入此命令,就能看
到效果了.8.宏替换
vi 不仅可以用 abbr 来替换文字, 也可以进行命令的宏定义.有些命令输起来很费劲,因此我把它们定义到-上, 这样就很方便了.这些配置可以预先写到 ~/.vimrc
(windows 下为 $VIM/_vimrc)中, 写进去的时候不用写前面的冒号.:nmap :nohls取消被搜索字串的高亮
:nmap w
命令模式下转移光标到不同窗口
:imap 输入模式下运行
:nmap :%s= *$==删除所有行尾多余的空格.:imap 同上
:java 中:(注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文
会说到如何实现这一点)
:nmap :comp javac:mak-d.%
此命令用 javac 编译 java 文件, 它会自动将光标定位到出错点.不过这需要定
义一个 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有两行字:
setlocal makeprg=javac
setlocal errorformat=%A%f:%l: %m,%-Z%p^,%-C%.%#
:nmap :comp ant:mak
此命令用 ant 编译 java 文件, 它会自动将光标定位到出错点.一般来说, 安装
vim 后已经有了compiler/ant.vim文件, 因此这个命令可以直接使用.但是需要
在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行.:nmap :cl此命令用于查看所有的编译错误.:imap
:nmap :cc此命令用于查看当前的编译错误.:imap
:nmap :cn此命令用于跳到下一个出错位置.:imap
:nmap :cp此命令用于跳到上一个出错位置.:imap
:nmap :JavaBrowser
此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括
本文件中出现的类, 类的成员变量及成员方法, 就好像 JCreator 表现的那样.在这个窗口中输入 ? 会看到帮助.嘿嘿, 很好用, 不过需要 ctags 支持.:imap 9.TAB
TAB 就是制表符, 单独拿出来做一节是因为这个东西确实很有用.>>输入此命令则光标所在行向右移动一个 tab.5>>输入此命令则光标后 5 行向右移动一个 tab.:12,24>此命令将12行到14行的数据都向右移动一个 tab.:12,24>>此命令将12行到14行的数据都向右移动两个 tab.那么如何定义 tab 的大小呢? 有人愿意使用 8 个空格位, 有人用4个, 有的用2个.有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab.没关系, vim 能
帮助你.以下的设置一般也都先写入配置文件中, 免得老敲.:set shiftwidth=4
设置自动缩进 4 个空格, 当然要设自动缩进先.:set sts=4
即设置 softtabstop 为 4.输入 tab 后就跳了 4 格.:set tabstop=4
实际的 tab 即为 4 个空格, 而不是缺省的 8 个.:set expandtab
在输入 tab 后, vim 用恰当的空格来填充这个 tab.10.autocmd
这个命令十分的强大, 可以用这个命令实现对不同的文件格式应用不同的配置;可以
在新建文件时自动添加上版权声明等等.这些命令一般定义在 ~/.vimrc 这样的配置文件
里面.由于他很强大, 所以我不能给出很具体的说明, 只能举几个例子, 详细的请看帮助.:autocmd!
删除所有之前的自动命令.autocmd FileType
java
source ~/.vim/files/java.vim
autocmd FileType
java
source ~/.vim/files/jcommenter.vim
以上两条命令让我在打开 java 文件时才应用后面提到的两个配置文件.autocmd BufNewFile
*.java
0r ~/.vim/files/skeletons/java.skel
以上这条命令让我在新建 java 文件时自动加入 java.skel 文件的内容.autocmd BufNewFile
*.java
normal gnp
以上这条命令让我在新建 java 文件时自动运行 gnp 命令, 这个命令进行一些特殊化
处理, 比如将新 java 文件中的 __date__ 替换成今天的日期什么的.11.常用脚本
在 vim.sf.net 你可以发现很多脚本(script), 这些脚本常常有让你意想不到的作用.我常用的有:
jcommenter.vim
自动加入 javadoc 风格的注释.JBrowser.vim
类资源浏览.C, C++ 等可以用 Tlist
还有许多有用的, 比如 checkstyle.vim 可以检验你的编程风格, jad.vim 可以直接
反编译.cla 文件等等.12.常用配置
在~/.vimrc 配置文件中你常常需要一些个性化配置.比如上面写的一些宏定义, 一些
autocmd 定义等等.比如:
set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
这样在vim中打开文件时, 按 tab 键补齐文件名时它会忽略上述文件.set nu
显示行号
set ai
设置自动缩进
map Y y$
让 Y 和 D 一样, 要不然 Y 的本意和 yy 一样.vim+ctags用法:
[/home/brimmer/src]$ ctags-R “-R”表示递归创建,也就包括源代码根目录下的所有子目录下的源程序。“tags”文件中包括这些对象的列表: l 用#define定义的宏 l 枚举型变量的值 l 函数的定义、原型和声明 l 名字空间(namespace)l 类型定义(typedefs)l 变量(包括定义和声明)
l 类(cla)、结构(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 中有许多帮助编写程序的功能: 跳转到标识符被定义和使用的地方;在另一个窗口中预览有关的声明等等。在下一章中还 会介绍更多的功能。
使用标签
什么是标签?标签就是一个标识符被定义的地方。一个例子就是 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 |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_” 的标签名也会被找到。类似 地,“___FCKpd___0quot;指定标签名结尾处的匹配。
标 签 浏 览 器
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|。
预览窗口
当编辑含有函数调用的代码时,你需要使用正确的调用参数。要获知所要传递的值,你可以 查看这个函数是如何定义的。标签机制对此十分适用。如果定义可在另一个窗口内显示那 就更好了。对此我们可以利用预览窗口。
打开一个预览窗口来显示函数 “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 *));
你可以用 'previewheight' 选项指定预览窗口打开时的高度。
在代码间移动
因为程序代码是结构化的,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 defined(HAS_INC_H)a = a + inc();# ifdef USE_THEME a += 3;# endif set_width(a);
如果光标在最后一行,“[#” 会移动到第一行。中间的 “#ifdef”*/ 注释 有效。
+-> +-> /* | [/ | * A comment about--+ [/ | +--* wonderful life.| ]/ | */
查找全局标识符
你在编辑一个 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 只列出光标下面的项目
]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
三种状态Command: 任何输入都会作为编辑命令,而不会出现在屏幕上,任何输入都引起立即反映 Insert: 任何输入的数据都置于编辑寄存器,按ESC,可跳回command方式Escape: 以“:”或者“......
vim高级用法多年经验原创总结(全部测试成功)====================================一、Linux→命令模式:Vim filename1.一次移动一个光标h j k l左下上右2.行内移动0 到行首(......
当工作或学习进行到一定阶段或告一段落时,需要回过头来对所做的工作认真地分析研究一下,肯定成绩,找出问题,归纳出经验教训,提高认识,明确方向,以便进一步做好工作,并把这些用文字表......
QE实战总结Remark: 1.以下文章仅代表个人观点;2. 所取的例子,客户代码全部是缩写,如有雷同,纯属巧合;Tiger jin 初稿于2012.4.19 前段时间有二个朋友路过,找我一起喝酒,他们都是生产......
模具实战经验总结(转载) 模具经验一:模具外观1、模具必须有模具编号,并整齐地打在基准角长方向对面一边,大模用10~12mm字码,小模用6~8mm字码,左上角打模号,右上角打数字以确认模板......