Adicione boas palavras específicas do arquivo à lista interna de palavras do vim (via modeline)

9

É possível adicionar palavras escritas corretamente à lista interna de palavras do vim via modeline? Ou outro método específico de arquivo?

O Vim pode adicionar palavras à lista interna temporária de palavras através do comando key zGou :spellgood! {word}. O mesmo pode ser feito na modelagem?

Um exemplo seria o seguinte texto, onde eu quero que as siglas "RAS" e "RAP" sejam consideradas boas palavras ao usar a verificação ortográfica do vim.

Síndrome RAS (abreviação de "síndrome da síndrome do acrônimo redundante"), também conhecida como síndrome do PNS ("síndrome da síndrome do número do PIN", que se expande para "síndrome da síndrome do número de identificação pessoal") ou frases RAP ("frases da frase do acrônimo redundante"), refere-se ao uso de uma ou mais das palavras que compõem um acrônimo ou inicialismo em conjunto com a forma abreviada, repetindo assim uma ou mais palavras.

O texto foi copiado de http://en.wikipedia.org/wiki/RAS_syndrome

Charles Maresh
fonte

Respostas:

6

Atualmente, o Vim não fornece nenhum mecanismo "nativo" para fazer isso, embora eu ache que seja uma boa idéia. A única coisa em que consigo pensar é em um :autocmdque chama uma função que procura uma seção especial no arquivo e move o cursor sobre as palavras dessa seção e dispara zGcom :normalcomandos. Isso seria confuso e eu relutaria em me preocupar com isso.

Edit: Claro, de alguma forma eu ignorei a existência de:spellgood!, mesmo que esteja na sua pergunta. Isso torna o trabalho muito mais viável. Eu vim com uma implementação básica que você pode ajustar para atender às suas necessidades:

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()

Isso irá procurar por um bloco que se parece com isso:

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

E cada palavra que encontra - neste caso, word1, word2, word3, word4, e word5--within o bloco que vai adicionar à lista de palavras boas temporária.

Esteja ciente de que ainda não testei o estresse.

Heptite
fonte
Isso é mais profundo do que eu esperava, e seria um script vim muito útil. Eu verifiquei o vim.org, mas não houve correspondências semelhantes. Obrigado!
Charles Maresh