2011-01-12 110 views
9

我使用Emacs编写我的大部分着作。我使用reStructuredText编写,然后在进行一些预处理后将它们转换为LaTeX,因为我写了我的引文La-LaTeX。这是我的文本(西班牙文)之一的摘录:如何让flyspell通过上下文绕过某些单词?

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

本文由与\cite一部分,所以rst2latex可以做它的工作涉及一些自定义的脚本进行处理。

当我激活flyspell模式时,它将大多数引用键标示为拼写错误。

如何告诉flyspell不要拼写检查\cite命令中的内容。

此外,如何将rst模式和flyspell结合起来,以便rst模式可以保持spellchecking以下的谜语?

  • 的reST评论
  • 的reST代码字面
  • 的reST指令参数和变量
  • 的reST原始指令内容

任何想法?

回答

11

您可以将变量ispell-parser设置为值'tex,以便flyspell将忽略(la)tex序列。要做到这一点,你可以手动设置它在每个缓冲区像这样:

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

,或者你写一个小功能,将做到这一点你。把你的.emacs文件如下:

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

那么你仍然可以手动调用它,使用

M-x flyspell-ignore-tex 

或当你编辑的文件,你可以添加自动调用该函数的挂钩某种类型。您可以通过将新定义的功能添加到您的auto-mode-alist来完成后者。假设你的文件名通常以“.rst”结束,那么这行添加到您的.emacs文件:

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

关于你问题的第二部分:制作flyspell模式忽略较大的地区,如,例如,重新评论,是不容易实现的。当你思考flyspell的工作方式时,它会变得很清晰:它逐字检查文本。为此,flyspell-word每次只查看一个单词,并将其发送到在后台运行的ispell进程。 ispell进程执行字典查找并返回当前单词是否正确。如果flyspell-word每次都必须检查当前单词是否是注释或其他不应该被检查的区域的一部分,那么它会非常慢,因为这将包括通过缓冲区的相当多的搜索。

现在当然,可以稍微聪明一些,首先找到非注释区域等,然后仅在那些区域以外的部分逐字检查 - 但不幸的是,这不是蝇类实施的方式。

但是,如果您可以不使用“飞行”部分,但ispell模式具有一种机制来自定义缓冲区的哪些区域可以跳过。这通过变量ispell-skip-region-alist完成。但是,尽管flyspell模式工作在ispell模式下,但出于上述原因,flyspell模式不使用该变量。

+0

托马斯,非常感谢!过去我曾经使用ispell模式,但目前flyspell更适合我。尽管如此,在阅读“ispell-skip-region-alist”文档后,我想我必须编写一个函数来检测评论的结尾。我还不熟悉Emacs Lisp。 无论如何,`ispell-parser`的方式仍然有帮助。也许我可以检查它的使用方式,并尽可能创建我自己的ispell解析器周期。 – manu 2011-01-13 23:22:19

4

您也可以使用flyspell-generic-check-word-predicate,正如我在超级用户in this question中解释的那样。

1

(中的aspell的TEX过滤器可以做的正是你想要的东西 - 但如果你想要一个更通用的解决方案)

虽然我使用下面的代码flyspell劝不标志和编号的某些词语在其中, 你可以使用这种钩子来匹配特定的上下文。

在你想要的位置开始寻找 - 所以你可能想要向后搜索你关心的任何上下文的开始/结束。

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