Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs 如何让flyspell通过上下文绕过一些单词?_Emacs_Emacs23_Flyspell - Fatal编程技术网

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

Emacs 如何让flyspell通过上下文绕过一些单词?,emacs,emacs23,flyspell,Emacs,Emacs23,Flyspell,我用Emacs来写我的大部分作品。我使用StructuredText编写,然后在一些预处理之后将它们转换为LaTeX,因为我编写了引文-LaTeX。这是我的一篇文章的摘录(西班牙语): 此文本由一些处理\cite部分的自定义脚本处理,因此rst2latex可以完成其工作 当我激活flyspell模式时,它会将大多数引用键标记为拼写错误 如何告诉flyspell不要在\cite命令中检查拼写 此外,我如何结合rst模式和flyspell,使rst模式可以防止flyspell检查以下拼写 其余评论

我用Emacs来写我的大部分作品。我使用StructuredText编写,然后在一些预处理之后将它们转换为LaTeX,因为我编写了引文-LaTeX。这是我的一篇文章的摘录(西班牙语):

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

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

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

此外,我如何结合rst模式和flyspell,使rst模式可以防止flyspell检查以下拼写

  • 其余评论
  • reST代码文字
  • reST指令参数和参数
  • reST原始指令内容

有什么想法吗?

您可以将变量
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))
(add-to-list 'auto-mode-alist '("\\.rst$" . flyspell-ignore-tex))
然后您仍然可以使用

M-x flyspell-ignore-tex
或者,您可以添加一个钩子,每当您编辑特定类型的文件时,该钩子会自动调用该函数。您可以通过将新定义的函数添加到您的
自动模式列表
来实现后者。说文件名通常以“.rst”结尾,然后将这一行添加到.emacs文件中:

(defun flyspell-ignore-tex ()
  (interactive)
  (set (make-variable-buffer-local 'ispell-parser) 'tex))
(add-to-list 'auto-mode-alist '("\\.rst$" . flyspell-ignore-tex))
至于问题的第二部分:让flyspell模式忽略较大的区域,例如reST注释,是不容易实现的。当你想到flyspell的工作方式时,你就会明白:它会逐字检查文本。为此,
flyspell word
一次只查看一个单词,并将其发送到后台运行的ispell进程。ispell进程执行字典查找并返回当前单词是否正确。如果每次都必须检查当前单词是否属于不应检查的注释或其他区域,则速度会相当慢,因为这将包括相当多的缓冲区搜索

当然,我们可以更聪明地处理这个问题,首先找到非注释区域等,然后只在这些区域之外的部分进行逐字检查——但不幸的是,这不是flyspell的实现方式


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

正如我在Super User上所解释的那样,您也可以使用
flyspell通用检查词谓词。

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

托马斯,非常感谢!我过去使用过ispell模式,但现在flyspell更适合我。然而,在阅读了
ispell skip region alist
doc之后,我想我必须编写一个函数来检测注释的结尾。我还不太熟悉Emacs Lisp。无论如何,
ispell解析器
方法仍然是有用的。也许我可以检查它是如何使用的,并在可能的时候创建我自己的ispell解析器tweek。Manu,您可能不必编写lisp函数来检测注释的开头和结尾。通常一个正则表达式就足够了,一个匹配开头,一个匹配结尾。你把它们都放在括号里,并将其添加到
ispell skip region列表中
(我昨天试过了,其实没那么难)很有可能,
rst模式
已经包含了您在某处寻找的regexp。在StructuredText中,缩进级别降低时会检测到代码部分的结尾。所以regexp不会有帮助。致以最良好的问候,Manu。尽管它可能会有所帮助。如果我使用
aspell
而不是(
(setq ispell程序名“aspell”)
),我该怎么办@托马斯