我有一个tabline函数,我从某个地方偷了/修改过,但我希望文件名前面有一个星号,如果它自上次写入磁盘后被修改过(即if: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
答案 0 :(得分:13)
我只是在寻找相同内容,发现%m
和%M
不太合适,因为它告诉您当前打开的缓冲区是否被修改。因此,您无法看到是否修改了其他缓冲区(特别是对于制表符,这很重要)。
解决方案是函数getbufvar
。大致来自帮助:
let s .= (getbufvar(buflist[winnr - 1], "&mod")?'*':'').file
而不是
let s .= file
应该做的伎俩。这可以很好地用于显示在一个选项卡中打开的所有缓冲区(如果有多个拆分)。
答案 1 :(得分:1)
tabline
使用与statusline
类似的标记(请参阅:h statusline
)。因此%m
就是您所需要的,并在endwhile
之前修改行
let s .= file
let s .= (i == t ? '%m' : '')
let i = i + 1
如果有未保存的更改,会自动将默认[+]
放在当前标签中的文件名之后。