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


9

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

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

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

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


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 .


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

Даже если они могут быть сохранены между сессиями vim, слишком просто перезаписать метки. Я добавил альтернативное решение.
— VanLaser

Действительно, ваше альтернативное решение, кажется, стоит попробовать, большое спасибо!
— statox
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.