Как получить уникальный идентификатор для окна? - PullRequest
5 голосов
/ 07 марта 2011

Я пытаюсь получить какой-то уникальный идентификатор для окна, чтобы можно было запускать команды для этого окна.

Т.е., если мне нужно выделить этот фокус окна ... или если мне нужно увидеть размер этого окна ... и т. Д. Проблема в настоящее время кажется, что номер окна используется в качестве этого идентификатора, но этот номер потенциально меняется каждый раз, когда появляется новое окно. Кажется, это счетчик индексов слева направо и сверху вниз ..., который меня озадачивает, почему это будет использоваться в качестве идентификатора.

Видя, что я понятия не имею, что пользователь может сделать с макетом ... как я могу быть уверен, что когда я назначаю окну буфер или получаю информацию об окне, я действительно получаю информацию об этом окне? хотите?

Ответы [ 2 ]

6 голосов
/ 07 марта 2011

Вы можете использовать переменные окна, чтобы получить такой идентификатор:

" put unique window identifier into w:id variable
autocmd VimEnter,WinEnter * if !exists('w:id') | let w:id={expr_that_will_return_an_unique_identifier} | endif

: это должно отметить все окна.Или, может быть, лучше отметить только те окна, которые вы хотите использовать сразу после создания окна.Чтобы найти окно с идентификатором abc и затем переключиться на него:

function s:FindWinID(id)
    for tabnr in range(1, tabpagenr('$'))
        for winnr in range(1, tabpagewinnr(tabnr, '$'))
            if gettabwinvar(tabnr, winnr, 'id') is a:id
                return [tabnr, winnr]
            endif
        endfor
    endfor
    return [0, 0]
endfunction
<...>
let [tabnr, winnr]=s:FindWinID('abc')
execute "tabnext" tabnr
execute winnr."wincmd w"

В последних версиях Vim есть функция win_getid() и win_id2tabwin() вместо s:FindWinID, а также win_gotoid() просто зайти в окно с заданным идентификатором.Идентификаторы поддерживаются самим Vim, поэтому даже открывающееся окно, например noautocmd wincmd s, не сможет создать окно без идентификатора.

1 голос
/ 21 августа 2017
Simple version:

    let l:current_window = win_getid()

    ... do something that alters the current window and/or tab and now i want to go back

    call win_gotoid(l:current_window)

Complicated version:

    let [l:current_window_tabnr, l:current_window_winnr] = win_id2tabwin(win_getid())

    or

    let l:current_window_tabnr = tabpagenr()
    let l:current_window_winnr = winnr()

    ... do something that alters the current window and/or tab and now i want to go back

    execute 'tabnext ' . l:current_window_tabnr
    execute l:current_window_winnr . 'wincmd w'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...