Можно ли автоматически исправить орфографию «на месте»?

10

Я собирался опубликовать вопрос, но потом увидел его в переполнении стека во время поиска возможностей автокоррекции. На связанный вопрос нет ответов, поэтому я подумал, что на этом сайте будет больше удачи. Вот текст:

Хотелось бы, чтобы был способ, когда я неправильно наберу слово, flyspell может автоматически исправить его до «наиболее вероятного» исправления. Когда я неправильно набираю слово, а затем нажимаю OPTION-TAB, чтобы исправить его, flyspell ALMOST ВСЕГДА выбирает правильное исправление по умолчанию в качестве основного предложения.

Тем не менее, я хочу, чтобы flyspell делал это с каждым ошибочным словом, БЕЗ необходимости нажимать OPTION-TAB. От удара по пробелу и перехода к следующему слову.

Это возможно?

Так что в основном что-то вроде автокоррекции на мобильных телефонах. Такая функция была бы полезна для режимов как jabberи captureвorg-mode


Редактировать :

Я предпочел бы иметь эту функцию в качестве отдельного второстепенного режима, чем перезаписывать функциональность по умолчанию для летающих заклинаний. Он может быть активирован дополнительно или вместо заклинания мухи при необходимости

Tymric
источник
1
Я уверен, что это возможно (и, вероятно, не трудно взломать), но я чувствую себя обязанным сказать, что ИМХО, это было бы очень плохой идеей.
mbork
1
@mbork Было бы плохой идеей изменить работу заклинания мухи, но что плохого в том, чтобы иметь дополнительный второстепенный режим, который можно активировать / деактивировать по требованию?
Тымрик
Меня постоянно раздражает похожая функция на моем телефоне. Мне не нравятся машины, притворяющиеся, что они умнее меня, особенно то, что они не являются ;-): их словарный запас очень ограничен, особенно потому, что я иногда хочу печатать не слова (как некоторые собственные существительные).
mbork
@mbork Правда, но у этого также есть преимущества, например, не нужно беспокоиться о наборе каждого '. Я использую немецкую клавиатуру , и мои мизинцы должны
делить
1
@mbork Чтобы решить проблему «non_words», можем ли мы связываться S-SPCс «оставьте это слово в покое»?
Тымрик

Ответы:

6

Позвольте мне отослать вас к моему посту по этому вопросу .


Я обнаружил, что аббревиатуры - это лучший способ внести исправления SPC, вам нужно только определить те исправления, которые вы хотите. Для этого я использую следующий подход:

  1. Добавьте приведенный ниже код в ваш файл инициализации.
  2. Когда вы печатаете что-то неправильно, нажмите C-x C-iи выберите одно из предложенных исправлений.
  3. Это оно! Там исправление будет автоматически заменено и будет выполняться автоматически каждый раз, когда вы делаете эту ошибку с этого момента.

Вот код

(define-key ctl-x-map "\C-i" 'endless/ispell-word-then-abbrev)

(defun endless/ispell-word-then-abbrev (p)
  "Call `ispell-word'. Then create an abbrev for the correction made.
With prefix P, create local abbrev. Otherwise it will be global."
  (interactive "P")
  (let ((bef (downcase (or (thing-at-point 'word) ""))) aft)
    (call-interactively 'ispell-word)
    (setq aft (downcase (or (thing-at-point 'word) "")))
    (unless (string= aft bef)
      (message "\"%s\" now expands to \"%s\" %sally"
               bef aft (if p "loc" "glob"))
      (define-abbrev
        (if p local-abbrev-table global-abbrev-table)
        bef aft))))

(setq save-abbrevs t)
(setq-default abbrev-mode t)

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

Кроме того, альтернатива (позволяющая ispell выбирать для вас исправление каждый раз, когда слова не существует) чаще всего дает неправильные исправления. Так что лучше в любом случае определить свой собственный. Это даже решает проблему, когда вы действительно хотите печатать не слова.

Malabarba
источник
Я попытался добавить подмену dontв don'tиспользовании , C-x C-i 1но он добавил букву tвместо ( "dont" now expands to "t" globally). Я не думаю, что он хорошо справляется с апострофами. Есть ли решение для этого?
Tymric
@ Тимми Это в режиме программирования? В текстовом режиме это не происходит для меня.
Малабарба
Я попробовал это в разговоре, но после вашего комментария я проверил его в текстовом режиме, и он работал глобально. Спасибо
Tymric
2

Вот простая попытка:

(defun my-flyspell-correct-on-space ()
  (interactive)
  (when flyspell-mode
    (flyspell-auto-correct-word))
  (self-insert-command 1))
(local-set-key " " 'my-flyspell-correct-on-space)

Он ведет себя странно, когда вы вставляете более одного пробела в строке, и иногда он отсекает часть исправляемого слова. Таким образом, этот пост является вики сообщества; не стесняйтесь, чтобы улучшить его.

legoscia
источник
6
Я бы предпочел оставить клавишу пробела в покое, и вместо этого использовать, post-self-insert-hookчтобы отслеживать вставку пробелов и действовать соответственно. Это безопаснее и эффективнее.
lunaryorn
1

Поздний ответ вдохновленный другой вопрос о автозамены и @ ответ legoscia в . Вот быстрый второстепенный режим, который будет автоматически исправляться на лету, используя flyspell. По сути, он «глобальный» в том смысле self-insert-command, что советует , но срабатывает только в включенных буферах flyspell-mode.

(defun flyspell-ac-word (&optional arg)
  "Autocorrect a word when entering a non-word character."
  (when flyspell-mode
    (unless (eq ?w (char-syntax (string-to-char (this-command-keys))))
      (when (or (bobp)
                (eq ?w (char-syntax (char-before))))
        (flyspell-auto-correct-word)))))

(define-minor-mode flyspell-autocorrect-mode
  "Toggle `flyspell-autocorrect-mode'.  Fires flyspell on a
just-completed word.  Only operates when `flyspell-mode' is on."
  :init-value nil
  :lighter (" AC")
  (if flyspell-autocorrect-mode
      (progn 
        (require 'flyspell)
        (advice-add #'self-insert-command :before #'flyspell-ac-word))
    (advice-remove #'self-insert-command #'flyspell-ac-word)))
Дэн
источник