如何获得Vim的实际高度和宽度?


18

winheight()winwidth()返回当前窗口中的列数/行数。我正在寻找的是更接近于编辑区域或显示区域(如果在终端中运行)的实际高度和宽度的东西。这个问题winheight()winwidth()从这些值计算出纵横比与实际长宽比脱节。

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

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

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


3
我认为您无法使用普通的Vim函数获得以像素为单位的尺寸。至于在垂直拆分中打开帮助,我不必担心宽高比的计算,只要终端窗口足够宽,我就可以垂直拆分cnoreabbrev h <C-r>=(&columns >= 160 && getcmdtype() ==# ':' && getcmdpos() == 1 ? 'vertical botright help' : 'h')<CR>
佐藤桂2015年

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

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

@SatoKatsura该命令是一些严重的黑魔法。令我惊讶的是,除了不了解有助于清除问题的==#操作员之外,:h我实际上了解了整个怪胎命令。这使我成为Vim专家吗?一定是那样的。需要更多。
史蒂文·卢

Answers:


1

104列/ 51行= 2.04

因为每个单元的纵横比都是垂直的,所以您的计算存在偏差。

例如,在Terminal.app上,使用23pt字体和默认字符间距,每个终端单元的宽度为7px,高度为15px,总计728x765px

(104 * 7)/(51 * 15)= 728/765 = 0.95


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

如果您设法做到这一点,仍然需要一种方法来推断单元格的大小,如果没有标准的话,它可能会根据终端程序而有所不同。我只检查了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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.