2

我对vim还是有点陌生​​,所以我希望这个问题不是太基本,但我在逃犯的文档中找不到答案。我希望添加一个切换功能,它可以执行以下操作:

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

map gb :call (the above function)<CR>

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

4

1 回答 1

6

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>

笔记

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