2011-03-31 2 views
47

이맥스에서 전역 키 바인딩을 설정하는 방법을 알고 있지만 로컬 (부 모드 별) 키 바인딩을위한 코드도 Google에서 찾기 어렵습니다. 나는 세계를 설정하지 않으특정 이맥스 모드에 대한 맞춤 키 바인딩 설정하기

;; PDFLaTeX from AucTeX 
(global-set-key (kbd "C-c M-p") 
     (lambda() 
      (interactive) 
      (shell-command (concat "pdflatex " buffer-file-name)))) 

: 예를 들어, 내 .emacs에서이 코드가 있습니다. local-set-key과 같은 기능이 있습니까?

+0

더 많은 나 자신이 도움을 이맥스 위키에가는 찾을 : http://www.emacswiki.org/emacs/KeyBindingDiscussion 모드 키 맵에 키 바인딩을 추가 할 수 있고 그 맵을 찾는 f}을 보여줍니다. – drysdam

+0

Yepp ... 이미 그걸 보았습니다.하지만 Symbol의 값은 변수로 항상 무효입니다 : LaTeX-mode-map'. 음 ... – aL3xa

답변

43

모드에서 키를 바인딩하려면 키를 정의하기 전에 모드가로드 될 때까지 기다려야합니다. 하나는 모드를 필요로하거나

(eval-after-load 'latex 
        '(define-key LaTeX-mode-map [(tab)] 'outline-cycle))) 

eval-after-load 중 하나 ' 잊지 마세요 사용할 수 있습니다 - eval-after-load 매크로 아니다, 그래서 그들을 필요로한다.

(add-hook 'LaTeX-mode-hook 
      (lambda() (local-set-key (kbd "C-0") #'run-latexmk))) 

혼자 LaTeX의 모드에 대해 정의 된 바인딩을 가지고 :

+7

'eval-after-load'에 대한 첫 번째 인수는 프로그래밍 방식으로 어떻게 결정됩니까? – erjoalgo

+0

모드에 속한 모든 기능을 제공하는 것만으로 충분하다고 생각합니다. ''라텍스 '대신' 'LaTeX 모드' '도 마찬가지이다. – Artyom

+0

나를 위해 변수는 라텍스 모드 맵 (모두 소문자)이라고합니다. LaTeX-mode-map은 존재하지 않습니다. –

5

해당 모드에 대한 키 맵 (예 : LaTeX-mode-map)을 식별하고 define-key 기능을 사용해야합니다. 예를 들어, LaTeX의 모드에서 outline-minor-mode 활성화와 함께, 내가 가진 :이 경우 주요 모드 (유액)에서

(define-key LaTeX-mode-map [(tab)] 'outline-cycle)) 

키 바인딩을 보유하고 있지만, 또한 outline-minor-mode-map있다.

+7

라텍스 모드가로드 될 때까지 기다려야합니다. (eval-after-load 'latex'(정의 키 LaTeX 모드 맵 [(탭)] '개요 순환))) –

+0

@ 감사합니다. 많은, 그것은 나를 매달리고 있었다. 확인할 수 있도록 답변으로 의견을 제공하십시오. =) – aL3xa

35

나는 다음과 같은 사용합니다.

+1

'#'은 나와 중복되었습니다. – doctorate

+0

대신 'latex-mode-hook'을 설정해야했습니다 (대문자 없음). 나는 또한 불필요한'# '을 발견했다. – hunse

+2

날카로운 인용구에서 'http://endlessparentheses.com/get-in-the-habit-of-using-sharp-quote.html – codeasone

2

다른 답변은 내 필요를 충족시키지 못했습니다. 그래서 이것은 다른 사람들을 도울 것입니다. 내가 이블의 정상 모드 (기본적으로 :이 의미는 도처에 이맥스에서을 의미한다)에서 라인의 시작 부분으로 건너 뛰고 싶었지만 org-mode에 있다면 org 항목 사이를 순환하려고했다. 문서.

버퍼를 전환 할 때마다 별개의 바인딩과 상수 바인딩 재 바인딩을 사용하는 것이 하나의 옵션이었습니다. 왜냐하면 악의 경우 정상적인 상태에서 키당 하나의 바인딩 만 허용하기 때문입니다.

하지만 더 효율적인 옵션은 현재 버퍼가 사용하는 주요 모드를 기반으로 필요한 기능을 실행하는 내 코드를 Tab이 실행하도록하는 것이 었습니다. 그래서 내가 org 버퍼에 있다면,이 코드는 org-cycle을 실행하고, 그렇지 않으면 evil-first-non-blank을 실행합니다 (줄의 첫 번째 공백이 아닌 문자로 이동).

여기에 사용 된 기술은 일반적인 악의없는 이맥스를 사용하는 사람들을 위해 global-set-key을 통해 사용자 정의 함수를 호출하여 사용할 수도 있습니다.

Emacs lisp를 모르는 사람들은 "if"문 다음의 첫 줄이 참 조치이고 그 이후의 줄은 거짓 작동입니다. major-modeorg-mode 동일 그래서, 우리는 그렇지 않으면 우리는 다른 모든 모드에서 evil-first-non-blank을 실행 org-cycle 실행

(defun my/tab-jump-or-org-cycle() 
    "jumps to beginning of line in all modes except org mode, where it cycles" 
    (interactive) 
    (if (equal major-mode 'org-mode) 
     (org-cycle) 
     (evil-first-non-blank)) 
    ) 
    (define-key evil-normal-state-map (kbd "<tab>") 'my/tab-jump-or-org-cycle)