Як використовувати Flyspell для ефективного виправлення попереднього слова?


18

З моменту, коли я почав використовувати Flyspell, використовувати його завжди було боляче. Я рідко перевіряю цілий буфер на наявність неправильно написаних слів, зазвичай я набираю текст, і коли я бачу підкреслене слово, я хочу його негайно виправити і продовжую вводити текст. Це просто тому, що я боюся забути виправити слово пізніше і тому, що коли я починаю всебічну перевірку буфера, iSpell дає занадто багато помилкових позитивних результатів. Отже, майже завжди я виправляю слова якомога швидше, поки я набираю текст.

Ось вбудовані функції, про які я знаю, та причини, чому вони не ефективні (для мене):

  • flyspell-correct-word- Це пов'язано з клацанням миші. Забудь про це, я не збираюся використовувати мишку.

  • flyspell-correct-word-before-point- Я користувався цим деякий час. У нього два мінуси:

    1. За замовчуванням він показує меню GUI, яке важко керувати без миші, і воно справді громіздке, коли у вас є список виправлень з більш ніж 10 пунктами.

    2. Це не працює за слово задовго до точки. Я набираю швидкий текст, і коли я помічаю неправильно написане слово, у мене зазвичай є одне або два слова між неправильно написаним словом та крапкою. Мені потрібно перемістити точку, виправити слово, повернутися назад. Ой.

  • flyspell-auto-correct-word - Див. Пункт 2 ↑ плюс він не працює добре, коли у вас довгий список завершених робіт (через їзду на велосипеді).

Питання: Як я можу ефективно використовувати Flyspell за допомогою клавіатури, маючи можливість вибирати зі списку доповнень без їзди на велосипеді та вміти виправляти навіть більш-менш віддалені слова?

Прийнятні відповіді включають пакети, які допомагають перейти до попереднього неправильно написаного слова, виправити його та повернутись назад чи щось подібне, а також невеликі фрагменти, можливо, з вашого власного файлу конфігурації, оскільки я вважаю, що інші люди з’ясували свої способи ефективної взаємодії з Flyspell.

Відповіді:


14

Вбудований flyspell-auto-correct-previous-wordпрацює як шарм для мене. Я зв'язав це, F12і я не оглянувся. Це послідовно правильно слова для мене, незалежно від того, скільки слів назад було неправильне слово.

З функціональної документації:

flyspell-auto-correct-previous-word is an interactive compiled Lisp
function in `flyspell.el'.

(flyspell-auto-correct-previous-word POSITION)

For more information check the manuals.

Auto correct the first misspelled word that occurs before point.
But don't look beyond what's visible on the screen.

Крім того, якщо перший раз автокорекція не дала вам потрібного слова, продовжуйте натискати на прив’язану клавішу ( F12в моєму випадку), щоб перейти до всіх варіантів.

[Моя конфігурація перевірки орфографії]


1
Я бачу, вам все одно потрібно пройти цикл, хоча всі можливі виправлення. Спробуйте, ttwoнаприклад, хоча в моєму меню я бачу 26 запропонованих виправлень!
Марк Карпов

3
ttwoавтоматично виправлено twoв першій спробі. Але я знаю, що ти маєш на увазі. З практичного досвіду, приблизно в 90% випадків перша спроба отримує правильне слово, ймовірно, для інших 9% потрібно 2-3 спроби, і останній 1% - це коли flyspell просто не зрозуміє, і мені потрібно піти через 5+ спроб (або я вручну це виправляю).
Каушал Моді

Я бачу, у вашого методу є свої переваги (простота). Можливо, я перейду на це все-таки.
Марк Карпов

2
Дуже приємно - це те, що я очікував знайти, і пропустив це, бо я прив’язував ключ за замовчуванням до чогось іншого. Це C-;за замовчуванням, і ви можете налаштувати його, flyspell-auto-correct-bindingщоб прив'язати його до іншого ключа на карті мухоспеціалізації. (Або просто пов'язуйте це звичайним чином, звичайно.)
glucas

6

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

Я думаю flyspell-correct-word-before-point, що це гарне місце для початку, тому що принаймні його можна викликати натисканням клавіші, і воно відображає меню можливих виправлень. Щоб виправити меню, я написав пакунок Ace Popup Menu, який використовує Avy як бекенд. Це замінює спливаюче меню GUI, яке flyspell-correct-word-before-pointвикористовує (функція називається x-popup-menu) текстовим спливаючим меню, яке містить мічені пункти меню: один або два обведення клавіш, і ви закінчили.

Для вирішення другої проблеми (неможливість виправити слова "на відстані") я написав цього помічника:

(defun flyspell-correct-previous (&optional words)
  "Correct word before point, reach distant words.

WORDS words at maximum are traversed backward until misspelled
word is found.  If it's not found, give up.  If argument WORDS is
not specified, traverse 12 words by default.

Return T if misspelled word is found and NIL otherwise.  Never
move point."
  (interactive "P")
  (let* ((Δ (- (point-max) (point)))
         (counter (string-to-number (or words "12")))
         (result
          (catch 'result
            (while (>= counter 0)
              (when (cl-some #'flyspell-overlay-p
                             (overlays-at (point)))
                (flyspell-correct-word-before-point)
                (throw 'result t))
              (backward-word 1)
              (setq counter (1- counter))
              nil))))
    (goto-char (- (point-max) Δ))
    result))

Це, здається, працює.


5

З кермом-мухоловкою ви можете ефективно вибирати зі списку виправлень. Я використовую наступний код, щоб перейти до помилок і виправити їх за допомогою цього, він зберігає положення точки до того, mark-ringщоб ви могли перейти назад до позиції, де ви почали або виправили слова раніше:

(defun flyspell-goto-previous-error (arg)
  "Go to arg previous spelling error."
  (interactive "p")
  (while (not (= 0 arg))
    (let ((pos (point))
          (min (point-min)))
      (if (and (eq (current-buffer) flyspell-old-buffer-error)
               (eq pos flyspell-old-pos-error))
          (progn
            (if (= flyspell-old-pos-error min)
                ;; goto beginning of buffer
                (progn
                  (message "Restarting from end of buffer")
                  (goto-char (point-max)))
              (backward-word 1))
            (setq pos (point))))
      ;; seek the next error
      (while (and (> pos min)
                  (let ((ovs (overlays-at pos))
                        (r '()))
                    (while (and (not r) (consp ovs))
                      (if (flyspell-overlay-p (car ovs))
                          (setq r t)
                        (setq ovs (cdr ovs))))
                    (not r)))
        (backward-word 1)
        (setq pos (point)))
      ;; save the current location for next invocation
      (setq arg (1- arg))
      (setq flyspell-old-pos-error pos)
      (setq flyspell-old-buffer-error (current-buffer))
      (goto-char pos)
      (if (= pos min)
          (progn
            (message "No more miss-spelled word!")
            (setq arg 0))))))


(defun check-previous-spelling-error ()
  "Jump to previous spelling error and correct it"
  (interactive)
  (push-mark-no-activate)
  (flyspell-goto-previous-error 1)
  (call-interactively 'helm-flyspell-correct))

(defun check-next-spelling-error ()
  "Jump to next spelling error and correct it"
  (interactive)
  (push-mark-no-activate)
  (flyspell-goto-next-error)
  (call-interactively 'helm-flyspell-correct))

(defun push-mark-no-activate ()
  "Pushes `point' to `mark-ring' and does not activate the region
 Equivalent to \\[set-mark-command] when \\[transient-mark-mode] is disabled"
  (interactive)
  (push-mark (point) t nil)
  (message "Pushed mark to ring"))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.