online metrologia mac for vim

metrologia - Vim scripting: conservar la posición del cursor y la vista de pantalla en la llamada de función



vim online (5)

Hay un plugin pero uso una sola función como esta:

if !exists(''*Preserve'') function! Preserve(command) try " Preparation: save last search, and cursor position. let l:win_view = winsaveview() let l:old_query = getreg(''/'') silent! execute ''keepjumps '' . a:command finally " Clean up: restore previous search history, and cursor position call winrestview(l:win_view) call setreg(''/'', l:old_query) endtry endfunction endif

Entonces lo llamo para limpiar los espacios finales.

fun! CleanExtraSpaces() call Preserve(''%s//s/+$//ge'') endfun com! Cls :call CleanExtraSpaces() au! BufwritePre * :call CleanExtraSpaces()

líneas en blanco

fun! DelBlankLines() call Preserve(''%s/^/n/{2,}//r/ge'') endfun command! -nargs=0 DelBlank :call DelBlankLines()

y cambiar la información del encabezado (última modificación)

fun! ChangeHeader() call Preserve(''1,5s/Last Change: /zs.*//=strftime("%c")/e'') endfun command! -nargs=0 CH :call ChangeHeader() au BufWritePost * :call ChangeHeader()

Tengo algunas funciones de Vim que realizan cambios en el formato del documento. Cuando llamo a esta función, actualmente uso algo como lo siguiente para guardar y restaurar la posición de mi cursor:

func! Foo() :norm mz ... :norm `z endf

Esto guarda correctamente la posición del cursor, pero a veces cambia la posición de la ventana, de modo que la línea actual se mueve desde la parte superior de la pantalla hasta la parte inferior o viceversa. ¿Hay alguna forma de conservar la posición del cursor y la posición en pantalla de la línea?


Puede guardar una marca para la primera línea en pantalla que se muestra en la ventana y restaurarla también. Un ejemplo que ejecuta una g? comando en todo el búfer y restaura ambas posiciones:

:noremap <F11> mkHmlggg?G`lzt`k

Caminando a través del comando:

  • mk : establecer marca k para la posición actual
  • H : ir a la primera línea en pantalla
  • ml : establecer la marca l para esta posición
  • ggg?G : ejecuta el comando
  • `` l : jump to mark l`
  • zt : establece esta línea la primera línea en pantalla
  • `` k : jump to mark k`

Sólo: h getpos ()

let save_cursor = getpos(".") " MoveTheCursorAround call setpos(''.'', save_cursor)


puede usar getline () para guardar la línea de búfer actual y winline () para guardar la línea de ventana actual.

Así que iría algo como esto:

  • guardar línea de ventana con winline ()
  • mueva el cursor a la parte superior de la ventana con: normal! H
  • guardar línea de búfer con getline ()
  • ...
  • restaurar la línea de búfer con: exec ''normal! ''.myline.''G''
  • desplácese hasta la parte superior con: zt normal
  • entonces restaure la línea de ventana original con: exec ''normal! ''.mywinline.''H''

Es posible que tenga que cuidarse de algunos casos especiales, como si la posición está cerca del final o al principio del archivo o si el archivo es más pequeño que el tamaño de la ventana.


let l:winview = winsaveview() " do stuff call winrestview(l:winview)

Esto debería prácticamente hacer exactamente lo que quiere que haga, posiblemente exceptuando el cambio de conteo de líneas sobre el cursor (sospecho que las líneas eliminadas sobre el cursor tendrían el efecto de mover el cursor hacia abajo).