Как заставить Flyspell обходить некоторые слова по контексту?

StackOverflow https://stackoverflow.com/questions/4671908

  •  10-10-2019
  •  | 
  •  

Вопрос

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

Как я могу сказать Flyspell не проверять вещи внутри \cite команды

Кроме того, как я могу объединить RST-Mode и Flyspell, чтобы RST-режим не позволял Flyspell от Spellckecking следующее?

  • Отдых комментарии
  • Код отдыха букваль
  • Параметры и аргументы Distictive REST
  • REST RAW Directive Contents

Любые идеи?

Это было полезно?

Решение

Вы можете установить переменную 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 Пришлось каждый раз проверять, является ли текущее слово частью комментария или другого региона, который не следует проверять, оно было бы довольно медленным, потому что это включало бы немало поиска через буфер.

Теперь, конечно, можно приблизиться к этому немного умнее и сначала найти регионы без учета и т. Д., А затем сделать слово, проверяя только в тех частях, которые находятся за пределами этих регионов, но, к сожалению, это не так Flyspell реализован.

Однако, если вы можете обойтись без «мухи», у Ispell-Mode есть механизм для настройки, какие области буфера могут быть пропущены. Это делается через переменную ispell-skip-region-alist. Анкет Но хотя режим FlySpell работает от режима ISPELL, по причинам, изложенным выше, эта переменная не используется режимом FlySpell.

Другие советы

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

(Фильтр Tex's 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top