确定缓冲区是否已修改的vimrc函数是什么?

确定缓冲区是否已修改的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()

我有一个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()
      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安装中的默认行为吗?