키 시퀀스가 ​​실제로 수행하는 작업을 찾는 방법


14

때때로 텍스트를 편집 할 때 예기치 않은 동작이 관찰됩니다. 내 첫 번째 수단은 일반적으로 C-h k주어진 키 시퀀스에 의해 호출되는 함수를 찾는 데 사용 하는 것입니다. 그러나 때때로 문서가 관찰 된 동작과 상충되는 경우가 있습니다. 이 경우 일반적으로 다른 패키지가 해당 기능이나 키 시퀀스에 연결되어 동작을 수정한다고 가정합니다.

키 시퀀스에 어떤 기능이 연결되어 있는지 어떻게 알 수 있습니까?

최근에 발생한 한 가지 예는 "키를 눌렀고 따옴표가 활성 영역의 시작과 끝에 삽입되었다는 것입니다. 이것이 기본 Emacs 동작이 아니라는 의혹이 있었으므로 C-h k "실제로 어떤 함수가 호출되는지 알아 내었습니다.

describe-key문서는 기능이 있다고 나에게 말했다 self-insert-command내장 함수가 호출되고 있었다. 약간의 시행 착오 후에 긴 이야기를 짧게하기 위해, 나는 그 행동이에 기인 한 것으로 판단 할 수있었습니다 electric-pair-mode. 미래에는 범인을 찾을 때까지 의심스러운 패키지를 한 번에 하나씩 끄는 것보다이 결론에 도달하는 더 빠른 방법이 있습니까?


electric-pair-mode일부 주요 모드에서만 활성화 되었을 수 있습니까? 당신은 여전히 보는가 self-insert-command을 위해 "당신이 할 때 C-h k동안 electric-pair-mode활성화?
Kaushal Modi

@ kaushalmodi : 키 바인딩을 변경하지 않고에 electric-pair-mode연결하여 작동합니다 post-self-insert-hook.
nispio

C-h k키를 누르는 과정을 정확히 알려줍니다. 에 대한 설명서를 보면 명령이 완료된 후 실행 self-insert-command된다는 것이 매우 명확 post-self-insert-hook합니다.
shosti

@ shosti :이 간단한 예에서 그렇습니다. 그러나 확장 after-change-functions이 Jordon이 그의 답변에서 언급 한 것처럼 사용한다면 어떻게 될까요? 함수에 대한 문서는 아마도 그 후크를 구체적으로 언급하지 않을 것입니다.
nispio

죄송합니다. 좀 더 구체적으로 말씀하셨습니다. C-h k+ 표준 후크 == 완전한 동작 (더 많거나 적음). 물론 때때로 그것은 많은 가능성을 남기지 만, 내가 아는 다른 복잡한 소프트웨어 시스템보다 훨씬 더 투명합니다.
shosti

답변:


13

한 번의 키 누름으로 정확히 무엇을 알 수있는 쉬운 방법은 없습니다.

추가 동작이 보이면 항상 공통 후크를 확인하십시오. 여기 목록을 참조하십시오 : http://www.gnu.org/software/emacs/manual/html_node/elisp/Standard-Hooks.html

대부분의 경우 중요한 것은 다음과 같습니다.

  • 변경 후 기능
  • 변경 전 기능
  • 첫 번째 변경 후크
  • 사후 명령 후크
  • 사전 명령 후크
  • 포스트-자체 삽입 후크

이러한 후크를 검사하고 포함 된 기능을 조사하여 동작을 수정하는 후크를 확인해야합니다.

이러한 후크의 기능이 관찰 된 동작을 완전히 설명하지 않은 경우의 설명서에 나와있는 조언에 대한 기능을 확인하십시오 describe-function.


편집 : 나는 기능 하나 하나를 통해가는 것보다 후크 더 도움이되는 몇 가지 기능을 설명 작성한 https://gist.github.com/jordonbiondo/bad03e44bb053db0f1eb를 사용할 수있는 describe-hook다른 기능을 설명처럼이 정의. 다음은 출력 샘플입니다.

