Establecer una marca a su valor anterior

9

A veces uso 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) debido a la falta de atención o por el motivo que sea, lo uso 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 inmediatamente 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 configurarla nuevamente?

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

statox
fuente
1
También usted podría mirar a este post para más información: superuser.com/questions/687441/...
nobe4
@ Nobe4 gracias por su enlace. No lo había encontrado, pero parece confirmar que no es realmente posible hacerlo fácilmente.
statox
Utilice los comandos de salto ( ctrl-o, ctrl-iy :jumps) con su propia memoria personal :)
VanLaser

Respuestas:

5

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

Sobreescribimos al matravés de mzasignaciones para almacenar el valor actual g:previous_marksantes de llamar al original mpara la creación efectiva de la marca. También definimos <Leader>maa través <Leader>mzde mostrar la historia de dicha marca.

Probablemente desee almacenar la información de g:previous_marksuna 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, se dejan más ajustes como ejercicio al 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()
Martin Tournoij
fuente
¡Guau, como siempre, una respuesta increíble! Intentaré tomarme tiempo este fin de semana para implementar el ejercicio para el lector;)
statox
2

No es exactamente lo que quieres, pero quizás sea más útil: el complemento de firma . Muestra las marcas actuales como signos en el margen de la canaleta y tiene accesos directos simples para editarlas. También puede poner la lista de signos en una lista de ubicaciones para un acceso rápido.

Sato Katsura
fuente
No soy un gran admirador de la marca visible en el margen, pero parece tener algunas características interesantes. Lo echaré un vistazo.
statox
@statox En la misma línea, también hay marcas de presentación . Muestra literalmente todas las marcas (el complemento anterior solo trata las alfabéticas), y se puede alternar con una tecla. Lo encuentro útil ocasionalmente.
Sato Katsura
Sí, he estado usando marcas durante un tiempo (a diferencia de la firma), por eso dije que no soy fanático de las marcas en el margen, pero estoy tratando de firmar ahora mismo para ver si me gusta :-)
statox
2

Dado que el problema real parece ser la navegación entre múltiples archivos / posiciones, sugeriría esta solución simple, que se basa en el complemento Unite :

:Unite jump -auto-preview

Este comando (que se puede asignar a algo como, <leader>jpor ejemplo) mostrará la lista de salto, con una vista previa: cada vez que navegue por la lista con j/ k, se mostrarán varias líneas alrededor de la posición del cursor en ese archivo.

ingrese la descripción de la imagen aquí


Alternativa:

Las marcas predeterminadas son muy fáciles de sobrescribir: quizás los marcadores con nombre se ajusten mejor a su caso de uso, por ejemplo, con el complemento simple_bookmarks .

VanLaser
fuente
Realmente no puedo decir que el problema es este tipo de navegación porque uso esas marcas de vez en cuando y la mayoría de las veces navego de manera diferente a través de mis archivos. Sin embargo, he estado pensando durante mucho tiempo que debería usar la lista de salto más a menudo, ¡así que parece una buena manera de hacerlo!
statox
Incluso si se pueden guardar entre sesiones vim, es demasiado fácil sobrescribir las marcas. Agregué una solución alternativa.
VanLaser
De hecho, parece que vale la pena probar su solución alternativa, ¡muchas gracias!
statox