Установить отметку к ее предыдущему значению

9

Иногда я использую метки, чтобы легко перемещаться по разным файлам, используя mA, mB... и 'A, 'B...

И иногда (чаще, чем я хотел бы признать) из-за невнимательности или какой-либо другой причины я использую m[LETTER]уже существующую отметку, которая стирает предыдущее значение, когда я этого не хочу. Большую часть времени, когда я делаю это, у меня не открывается файл, изначально отмеченный знаком.

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

Я не нашел подобной команды в документе, поэтому, если она не существует, есть ли хитрый обходной путь, который некоторые из вас используют в этой ситуации?

statox
источник
1
Также вы можете посмотреть этот пост для получения дополнительной информации: superuser.com/questions/687441/…
nobe4
@ Nobe4 спасибо за вашу ссылку. Я не нашел ее, но, похоже, это подтверждает, что на самом деле это невозможно сделать легко.
statox
Используйте команды перехода ( ctrl-o, ctrl-iи :jumps) со своей личной памятью :)
VanLaser,

Ответы:

5

Вот некоторый базовый VimScript, который примерно делает то, что вы хотите.

Мы переопределяем maсквозные mzотображения, чтобы сохранить текущее значение g:previous_marksперед вызовом оригинала, mчтобы фактически установить метку. Мы также определяем <Leader>maчерез , <Leader>mzчтобы показать историю для указанной марки.

Возможно, вы захотите сохранить информацию g:previous_marksболее организованным образом и добавить возможность быстрого восстановления метки (а не просто просмотра местоположений), но в этом примере показано, как это можно сделать, дальнейшие настройки оставлены в качестве упражнения. читателю ;-)

let g:previous_marks = {}
fun! MyMark(mark)
    let l:marks = ''
    redir => l:marks
        try
            silent! execute 'marks ' . a:mark
        catch
        endtry
    redir END

    if l:marks != ''
        if !has_key(g:previous_marks, a:mark)
            let g:previous_marks[a:mark] = []
        endif
        call add(g:previous_marks[a:mark], split(l:marks, "\n")[1])
    endif

    execute 'normal! m' . a:mark
endfun

fun! ShowHistory(mark)
    if !has_key(g:previous_marks, a:mark)
        echoerr 'No history for ' . a:mark
        return
    endif

    for l:line in g:previous_marks[a:mark]
        echo l:line
    endfor
endfun

fun! MakeMappings()
    for l:char in range(97, 122)
        let l:char = nr2char(l:char)

        execute 'nnoremap <silent> m' . l:char . ' :call MyMark("' . l:char . '")<CR>'
        execute 'nnoremap <silent> <Leader>m' . l:char . ' :call ShowHistory("' . l:char . '")<CR>'
    endfor
endfun

call MakeMappings()
Мартин Турной
источник
Ух как обычно изумительный ответ! Я постараюсь занять время на этих выходных, чтобы выполнить упражнение для читателя;)
statox
2

Не совсем то, что вы хотите, но, возможно, более полезно: плагин подписи . Он показывает текущие метки в виде знаков на полях желоба и имеет простые ярлыки для их редактирования. Он также может поместить список знаков в список местоположений для быстрого доступа.

Сато Кацура
источник
Я не большой поклонник видимой отметки на полях, но, похоже, у нее есть некоторые интересные особенности, на которые я взгляну.
statox
@statox В том же духе есть и отличительные черты . Он показывает буквально все метки (плагин выше имеет дело только с буквенными), и может быть переключен с ключом. Я нахожу это полезным иногда.
Сато Кацура
Да, я использовал showmarks в течение некоторого времени (в отличие от подписи), поэтому я сказал, что я не фанат отметок на полях, но сейчас я пробую подпись, чтобы посмотреть, понравится ли мне это :-)
statox
2

Поскольку реальной проблемой является навигация между несколькими файлами / позициями, я бы предложил это простое решение, основанное на плагине Unite :

:Unite jump -auto-preview

Эта команда (которая может быть сопоставлена ​​с чем-то вроде, <leader>jнапример) покажет список переходов с предварительным просмотром: каждый раз, когда вы перемещаетесь по списку с помощью j/ k, несколько строк вокруг позиции курсора в этом файле будут отображаться.

введите описание изображения здесь


Альтернатива:

Метки по умолчанию так легко перезаписать: возможно, именованные закладки лучше подойдут для вашего случая использования, например, с плагином simple_bookmarks .

VanLaser
источник
Я не могу сказать, что проблема в этом типе навигации, потому что я использую эти метки действительно время от времени, и большую часть времени я перемещаюсь по файлам по-разному. Тем не менее, я долго думал, что мне следует чаще использовать список переходов, так что это кажется хорошим способом сделать это!
statox
Даже если они могут быть сохранены между сессиями vim, слишком просто перезаписать метки. Я добавил альтернативное решение.
VanLaser
Действительно, ваше альтернативное решение, кажется, стоит попробовать, большое спасибо!
statox