Vim: как предотвратить выпрыгивание из текущего буфера? - PullRequest
9 голосов
/ 15 августа 2011

У меня часто открыто несколько буферов в сеансе Vim.Это означает, что мой JumpList хранит местоположения из нескольких буферов.Однако часто, когда я использую Ctrl-o для перехода к предыдущему местоположению, я не хочу покидать буфер и хочу переходить к предыдущим местам, «локальным» по отношению к текущему буферу.Как мне это сделать?

Пример: если мой список переходов выглядит следующим образом:

4   10   1 ~/aaa.m
3   20   1 ~/aaa.m
2   12   2 ~/xxx.m
1   15   1 ~/aaa.m

Я хочу перейти к строке 15 файла aaa.m при первом нажатии Ctrl-о.Важно отметить, что в следующий раз, когда я нажму Ctrl-o, я не хочу переходить к файлу xxx.m.Скорее, я хочу перейти к строке 20 файла aaa.m;то есть мое предыдущее местоположение в «текущем» буфере.Поведение Vim по умолчанию сводит меня к строке 12 файла xxx.m.Есть идеи, как мне этого добиться?

Ответы [ 2 ]

10 голосов
/ 16 августа 2011

Попробуйте следующую функцию обхода списка переходов. Это последовательно выходит из одно местоположение списка переходов в другое (используя Ctrl + O или Ctrl + I в зависимости от того, какие значения его back и forw аргументы имеют) и останавливается, если текущее местоположение находится в том же буфере, что и тот буфер, с которого он начал. Если не удается найти список переходов расположение, относящееся к буферу, функция возвращает в положение, список переходов есть до начала.

function! JumpInFile(back, forw)
    let [n, i] = [bufnr('%'), 1]
    let p = [n] + getpos('.')[1:]
    sil! exe 'norm!1' . a:forw
    while 1
        let p1 = [bufnr('%')] + getpos('.')[1:]
        if n == p1[0] | break | endif
        if p == p1
            sil! exe 'norm!' . (i-1) . a:back
            break
        endif
        let [p, i] = [p1, i+1]
        sil! exe 'norm!1' . a:forw
    endwhile
endfunction

Чтобы использовать эту функцию как a Ctrl + O / Ctrl + I - замена заблокирована в текущий буфер создайте отображения, как показано ниже.

nnoremap <silent> <c-k> :call JumpInFile("\<c-i>", "\<c-o>")<cr>
nnoremap <silent> <c-j> :call JumpInFile("\<c-o>", "\<c-i>")<cr>
0 голосов
/ 17 апреля 2013

Возможно, плагин EnhancedJumps поможет.

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

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