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

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

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

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

Respuesta1

Si está de acuerdo con crear una función pequeña en lugar de una macro pequeña, 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 utilizando getpos()y posteriormente 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 utilicen esta función y 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>

Respuesta2

Si usa nivel bajo setpos()en lugar de :substitute(lo cual 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>

Respuesta3

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 haces que el cursor "salte" con uno de estos comandos, se recuerda la posición del cursor antes del salto. Puede regresar a esa posición con el comando "''" y "``", a menos que la línea que contiene esa posición haya sido cambiada o eliminada.

AObviamente no está en la lista, por lo que "tick-tic-back", como lo llama Gary Bernhardt, no funcionará "tal cual". Sin embargo, sigue siendo un buen enfoque, pero debes colocar explícitamente la marca de acento graveantestú hacesA;

nnoremap <key> m`A;<Esc>``

Respuesta4

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

Combinación de teclas:

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

Función:

fun! AppendSC()
  let pos = getpos('.')
  s/.*/&;/
  call setpos('.', pos)
endf

información relacionada