Vim Fugitive:切换“:Gblame”功能

Ami*_*hai 2 vim vim-fugitive

我对 vim 还很陌生,所以我希望这个问题不是太基本,但我在 fugitive 的 DOC 中找不到答案。我希望添加一个执行以下操作的切换函数:

if :Gblame buffer is open:
     close buffer
else 
     execute "normal :Gblame<CR>"
endif

map gb :call (the above function)<CR>
Run Code Online (Sandbox Code Playgroud)

我正在考虑添加一个在 1 或 0 之间变化的变量,具体取决于我使用“gb”映射的次数。
但我真正想要的是一种检查缓冲区是否打开的方法。那可能吗?

Ing*_*kat 7

Fugitive 插件'filetype'在侧边栏指责缓冲区中设置自定义(通过fugitiveblame; 查询:setlocal filetype?,或在 Vimscript 中通过&l:filetype特殊变量查询)。仅当您当前位​​于侧边栏中时,此功能才有效。要使此功能也适用于主窗口,您必须检查缓冲区名称(例如 via bufwinnr('fugitiveblame') != -1),然后在调用之前返回到该窗口:close(或使用:bdelete通过 获得的缓冲区编号bufnr('fugitiveblame'))。

function! s:ToggleBlame()
    if &l:filetype ==# 'fugitiveblame'
        close
    else
        Gblame
    endif
endfunction

nnoremap gb :call <SID>ToggleBlame()<CR>
Run Code Online (Sandbox Code Playgroud)

笔记

  • :Gblame是一个(自定义)Ex 命令;您可以在 Vimscript 中按原样调用它;不需要:normal这里。
  • 关闭侧边栏只是:close如上所述,当您处于侧边栏时,
  • 我定义了一个脚本本地函数;cp。:help <SID>
  • 你应该使用:noremap; 它使映射不受重新映射和递归的影响。