Как заставить flyspell обойти некоторые слова по контексту? - PullRequest
9 голосов
/ 12 января 2011

Я использую Emacs для написания большинства моих работ. Я пишу с использованием reStructuredText, а затем преобразую их в LaTeX после некоторой предварительной обработки, так как я пишу свои цитаты в стиле 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, он сигнализирует большинство клавиш цитирования как ошибки правописания.

Как я могу сказать flyspell не проверять правописание в командах \cite.

Кроме того, как я могу совместить rst-mode и flyspell, чтобы rst-mode не позволял flyspell проверять орфографию в следующих случаях?

  • reST комментарии
  • код reST-литерала
  • Параметры и аргументы reST
  • reST необработанное содержание директивы

Есть идеи?

Ответы [ 3 ]

11 голосов
/ 13 января 2011

Вы можете установить переменную ispell-parser на значение 'tex, чтобы flyspell игнорировал (la) текс-последовательности.Для этого вы можете установить его вручную в каждом буфере следующим образом:

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.

4 голосов
/ 12 октября 2011

Вы также можете использовать flyspell-generic-check-word-predicate, как я объяснил в этом вопросе в Super User.

1 голос
/ 19 июня 2014

(tex-фильтр aspell может делать именно то, что вы хотите - но если вам нужно более общее решение)

Хотя я использую приведенный ниже код, чтобы убедить 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)
...