Dodaj dobre słowa specyficzne dla pliku do wewnętrznej listy słów vima (przez modeline)

9

Czy możliwe jest dodawanie poprawnie napisanych słów do wewnętrznej listy słów vima za pomocą modeline? Lub inna metoda specyficzna dla pliku?

Vim może dodawać słowa do tymczasowej wewnętrznej listy słów za pomocą klawisza zGlub :spellgood! {word}. Czy to samo można zrobić na modelinie?

Przykładem może być następujący tekst, w którym chcę, aby akronimy „RAS” i „RAP” były uważane za dobre słowa podczas używania sprawdzania pisowni przez vima.

Zespół RAS (skrót od „redundant acronym syndrome”), znany również jako zespół PNS („zespół numeru PIN”, który rozszerza się na „zespół zespołu numeru osobistego numeru identyfikacyjnego”) lub zwroty RAP („zbędne wyrażenia akronimowe”), odnosi się do użycia jednego lub większej liczby słów, które składają się na akronim lub inicjalizm w połączeniu ze skróconą formą, w ten sposób w efekcie powtarzając jedno lub więcej słów.

Tekst został skopiowany z http://en.wikipedia.org/wiki/RAS_syndrome

Charles Maresh
źródło

Odpowiedzi:

6

Obecnie Vim nie zapewnia „rodzimego” mechanizmu, aby to zrobić, chociaż myślę, że to dobry pomysł. Jedyne, co mogę wymyślić, to :autocmdwywołanie funkcji, która wyszukuje specjalną sekcję w pliku, a następnie przesuwa kursor nad słowami w tej sekcji i uruchamia się za zGpomocą :normalpoleceń. Byłoby to bałagan i nie chciałbym się tym przejmować.

Edytuj: Oczywiście, jakoś przeoczyłem istnienie:spellgood!, nawet jeśli jest to twoje pytanie. Dzięki temu praca jest znacznie bardziej wykonalna. Wymyśliłem podstawową implementację, którą możesz dostosować do swoich potrzeb:

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

Spowoduje to wyszukanie bloku, który wygląda mniej więcej tak:

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

I każde słowo znajdzie - w tym przypadku word1, word2, word3, word4, i word5--within bloku doda do listy dobrych słów tymczasowego.

Pamiętaj tylko, że nie testowałem tego w warunkach skrajnych.

Heptyt
źródło
Jest to bardziej dogłębne, niż się spodziewałem, i byłoby bardzo przydatnym skryptem vim. Sprawdziłem vim.org, ale nie było podobnych dopasowań. Dzięki!
Charles Maresh,