有什么vimrc函数可以确定缓冲区是否已被修改?

7
我有一个选项卡功能,是从某个地方偷/修改的,但如果文件自上次写入磁盘以来已经被修改(即如果:up将执行操作),我希望文件名前面有一个星号。例如,当我打开vim-p file *.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

可能是重复的问题:Vim缓冲区已被修改 - Karl Bielefeldt
2个回答

15

我也在寻找同样的答案,发现%m%M并不适用,因为它们只能告诉你当前打开的缓冲区是否被修改。所以你不能知道其他缓冲区是否被修改(特别是对于标签页,这很重要)。

解决方案是使用函数getbufvar。大致来自帮助文档:

let s .= (getbufvar(buflist[winnr - 1], "&mod")?'*':'').file

取代

let s .= file

这应该就可以解决问题了。在多个分屏的情况下,可以很好地用它来显示所有打开的缓冲区。


1

tabline 使用与 statusline 相似的标志(参见 :h statusline)。因此,%m 是您需要的内容,并且可以在 endwhile 之前修改这些行。

let s .= file
let s .= (i == t ? '%m' : '')
let i = i + 1

如果有未保存的更改,该程序将自动在当前选项卡中的文件名后面放置默认的[+]


谢谢!哇,我的点赞让你超过了10k;)你修改的唯一问题是,只有在焦点选项卡被修改时才会出现[+]。如果您当前查看的选项卡未被修改,则其他选项卡都没有[+],即使它们已被修改。 - Philip
@yoda 这会使得在你选中一个被修改过的标签页时所有的标签都有[+],而当你选中一个未修改的标签时所有标签都不会显示任何东西。 - Philip
@Philip:啊,当然。嗯...我不确定是否有一种方法可以轮询缓冲区号并获取其修改状态。我猜它可以通过在此基础上构建实现(我还不知道如何做,而且我可能也是错的),但我真的不建议这样做。原因是tabline在_每次按键_时都会更新。因此,如果您有一个在每次按键时轮询每个缓冲区的函数,您将会注意到性能下降。我想这是其中一件事情,您必须权衡它是否_真的_必要以及是否值得努力。 - user616736
@philip:我没有尝试过那个,并且我的vimscript技能不足以给你一个明确的答案。无论如何,您可以使用“bufdo”修改所有缓冲区,而无需切换选项卡,因此如果您采用缓存路线,则可能涉及其他边角情况。 - user616736
我在家里检查了一下,发现我的Mac Vim和Ubuntu Vim安装都是默认行为。而在工作中,我必须在Windows环境下开发,使用的Cygwin Vim没有这个功能。因此我试图在我的 .vimrc 文件中复制这个行为。你知道在我家里安装的Vim中,状态行代码在哪里吗? - Philip
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接