mark – Establecer una marca a su valor anterior

Pregunta:

A veces utilizo marcas para navegar fácilmente a través de diferentes archivos usando mA , mB … y 'A , 'B

Y en algún momento (más a menudo de lo que me gustaría admitir) por falta de atención o por la razón que sea, utilizo m[LETTER] con una marca ya existente que borra su valor anterior cuando no quiero. La mayoría de las veces, cuando hago eso, no tengo abierto el archivo originalmente señalado por la marca.

En este caso, cuando me di cuenta de inmediato de que había cometido un error, ¿es posible obtener el valor anterior de mi marca además de recordar a dónde apuntaba, navegar a esta ubicación y volver a configurarlo?

No he encontrado un comando como ese en el documento, así que si no existe, ¿hay alguna solución inteligente que algunos de ustedes usen en esta situación?

Respuesta:

Aquí hay algunos VimScript básicos que hacen aproximadamente lo que quieres.

mz asignaciones de ma a mz para almacenar el valor actual en g:previous_marks antes de llamar a la m original para establecer la marca. También definimos <Leader>ma a <Leader>mz para mostrar el historial de dicha marca.

Probablemente desee almacenar la información en g:previous_marks de una manera más organizada y agregar la capacidad de restaurar rápidamente una marca (en lugar de solo ver las ubicaciones), pero este ejemplo muestra cómo se puede hacer, quedan más ajustes como ejercicio para el lector 😉

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()

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım