내가 입력 할 때 이중 목마 고정


23

나는 약간 핑키가 조금 있습니다. 입력 할 때 다른 손가락이 더 빨라지고 빨라지면서 핑키는 계속 유지할 수 없습니다. 이것은 종종 첫 단어가 두 개의 대문자로 시작하는 문장을 입력하게합니다. 다음은 간단한 예입니다.

THere's nothing in there. DEfinitely not a body.

일반적으로 내가하는 일은 타격을 M-b M-c입히는 것입니다 (즉시 발견한다고 가정).하지만 조금 피곤합니다.

Emacs가이 문제를 자동으로 해결하도록하려면 어떻게해야합니까?

즉, 두 개의 대문자로 시작하고 그 뒤에 하나 이상의 소문자가 나오는 단어를 입력하면 자동으로 수정되도록 Emacs가 원합니다.

답변:


19

다음은 DOuble CApitals를 단일 자본으로 변환하는 함수입니다. 원래에 추가하는 것이 post-self-insert-hook좋았지 만 아래는 영광스러운 마이너 모드의 옵션이므로 원하는 경우에만 후크에 추가 할 수 있습니다.

(defun dcaps-to-scaps ()
  "Convert word in DOuble CApitals to Single Capitals."
  (interactive)
  (and (= ?w (char-syntax (char-before)))
       (save-excursion
         (and (if (called-interactively-p)
                  (skip-syntax-backward "w")
                (= -3 (skip-syntax-backward "w")))
              (let (case-fold-search)
                (looking-at "\\b[[:upper:]]\\{2\\}[[:lower:]]"))
              (capitalize-word 1)))))

