autocompletion – ¿Cómo puedo utilizar la finalización del modo de inserción en una macro?

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 palabra arezzo . (Nota: he incluido longest 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.

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım