winheight()winwidth()返回当前窗口中的列数/行数。我正在寻找的是更接近于编辑区域或显示区域(如果在终端中运行)的实际高度和宽度。 winheight()winwidth()的问题在于,根据这些值计算出的宽高比与实际的宽高比不符。

:echo winwidth('%') winheight('%') winwidth('%') * 1.0 / winheight('%')
104 51 2.039216


缓冲区的屏幕截图大小为936x918像素,显示的纵横比为1.019608。我想我可以通过使用字体的大小来获取实际值,但是如何呢?

这是我如何在垂直分割中使Vim打开帮助的后续文章。我正在尝试适应Nobe4的解决方案。

评论

我认为用普通的Vim函数无法获得以像素为单位的尺寸。至于垂直拆分中的打开帮助,我不必理会长宽比的计算,只要终端窗口足够宽,我就垂直拆分:cnoreabbrev h =(&columns> = 160 && getcmdtype()==#' :'&& getcmdpos()== 1?'垂直botright帮助':'h')

@SatoKatsura因此遵循大多数Web开发人员设定的传统,他们使用文档宽度来确定它是否是移动设备。 :(

不完全是,因为我只是在对自己施加这种影响。我玩了一段时间的长宽比,发现结果并不令人满意。然后,我想起了用于打开终端的两个快捷方式,分别是“正常”尺寸和“宽”终端。因此,我的终端几乎总是具有相同的尺寸。当然是YMMV。

@SatoKatsura该命令是一些严重的黑魔法。我很惊讶,除了不了解= h = h可以帮助清除的==#运算符之外,我实际上理解了整个怪胎命令。这会让我成为Vim专家吗?一定是那样的。需要更多。

#1 楼


104列/ 51行= 2.04


由于每个单元的纵横比是垂直的,因此您的计算存在偏差。

例如在Terminal上。应用程序,具有23pt字体和默认字符间距,每个终端单元的宽度为7px,高度为15px,总计728x765px:




如果不调用外部命令或与终端进行通信的方法,就无法从Vim中检索字体大小,这会变得很繁琐。显然,由于'guifont',这在Gvim中是不同的。

如果设法做到这一点,仍然需要一种方法来减小单元格的大小,如果没有,该方法可能会根据终端程序而有所不同。标准。我只检查了iTerm 2,幸运的是结果相同。


因此我会选择静态解决方案。
我将最小宽度检查嫁接到了您可以放入的代码段中plugin/help.vim

function! Help(...)
  let l:topic = a:0 ? a:1 : ''
  if winwidth('%') >= 160 " Minimum width
    execute 'vertical botright help' l:topic
    execute 'vertical resize 78'
  else
    execute 'botright help' l:topic
  endif
endfunction

" Use :H to open a vertical or horizontal help split
command! -complete=help -nargs=? H call Help(<f-args>)


如果窗口足够大,可以保留当前缓冲区的80列,则在右侧打开一个狭窄的帮助拆分,否则在下面打开。您可以使用:vertical自定义分割方向。