📄 usr_29.cnx
字号:
这会在预览窗口中显示含有 popen() 原型的 "stdio.h" 文件: FILE *popen __P((const char *, const char *)); ~你可以用 'previewheight' 选项指定预览窗口打开时的高度。==============================================================================*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; --+ | ]/ /* a short comment */ <-+==============================================================================*29.4* 查找全局标识符你在编辑一个 C 程序,想要知道一个变量是被声明为 "int" 还是 "unsigned"。一个快速的方法是使用 "[I" 命令来查找。 假设光标在单词 "column" 处。输入: > [IVim 会列出它所找出的匹配行,不仅在当前文件内查找,还会在所有的包含文件中查找。结果如下所示: structs.h ~ 1: 29 unsigned column; /* column number */ ~相对使用标签文件或预览窗口的好处是包含文件也被搜索。大多数情况下都能找到正确的声明。即使标签文件已经过期或者你没有为包含文件建立标签也不会影响结果。 但是一些准备工作是必要的,否则 "[I" 就没法工作。首先,'include' 选项必须指定文件是如何被包含的。省缺值适用于 C 和 C++。对其它的语言,你需要自己设定。定 位 包 含 文 件 Vim 会找到 'path' 选项指定路径中的包含文件。如果缺少某个目录,一些包含文件将不会被找到。你可以用这个命令来查看: > :checkpath它会列出不能找到的包含文件,以及被找到的包含文件。一个输出样例: --- Included files not found in path --- ~ <io.h> ~ vim.h --> ~ <functions.h> ~ <clib/exec_protos.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" 产生一个每项只有一行文本的列表。如果你想要进一步的查看第一项,你可以这个命令来跳转: > [<Tab>你也可以使用 "[ CTRL-I", 因为 CTRL-I 和按 <Tab> 效果一样。"[I" 产生的列表在每行的开头都有一个序号。如果你要跳转到第一项外的其它项,首先输入序号: > 3[<Tab>会跳转到列表中的第三项。记住你可以用 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 < table_len; ++idx) | if (strcmp(table[idx].name, name) == 0) +-- return idx; }==============================================================================Next chapter: |usr_30.txt| Editing programsCopyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -