Встановіть позначку попереднього значення


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 У цьому ж ключі є також покази . Він показує буквально всі позначки (плагін вище стосується лише буквених знаків), і його можна перемикати клавішею. Я вважаю це корисним періодично.
Сато Кацура

Так, я вже декілька разів використовую покази (на відміну від підпису), тому я сказав, що я не прихильник знаків на полях, але зараз намагаюся підписати, щоб побачити, чи мені це подобається :-)
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.