2011-01-12 8 views
9

Używam Emacsa do pisania większości moich pism. Piszę przy pomocy reStructuredText, a potem po pewnym wstępnym przetworzeniu przekształcam je w LaTeX, ponieważ piszę moje cytaty á-la LaTeX. Jest to fragment jednego z moich tekstów (w języku hiszpańskim):Jak zrobić flyspell ominąć niektóre słowa według kontekstu?

En \cite[pp.~XXVIII--XXIX]{Crnkovic2002} se brindan algunos riesgos 
que se pueden asumir con el desarrollo basado en componentes, los 

Ten tekst jest przetwarzany przez niektórych niestandardowych skryptów, która zajmuje się \cite części tak rst2latex może wykonywać swoje zadania.

Po włączeniu trybu Flyspell sygnalizuje większość klawiszy cytowania jako błędy ortograficzne.

Jak mogę powiedzieć, że funkcja Flyspell nie sprawdza pisowni w poleceniach \cite.

Co więcej, w jaki sposób mogę połączyć tryb rst i Flyspell, aby w pierwszym trybie do sprawdzania pisowni następowało polecenie flyspell?

  • reszta komentarzach Kod
  • reszta dosłownego
  • dyrektywa reszta parametrów i argumenty
  • reszta surowy dyrektywa zawartość

Jakieś pomysły?

Odpowiedz

11

Można ustawić zmienną ispell-parser na wartość 'tex, aby mucha zignorowała (la) sekwencje tex. Aby to zrobić, możesz ustawić go ręcznie w każdym buforze, tak:

M-: (setq 'ispell-parser 'tex) 

lub napisać trochę funkcji, która zrobi to za Ciebie. Umieścić następujące informacje w pliku .emacs:

(defun flyspell-ignore-tex() 
    (interactive) 
    (set (make-variable-buffer-local 'ispell-parser) 'tex)) 

Następnie można nadal powoływać się go ręcznie, za pomocą

M-x flyspell-ignore-tex 

lub można dodać hak, który wywołuje tę funkcję automatycznie przy edycji plików na pewien typ. Zrobiłbyś to drugie, dodając nowo zdefiniowaną funkcję do swojej auto-mode-alist. Wypowiedz nazwy plików zwykle kończą się „.rst”, a następnie dodać ten wiersz do pliku .emacs:

(add-to-list 'auto-mode-alist '("\\.rst$" . flyspell-ignore-tex)) 

Co do drugiej części pytania: co flyspell-mode ignorować większych regionów, takich jak, na przykład, komentarze REST, nie jest łatwo osiągalne. Staje się jasne, kiedy myślisz o sposobie działania Flyspell: sprawdza tekst na podstawie słowo po słowie. W tym celu flyspell-word wyświetla tylko jedno słowo na raz, które wysyła do procesu ispell działającego w tle. Proces ispell wykonuje wyszukiwanie w słowniku i zwraca informację, czy obecne słowo jest poprawne. Jeśli flyspell-word musiał sprawdzić za każdym razem, czy obecne słowo jest częścią komentarza lub innego regionu, który nie powinien być sprawdzany, byłoby raczej powolne, ponieważ obejmowałoby to sporo przeszukiwania bufora.

Teraz można podejść do tego trochę mądrzej i najpierw znaleźć regiony bez komentarza itp., A następnie sprawdzać słowo po słowie tylko w tych częściach, które są poza tymi regionami - ale niestety, to nie jest sposób w jaki zaimplementowano Flyspell.

Jeśli jednak możesz wykonać operację bez części "latającej", tryb ispell ma mechanizm pozwalający dostosować, które regiony bufora można pominąć. Odbywa się to za pomocą zmiennej ispell-skip-region-alist. Ale chociaż tryb flyspell działa w trybie ispell, z powodów opisanych powyżej, zmienna nie jest używana w trybie flyspell.

+0

Thomas, wielkie dzięki! Używałem w przeszłości trybu ispell, ale w tej chwili muchówka bardziej mi odpowiada. Niemniej jednak, po przeczytaniu dokumentu "ispell-skip-region-alist", myślę, że musiałbym zaprogramować funkcję wykrywania końca komentarza. Nie jestem jeszcze zaznajomiony z Emacsem Lispem. W każdym razie sposób 'ispell-parser' jest nadal pomocny. Może mógłbym sprawdzić, w jaki sposób został użyty i jak mogę stworzyć mój własny parsera-parser-tweek. – manu

+0

Manu, prawdopodobnie nie będziesz musiał programować funkcji seplenienia, aby wykryć początek i koniec komentarza. Zazwyczaj powinno wystarczyć wyrażenie regularne, takie, które pasuje do początku i takie, które pasuje do końca. Wstawiasz je w nawias i dodajesz do 'ispell-skip-region-alist' (wypróbowałem to wczoraj, to właściwie nie jest takie trudne) i istnieje duża szansa, że' pierwszy tryb' zawiera już regexps gdzieś szukałem. – Thomas

+0

W reStructuredText koniec sekcji kodu jest wykrywany po zmniejszeniu poziomu wcięcia. Regexp nie pomogłoby. Z pozdrowieniami, Manu. – manu

4

Możesz również użyć flyspell-generic-check-word-predicate, jak wyjaśniłem in this question w Super User.

1

(filtr tex aspell może zrobić dokładnie to, co chcesz - ale jeśli chcesz bardziej ogólne rozwiązanie)

Chociaż używam poniżej kod, aby przekonać flyspell aby nie flaga pewnych słów z numerami w nich cię może użyć tego rodzaju haka, aby dopasować określony kontekst.

Wyszukiwanie rozpoczyna się w żądanej pozycji - możesz więc odszukać początek/koniec dowolnego kontekstu, który Cię interesuje.

(when "another attempt to accept certain words flyspell/ispell/aspell flags as incorrect" 
    (defun flyspell-ignore-WordNumber99-stuff/ag (beg end info) 
    (save-excursion 
     (goto-char beg) 
     (cond 
    ((or 
     (looking-at "\\bWord1\\b") 
     (looking-at "\\bWord99Foo\\b") 
     ) 
     t) 
    (t nil) 
    ) 
    ) 
    ) 
) 

(add-hook 'flyspell-incorrect-hook 'flyspell-ignore-WordNumber99-stuff/ag) 
Powiązane problemy