Pregunta:
Estoy tratando de definir una macro que genera rápidamente una lista de palabras aleatorias.
Quiero que la macro convierta esto en una lista como
a
b
c
d
e
dentro de esto
arezzo
bywords
czars
détente
eyrie
Lo que tengo hasta ahora:
- poner el cursor en la letra
a
- empezar a grabar macro
qq
-
a
modo de inserción de entrada -
<Cx><Ck> - perform dictionary completion on the character before cursor - in this case the letter
a` -
<Cp>
seleccione el último elemento de la lista de finalización que aparece, en mi sistema es la palabraarezzo
. (Nota: he incluidolongest
en mi configuración'completeopt'
, que es necesaria para que<Cp>
funcione de esta manera durante la finalización:'set completeopt=longest,menuone,preview'
). -
<Cy>
acepta la finalización -
^[^[
salir del modo de inserción -
j
baje a la siguiente línea, listo para hacer la misma operación en la siguiente línea -
q
detener la grabación
cuando creo la macro y sigo los pasos manualmente, todo funciona bien, sin embargo, cuando ejecuto la macro, veo un mensaje parpadeando en la línea de comando algo como:
escanear archivo de diccionario
y no sucede nada, de los comandos de la macro solo se ejecuta j
, es decir, el cursor se mueve hacia abajo en la línea, pero no se ejecuta ninguno de los comandos de finalización.
¿Es posible utilizar finalizaciones del modo de inserción en una macro y, de ser así, cómo puedo hacerlo?
Respuesta:
EDITAR : Realmente estás después de completar el diccionario; no necesita necesariamente el modo de inserción (modo Ctrl + X) para hacer esto. Como descubrió, hace que trabajar con macros sea un verdadero dolor de cabeza. El siguiente script se puede utilizar para completar el diccionario sin el modo de inserción, de modo que pueda repetirlo fácilmente dentro de una macro.
Agregue el siguiente código a su archivo .vimrc
, cierre y vuelva a abrir cualquier ventana de vim para obtener la nueva función, y luego grábese alternativamente presionando <Ck>
para completar j
para pasar a la siguiente línea. Agregué una marca de verificación para la opción longest
y, si está deshabilitada, elige una entrada aleatoria usando el tiempo aleatorio del sistema. Si encuentra la opción longest
, busca manualmente la entrada coincidente más larga del diccionario y la inserta.
Si no le gusta el mapeo <Ck>
, no dude en cambiarlo como mejor le parezca. Debería funcionar con cualquier mapeo que desee.
Además, el comando para devolver la expresión para que el mapeo evalúe agrega un carácter \<esc>
al final para que dejemos el modo de inserción automáticamente después de cada inserción, y un 0cw
al frente para ingresar al modo de inserción para comenzar y asegurarse sobrescribimos toda la palabra correctamente. Dependiendo del comportamiento exacto que desee (si sus palabras no están bien al principio de cada línea), puede usar bcw
en bcw
lugar para encontrar el inicio real de la palabra. Sin embargo, verá algunas rarezas al volver a las palabras que comienzan la línea. Probablemente haya un comando más avanzado para ignorar el final de la línea y hacer ambas cosas a la vez, pero no pude encontrar uno.
map <expr> <C-k> CompleteDictionary()
fun! CompleteDictionary()
let cword = expand(“<cword>”)
let res = []
for m in readfile(&dictionary)
if m =~ '^' . cword
call add(res, m)
endif
endfor
if &completeopt =~ 'longest'
let max = 0
let maxindex = 0
let index = 0
for item in res
if strlen(item) > max
let max = strlen(item)
let maxindex = index
endif
let index = index + 1
endfor
return "0cw" . res[maxindex] . "\<esc>"
else
return "0cw" . res[system('@echo %RANDOM%') % len(res)] . "\<esc>"
endif
endfun
Además, no sería difícil extender la lógica aquí para crear asignaciones alternativas (usando, por ejemplo, parámetros de función) que realicen cualquier función que proporcione el modo de inserción. Estaré encantado de ayudar con dichos requisitos y actualizar este script cuando tenga tiempo.