VIM: проверить, открыт ли файл в текущей вкладке? окно? (и активировать его) - PullRequest
4 голосов
/ 12 января 2012

В vim вы можете проверить, открыт ли файл в текущем буфере, с помощью bufexists.Для короткого имени файла (не полного пути) вы можете проверить, открыто ли оно, используя bufexists(bufname('filename')).

. Есть ли способ проверить, открыт ли файл на вкладке ?

Мой ближайший обходной путь - сделать что-то вроде:

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

Однако это своего рода питонический псевдокод ... Я не уверен, как заставить это работать в vim.Моя цель состоит в том, чтобы внешний яблочный скрипт проверял, открыт ли уже файл, и если это так, перейдите к строке в этом файле.

В идеале, я хотел бы также иметь возможность поиска через различные окна графического интерфейса, ноЯ понял (например, Открыть вкладку vim в новом окне (GUI)? ), что работа с различными окнами GUI очень сложна / невозможна в VIM.

Ответы [ 2 ]

6 голосов
/ 13 января 2012

Мое нетерпение и хорошая документация одолели меня ... вот решение (очень помогает Проверьте, пуста ли текущая вкладка в vim и Откройте вкладку vim в новом окне (GUI)).Источник находится в 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
3 голосов
/ 20 января 2013

Я бы ответил keflavich, но пока не могу ...

Я работал над аналогичной проблемой, когда хотел имитировать поведение gvim --remote-tab-silent при открытиифайлы внутри gvim.Я нашел этот сценарий WhichTab, но столкнулся с проблемами, когда в любой вкладке открыто более одного окна.Если вы разделите окна внутри вкладок, то у вас будет более одного буфера, возвращаемого tabpagebuflist (), поэтому ваш метод использования позиции номера буфера в списке не работает.Вот мое решение, которое учитывает такую ​​возможность.

" Note: returns a list of tabnos where the buf is found or 0 for none.
"               tabnos start at 1, so 0 is always invalid
function! WhichTabNo(bufNo)
    let tabNos = []
    for tabNo in range(1, tabpagenr("$"))
        for bufInTab in tabpagebuflist(tabNo)
            if (bufInTab == a:bufNo)
                call add(tabNos, tabNo)
            endif
        endfor
    endfor
    let numBufsFound = len(tabNos)
    return (numBufsFound == 0) ? 0 : tabNos
endfunction

Я думаю, что я могу просто вернуть tabNos, который будет пустым списком, который будет оцениваться как скаляр 0, но я только что выучил vimscript и мне не очень удобноподробностей его динамического поведения при печати пока нет, поэтому я пока оставлю это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...