确定缓冲区是否已修改的vimrc函数是什么?
我有一个tabline函数,是我从某处偷来/修改的,但如果文件名自上次写入磁盘后被修改过(即if:up将执行一个操作),我希望文件名前面有一个星号 例如,当我打开vim-p文件*.txt时,这是我的表格确定缓冲区是否已修改的vimrc函数是什么?,vim,tabs,Vim,Tabs,我有一个tabline函数,是我从某处偷来/修改的,但如果文件名自上次写入磁盘后被修改过(即if:up将执行一个操作),我希望文件名前面有一个星号 例如,当我打开vim-p文件*.txt时,这是我的表格 file1.txt file2.txt file3.txt 然后在我更改file1.txt并且不保存它之后: *file1.txt file2.txt file3.txt 我的小报功能: if exists("+showtabline") function MyTabLine()
file1.txt file2.txt file3.txt
然后在我更改file1.txt并且不保存它之后:
*file1.txt file2.txt file3.txt
我的小报功能:
if exists("+showtabline")
function MyTabLine()
let s = ''
let t = tabpagenr()
let i = 1
while i <= tabpagenr('$')
let buflist = tabpagebuflist(i)
let winnr = tabpagewinnr(i)
let s .= ' %*'
let s .= (i == t ? '%#TabLineSel#' : '%#TabLine#')
let file = bufname(buflist[winnr - 1])
let file = fnamemodify(file, ':p:t')
if file == ''
let file = '[No Name]'
endif
let s .= file
let i = i + 1
endwhile
let s .= '%T%#TabLineFill#%='
let s .= (tabpagenr('$') > 1 ? '%999XX' : 'X')
return s
endfunction
set stal=2
set tabline=%!MyTabLine()
endif
如果存在(“+显示行”)
函数MyTabLine()
让我们=“”
设t=tabpagenr()
设i=1
而我呢999XX':'X')
返回s
端功能
设置stal=2
设置tabline=%!MyTabLine()
恩迪夫
表格
使用与状态行
类似的标志(请参见:h状态行
)。因此,%m
是您所需要的,并根据需要修改结尾之前的行
let s .= file
let s .= (i == t ? '%m' : '')
let i = i + 1
如果有未保存的更改,将自动将默认的[+]
放在当前选项卡中的文件名之后。我只是查找相同的文件名,发现%m
和%m
不合适,因为它会告诉您当前打开的缓冲区是否已修改。因此,您无法查看是否修改了其他缓冲区(特别是对于选项卡,这一点很重要)
解决方案是函数getbufvar
。从帮助中大致可以看出:
let s .= (getbufvar(buflist[winnr - 1], "&mod")?'*':'').file
而不是
let s .= file
我们应该做到这一点。这可以很好地用于在一个选项卡中显示所有打开的缓冲区(在多个拆分的情况下)。可能重复感谢!呜呼,我的一票让你超过了10公里;)修改的唯一问题是[+]仅在焦点选项卡被修改时出现。如果您当前查看的选项卡未被修改,则即使其他选项卡已被修改,也不会有[+]标记。@Philip:谢谢:)是的,我通常就是这样使用它的,只是从我的vimrc复制的。您是否可以尝试将其保留为let s.='%m'
而不是条件语句?让我知道这是否有效。我现在没有时间检查它是否有效,但也许在今天晚些时候。。。(当然,除非它能起作用)@yoda,当你专注于一个已修改的选项卡时,所有选项卡都有[+],而当你专注于一个未修改的选项卡时,所有选项卡都没有任何内容。@Philip:啊,当然可以。六羟甲基三聚氰胺六甲醚。。。我不确定是否有办法轮询缓冲区编号并获取其修改状态。我猜它可以在这个基础上实现(我不知道怎么实现,我也可能错了),但我真的不推荐它。原因是,表格
在每次击键时都会更新。因此,如果您有一个函数,在每次击键时轮询每个缓冲区,您将注意到性能的提升。我想这是你需要权衡是否真的有必要,是否值得付出努力的事情之一。你能以某种方式缓存其他缓冲区的修改值吗?因为如果你不关注这个标签,它们就不太可能被更新。这样,您就不必在每次击键时轮询其他缓冲区,只需从数组中读取。我知道在我熟悉的编程语言中我会这么做,但我不知道vim脚本语言的局限性。另外,这(我正在寻找的行为)不是某些vim安装中的默认行为吗?