📄 windows.cnx
字号:
*windows.txt* For Vim version 6.1. 原文最后更新: 2001年1月30日 VIM 参考手册 作者:Bram Moolenaar 翻译:Dasn<dasn@users.sf.net> VCD主页:http://vimcdoc.sf.net使用多个窗口和缓冲区进行编辑 *windows* *buffers*下面我们看一下操作多个窗口和缓冲区的命令。另外有些命令在操作多个窗口的时候不同于单个窗口,这也是需要解释的。一些基本的内容在用户手册的第 7、8 两个章节里 |usr_07.txt| |usr_08.txt|已经介绍过了。1. 简介 |windows-intro|2. 启动 Vim |windows-starting|3. 打开和关闭一个窗口 |opening-window|4. 把光标移动到另一个窗口 |window-move-cursor|5. 窗口的移动 |window-moving|6. 改变窗口的大小 |window-resize|7. 参数和缓冲区的列表命令 |buffer-list|8. 在所有的缓冲区和窗口里执行命令 |list-repeat|9. 当前光标处的标记和文件名 |window-tag|10. 预览窗口 |preview-window|11. 使用隐藏的缓冲区 |buffer-hidden|12. 特殊类型的缓冲区 |special-buffers|{Vi 没有这些命令}{如果在编译时没有加入 |+windows|,则不能使用多个窗口}{如果在编译时没有加入 |+vertsplit|,则不能垂直分割窗口}==============================================================================1. 简介 *windows-intro*“窗口”被用来查看缓冲区里的内容。你可以用多个窗口观察同一个缓冲区,也可以用多个窗口观察不同的缓冲区。“缓冲区”是一块内存区域,里面存储着正在编辑的文件。如果没有把缓冲区里的文件存盘,那么原始文件不会被更改。缓冲区的状态可以是下述三种情况之一: *active-buffer*激活: 缓冲区的内容显示在一个窗口里。如果该缓冲区是针对某一个文件创建的,那 么该文件已经被读入缓冲区。如果缓冲区被更改过,其内容便会与原文件不同。 *hidden-buffer*隐藏: 缓冲区的内容不被显示。如果该缓冲区是针对某一个文件创建的,那么么该文 件已经被读入缓冲区。其实它与激活状态一样,只是你看不见它。 *inactive-buffer*非激活: 缓冲区的内容不被显示,也不包含任何数据。文件一旦被装入,与该缓冲区相 关的选项会被记住。这些选项可以包括 |viminfo| 文件里的一些标记,但是 这种缓冲区不能包含文本。用一个表来说明:状态 在窗口显示 文件装载 用 ":buffers" 命令 ~ 显示 ~激活 yes yes 'a'隐藏 no yes 'h'非激活 no no ' 'Note: 所有的 CTRL-W 命令都可以用 |:wincmd| 执行,当我们不能在正常模式下输入命令,或者输入不方便时可以试一下。==============================================================================2. 启动 Vim *windows-starting*在默认情况下,与 Vi 类似, Vim 启动后只打开一个窗口。参数 "-o" 和 "-O" 可以让 Vim 为参数列表里的每一个文件打开一个窗口。参数 "-o"水平分割窗口;参数 "-O" 垂直分割窗口。如果 "-o" 和 "-O" 都用了,那么最后一个参数决定分割的方向。例如,下面的例子打开三个水平分割的窗口: > Vim -o file1 file2 file3参数 "-oN" ,这里的 N 是一个十进制数,用这个参数可以打开 N 个水平分割的窗口。如果文件名的个数多于窗口数目,则只打开 N 个窗口,这样有一些文件就得不到窗口来显示。如果指定的窗口数多于文件的个数,那么后面的几个窗口会编辑空的缓冲区。同样,"-ON" 打开 N 个垂直分割的窗口,相应的规则与 "-oN" 相同。如果你打开了很多的文件,每个窗口都会便得很小。你可能需要设置 'winheight' 和'winwidth' 选项来创建一个适合工作的环境。Buf/Win Enter/Leave 等自动命令 |autocommand| 不会在打开窗口或读取文件时运行,只有在真正进入程序后才会运行。 *status-line*状态栏用来分割窗口。选项 'laststatus' 用来设置在什么时候最后一个窗口可以有状态栏: 'laststatus' = 0 不要状态栏 'laststatus' = 1 窗口数多于一个的时候 'laststatus' = 2 总是显示状态栏你可以通过设置 'statusline' 选项来改变状态栏的内容。通常状态栏用反色显示。你可以通过修改 'highlight' 选项中的 's' 字符来改变。例如,"sb" 设置为粗体字。如果没有启用状态栏加亮 ("sn"), 那么字符 '^' 表示当前窗口,字符 '=' 表示其它窗口。如果支持鼠标,并且已经通过设置 'mouse' 选项使之启动,那么你可以用鼠标拖动状态栏以改变窗口的大小。Note: 如果你想让状态栏以反色显示,但是它没有。查看一下 'highlight' 选项是否包含了 "si"。在 3.0 版本里,这意味着反转(invert)状态栏,但是现在应该使用 "sr",反转(reverse)状态栏,因为 "si" 现在表示斜体(italic)!如果你的终端不支持斜体,那么状态栏还是会以反色显示;这种问题只会出现在支持斜体字的 termcap 终端上。==============================================================================3. 打开和关闭一个窗口 *opening-window* *E36*CTRL-W s *CTRL-W_s*CTRL-W S *CTRL-W_S*CTRL-W CTRL-S *CTRL-W_CTRL-S*:[N]sp[lit] [++opt] [+cmd] *:sp* *:split* 把当前窗口分割成两个,结果是两个窗口显示同一个文件。新打开的窗 口高度为 N (默认值是当前窗口高度的一半。减少当前窗口的高度, 空出地方给新的窗口(或者采用别的方案,如果你设置了 'equalalways' 选项,并且 'eadirection' 没有设置为 "hor")。 Note: CTRL-S 不是在所有的终端都能使用,并且可能导致不能继续输 入,遇到这种情况,用 CTRL-Q 继续。参见 |++opt| 和 |+cmd|。CTRL-W CTRL-V *CTRL-W_CTRL-V*CTRL-W v *CTRL-W_v*:[N]vs[plit] [++opt] [+cmd] [file] *:vs* *:vsplit* 与 |:split| 类似, 但垂直分割窗口。如果打开了 'equalalways' 选 项,并且选项 'eadirection' 没有设置为 "ver" ,窗口会被水平铺开, 除非你指定了窗口的宽度。 Note: 在其它地方 CTRL-Q 与 CTRL-V,但是在这里不是!CTRL-W n *CTRL-W_n*CTRL-W CTRL_N *CTRL-W_CTRL-N*:[N]new [++opt] [+cmd] *:new* 创建一个新窗口并且开始编辑一个空文件。新窗口的高度为 N (默认 值为现存高度的一半)。减少当前窗口的高度,为新窗口留出空间(如 果你打开了 'equalalways' 选项,并且 'eadirection' 没有设置为 "hor",那么可能是另一种情况)。 也参见:|++opt| and |+cmd|。 如果设置了 'fileformats' 选项,那么新缓冲区会使用这个值;如果 'fileformats' 为空,那么使用当前缓冲区的 'fileformat' 值。这个 值可以被 |++opt| 参数覆盖。 自动命令以如下顺序执行: 1. 在当前窗口执行 WinLeave 2. 在新窗口里执行 WinEnter 3. 在当前缓冲区执行 BufLeave 4. 在新缓冲区执行 BufEnter 这跟先执行 ":split" ,再执行一个 ":e" 命令的效果差不多。:[N]vne[w] [++opt] [+cmd] [file] *:vne* *:vnew* 与 |:new| 命令相似,但是它垂直分割窗口,如果打开了 'equalalways' 选项,并且选项 'eadirection' 没有设置为 "ver" , 窗口会被水平铺开,除非你指定了窗口的宽度。:[N]new [++opt] [+cmd] {file}:[N]sp[lit] [++opt] [+cmd] {file} *:split_f* 创建一个新的窗口,并且开始编辑文件 {file}。 如果使用了 [+cmd] 参数,文件加载完毕后会执行命令 |+cmd| 。 也参见:|++opt|。 新窗口的高度为 N (默认值为现存高度的一半)。减少当前窗口的高 度,为新窗口留出空间(如果你打开了 'equalalways' 选项,那么可 能是另一种情况)。:[N]sv[iew] [++opt] [+cmd] {file} *:sv* *:sview* *splitview* 与 ":split" 命令相同,但是会给缓冲区设置 'readonly' 。:[N]sf[ind] [++opt] [+cmd] {file} *:sf* *:sfind* *splitfind* 与 ":split" 命令相同,但是会在 'path' 里寻找 {file} 。如果找不 到,就不会分割窗口。CTRL-W CTRL-^ *CTRL-W_CTRL-^* *CTRL-W_^*CTRL-W ^ 执行 ":split #" 命令,把窗口分成两个,并且编辑另一个文件。如果 指定了计数器,就变成了 ":split #N",分割窗口,并且编辑缓冲区 N 。Note 'splitbelow' 和 'splitright' 会影响窗口。 *:vert* *:vertical*:vert[ical] {cmd} 执行 {cmd} 。如果包含一个分割窗口的命令,那么将垂直分割窗口。:lefta[bove] {cmd} *:lefta* *leftabove*:abo[veleft] {cmd} *:abo* *:aboveleft* 执行 {cmd} 。如果包含一个分割窗口的命令,那么将从当前窗口的左 (垂直分割)或者上方(水平分割)分割窗口,而不管 'splitbelow' 和 'splitright' 的设置。:rightb[elow] {cmd} *:rightb* *:rightbelow*:bel[owright] {cmd} *:bel* *:belowright* 执行 {cmd} 。 如果包含一个分割窗口的命令,那么将从当前窗口的右 (垂直分割)或者下方(水平分割)分割窗口,而不管 'splitbelow' 和 'splitright' 的设置。 *:topleft* *E442*:to[pleft] {cmd} 执行 {cmd} 。如果包含一个分割窗口的命令,那么该窗口出现在顶部, 并且占据最大宽度。当垂直分割窗口时,窗口出现在最左边,并且占据 最大高度。 *:botright*:bo[tright] {cmd} 执行 {cmd} 。如果包含一个分割窗口的命令,那么该窗口出现在底部, 并且占据最大宽度。当垂直分割窗口时,窗口出现在最右边,并且占据 最大高度。这些调节符可以结合使用,打开一个垂直分割的并且占据最大高度的窗口,例如: > :vertical topleft edit tags在最左边打开一个垂直分割的、最大高度的窗口,用来编辑 tags 文件。关闭一个窗口----------------CTRL-W q *CTRL-W_q*CTRL-W CTRL-Q *CTRL-W_CTRL-Q*:q[uit] 退出当前窗口。如果退出的是最后一个窗口(不包括帮助窗口),就是 退出 Vim 。 如果设置了 'hidden' 并且只有此一个窗口监视当前缓冲区,那么该缓 冲区被隐藏。 如果没有设置 'hidden',并且只有当前这一个窗口监视该缓冲区,而 且缓冲区被修改了,那么该命令不会成功。 (注意: CTRL-Q 不是在所有的终端下都好用):q[uit]! 退出当前窗口。如果这是缓冲区的最后一个窗口,那么对于此缓冲区的 改动将全部丢失。如果退出的是最后一个窗口(不包括帮助窗口),就 是退出 Vim 。缓冲区里的全部内容将丢失,即使设置了 'hidden' 。CTRL-W c *CTRL-W_c* *:clo* *:close*:clo[se][!] 关闭当前窗口。如果设置了 'hidden' ,或者改动了缓冲区但是命令里 用了[!],缓冲区会被隐藏。(除非还有一个窗口在编辑该缓冲区)。 该命令在下述情况下会失败: *E444* - 只剩下最后一个窗口的时候。 - 当 'hidden' 没有设置, 也没有用 [!] ,并且缓冲区也已经被修改, 而且也没有其他窗口监视该缓冲区的时候。对缓冲区的改动既不写入 文件,也不会丢失,所以这是个“安全”的命令。CTRL-W CTRL-C *CTRL-W_CTRL-C* 你可能想用 CTRL-W CTRL-C 关闭当前窗口,但是这不行,因为 CTRL-C 是用来结束命令的。 *:hide*:hid[e] 退出当前窗口,除非这是屏幕上的最后一个窗口。缓冲区被隐藏起来( 除非还有另一个窗口正在编辑它,或者 'bufhidden' 设置为 "unload" 或 "delete")。 'hidden' 的值和这个命令没有一点关系。 对缓冲区的改动既不写入文件,也不会丢失,所以这是个“安全”的命 令。:hid[e] {cmd} 执行 {cmd} 并设置 'hidden' 选项。{cmd} 执行完毕后,先前的 'hidden' 选项会被恢复。 例如: > :hide edit Makefile< 这条命令编辑 "Makefile" 文件,并且如果当前缓冲区有改动的话,隐 藏之。CTRL-W o *CTRL-W_o* *E445*CTRL-W CTRL-O *CTRL-W_CTRL-O* *:on* *:only*:on[ly][!] 使当前窗口成为屏幕上唯一的窗口。其它窗口都关闭。 如果设置了 'hidden' 选项,被关闭窗口里的所有缓冲区变成隐藏。 如果没有设置 'hidden' ,但是设置了 'autowrite' 选项,那么已经 更改的缓冲区被写入文件。否则,那些包含被修改过的缓冲区的窗口不 能被关闭,除非使用 [!] 强制关闭。于是缓冲区转入隐藏状态,对缓 冲区的改动也不会丢失。==============================================================================4. 把光标移动到另一个窗口 *window-move-cursor*CTRL-W <Down> *CTRL-W_<Down>*CTRL-W CTRL-J *CTRL-W_CTRL-J* *CTRL-W_j*CTRL-W j 把光标向下移动 N 个窗口。 用光标的位置在两个窗口之间做出选择。CTRL-W <Up> *CTRL-W_<Up>*CTRL-W CTRL-K *CTRL-W_CTRL-K* *CTRL-W_k*CTRL-W k 把光标向上移动 N 个窗口。 用光标的位置在两个窗口之间做出选择。CTRL-W <Left> *CTRL-W_<Left>*CTRL-W CTRL-H *CTRL-W_CTRL-H*CTRL-W <BS> *CTRL-W_<BS>* *CTRL-W_h*CTRL-W h 把光标向左移动 N 个窗口。 用光标的位置在两个窗口之间做出选择。CTRL-W <Right> *CTRL-W_<Right>*CTRL-W CTRL-L *CTRL-W_CTRL-L* *CTRL-W_l*CTRL-W l 把光标向左移动 N 个窗口。 用光标的位置在两个窗口之间做出选择。CTRL-W w *CTRL-W_w* *CTRL-W_CTRL-W*CTRL-W CTRL-W 如果没有添加计数器,则将光标移动到当前窗口的 右/下方的窗口。如 果右下方没有窗口,就移动到左上角的窗口。要是添加了计数器,就移 动到第 N 个窗口(从左上方到右下方依次计数)。 *CTRL-W_W*CTRL-W W 如果没有添加计数器,则将光标移动到当前窗口的 左/上方的窗口。如 果左上方没有窗口,就移动到右下角的窗口。要是添加了计数器,就移 动到第 N 个窗口(从左上方到右下方依次计数)。CTRL-W t *CTRL-W_t* *CTRL-W_CTRL-T*CTRL-W CTRL-T 把光标移动到左上角的窗口。CTRL-W b *CTRL-W_b* *CTRL-W_CTRL-B*CTRL-W CTRL-B 把光标移动到右下角的窗口。CTRL-W p *CTRL-W_p* *CTRL-W_CTRL-P*CTRL-W CTRL-P 移动到前一个(上次访问的)窗口。 *CTRL-W_P* *E441*CTRL-W P 移动到前一个窗口。如果没有前一个窗口就会出错。 {如果编译时没有加入 |+quickfix| 则不可用}在“可视”模式(Visual)下,如果窗口编辑的是同一个缓冲区,则光标所选择的区域会被保留;如果不是同一个缓冲区,则终止“可视”模式。 *:winc* *:wincmd*这些命令也可以用 ":wincmd" 来执行::[count]winc[md] {arg} 与 CTRL-W [count] {arg} 相同。例如: > :wincmd j< 把光标移动到当前窗口下面的窗口。 这个命令在“正常”状态不可用的时候(比如在 |CursorHold| 自动命 令执行的时候),或者在启用“正常”状态不方便时,特别好用。==============================================================================5. 窗口的移动 *window-moving*CTRL-W r *CTRL-W_r* *CTRL-W_CTRL-R* *E443*CTRL-W CTRL-R 向右下方向移动窗口。第一个窗口变成第二个,第二个变成第三个…… 最后一个变成第一个。光标保留在相同窗口里。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -