Neovim/Vim:根据缓冲区类型调整窗口大小

3
使用 Neovim 的终端仿真器同时运行我的代码已经成为了我工作流的必要部分,自从我发现它以来。但是我希望有一种方法让新打开的 nvim 终端窗口变得狭窄,而不是像现在这样占据屏幕的一半。
我不完全理解 vimscript,这也是问题所在之一。我已经研究过如何根据文件类型运行一个自动命令以及如何调整窗口大小,并基于此拼凑出了一些东西。但它并没有起作用,因为它调整的是整个 vim 会话,而不是所需的窗口。
au BufWinEnter * if &buftype == 'terminal' | resize 20 | endif

我已经研究了黄金比例插件,但当我移动时,我不想让终端窗口变得更大; 我只希望它小巧并在一边。

2个回答

7

terminal的问题在于在BufWinEnter之后设置了buftype。因此,您必须捕获Vim中的TerminalOpenNeovim中的TermOpen

augroup myterm | au!
    au TermOpen * if &buftype ==# 'terminal' | resize 20 | vert resize 50 | endif
augroup end

注意:

  1. 总是使用 augroup 来清除或重新定义你的自动命令。

  2. 比较字符串时,总是使用 ==#==? ,这样就不会依赖于 ignorecase 选项设置了。

  3. 你仍然需要检查 &buftype ,因为终端可能会隐藏起来(即没有任何窗口附加)。在这种情况下,终端的缓冲区将可用于 <abuf> ,但 % 将指向活动/可见的缓冲区。


2
很棒的答案!唯一的问题是使用 | au! 会使其太不可见。乍一看,我以为它丢失了。在augroup顶部单独一行上使用 au! 会更好,也更符合惯用法(基于帮助文件、指南和教程、vimrc和插件发行版等示例)。 - filbranden
1
@filbranden 嗯,我喜欢这种方式 :) 对我来说,这看起来就像是用“一个命令”开始“一个干净的自动组”。当然,这非常主观。 - Matt
1
我也喜欢这种方式,出于同样的原因。更新我的vimrc以类似的方式,哈哈! - Biggybi
对于neovim,可以这样使用:autocmd BufWinEnter,WinEnter term://* startinsert | resize 16 | vert resize 50 - rofrol
@rofrol 在 Neovim 中无法匹配 BufWinEnter term://*,除非您将终端作为 :e term://sh 或类似方式调用。而 WinEnter term://* 不能保证触发。考虑使用 :new,然后(新创建的窗口已经处于活动状态)使用 :term。在手动切换窗口之前,您不会再收到任何 WinEnter - Matt
显示剩余5条评论

1
提到帮助,您只需要设置'termwinsize'选项。
例如:
set termwinsize=0x50

垂直终端设置为打开一个50列宽的垂直分割终端。

set termwinsize=20x0

让终端打开一个水平分屏,高度为20行。

termwinsize 设置终端的大小,但它不会调整 Vim 窗口的大小。 - Matt
确实,但我认为这就是OP想要的(“我只想让它变小并靠边站。”)。只需要tws,你就可以将终端设置为所需的大小。我编辑了我的答案以反映这一点。 - Biggybi
我尝试了你的选项,但是我一直收到错误E518:未知选项:termwinsize=20x0,尽管这听起来应该可以工作。我也不知道是不是因为我使用命令“:vsplit term://zsh”打开窗口。 - HANS LARSSON
这确实是另一个问题。如果它可以使用常规的“终端”命令工作,但不能在“term://zsh”中工作,我建议您开启另一个主题。 - Biggybi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接