2011-01-12 11 views
9

Ich benutze Emacs zum Schreiben der meisten meiner Schriften. Ich schreibe mit reStructuredText und transformiere sie nach einiger Vorverarbeitung in LaTeX, da ich meine Zitate á la LaTeX schreibe. Dies ist ein Auszug aus einem meiner Texte (in Spanisch):Wie Flyspell umgehen einige Wörter durch Kontext umgehen?

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

Dieser Text wird durch einige benutzerdefinierte Skripts verarbeitet wird, die mit dem \cite Teil beschäftigt sich so rst2latex kann seine Arbeit tun.

Wenn ich den Flyspell-Modus aktiviere, werden die meisten Zitationsschlüssel als Rechtschreibfehler angezeigt.

Wie kann ich Flyspell nicht zu Rechtschreibprüfung Dinge innerhalb \cite Befehle sagen.

Desweiteren, wie kann ich rst-mode und flyspell kombinieren, so dass der right-modus den flyspell von der rechtschreibprüfung des folgenden hält?

  • reST kommentiert
  • reST Code wörtliche
  • reST Richtlinie Parameter und Argumente
  • reST roh Richtlinie Inhalt

Irgendwelche Ideen?

Antwort

11

Sie können die Variable ispell-parser auf den Wert 'tex setzen, damit Flyspell (la) Tex-Sequenzen ignoriert. Dazu können Sie entweder manuell in jedem Puffer wie so:

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

oder Sie schreiben eine kleine Funktion, die das für Sie tun. Legen Sie die folgenden in Ihrer .emacs-Datei:

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

Dann können Sie noch rufen Sie es manuell,

M-x flyspell-ignore-tex 

oder Sie könnten einen Haken hinzufügen, die diese Funktion ruft automatisch, wenn Sie eine Datei von einem bearbeiten bestimmter Typ. Sie würden Letzteres tun, indem Sie die neu definierte Funktion zu Ihrem auto-mode-alist hinzufügen. Sagen Sie Ihre Dateinamen der Regel mit „.rst“ beenden, dann fügen Sie diese Zeile in Ihre .emacs-Datei:

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

Was den zweiten Teil Ihrer Frage: macht flyspell-Modus ignorieren größere Bereiche, wie zB reST Kommentare, ist nicht leicht zu erreichen. Es wird deutlich, wenn man über die Funktionsweise von flyspell nachdenkt: Text wird Wort für Wort geprüft. Dafür sieht flyspell-word nur ein Wort nach dem anderen, das es an einen im Hintergrund laufenden ispell-Prozess sendet. Der ispell-Prozess führt die Wörterbuchsuche durch und gibt zurück, ob das aktuelle Wort korrekt ist oder nicht. Wenn flyspell-word jedes Mal überprüfen musste, ob das aktuelle Wort Teil eines Kommentars oder einer anderen Region ist, die nicht überprüft werden sollte, wäre das ziemlich langsam, weil das ziemlich viel Suchen im Puffer beinhalten würde.

Jetzt könnte man das natürlich ein bisschen schlauer angehen und zuerst die Nichtkommentar-Regionen usw. finden und dann die Wort-für-Wort-Prüfung nur in den Teilen außerhalb dieser Regionen durchführen - aber leider So ist Flyspell nicht implementiert.

Wenn Sie jedoch auf den "Fly" -Teil verzichten können, verfügt ispell-mode über einen Mechanismus, um festzulegen, welche Bereiche eines Puffers übersprungen werden können. Dies geschieht über die Variable ispell-skip-region-alist. Aber obwohl der Flyspell-Modus im Ispell-Modus arbeitet, wird diese Variable aus den oben genannten Gründen nicht im Flyspell-Modus verwendet.

+0

Thomas, vielen Dank! Ich habe in der Vergangenheit den Ispell-Modus benutzt, aber Flyspell passt mir im Moment besser. Nach dem Lesen des Dokuments 'ispell-skip-region-alist' würde ich jedoch eine Funktion programmieren müssen, um das Ende des Kommentars zu erkennen. Ich kenne Emacs Lisp noch nicht sehr gut. Wie dem auch sei, der 'ispell-parser' Weg ist immer noch hilfreich. Vielleicht könnte ich überprüfen, wie es verwendet wird und meinen eigenen Ispell-Parser Tweek erstellen, wenn ich kann. – manu

+0

Manu, Sie müssen wahrscheinlich keine Lisp-Funktion programmieren, um den Anfang und das Ende eines Kommentars zu erkennen. Normalerweise sollte ein regulärer Ausdruck ausreichen, einer, der dem Anfang entspricht und einer, der dem Ende entspricht. Sie setzen beide in Klammern und fügen sie dem 'ispell-skip-region-alist' hinzu (ich habe es gestern ausprobiert, es ist eigentlich gar nicht so schwer) und es besteht eine gute Chance, dass der 'right-mode' bereits die Regexps enthält Ich suche irgendwo. – Thomas

+0

In reStructuredText wird das Ende des Codeabschnitts erkannt, wenn die Einrückungsebene verringert wird. Regexp würde also nicht helfen. Mit freundlichen Grüßen, Manu. – manu

4

Sie können auch flyspell-generic-check-word-predicate wie ich erklärte in this question bei Super User verwenden.

1

(aspell des tex-Filter kann genau das tun, was Sie wollen - aber wenn Sie eine allgemeinere Lösung wollen)

Obwohl ich den Code unten bin mit nicht-Flag zu überzeugen flyspell bestimmte Wörter mit Zahlen in ihnen, Sie kann diese Art von Hook verwenden, um bestimmten Kontexten zu entsprechen.

Suchen beginnt an der gewünschten Position - Sie können also rückwärts nach Start/Ende suchen, egal in welchem ​​Kontext Sie sich befinden.

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