Чи можна автоматично виправити написання "на пробіл"?


10

Я збирався опублікувати питання, але тоді я побачив його на Stack Overflow , шукаючи можливості автоматичного виправлення. На пов'язане запитання немає відповідей, тому я подумав, що на цьому сайті буде більше удачі. Ось текст:

Я хотів би, щоб був спосіб, щоб, коли я вводив помилку в слово, flyspell міг автокоригувати його на "найімовірніше" виправлення. Коли я ввожу помилкове слово, а потім натискаю кнопку OPTION-TAB, щоб його виправити, flyspell ЗАВЖДИ ВИНАГА вибирає правильну корекцію за замовчуванням як основну пропозицію.

Тим не менш, я хочу, щоб це робив заклинання з кожним словом, яке я вводячи в аркуші, БЕЗ того, що мені потрібно вдарити OPTION-TAB. Тільки від натискання на панель SPACE та переходу до наступного слова.

Чи можливо це?

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


Редагувати :

Я вважаю за краще, щоб ця функція була окремим другорядним режимом, ніж перезаписування функціональних функцій "муха-правопис" Він може бути активований додатково або замість цього, коли потрібно


1
Я впевнений, що це можливо (і, мабуть, не важко зламати), але я відчуваю обов'язок сказати, що ІМХО це було б дуже поганою ідеєю.
mbork

1
@mbork Неправильно було б змінити, як працює заклинання, але що поганого в тому, щоб мати додатковий другорядний режим, який можна активувати / деактивувати на вимогу?
Тимрік

Мене постійно дратує подібна функція на моєму телефоні. Мені не подобаються машини, які роблять вигляд, що вони розумніші за мене, тим більше, що вони не є ;-): словниковий запас дуже обмежений, тим більше, що я іноді хочу вводити не слова (як деякі власні іменники).
mbork

@mbork Правда, але вона також має свої переваги, як не турбуватися про введення кожного '. Я використовую німецьку клавіатуру , і мої горішки повинні робити
розбивки

1
@mbork Щоб вирішити проблему "non_words", чи можемо ми пов'язувати S-SPC"залишити-що-слово-в поодинці"?
Тимрік

Відповіді:


6

Дозвольте передати вам свою публікацію з цього приводу .


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

  1. Додайте код нижче у свій файл init.
  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 обирати виправлення для вас кожного разу, коли слово не існує) буде отримувати неправильні виправлення частіше, ніж ні. Тож краще все-таки визначити своє. Він навіть вирішує проблему, коли ви насправді хочете вводити не слова.


Я спробував додати заміну dontна don'tвикористання, C-x C-i 1але він додав букву tзамість ( "dont" now expands to "t" globally). Я не думаю, що це добре справляється з апострофами. Чи є виправлення на це?
Тимрік

@Timmy Це в режимі програмування? У текстовому режимі цього не відбувається для мене.
Малабарба

Я спробував це в розмові на жабі, але після Вашого коментаря я перевірив його в текстовому режимі, і він працював у всьому світі. Дякую
Тимрик

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)

Він поводиться дивно, коли ви вставляєте більше одного пробілу в ряд, а іноді він розщеплює частину виправленого слова. Таким чином, ця публікація є вікі спільноти; сміливо вдосконалюйте це.


6
Я б краще залишити клавішу пробілу в спокої, а замість цього використати post-self-insert-hookдля відстеження вставки пробілів і відповідно до цього. Це безпечніше та ефективніше.
місячник

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)))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.