VIM:如何确定当前文件是否在标签堆栈上



在其他 SO-ers 的帮助下,我为 vim 整理了一个智能退出宏,询问您是否真的要退出包含更改的文件。 我把这个宏和 F3 绑定起来,因为我 30 年前在大型机上学会了编辑器,而 F3 对我来说是永远退出的。

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

所以,我想改进我的智能退出宏,让它检测到当前文件在标签堆栈上,我的意思是:p op,而不是: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

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

这是可能的开始:

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 上包含一个映射以删除最后一个元素,然后您可以镜像标签堆栈的内容。

被要求从其发布位置@kazark将这个答案移到这里,这是原始问题的附录。

男孩,我错过了显而易见的。

在下面的解决方案中,我使用了与原始逻辑相反的方法。 也就是说,始终trypop 关闭当前文件。 如果可行,我就完成了。 如果失败,我将生成一些错误,可能是 E555,我可以catch。 但是,如果我发现任何错误,pop失败,我知道try关闭文件,然后按照原始脚本进行操作。 这是最终结果:

" Smart Quit Function ----------------------                                                                             
function! QuitF3()
   try
      pop
   catch 
      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
        return 0
      endtry
   endtry
endfunction

相关内容

最新更新