13

Emacs には、可能なすべてのキーボードの組み合わせが、そのコマンド間で既にランダムに分散されているようです。:p

新しいキーボード ショートカットを定義する場合、どこに配置すればよいですか? どのプレフィックスを使用すればよいですか?

例: 次の機能のショートカットを定義したい:

  • indent-buffer (Cc i、答えを得た後)
  • コメントまたはコメント解除領域 (Cc C)
  • rdebug (ruby デバッガー) (Cc R)
  • rsense-complete (ルビオートコンプリート) (Cc e)

これらをどこに置きますか?なんで?

4

5 に答える 5

20

Emacsは実際にはそのバインディングに非常に明確なパターンを持っています、この答えはいくつかを示しています。

キーを定義する必要がある場所に関しては、規則のドキュメントをC-c a見ると、 (a小文字または大文字はどこでも)ユーザー用に予約されていることがわかります。

さらに、特定のモードでのみ実際に意味を持つキーを定義している場合は、そのキーマップで定義する必要があります。

たとえば、M-/はにバインドされdabbrev-expandています。これは、入力している単語を自動補完する便利な方法です。rsense-complete代わりに使用するのは非常に理にかなっているかもしれませんが、それはあなたがルビーにいるときだけです。その場合、これを行うことができます:

(add-hook 'ruby-mode-hook
     (lambda () (define-key ruby-mode-map (kbd "M-/") 'rsense-complete)))

M-/これにより、現在の場合にのみバインディングが上書きさruby-modeれ、残りのモードでは変更されない(または使用可能になる)ままになります。

于 2011-04-15T22:00:04.587 に答える
5

私はこれに対して型にはまらないアプローチをとっており、それを強くお勧めします。Cl ('ell') キーをプレフィックス キーとして再定義し、それをお気に入りのコマンドのプレフィックスとして使用しています。このキーは非常に簡単に入力でき、あまり使用されない関数 ('recenter) にバインドされています。

まあ、私は 'recenter をあまり使用しませんが、使用したとしても、入力がほぼ同じくらい簡単な Cl Cl に割り当てることができ、Ctrl-L-map によって開かれた可能性に対してわずかな代償を払うことができます。 . (実際、私は 'recentering' よりも 'redraw-display' の方が好きなので、それを優先しました。)

それを機能させる魔法の呪文をどこで手に入れたか覚えていません。

(global-unset-key "\C-l")
(defvar ctl-l-map (make-keymap)
     "Keymap for local bindings and functions, prefixed by (^L)")
(define-key global-map "\C-l" 'Control-L-prefix)
(fset 'Control-L-prefix ctl-l-map)

その後、心ゆくまでキーを定義できます。Cl は、キーにバインドされていない関数や、覚えていないキーや入力しにくいキーにバインドされている関数だけでなく、独自のコマンドのバインドを配置するのに最適な場所です。標準関数へのバインディングの例を次に示します。

(define-key ctl-l-map "\C-l"  'redraw-display)
(define-key ctl-l-map "l"  'recenter)

(define-key ctl-l-map "g"  'goto-line)
(define-key ctl-l-map "r"  'replace-string)
(define-key ctl-l-map "R"  'replace-regexp)
(define-key ctl-l-map "q"  'query-replace)
(define-key ctl-l-map "Q"  'query-replace-regexp)
(define-key ctl-l-map "o"  'overwrite-mode)
(define-key ctl-l-map "\C-w"  'kill-rectangle)
(define-key ctl-l-map "\C-y"  'yank-rectangle)
(define-key ctl-l-map "h"  'command-history)
(define-key ctl-l-map "w"  'write-region)
(define-key ctl-l-map "r" 'electric-replace-string)
(define-key ctl-l-map "\er" 'replace-string)
(define-key ctl-l-map "T"  'delete-trailing-whitespace)
(define-key ctl-l-map "C"  'describe-char)
(define-key ctl-l-map "W"  'ediff-regions-wordwise)
(define-key ctl-l-map "L"  'ediff-regions-linewise)
(define-key ctl-l-map "\C-f" 'facemenu-remove-all)
(define-key ctl-l-map "\C-c" 'calendar)
(define-key ctl-l-map "m"  'not-modified)   ;; already at M-~
(define-key ctl-l-map "\C-q" 'fill-region)
(define-key ctl-l-map "u" 'set-buffer-file-coding-system)
(define-key ctl-l-map [?\C-2] 'transient-mark-mode)
(define-key ctl-l-map "\C-@"  'transient-mark-mode)
(define-key ctl-l-map "\C-n"  'linum-mode)
(define-key ctl-l-map "\C-s" 'isearch-forward-regexp)
(define-key ctl-l-map "\C-r" 'isearch-backward-regexp)a
(define-key ctl-l-map "U" 'browse-url)
(define-key ctl-l-map "F" 'browse-url-of-file)
(define-key ctl-l-map "\C-u" 'undo-only)
于 2011-04-29T00:13:09.283 に答える
4

デフォルトでC-x hは、 はバッファ全体をマークし、 をC-M-\実行しますindent-region。したがって、これら 2 つを次々に実行すると、バッファ全体がインデントされます。

comment-dwimはすでにデフォルトで にバインドされてM-;おり、おそらく よりも優れていcomment-or-uncomment-regionます。(「DWIM」は「do-what-I-mean」の略です)

完了するには、rsense と相互運用するauto-complete-modeを設定することをお勧めします。オートコンプリートには、すべての補完に対して標準のキーバインドがあります。

rdebug については、おそらく F キーの 1 つに貼り付けるか、そうでなければC-c、指定された「カスタム」プレフィックスのような . 多分C-c d「デバッグ」のためです。キーがまだバインドされていないことを確認するには、ルビ バッファーに移動し、C-h kキーの組み合わせを押してからキーの組み合わせを押し、Emacs がそれが未定義であることを通知することを確認します。

于 2011-04-15T21:53:31.393 に答える
4

私は通常、グローバルキーバインディングを別のファイル(構成の一部)に入れ、モード固有の構成をモード固有の構成ファイルに入れます。そうすれば、すべてが無駄がなく、タイトで、見つけやすいです。コメント/コメント解除など、あなたが言及したことのいくつかには、すでにキーバインドが添付されています。標準の CM-\ インデント キーにバインドした関数 indent-buffer-or-region (EDT の一部) を使用して indent-buffer を実装しました。ユーザーが独自のキーバインドに使用するキーには正式なルールがあり、もちろん常識があります。石には何も書かれていません。

Emacs Preludeの例を次に示します。

;; You know, like Readline.
(global-set-key (kbd "C-M-h") 'backward-kill-word)

;; Align your code in a pretty way.
(global-set-key (kbd "C-x \\") 'align-regexp)

;; Perform general cleanup.
(global-set-key (kbd "C-c n") 'cleanup-buffer)

;; Font size
(define-key global-map (kbd "C-+") 'text-scale-increase)
(define-key global-map (kbd "C--") 'text-scale-decrease)

;; Jump to a definition in the current file. (This is awesome.)
(global-set-key (kbd "C-x C-i") 'ido-imenu)

;; File finding
(global-set-key (kbd "C-x M-f") 'ido-find-file-other-window)
(global-set-key (kbd "C-x C-M-f") 'find-file-in-project)
(global-set-key (kbd "C-x f") 'recentf-ido-find-file)
(global-set-key (kbd "C-c r") 'bury-buffer)
(global-set-key (kbd "M-`") 'file-cache-minibuffer-complete)

;; Window switching. (C-x o goes to the next window)
(global-set-key (kbd "C-x O") (lambda ()
                                (interactive)
                                (other-window -1))) ;; back one

;; Indentation help
(global-set-key (kbd "C-x ^") 'join-line)
(global-set-key (kbd "C-M-\\") 'indent-region-or-buffer)

;; Start proced in a similar manner to dired
(global-set-key (kbd "C-x p") 'proced)

;; Start eshell or switch to it if it's active.
(global-set-key (kbd "C-x m") 'eshell)

;; Start a new eshell even if one is active.
(global-set-key (kbd "C-x M") (lambda () (interactive) (eshell t)))

;; Start a regular shell if you prefer that.
(global-set-key (kbd "C-x M-m") 'shell)

;; If you want to be able to M-x without meta
(global-set-key (kbd "C-x C-m") 'execute-extended-command)

;; Fetch the contents at a URL, display it raw.
(global-set-key (kbd "C-x C-h") 'view-url)

;; Help should search more than just commands
(global-set-key (kbd "C-h a") 'apropos)

;; Should be able to eval-and-replace anywhere.
(global-set-key (kbd "C-c e") 'eval-and-replace)

;; Magit rules!
(global-set-key (kbd "C-x g") 'magit-status)

;; Activate occur easily inside isearch
(define-key isearch-mode-map (kbd "C-o")
  (lambda () (interactive)
    (let ((case-fold-search isearch-case-fold-search))
      (occur (if isearch-regexp
                 isearch-string
               (regexp-quote isearch-string))))))

;; cycle through buffers
(global-set-key (kbd "<C-tab>") 'bury-buffer)

;; use hippie-expand instead of dabbrev
(global-set-key (kbd "M-/") 'hippie-expand)

;; spell check Bulgarian text
(global-set-key (kbd "C-c B")
                (lambda()(interactive)
                  (ispell-change-dictionary "bulgarian")
                  (flyspell-buffer)))

;; replace buffer-menu with ibuffer
(global-set-key (kbd "C-x C-b") 'ibuffer)

;; interactive text replacement
(global-set-key (kbd "C-c C-r") 'iedit-mode)

;; swap windows
(global-set-key (kbd "C-c s") 'swap-windows)

;; duplicate the current line or region
(global-set-key (kbd "C-c d") 'duplicate-current-line-or-region)

;; rename buffer & visited file
(global-set-key (kbd "C-c r") 'rename-file-and-buffer)

;; open an ansi-term buffer
(global-set-key (kbd "C-x t") 'visit-term-buffer)

;; toggle input method
(global-set-key (kbd "C-\\") 'toggle-bulgarian-input-method)

;; search with google
(global-set-key (kbd "C-c g") 'google)

;; toggle menu-bar visibility
(global-set-key (kbd "<f12>") (lambda () (interactive) (menu-bar-mode)))
于 2011-04-15T21:56:11.913 に答える
1

これは私のものです。

移動キーを再マップしたことに注意してください。これは、MS NS4Kを使用しているためです。これにより、これらの特定のキーの移動が非常に簡単になります。

;;;;;;;; remapping of keys ;;;;;;;;;;;;;;;

(global-set-key "\C-cg" 'goto-line)
;C-c u untabifies...yuck!
(global-set-key "\C-cu" 'untabify)
;Regex replace
(global-set-key "\C-x%" `query-replace-regexp)
;;Backward-kill-line is defined later on in this file.
(global-set-key "\M-k" `backward-kill-line)

(global-set-key "\C-x\C-j" 'eval-print-last-sexp)
;;M-up/down -> start/end of buffer. Yay!
(global-set-key (kbd "M-<up>") 'beginning-of-buffer)
(global-set-key (kbd "M-<down>") 'end-of-buffer)
(global-set-key (kbd "M-[") 'beginning-of-buffer)
(global-set-key (kbd "M-]") 'end-of-buffer)

;;remap movement keys to get rid of emacs pinky
;Jump back and forth by 5.
(global-set-key "\C-n" '(lambda () (interactive) (forward-line 5)))
(global-set-key "\C-p" '(lambda () (interactive) (forward-line -5)))
(global-set-key "\M-a" 'move-beginning-of-line)
(global-set-key "\M-e" 'move-end-of-line)
(global-set-key "\M-n" 'next-line)
(global-set-key "\M-p" 'previous-line)

;bookmark
(global-set-key (kbd "<M-f2>") 'bm-toggle)
(global-set-key (kbd "<f2>")   'bm-next)
(global-set-key (kbd "<f3>") 'bm-previous)
(setq bm-cycle-all-buffers t)

(global-set-key (kbd "<f5>") 'revert-buffer)
(global-set-key (kbd "<f12>") 'delete-trailing-whitespace)
(global-set-key (kbd "<f11>") 'comment-or-uncomment-region)

(global-set-key (kbd "M-RET") 'newline-and-indent)
(global-set-key "\C-m" 'newline-and-indent)

;;Jump "backwards"
(global-set-key "\C-xp" '(lambda () (interactive) (other-window -1)))

;;copy
(global-set-key "\M-y" 'yank)

;;insert line
(global-set-key "\M-o" '(lambda () (interactive) (open-line 1)))

;zap to char backwards
(global-set-key "\C-z" 'minimize)
;;suspend-emacs is the send-to-background command on linux

;simplify register usage
(global-set-key "\M-s" 'copy-to-register)
(global-set-key "\M-i" 'insert-register)

;;autocomplete hacks
(global-set-key [?\M-/] 'hippie-expand)
(global-set-key [?\C-/] 'dabbrev-expand)


(global-set-key [?\C-.] 'find-tag)
;(global-set-key "\C-.\C-s" 'find-tag)
(global-unset-key [?\M-.])

;;this lets us have long lines go off the side of the screen instead of hosing up the ascii art
(global-set-key "\C-t" 'toggle-truncate-lines)

;comment/uncomment region
(global-set-key "\C-c\C-c" 'comment-or-uncomment-region)

;;Buffer-move
(global-set-key (kbd "<C-S-left>")   'buf-move-left)
(global-set-key (kbd "<C-S-right>")  'buf-move-right)
于 2011-04-29T00:20:15.300 に答える