Vim: salta a la posición anterior del cursor, NO edita el punto

0

Estoy tratando de escribir una macro pequeña para agregar un; al final de la línea actual (A;), luego regrese a la posición del cursor desde la que salté antes de ejecutar la macro.

Co y Ci no son lo que necesito, ni son '' y ``, que operan en puntos de edición. ¿No hay forma de hacer esto sin colocar un marcador?

krystah
fuente
Bueno, aparentemente no están operando los puntos de edición `` y '', sin embargo, su comportamiento no es confiable. El resultado de tocar `` o '' después de un salto ($, 3j, G, etc.) rara vez es la ubicación anterior. Aunque uno podría argumentar que no lo "entiendo", creo que esto no es intuitivo y espero que alguien conozca un mejor enfoque.
krystah
No, el doble backtick es el enfoque correcto.
romainl
Sin embargo, rara vez salta a la ubicación anterior. Tal vez porque no sé qué se considera "saltos" y qué está escrito en el historial de saltos. No obstante, no es intuitivo.
krystah
El truco es crear la marca antes de saltar: m`A; <esc> ``.
romainl

Respuestas:

1

Si está de acuerdo con hacer una pequeña función en lugar de una pequeña macro, le propondría lo siguiente:

function! AppendString(string)
  if getline('.') !~ a:string.'$'
    let original_cursor_position = getpos('.')
    exec("s/$/".a:string."/")
    call setpos('.', original_cursor_position)
  endif
endfunction

La posición del cursor se obtiene usando getpos()y luego se recupera con setpos().

Esta función podría agregar cualquier cadena que desee. También comprueba si la línea ya tiene la cadena deseada al final, en cuyo caso no hace nada.

Puede definir mapas de teclas que usen esta función que sean útiles para diferentes idiomas:

" in ftplugin/cpp.vim
nnoremap <silent> <LocalLeader>; :call AppendString(";")<CR>

o

" in ftplugin/python.vim
nnoremap <silent> <LocalLeader>: :call AppendString(":")<CR>
toma dos
fuente
2

El comportamiento de `` y lo que se consideran '' saltos '' se explican claramente en el documento.

De :help jump-motions:

Un "salto" es uno de los siguientes comandos: "'", "` "," G "," / ","? "," N "," N ","% "," (",") " , "[[", "]]", "{", "}", ": s", ": tag", "L", "M", "H" y los comandos que comienzan a editar un nuevo archivo. Si hace que el cursor "salte" con uno de estos comandos, se recordará la posición del cursor antes del salto. Puede volver a esa posición con el comando "''" y "` `", a menos que la línea que contiene esa posición se haya cambiado o eliminado.

Aobviamente no está en la lista, así que "tick-tick-back", como lo llama Gary Bernhardt, no funcionará "como está". Sin embargo, sigue siendo un buen enfoque, pero debe colocar explícitamente la marca de retroceso antes de hacerloA;

nnoremap <key> m`A;<Esc>``
romainl
fuente
1

Terminé escribiendo una pequeña función, una versión menos flexible pero más compacta que la que acaba de publicar.

Keybind:

nnoremap <leader>; :call AppendSC()<CR>

Función:

fun! AppendSC()
  let pos = getpos('.')
  s/.*/&;/
  call setpos('.', pos)
endf
krystah
fuente
1
Sin embargo, marcaré la suya como la aceptada, ya que su solución resolvió mi problema inicial. :)
krystah
Aparentemente, también puede exprimir la definición de la función en una línea si la compacidad es su principal preocupación:]
taketwo
1

Si usa un nivel bajo en setpos()lugar de :substitute(que tiene otros efectos secundarios no deseados, como agregar el patrón al historial de búsqueda), la posición del cursor se mantendrá automáticamente:

:nnoremap <silent> <leader>; :call setline('.', getline('.') . ';')<CR>
Ingo Karkat
fuente
¡Eso es inteligente! Estas funciones de nivel inferior realmente están ampliando el horizonte de mi configuración de Vim :)
krystah