¿Puedo hacer que Vim también guarde "pequeñas eliminaciones" en el registro "1?

14

Recientemente eliminé el complemento YankRing de mi configuración en parte porque estaba causando algunos problemas con las macros, pero principalmente porque decidí que sería mejor entrenarme para usar los registros de Vim, en particular, la forma en que el texto eliminado se almacena inicialmente en el registro "1y luego desplazado hacia arriba a través "2, "3, etc. medida que se realizan supresiones adicionales es muy útil.

Sin embargo, cuando una eliminación / cambio elimina menos de una línea de texto, se almacena en el "-pequeño registro de eliminación (con algunas excepciones para ciertos comandos de movimiento). Si se realizan pequeñas eliminaciones posteriores, ese bit de texto se pierde.

¿Es posible hacer que Vim almacene todas las eliminaciones en el registro "1?

nnoremap d "1d casi funciona, pero terminas con el texto en ambos registros "1 y "2 .

No me importa si la funcionalidad del pequeño registro de eliminación se ve afectada o no. Sugerir que cambie mi comportamiento para guardar pequeñas eliminaciones en un registro con nombre definitivamente no sería una respuesta útil, eso es lo que estoy haciendo actualmente.

Rico
fuente

Respuestas:

10

Esto solía funcionar en versiones anteriores de Vim 7.3 cuando usted :set clipboard=unnamed(vea esta discusión de Reddit , como resultado de un error, que he informado aquí .

Ese hilo contiene un parche de Aryeh Leib Taurog que presenta una 'regone'opción. Esto lo ha incluido en la lista de tareas pendientes (demasiado larga), pero es poco probable que se incorpore pronto. Por lo tanto, actualmente solo tiene la opción de degradar a un Vim desactualizado, o construir Vim usted mismo con ese parche (y presionar para su adopción en la lista de correo vim_dev ).

Ingo Karkat
fuente
1
¡Interesante! (Especialmente su idea sobre el umbral). Gracias por la información. Voy a esperar el voto positivo / aceptar por el momento en un intento de alentar a alguien a crear un VimScript loco para hacer esto mientras tanto.
Rich
5

Tengo una solución de prueba de concepto que funciona para el dcomando con movimientos y en modo visual. Todavía no es una solución completamente robusta (por ejemplo, d[count]dno funciona , y tampoco lo hace [count]D), pero casi cubre todos mis casos de uso reales.

Funciona configurando una función de operador de cliente que:

  1. almacena el contenido de los registros 1–8 en un diccionario,
  2. realiza la eliminación en el registro 1,
  3. establece los registros 2–9 a los contenidos guardados previamente de los registros 1–8.

Consulte :help map-operatorpara obtener una explicación de cómo funcionan las funciones del operador.

function! ShiftingDeleteOperator(type)
  let reg_dict = {}
  for k in range(1, 8)
    execute printf("let reg_dict[%d]=getreg('%d', 1)", k, k)
  endfor

  if a:type ==# 'v'
    execute 'normal! `<v`>d'
  elseif a:type ==# 'V'
    execute 'normal! `<V`>d'
  elseif a:type ==# "\<C-V>"
    execute "normal! `<\<C-V>`>d"
  elseif a:type ==# 'char'
    execute 'normal! `[v`]d'
  elseif a:type ==# 'line'
    execute "normal! '[V']d"
  else
    return
  endif

  let deleted = getreg('"', 1)
  call setreg(1, deleted)

  for [k, v] in items(reg_dict)
    execute printf("call setreg(%d, v)", k + 1)
  endfor
endfunction

" Call the function for d{motion} via operatorfunc
nnoremap <silent> d :set operatorfunc=ShiftingDeleteOperator<CR>g@
" Call the function when d or x are hit in visual mode
vnoremap d :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
vnoremap x :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
" Use the d{motion} as defined above to add limited support for `D` command
nmap D d$
" Use the standard dd command
nnoremap dd dd 
Rico
fuente
Perdón por comentar una vieja respuesta. Adopté esta solución a yy cpero para cmi nvim no entra en el modo de inserción después de la acción ... Actualmente tengo que execute ly startinsertque no es una solución adecuada (como c$sería poner el cursor en la posición incorrecta). ¿Algunas ideas?
Sunny Pun