如何在vim脚本中获得宽度3(图像中标有绿色)?
如果没有signs
列,并且没有其他"特殊列",我可以使用
winwidth(0) - (max([len(line('$')), &numberwidth-1]) + 1)
答案 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('')