📄 windows.cnx
字号:
:pedit +/fputc /usr/include/stdio.h< *:ps* *:psearch*:[range]ps[earch][!] [count] [/]pattern[/] 与 |:ijump| 命令很像,只是找到匹配的在预览窗口显示。预览窗口用 |:ptag| 打开。 当前窗口和光标的位置都不改变。有用的例子: > :psearch popen< 这很像 |:ptag| 命令,你可以用它自动显示光标所在单词的相关信息。 这个命令虽然不如 |:ptag| 用起来爽,但是你可以不使用标记文件, 并且它也可以找到一些系统的头文件。例如:> :au! CursorHold *.[ch] nested exe "silent! psearch " . expand("<cword>")< 警告:可能会很慢。例子 *CursorHold-example* > :au! CursorHold *.[ch] nested exe "silent! ptag " . expand("<cword>")这条命令以当前光标位置处的关键字为参数,执行 ":ptag" 命令。'updatetime' 指定了光标停留的时间;"nested" 使得自动命令得以执行,这样可以在预览窗口里启用语法加亮。"silent!" 屏蔽了在找不到标签时产生的错误信息。也参见 |CursorHold| 。要禁用此功能: > :au! CursorHold另一个比较好用的功能是加亮已经找到的标签,这样可以避免对光标处没有定义的单词执行 ":ptag",和一些别的东西: > :au! CursorHold *.[ch] nested call PreviewWord() :func PreviewWord() : if &previewwindow " 不要在预览窗口里执行 : return : endif : let w = expand("<cword>") " 在当前光标位置抓词 : if w != "" " 如果该词可以通过 ":ptag" 找到其定义 : : " 在显示下一个标签之前,删除所有现存的语法加亮 : silent! wincmd P " 跳转至预览窗口 : if &previewwindow " 如果确实转到了预览窗口…… : match none " 删除语法加亮 : wincmd p " 回到原来的窗口 : endif : : " 显示当前光标处匹配的标签 : let v:errmsg = "" : exe "silent! ptag " . w : if v:errmsg =~ "tag not found" : return : endif : : silent! wincmd P " 跳转至预览窗口 : if &previewwindow " 如果确实转到了预览窗口…… : if has("folding") : silent! .foldopen " 展开折叠的行 : endif : call search("$", "b") " 到前一行的行尾 : let w = substitute(w, '\\', '\\\\', "") : call search('\<\V' . w . '\>') " 把光标放置匹配的单词上 : " 在此位置对匹配的单词加亮 : hi previewWord term=bold ctermbg=green guibg=green : exe 'match previewWord "\%' . line(".") . 'l\%' . col(".") . 'c\k*"' : wincmd p " 返回原来的窗口 : endif : endif :endfun==============================================================================11. 使用隐藏的缓冲区 *buffer-hidden*隐藏的缓冲区已经载入内存,但是不会显示在窗口里。这使得 Vim 每次从一个文件切换到另一个文件时,不必频繁地读写磁盘。 {若编译时没加入 |+listcmds| ,则不可用} *:buffer-!*如果设置了 'hidden' ('hid') ,那么被丢弃的缓冲区会记忆你在 ":edit", ":next",":tag",等命令之后进行的所有操作。虽然有时没有设置 'hidden',但是有一些作用于缓冲区列表的命令还是会把当前窗口变为隐藏。这种情况发生在:当 'autowrite' 选项是关闭的或者缓冲区不可保存时,你试图用 '!' 强制删除一个修改过的缓冲区窗口。你可以用任何编辑命令使隐藏的缓冲区不再隐藏。或者用 ":bdelete" 命令将其删除。'hidden' 是全局选项, 它作用于所有的缓冲区。'bufhidden' 选项可以作用于指定的缓冲区,该选项可以是下面的值: <empty> 使用 'hidden' 的值。 hide 隐藏该缓冲区,也适合于 'hidden' 没有设置的情况。 unload 不隐藏,而是卸载该缓冲区,也适合于设置了 'hidden' 的情 况。 delete 删除该缓冲区。 *hidden-quit*如果存在一个隐含的,并且被修改过的缓冲区,若此时退出 Vim 会得到一条错误信息,并且 Vim 会把该缓冲区变为当前的缓冲区。你可以决定是保存(":wq")还是退出(":q!")。注意:可能不止一个隐藏的并且已被修改的缓冲区!缓冲区也可能是非列表的(unlisted),这意味着此缓冲区存在,但是从缓冲区列表中看不到。|unlisted-buffer|:files[!] *:files*:buffers[!] *:buffers* *:ls*:ls[!] 显示所有缓冲区。例如: > 1 #h "/test/text" line 1 2u "asdf" line 0 3 %l+ "version.c" line 1< 如果使用了 [!] ,将显示所有的缓冲区,包括非列表的缓冲区。( "unlisted" —— “非列表”这一术语有点儿别扭……)。 每一个缓冲区都有唯一的号码与之对应。这个号码是不会改变的,所以 你可以一直使用 ":buffer N" 或 "N CTRL-^" (N 是缓冲区号码)来 选择特定的缓冲区。 标识符号(同一列上的符号不可能同时出现): u 非列表缓冲区(只有使用 [!] 才能看到)|unlisted-buffer| % 当前窗口里的缓冲区 # 用 ":e #" 或 CTRL-^ 可切换到该缓冲区 a 激活的缓冲区:已载入内存并且可见 h 隐藏的缓冲区:已载入内存但是没有窗口显示它 |hidden-buffer| - 不可更改的缓冲区,选项 'modifiable' 被关闭。 = 只读缓冲区 + 被更改的缓冲区 *:bad* *:badd*:bad[d] [+lnum] {fname} 在缓冲区列表里添加一个文件名 {fname} ,但是不把该文件载入内存。 如果指定了 "lnum" ,那么第一次进入缓冲区时,光标会停留在那一行。 Note + 后面的其它命令将被忽略。:[N]bd[elete][!] *:bd* *:bdel* *:bdelete*:bd[elete][!] [N] 卸载缓冲区 [N] (默认:当前窗口)并且从缓冲区列表里删除该缓冲 区。如果缓冲区被改动过,那么该命令将失败,除非使用[!] ,但是这 样所有的改动都会丢失。文件和 Vim 失去联系。打开该文件的所有窗 口都会关闭。如果缓冲区 [N] 是当前的缓冲区,那么 Vim 会显示另一 个缓冲区来替代它。Vim 会选择列表中距离最近的一个装入缓冲区。 实际上,该缓冲区没有被完全从缓冲区列表 |unlisted-buffer| 里删除。该缓冲区中选项的值、变量、映射和缩略词被清空。:bdelete[!] {bufname} *E93* *E94* 类似 ":bdelete[!] [N]",但是使用名字指定缓冲区。 Note 如果缓冲区名字是数字的,不能用该命令引用;用号码代替。如 果名字里含有空格,在空格前插入反斜杠。:bdelete[!] N1 N2 ... 对缓冲区 N1,N2,……执行 ":bdelete[!]" 。 参数可以是名字或号码(但是名字里不能含有数字)。 如果名字里含有空格,在空格前插入反斜杠。:N,Mbdelete[!] 对 N 号到 M 号(包含 N 和 M )缓冲区执行 ":bdelete[!]" :[N]bw[ipeout][!] *:bw* *:bwipe* *:bwipeout*:bw[ipeout][!] {bufname}:N,Mbw[ipeout][!]:bw[ipeout][!] N1 N2 ... 类似 ":bdelete",真正删除缓冲区。所有标记失效,选项丢失,等等。 不要用,除非你知道自己正在做什么。:[N]bun[load][!] *:bun* *:bunload*:bun[load][!] [N] 卸载缓冲区 [N] (默认:当前缓冲区)。原来占用的内存将被释放该 缓冲区还保留在缓冲区列表里如果缓冲区被改动过,那么该命令将失败, 除非使用[!] ,但是这样所有的改动都会丢失。如果缓冲区 [N] 是当 前的缓冲区,那么 Vim 会显示另一个缓冲区来替代它。Vim 会选择列 表中距离最近的一个装入缓冲区。:bunload[!] {bufname} 类似 ":bunload[!] [N]", 但是使用名字指定缓冲区。 Note 如果缓冲区名字是数字的,不能用该命令引用;用号码代替。如 果名字里含有空格,在空格前插入反斜杠。:N,Mbunload[!] 对 N 号到 M 号(包含 N 和 M )缓冲区执行 ":bunload[!]" :bunload[!] N1 N2 ... 对缓冲区 N1,N2,……执行 ":bunload[!]" 。 参数可以是名字或号码(但是名字里不能含有数字)。 如果名字里含有空格,在空格前插入反斜杠。:[N]b[uffer][!] [N] *:b* *:bu* *:buf* *:buffer* *E86* 编辑列表中的缓冲区 [N] ,如果没指定 [N] ,就编辑当前的缓冲区。 对于 [!] 参见 |:buffer-!| 。这个命令同样可以编辑不再列表里的缓 冲区,而无需设置 'buflisted' 。:[N]b[uffer][!] {filename} 编辑列表中的缓冲区 {filename}。对于 [!] 参见 |:buffer-!| 。这 个命令同样可以编辑不再列表里的缓冲区,而无需设置 'buflisted' 。:[N]sb[uffer] [N] *:sb* *:sbuffer* 分割窗口编辑列表中的缓冲区 [N] ,如果没指定 [N] ,就编辑当前的 缓冲区。分割窗口的时候要看 'switchbuf' 是不是设置了 "useopen" 。这个命令同样可以编辑不再列表里的缓冲区,而无需设置 'buflisted' 。:[N]sb[uffer] {filename} 分割窗口编辑列表中的缓冲区 {filename}。这个命令同样可以编辑不 再列表里的缓冲区,而无需设置 'buflisted' 。 *:bn* *:bnext* *E87*:[N]bn[ext][!] [N] 前进至后面的第 [N] 个缓冲区。 [N] 默认是 1 。如果到了缓冲区列 表的末尾,则从头循环。对于 [!] 参见 |:buffer-!| 如果你在帮助文件缓冲区里,这条命令让你跳到下一个帮助缓冲区(如 果有的话)。同样,你在一个正常(非帮助)缓冲区里,就会使你跳到 下一个正常缓冲区。这样是为了在打开帮助的时候不会影响到浏览正常 的代码或文本。下面的命令都是这样。 *:sbn* *:sbnext*:[N]sbn[ext] [N] 分割窗口前进至后面的第 [N] 个缓冲区。 如果到了缓冲区列表的末尾,则从头循环。使用 'switchbuf':[N]bN[ext][!] [N] *:bN* *:bNext* *:bp* *:bprevious* *E88*:[N]bp[revious][!] [N] 到前面的第 [N] 个缓冲区。 [N] 默认是 1 。 如果到了缓冲区列表的顶端,则从末尾循环。对于 [!] 参见 |:buffer-!| 和 'switchbuf' 。:[N]sbN[ext] [N] *:sbN* *:sbNext* *:sbp* *:sbprevious*:[N]sbp[revious] [N] 分割窗口并前进到前面的第 [N] 个缓冲区。 [N] 默认是 1 。 如果到了缓冲区列表的顶端,则从末尾循环。对于 [!] 参见 |:buffer-!| 和 'switchbuf' 。 *:br* *:brewind*:br[ewind][!] 前进到缓冲区列表中的第一个缓冲区。 如果列表为空,则转到第一个非列表缓冲区。对于 [!] 参见 |:buffer-!| *:bf* *:bfirst*:bf[irst 与 ":brewind" 相同。 *:sbr* *:sbrewind*:sbr[ewind] 分割窗口并前进到缓冲区列表中的第一个缓冲区。 如果列表为空,则转到第一个非列表缓冲区。对于 [!] 参见 |:buffer-!| 还需考虑 'switchbuf' 选项。 *:sbf* *:sbfirst*:sbf[irst] 与 ":sbrewind" 相同。 *:bl* *:blast*:bl[ast][!] 前进到缓冲区列表中的最后一个缓冲区。 如果列表为空,则转到最后一个非列表缓冲区。对于 [!] 参见 |:buffer-!| 还需考虑 'switchbuf' 选项。 *:sbl* *:sblast*:sbl[ast] 分割窗口并前进到缓冲区列表中的最后一个缓冲区。 如果列表为空,则转到最后一个非列表缓冲区。对于 [!] 参见 |:buffer-!| 还需考虑 'switchbuf' 选项。:[N]bm[odified][!] [N] *:bm* *:bmodified* *E84* 前进至第 [N] 个修改过的缓冲区。 Note: 这一命令同样也能找到非 列表缓冲区。如果没有修改的缓冲区,此命令失败。:[N]sbm[odified] [N] *:sbm* *:sbmodified* 分割窗口并前进至第 [N] 个修改过的缓冲区。 还需考虑 'switchbuf' 选项。 Note: 这个命令也能找到不再列表里的缓冲区。:[N]unh[ide] [N] *:unh* *:unhide* *:sun* *:sunhide*:[N]sun[hide] [N] 重新排列窗口,给列表中的每一个载入的缓冲区打开一个窗口。如果设 置了计数器,则计数器指定的数目为打开窗口的最多数目。:[N]ba[ll] [N] *:ba* *:ball* *:sba* *:sball*:[N]sba[ll] [N] 重新排列窗口,给列表中的每一个缓冲区打开一个窗口。如果设置了计 数器,则计数器指定的数目为打开窗口的最多数目。 Buf/Win Enter/Leave 不会在新窗口执行,只会在真正进入窗口时才会执行。Note: 上面所有的命令在编辑另一个缓冲区的时候,总是保持 'readonly' 不变。这和":edit" 命令不同,它每次都会设置 'readonly' 。==============================================================================12. 特殊类型的缓冲区 *special-buffers*除了用来存放文本,缓冲区也可以用于其它目的。一些选项可以改变缓冲区的行为: 'bufhidden' 缓冲区不再在窗口里显示 'buftype' 缓冲区的类型 'swapfile' 缓冲区是否需要交换文件 'buflisted' 缓冲区是否在缓冲区列表中出现有用的缓冲区类型:quickfix 用来存放错误列表。参见 |:cwindow|。该命令设置 'buftype' 的值为 "quickfix" 。你不应该修改它。关闭 'swapfile' 。help 包含帮助文件。只能用 |:help| 命令创建,缓冲区的帮助标志是内置 的,不能被更改。选项 'buflisted' 在帮助缓冲区里将被重置。directory 显示目录内容。应用于 |file-explorer| 插件。该缓冲区由一下设置 创建: > :set buftype=nowrite :set bufhidden=delete :set noswapfile< 缓冲区的名字就是目录的名字,并且在使用 |:cd| 命令时会作出相应 的调整。scratch 该缓冲区包含的文本可以被随时扔掉。在关闭窗口时,它被保存下来, 并且必须被明确地删除。 设置: > :set buftype=nofile :set bufhidden=hide :set noswapfile< 缓冲区的名字可以用来标识缓冲区。 *unlisted-buffer*unlisted 该缓冲区不在缓冲区列表里。它不能用来编辑,但是可以显示帮助文件, 记录文件名或标记。":bdelete" 命令也会设置这个选项,这样就不会 完全地删除该缓冲区。设置: > :set nobuflisted< vim:tw=78:fo=tcq2:isk=!-~,^*,^\|,^\":ts=8:ft=help:norl:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -