VIM:如何判断当前文件是否在tagstack上?

标签 vim

在其他 SO-ers 的帮助下,我整理了一个 smart quit macro对于 vim,它会询问您是否确实要退出包含更改的文件。我将这个宏与 F3 联系起来,因为 30 年前我在大型机上学习了编辑器,而 F3 对我来说就永远退出了。

当我使用标签并查看标签堆栈上的文件时,我经常通过按 F3 而不是 ctrl-T 来关闭该文件。这将关闭所有未更改的文件、标记文件或其他文件。

所以,我想改进我的智能退出宏,让它检测当前文件位于标记堆栈上,我的意思是:pop,而不是:quit。

有办法做到这一点吗?

" Smart Quit Function ----------------------                                                                             
function! QuitF3()

  try
    quit
  catch /E37:/
    " Unwritten changes.
    echo "E37: Discard changes?  Y|y = Yes, N|n = No, W|w = Write"

    let ans = nr2char( getchar() )

    if      ans == "y" || ans == "Y"
      quit!
    elseif  ans == "w" || ans == "W"
      write
    else
      " Close prompt.
      call feedkeys('\<ESC>')
    endif
  endtry
endfunction

最佳答案

这可以通过映射用于跳转到标签的键来完成,以便在跳转到全局变量后保存文件名或缓冲区编号。然后您可以根据退出函数中保存的值检查当前文件名/缓冲区编号。

这里是尽可能的开始:

nnoremap <silent> <c-]> :call JumpTag()<CR>
let g:lastTagBuffer = -1
function! JumpTag()
   let w = expand("<cword>")        " get the word under cursor
   if w =~ '\a'                  " if the word contains a letter
      try
         exe "tag " . w
         let g:lastTagBuffer = bufnr("%")
      catch
         return
      endtry
   endif
endfunction

您可以在 :h CursorHold-example 上找到更多信息。

如果您愿意,可以使用列表而不是单个变量来保存所有标记跳转,并在 Ctrl+t 上包含一个映射以删除最后一个元素,然后您可以镜像标记堆栈的内容。

关于VIM:如何判断当前文件是否在tagstack上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20960298/

相关文章:

linux - 如何在vim中启用剪贴板功能?

vim - 在 Vim 中,有没有办法在行中水平移动对象/ Action (单词、字符、视觉选择等),并在其周围移动字符?

vim - 如何在 Vim 中快速上下(ctrl u 和 ctrl d)重新映射到 ctrl j 和 ctrl k

vim - 什么是vim的@@变量?

linux - 为什么 vim 的 d 运算符行为不端?

vim - 如何在 Vim 中使所有制表符缩进对齐

macos - 查找 VimR OSX 的配置文件(vimrc?)

linux - Vim + Airline + Linux 草率退出

google-chrome - 如果文本文件在浏览器中显示错误

python - 如何修复 vim 以正确缩进包含 Python 注释行的折叠?