web-dev-qa-db-ja.com

特定のEmacsモードにカスタムキーバインドを設定する

Emacsでグローバルキーバインディングを設定する方法は知っていますが、ローカル(マイナーモード固有)キーバインディングのコードをGoogleで検索することすら困難です。たとえば、.emacsにこのコードがあります:

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

グローバルに設定したくありません。 local-set-keyのような関数はありますか?

51
aL3xa

モードでキーをバインドするには、モードがロードされるのを待ってからキーを定義する必要があります。モードを要求するか、eval-after-load

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

'eval-after-loadはマクロではないため、必要です。

47
Rémi

私は次を使用します:

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

laTeXモードのみにバインドを定義すること。

41
Dror

そのモードのキーマップを識別する必要があります(たとえば、LaTeX-mode-map)および関数define-key。例として、outline-minor-mode LaTeXモード内では、次のことができます。

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

この場合、メジャーモード(LaTeX)はキーバインディングを保持しますが、outline-minor-mode-map

5
Kirk Kelsey

他の答えはどれも私のニーズを満たしませんでした。したがって、これは他の人を助けるかもしれません。 Evilの通常モード(基本的には、これはEmacsではeverywhereを意味します)である場合、Tabが行の先頭にジャンプすることを望みましたが、代わりにorg項目は、私が組織モード文書であるかどうかを示します。

1つのオプションは、バッファーを切り替えるたびに、個別のバインディングと定数のバインディングと再バインディングをいじることでした(悪が通常の状態でキーごとに1つのバインディングしか許可しないため)。

しかし、より効率的なオプションは、現在のバッファーが使用するメジャーモードに基づいて必要な機能を実行する独自のコードをTabで実行することでした。したがって、組織バッファーにいる場合、このコードはorg-cycleを実行し、そうでない場合はevil-first-non-blankを実行します(行の最初の非空白文字に移動します)。

ここで使用した手法は、通常の非邪悪なEmacsを使用する人のために、代わりにglobal-set-key経由でカスタム関数を呼び出すことでも使用できます。

Emacs LISPを知らない人にとって、「if」ステートメントの後の最初の行は真のアクションであり、その後の行は偽のアクションです。 major-modeorg-modeと等しい場合、org-cycleを実行します。それ以外の場合は、他のすべてのモードでevil-first-non-blankを実行します。

  (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)
3
gw0