요점이 사라지는 경우를 대비하여 모든 코드가 있습니다.

(defun guess-all-hooks ()
  "Return a list of all variables that are probably hook lists."
  (let ((syms '()))
    (mapatoms
     (lambda (sym)
       (if (ignore-errors (symbol-value sym))
           (let ((name (symbol-name sym)))
             (when (string-match "-\\(hook[s]?\\|functions\\)$" name)
               (push sym syms))))))
    syms))

(defun face-it (str face)
  "Apply FACE to STR and return."
  (propertize str 'face face))

(defun describe-hook (hook)
  "Display documentation about a hook variable and the
functions it contains."
  (interactive
   (list (completing-read
          "Hook: " (mapcar (lambda (x) (cons x nil)) (guess-all-hooks)))))
  (let* ((sym (intern hook))
         (sym-doc (documentation-property sym 'variable-documentation))
         (hook-docs (mapcar
                     (lambda (func)
                       (cons func (ignore-errors (documentation func))))
                     (symbol-value sym))))
    (switch-to-buffer
     (with-current-buffer (get-buffer-create "*describe-hook*")
       (let ((inhibit-read-only t))
         (delete-region (point-min) (point-max))
         (insert (face-it "Hook: " 'font-lock-constant-face) "\n\n")
         (insert (face-it (concat "`" hook "'") 'font-lock-variable-name-face))
         (replace-string "\n" "\n\t" nil
                         (point)
                         (save-excursion
                           (insert "\n" sym-doc "\n\n")
                           (1- (point))))
         (goto-char (point-max))
         (insert (face-it "Hook Functions: " 'font-lock-constant-face) "\n\n")
         (dolist (hd hook-docs)
           (insert (face-it (concat "`" (symbol-name (car hd)) "'")
                            'font-lock-function-name-face)
                   ": \n\t")
           (replace-string "\n" "\n\t" nil
                           (point)
                           (save-excursion
                             (insert (or (cdr hd) "No Documentation") "\n\n")
                             (1- (point))))
           (goto-char (point-max))))
       (help-mode)
       (help-make-xrefs)
       (read-only-mode t)
       (setq truncate-lines nil)
       (current-buffer)))))

이것은 기능이 권고 될 때 문서가 자동으로 업데이트되어 변경 사항을 반영한다는 의미입니까?
nispio

실제 속성이 업데이트되는지는 모르지만 반환 된 값 documentation은 업데이트됩니다.
Jordon Biondo

1
@nispio 네, 그렇습니다.
Malabarba

1
gist.github.com/jordonbiondo/bad03e44bb053db0f1eb 의 코드 / 기능 은 대답에 포함되어야하며 내 의견으로는 포함되어야합니다. SE 답변의 길이는 30,000 자로 제한됩니다.
Faheem Mitha

4

아마도 귀하의 질문에 대한 완전한 대답은 아니지만 패키지 는 단축키의 ASCII 표현에서 정의 된 모든 키보드 바인딩 helm-descbinds검색 하는 데 도움이됩니다 . 모든 히트를 들어, 그것은 당신에게 키보드 단축키와 관련된 대화 형 기능을 보여줍니다, 당신은 요청할 수 있습니다 helm-descbinds설명 을하거나 실행 검색 결과에서 직접.

여기에 이미지 설명을 입력하십시오

GitHub 사이트의 패키지 설명은 다음과 같습니다.

Helm Descbinds는 emacs의 describe-binding에 대한 인터페이스를 제공하여 현재 활성 키 바인딩을 Helm과 대화식으로 검색 할 수있게합니다.

또한 다음 작업이 있습니다

  • 명령을 실행
  • 명령 설명
  • 명령 찾기

그리고 C-z당신에게 현재 명령의 영구적 인 설명을 제공 할 것입니다.


2
대단하다. 나는 이것을 이것에 확실히 묶을 것이다 C-h b. 내 유일한 소망은 입력하는 대신 실제 키 시퀀스를 입력하여 목록의 항목으로 이동할 수 있다는 것입니다.C - c _ C - p
nispio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.