如何通过上下文使flyspell绕过一些单词?

时间:2011-01-12 17:31:55

标签: emacs emacs23 flyspell

我用Emacs写了我的大部分着作。我使用reStructuredText编写,然后经过一些预处理后将它们转换为LaTeX,因为我写了引用á-la LaTeX。这是我的一篇文章的摘录(西班牙文):

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

此文字由一些处理\cite部分的自定义脚本处理,因此rst2latex可以完成其工作。

当我激活flyspell-mode时,它会将大多数引文键指示为拼写错误。

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

此外,我如何将rst-mode和flyspell结合起来,这样rst-mode才能保持flyspell免于拼写检查?

  • reST评论
  • reST code literal
  • reST指令参数和参数
  • reST raw指令内容

有什么想法吗?

3 个答案:

答案 0 :(得分: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模式忽略更大的区域,例如reST评论,是不容易实现的。当您考虑flyspell的工作方式时,它就会变得清晰:它会逐字逐句地检查文本。为此,flyspell-word一次只查看一个单词,并将其发送到后台运行的ispell进程。 ispell进程执行字典查找并返回当前单词是否正确。如果flyspell-word必须每次都检查当前单词是否是评论或其他不应该检查的区域的一部分,那么它会相当慢,因为这将包括相当多的搜索缓冲区

现在当然,人们可以稍微聪明一点,首先找到非评论区域等,然后只在那些区域之外的那些部分进行逐字检查 - 但不幸的是,这是而不是flyspell的实现方式。

但是,如果没有“fly”部分,则ispell-mode有一种机制来自定义可以跳过缓冲区的哪些区域。这是通过变量ispell-skip-region-alist完成的。但是,尽管flyspell模式在ispell模式下工作,但由于上面提到的原因,flyspell模式不使用变量。

答案 1 :(得分:4)

您也可以使用flyspell-generic-check-word-predicate,因为我在超级用户处解释了in this question

答案 2 :(得分: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)