微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VIM:检查文件是否在当前选项卡中打开?窗口? (并激活它)

vim中,您可以使用bufexists检查当前缓冲区中的文件是否已打开.对于短文件名(非完整路径),您可以使用bufexists检查它是否打开(bufname(‘filename’)).

有没有办法检查文件是否在选项卡中打开?

我最接近的解决方法是做类似的事情:

:tabdo if bufnr(bufname('filename')) in tabpagebuflist(): echo "Yes"

然而,那种pythonic伪代码…我不知道如何让它在vim中工作.我的目标是使用外部AppleScript检查文件是否已打开,如果是,则转到该文件中的一行.

理想情况下,我也希望能够搜索不同的GUI窗口,但我收集(例如Open vim tab in new (GUI) window?)在VIM中使用不同的GUI窗口非常具有挑战性/不可能.

解决方法

我的不耐烦和良好的文档使我变得更好……这是解决方案(在 Check if current tab is empty in vimOpen vim tab in new (GUI) window?的帮助下).来源是 https://github.com/keflavich/macvim-skim

function! WhichTab(filename)
    " Try to determine whether file is open in any tab.  
    " Return number of tab it's open in
    let buffername = bufname(a:filename)
    if buffername == ""
        return 0
    endif
    let buffernumber = bufnr(buffername)

    " tabdo will loop through pages and leave you on the last one;
    " this is to make sure we don't leave the current page
    let currenttab = tabpagenr()
    let tab_arr = []
    tabdo let tab_arr += tabpagebuflist()

    " return to current page
    exec "tabnext ".currenttab

    " Start checking tab numbers for matches
    let i = 0
    for tnum in tab_arr
        let i += 1
        echo "tnum: ".tnum." buff: ".buffernumber." i: ".i
        if tnum == buffernumber
            return i
        endif
    endfor

endfunction

function! WhichWindow(filename)
    " Try to determine whether the file is open in any GVIM *window*
    let serverlist = split(serverlist(),"\n")

    "let currentserver = ????
    for server in serverlist
        let remotetabnum = remote_expr(server,\"WhichTab('".a:filename."')")
        if remotetabnum != 0
            return server
        endif
    endfor

endfunction

然后像这样使用:

exec "tabnext ".WhichTab('my_filename')

echo remote_foreground( WhichWindow('my_filename') )

或者,从命令行,这是一个脚本,使用WhichTab转到文件的特定行:

#!/bin/bash

file="$1"
line="$2"

for server in `mvim --serverlist` 
do
    foundfile=`mvim --servername $server --remote-expr "WhichTab('$file')"`
    if [[ $foundfile > 0 ]]
    then
        mvim --servername $server --remote-expr "foreground()" 
        mvim --servername $server --remote-send ":exec \"tabnext $foundfile\" <CR>"
        mvim --servername $server --remote-send ":$line <CR>"
    fi
done

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