在vim脚本中获取“可用”窗口宽度

时间:2014-10-11 14:53:00

标签: vim

get the width of text field in vim

如何在vim脚本中获得宽度3(图像中标有绿色)?

如果没有signs列,并且没有其他"特殊列",我可以使用

winwidth(0) - (max([len(line('$')), &numberwidth-1]) + 1)

5 个答案:

答案 0 :(得分:7)

我认为,您应该能够使用以下方式获得该宽度:

:set virtualedit=all
:norm! g$
:echo virtcol('.')

或者,您可以检查是否存在符号列(例如,使用redir

:redir =>a |exe "sil sign place buffer=".bufnr('')|redir end
:let signlist=split(a, '\n')
:let width=winwidth(0) - ((&number||&relativenumber) ? &numberwidth : 0) - &foldcolumn - (len(signlist) > 2 ? 2 : 0)

答案 1 :(得分:2)

我的ingo-library plugin具有ingo#window#dimensions#NetWindowWidth()功能。

答案 2 :(得分:2)

正在回答,因为我无法发表评论:

在文件中的实际行数超过&numberwidth的情况下,Christian的答案给出了错误的结果(因为kshenoy指出,&numberwidth仅是最小值)。但是,修复非常简单,只需取max()中的&numberwidth和缓冲区最后一行的位数(加上一个用于填充vim的位数)即可:

redir =>a | exe "silent sign place buffer=".bufnr('') | redir end
let signlist = split(a, '\n')
let lineno_cols = max([&numberwidth, strlen(line('$')) + 1])
return winwidth(0)
            \ - &foldcolumn
            \ - ((&number || &relativenumber) ? lineno_cols : 0)
            \ - (len(signlist) > 2 ? 2 : 0)

答案 3 :(得分:2)

Kale的答案纠正了一种极端情况,即行数超过了&numberwidth可以显示的行数。在这里,我修复了另一种极端情况,即signcolumn选项未设置为auto

function! BufWidth()
  let width = winwidth(0)
  let numberwidth = max([&numberwidth, strlen(line('$'))+1])
  let numwidth = (&number || &relativenumber)? numberwidth : 0
  let foldwidth = &foldcolumn

  if &signcolumn == 'yes'
    let signwidth = 2
  elseif &signcolumn == 'auto'
    let signs = execute(printf('sign place buffer=%d', bufnr('')))
    let signs = split(signs, "\n")
    let signwidth = len(signs)>2? 2: 0
  else
    let signwidth = 0
  endif
  return width - numwidth - foldwidth - signwidth
endfunction

答案 4 :(得分:0)

以上答案均未考虑以下几点-

  • 插件使用符号组(如果有),因此仅运行n//100=n不会显示符号在插件组中的位置

  • Neovim支持可变的符号列宽度

所以这是最终使我动起来的答案。当然,它受以上所有答案的影响-

exe "silent sign place buffer=".bufnr('')