(add-hook 'post-self-insert-hook #'dcaps-to-scaps nil 'local)

그리고 부 모드 정의 :

(define-minor-mode dubcaps-mode
  "Toggle `dubcaps-mode'.  Converts words in DOuble CApitals to
Single Capitals as you type."
  :init-value nil
  :lighter (" DC")
  (if dubcaps-mode
      (add-hook 'post-self-insert-hook #'dcaps-to-scaps nil 'local)
    (remove-hook 'post-self-insert-hook #'dcaps-to-scaps 'local)))

이 버전을 사용하여 가치있는 것을 위해 :

  • 간단합니다 : 수동 또는 모드 훅에서 전원을 켜거나 끄는 것입니다.
  • 키 바인딩을 변경할 필요가 없으므로 다른 기능을 잃지 않습니다.

에 추가해도 post-self-insert-hook최소한 간단한 벤치마킹에 따르면 오버 헤드가 거의 존재하지 않습니다. 내 컴퓨터에는 다음과 같이 간단하고 간단한 형태와 dcaps-to-scaps기능을 각각 10,000 회 반복하여 얻을 수 있습니다.

(benchmark-run-compiled 10000 (+ 1 1))          ; => .001 to .003 -ish
(benchmark-run-compiled 10000 (dcaps-to-scaps)) ; => .003 to .006 -ish

예, 1 + 1을 추가하는 것보다 느리지 만 절대적으로는 눈치 채지 못할 것입니다.


당신은 사용할 수 있습니다 looking-at-p(당신이 필요로하지 않기 때문에 괜찮아요 그 또는 여기에 사용) 모두에 일치하는 데이터를 설정하지 않는다.
YoungFrog

몇 가지 더 말은, (나는 공헌 할 수 있도록하지만 난 당신의 대답을 선호; p)를 주로 중요 :의 사용은 forward-word잘 작동하지 않습니다 subword-mode사용, (char-syntax (char-before))(내 생각) 구문 클래스 속성 세트를 무시합니다 (대체 솔루션을 : (syntax-after (1- (point))) , 그리고 (마지막은 아니지만) 정규 표현식은 악센트 부호 문자를 찾을 수 없습니다 (예 : "ÉMincer", 프랑스어)
YoungFrog

@YoungFrog :이 forward-word문제를 해결 하기 위해 업데이트되었으며 , 강조된 대문자를 처리하도록 정규 표현식을 변경했습니다.
Dan

특히 첫 번째 경우 and보다 선호하는 이유가 when있습니까?
Clément

@ Clément : and는 단락되어 있으므로 논리는 when여기 처럼 작동 합니다. 하나를 사용하는 방법과 다른 방법을 사용하는 방법에 대한 모범 사례가 있는지 확실하지 않지만이 사이트에서 좋은 질문을하는 것처럼 보입니다 (어쨌든 upvote했습니다).
Dan

8

내가 선호하는 것은 단순히 평소 보다 더 많은 일을하는 새로운 기능을 만드는 self-insert-command것이다 .

몇 가지 이유는 다음과 같습니다.

  • 이 자동 수정 기능을 갖추어야하는 주요 모드를보다 세밀하게 제어 할 수 있습니다. 이 사용 사례의 경우, 수 같은 텍스트 전용 모드 org-mode, text-mode
  • 교정의 종류가 문제의 요구를 들어, 사용자는 일반적으로 히트 것 SPC또는 RET.단어 후 키를 누릅니다. 따라서 비슷한 것을 사용 post-self-insert-hook하는 것은 과도한 일이 될 수 있으며 키를 누를 때마다 추가 처리를 수행합니다.

따라서 아래 제안 된 솔루션은 SPC키를 사용 하여이 기능을 바인딩합니다 org-mode-map(단어의 마지막 단어가 될 수있는 코너 경우는 무시). 필요한 경우 사용자는 유사한 랩퍼 기능을 더 많은 키에 바인딩 할 수 있습니다.

(defun space-plus-more ()
  (interactive)
  (save-excursion
    (backward-word 1)
    (let ((case-fold-search))
      (when (looking-at-p "[A-Z]\\{2\\}.*?[a-z]+.*?\\b")
        (capitalize-word 1))))
  (self-insert-command 1))

(define-key org-mode-map (kbd "<SPC>") #'space-plus-more)

이것은 재미있는 elisp 운동입니다 :)

나는 개인적으로 이것을 바인딩하고 싶지 않다면 RET기본 바인딩 org-mode과 다른 주요 모드에서도 잃어 버릴 것입니다. 그러나에 대한 자세한 내용은 흥미로웠다 elt하고 this-command-keys-vector.

(defun my/fix-double-caps ()
  (interactive)
  (save-excursion
    (backward-word 1)
    (let ((case-fold-search))
      (when (looking-at-p "[A-Z]\\{2\\}.*?[a-z]+.*?\\b")
        (capitalize-word 1))))
  (if (eq 13 (elt (this-command-keys-vector) 0)) ; detect RET
      (newline)
    (self-insert-command 1)))

(let ((maps-list (list org-mode-map
                       text-mode-map))
      (keys-list (list "<SPC>" "<RET>" ".")))
  (dolist (map maps-list)
    (dolist (key keys-list)
      (define-key map (kbd key) #'my/fix-double-caps))))

예, 텍스트 파생 모드로 제한하는 것이 좋습니다. :)
Malabarba

@Malabarba prog-mode에서 파생 된 모드의 문자열에서이 동작을 원하지 않습니까?
YoungFrog

@YoungFrog 확실하지만 실제로 문자열 안에 있는지 확인해야합니다. 그렇지 않으면 방해가됩니다.
Malabarba

0

어쩌면이 대답은 당신이 기대하는 해결책을 제공하지 않을 수도 있습니다 (입력하는 단어의 대화 형 수정), 나는 그러한 문제에 맞서 싸우는 방법을 공유하고 싶습니다.

우선, 나는 내 텍스트를 자동으로 바꾸는 것 (대문자 등)을 좋아하지 않는다 IBuffer.

먼저 "Sticky Keys"기능을 활성화하십시오. 처음에는 이상하게 보일 수 있지만 항상 사용합니다. 이 기능은 OS / 데스크톱 환경 수준에서 사용할 수 있으며 Emacs 기능은 아닙니다. 이 기능이 활성화되면 먼저을 누른 ⇧ Shift다음 대문자로 바꾸려는 다른 키를 누릅니다. 이런 식으로 문제가 발생할 수 없으며이 순차적 접근 방식에서는 한 글자 만 대문자로 표시됩니다! 또한 손으로 ⇧ Shift키를 잡는 데 필요한 작업이 줄어 듭니다 . 타이핑하기가 더 쉽다고 생각합니다.

둘째, 이제는 ⇧ Shift필요할 때 키를 정상적으로 사용할 수 있지만 ( Fix Word) Emacs 패키지를 제안하고 싶습니다 . "스티키 키"가 마음에 들지 않더라도 단어를 올바른 형태로 쉽게 수정할 수 있으며 커서를 쓸데없이 움직이지 않고도 여러 단어를 한 줄에 수정할 수 있습니다. 시도해보십시오. 항상 사용합니다. (여러 단어를 입력했는데 대문자를 사용해야하는 단어가 중간에 있으면 문제를 해결하기가 여전히 어렵습니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.