Agregue palabras buenas específicas de archivo a la lista de palabras vim interna (a través de modeline)

9

¿Es posible agregar palabras escritas correctamente a la lista interna de palabras de vim a través de modeline? ¿O otro método específico de archivo?

Vim puede agregar palabras a la lista temporal interna de palabras mediante el comando de teclado zGo :spellgood! {word}. ¿Se puede hacer lo mismo en la línea de modelo?

Un ejemplo sería el siguiente texto donde quiero que los acrónimos "RAS" y "RAP" se consideren buenas palabras cuando se utiliza la corrección ortográfica de vim.

Síndrome RAS (abreviatura de "síndrome de síndrome de acrónimo redundante"), también conocido como síndrome PNS ("síndrome de síndrome de número PIN", que se expande a "síndrome de síndrome de número de identificación personal") o frases RAP ("frases de frase de acrónimo redundante"), se refiere al uso de una o más de las palabras que forman un acrónimo o inicialismo en conjunción con la forma abreviada, por lo que en efecto repite una o más palabras.

El texto se copió de http://en.wikipedia.org/wiki/RAS_syndrome

Charles Maresh
fuente

Respuestas:

6

Actualmente, Vim no proporciona un mecanismo "nativo" para hacer esto, aunque creo que es una buena idea. Lo único que se me ocurre es :autocmdque llama a una función que busca una sección especial en el archivo y luego mueve el cursor sobre las palabras en esa sección y se dispara zGcon :normalcomandos. Esto sería desordenado y sería reacio a molestarme con eso.

Editar: Por supuesto, de alguna manera pasé por alto la existencia de:spellgood!, aunque esté en tu pregunta. Esto hace que el trabajo sea mucho más factible. Se me ocurrió una implementación básica que puede ajustar para satisfacer sus necesidades:

function! AutoSpellGoodWords()
    let l:goodwords_start = search('\C-\*-SpellGoodWordsStart-\*-', 'wcn')
    let l:goodwords_end = search('\C-\*-SpellGoodWordsEnd-\*-', 'wcn')
    if l:goodwords_start == 0 || l:goodwords_end == 0
        return
    endif
    let l:lines = getline(l:goodwords_start + 1, l:goodwords_end - 1)
    let l:words = []
    call map(l:lines, "extend(l:words, split(v:val, '\\W\\+'))")
    for l:word in l:words
        silent execute ':spellgood! ' . l:word
    endfor
endfunction

autocmd BufReadPost * call AutoSpellGoodWords()

Esto buscará un bloque que se vea así:

-*-SpellGoodWordsStart-*-
word1 word2 word3
word4 word5 ...
-*-SpellGoodWordsEnd-*-

Y cada palabra que encuentra - en este caso, word1, word2, word3, word4, y word5-dentro del bloque que se sumará a la lista de palabras buenas temporal.

Solo tenga en cuenta que no he probado esto.

Heptita
fuente
Esto es más profundo de lo que esperaba, y sería un script vim muy útil. Verifiqué vim.org, pero no hubo coincidencias similares. ¡Gracias!
Charles Maresh