¿Cómo puedo usar marcas para saltar a ubicaciones en archivos que he abierto recientemente, pero que no he cambiado?


11

Muchas veces edito un archivo, creo que mi trabajo está hecho, luego cierro el archivo y paso a lo siguiente. Pero luego me doy cuenta de que necesito volver a ese código y modificarlo un poco más.
Si vuelvo a abrir el archivo, puedo usar la .marca y saltar a la posición de la última edición con '..
Ahora estoy tratando de encontrar una manera de usar las marcas de vim para saltar a ubicaciones en archivos que he visitado recientemente, pero que no he cambiado.
Sé que puedo establecer una marca manualmente, pero la mayoría de las veces, no espero volver y, por lo tanto, no establezco una marca y necesito usar una marca que vim genera automáticamente.
La "marca parece que esto podría ser una forma de lograr esto, desde :h motion.

" A la posición del cursor la última vez que sale del búfer actual. El valor predeterminado es el primer carácter de la primera línea. Ver | last-position-jump | para saber cómo usar esto para cada archivo abierto. Solo se recuerda una posición por búfer, no una para cada ventana. Mientras el búfer esté visible en una ventana, la posición no cambiará. {no en Vi}.

Sin embargo si yo

  • cierre todas las ventanas que muestran un búfer (pero el búfer todavía está presente en la lista de búfer). o:
  • matar todas las instancias del búfer

la marca no parece actualizarse, ¿cómo puedo usar una marca para saltar a una ubicación de la última posición del cursor en el búfer / archivo?


2
Creo que estás buscando Ctrl+oy Ctrl+i... :h jump-motionspara obtener más información
Sundeep

@spasic no es una mala sugerencia, pero una vez que realice algunas docenas de saltos, la posición se perdería en una lista de salto masiva. Al marcar las marcas en el búfer, tiene una lista más pequeña de marcas / ubicaciones para administrar
the_velour_fog

Si aún no lo leyó, creo que este consejo sería interesante. Tal vez tengas que modificar tuviminfo
statox

@statox gracias. Vi eso y la punta en la ayuda vim. Creo que esas soluciones causan saltos automáticos a la "marca cuando abres un archivo. Realmente solo quería saltar a la última posición del cursor manualmente. Además, no podía entender cuándo "se establece y actualiza la "marca, por lo que para mí la marca no se puede usar.
the_velour_fog

Respuestas:


6

Aquí hay una solución clásica: usar

`H

para saltar al último archivo HTML y así sucesivamente ...

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

2
gracias, esto parece que realmente podría ser útil. Lo he cargado en mi vimrc para probarlo. He cambiado a autocmd a WinLeavecomo he notado BufLeaveque no parece dispararse cuando cierras una división y el búfer todavía está abierto en otro lugar. Sé que es un caso marginal, pero WinLeaveparece funcionar en una gama más amplia de situaciones de tipo "cierre de archivo", pero todavía estoy probando ...
the_velour_fog

3

Escribí esta declaración vimscript que parece funcionar

autocmd BufLeave * :normal ml

Explicación

  • BufLeave comando automático: esto parece activarse cuando
    • pasar a otra ventana
    • cuando cierra la última ventana que muestra el búfer
    • cuando cierras el búfer con bd
  • :normal- Parece que por defecto, la commandparte de autocmd es un comando ex. Entonces, para decirle a vim que ejecute un comando en modo normal, debe agregar:normal
  • ml- establecer una marca l(mnemotécnico: último )

Uso

para recuperar la posición del cursor desde la última vez que estuvo en el búfer simplemente presione

'l

o

`l

0

Si desea que su cursor restaure la última posición conocida por viminfo , puede usar

autocmd BufReadPost * call setpos(".", getpos("'\""))

La respuesta de romainl me ha sido particularmente útil, y he estado usando esto mucho (ya que soy un desarrollador web):

augroup VIMRC
    autocmd!
    autocmd BufLeave,WinLeave *.html normal! mH
    autocmd BufLeave,WinLeave *.css normal! mC
    autocmd BufLeave,WinLeave *.js normal! mJ
augroup end

nnoremap <space>h `Hzz
nnoremap <space>c `Czz
nnoremap <space>j `Jzz

La última cosa potencialmente útil es la opción :help 'nostartofline:

               *'startofline'* *'sol'* *'nostartofline'* *'nosol'*
'startofline' 'sol' boolean (default on)
            global
            {not in Vi}
    When "on" the commands listed below move the cursor to the first
    non-blank of the line.  When off the cursor is kept in the same column
    (if possible).  This applies to the commands: CTRL-D, CTRL-U, CTRL-B,
    CTRL-F, "G", "H", "M", "L", gg, and to the commands "d", "<<" and ">>"
    with a linewise operator, with "%" with a count and to buffer changing
    commands (CTRL-^, :bnext, :bNext, etc.).  Also for an Ex command that
    only has a line number, e.g., ":25" or ":+".
    In case of buffer changing commands the cursor is placed at the column
    where it was the last time the buffer was edited.
    NOTE: This option is set when 'compatible' is set.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.