Flyspell을 사용하여 이전 단어를 효율적으로 수정하는 방법은 무엇입니까?


18

Flyspell을 사용하기 시작한 순간부터 항상 사용하기가 어려웠습니다. 나는 맞춤법이 틀린 단어에 대해 전체 버퍼를 거의 확인하지 않습니다. 일반적으로 입력하고 밑줄이 그어진 단어가 표시되면 즉시 수정하고 계속 입력하고 싶습니다. 이것은 나중에 단어를 수정하는 것을 잊어 버릴까 두려워하기 때문에 버퍼의 포괄적 인 검사를 시작할 때 iSpell이 너무 많은 오 탐지를 제공하기 때문입니다. 따라서 입력하는 동안 거의 항상 단어를 최대한 빨리 수정합니다.

다음은 내가 알고있는 내장 함수와 왜 효율적이지 않은 이유입니다.

  • flyspell-correct-word— 마우스 클릭에 구속됩니다. 잊어 버려, 나는 마우스를 사용하지 않을 것이다.

  • flyspell-correct-word-before-point— 한동안 사용했습니다. 두 가지 단점이 있습니다.

    1. 기본적으로 마우스없이 작동하기 어려운 GUI 메뉴가 표시되며 10 개가 넘는 항목의 수정 목록이 있으면 정말 번거 롭습니다.

    2. 그것은 단어를 작동하지 않습니다 지점 전에. 나는 빨리 입력하고 철자가 틀린 단어를 발견하면 일반적으로 철자가 틀린 단어와 점 사이에 하나 또는 두 개의 단어가 있습니다. 나는 포인트를 이동하고 올바른 단어를 다시 돌려야합니다. 오.

  • flyspell-auto-correct-word — 포인트 2 ↑를 참조하십시오. 사이클링으로 인해 완료 목록이 길면 제대로 작동하지 않습니다.

Q : 키보드를 사용하여 사이클링없이 완성 목록에서 선택할 수 있고 훨씬 더 먼 단어를 수정하는 기능을 통해 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 개의 수정 제안이 표시됩니다!
Mark Karpov

3
ttwotwo첫 번째 시도에서 자동 수정되었습니다 . 하지만 무슨 말인지 알아 실제 경험에서, 사례의 약 90 %에서 첫 번째 시도는 올바른 단어를 얻습니다. 아마도 나머지 9 %는 2-3 시도를 요구하고 마지막 1 %는 플라이 스펠이 이해하지 못하고 나가야 할 때입니다. 5 번 이상의 시도 (또는 수동으로 수정).
Kaushal Modi

귀하의 방법에는 고유 한 이점이 있습니다 (단순성). 어쨌든 나는 그것을 전환 할 것입니다.
Mark Karpov

2
매우 좋았습니다. 이것은 내가 찾은 것으로 예상되었으며 기본 키를 다른 것에 바인딩했기 때문에 놓쳤습니다. 이것은 C-;기본적 flyspell-auto-correct-binding으로 바인딩되어 있으며, 맞춤법 맵의 다른 키에 바인딩하도록 사용자 지정할 수 있습니다 . (또는 그냥 정상적인 방법으로 묶으십시오.)
glucas

6

나는 다른 사람들이 미래 독자들에게 유용한 다른 솔루션을 생각 해낼 것이라고 확신합니다. 그러나 여기에 내가 현재 처리하는 방법이 있습니다.

flyspell-correct-word-before-point적어도 키를 눌러 호출 할 수 있고 가능한 수정 메뉴가 표시되기 때문에 시작하기에 좋은 장소 라고 생각 합니다. 메뉴를 수정하기 위해 Avy 를 백엔드로 사용하는 Ace Aceup Menu 패키지를 작성했습니다 . 이것은 사용하는 GUI 팝업 메뉴 (함수라고 함 )를 레이블이 지정된 메뉴 항목을 표시하는 텍스트 팝업 메뉴 (하나 또는 두 개의 키 입력)로 대체합니다 .flyspell-correct-word-before-pointx-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

Helm-flyspell 을 사용하면 수정 목록에서 효율적으로 선택할 수 있습니다. 다음 코드를 사용하여 오류로 이동하여 오류를 수정합니다. 포인트의 위치를 ​​저장하여 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"))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.