emacs中好的自定义键绑定是什么?

| Emacs似乎已经在其命令之间随机分配了所有可能的键盘组合。 :p 如果要定义新的键盘快捷键,应该放在哪里?我应该使用哪些前缀? 例如:我想为以下功能定义快捷方式: 缩进缓冲区(C-c i,在得到答案后) 评论或取消评论区域(CC) rdebug(红宝石调试器)(C-C R) rsense-complete(红宝石自动完成)(C-c e) 您将这些放在哪里?为什么?     
已邀请:
Emacs实际上对其绑定具有非常明确的模式,此答案显示了一些。 至于应该在哪里定义键,如果您查看约定的文档,您会发现C-c a(其中a是任何小写或大写字符)是为用户保留的。 另外,如果您要定义一个仅在特定模式下才有意义的键,则应在该键图中定义它。 例如,M- /绑定到
dabbrev-expand
,这是一种自动完成输入单词的便捷方法。改用ѭ1可能很有意义,但仅当您使用红宝石时才可以。在这种情况下,您可以执行以下操作:
(add-hook \'ruby-mode-hook
     (lambda () (define-key ruby-mode-map (kbd \"M-/\") \'rsense-complete)))
仅当您在
ruby-mode
中时,它将覆盖M- /的绑定,而对于其余模式,则保持不变(或可用)。     
默认情况下,
C-x h
标记整个缓冲区,,5ѭ运行
indent-region
,因此一个接一个地执行这两个操作会缩进整个缓冲区。 默认情况下,7ѭ已绑定到
M-;
,并且可能比
comment-or-uncomment-region
要好。 (\“ DWIM \”代表\“ do-what-I-mean \”) 为了完成,我建议设置与rsense互操作的自动完成模式。自动完成具有用于所有完成的标准键绑定。 至于rdebug,我可能只是将其粘贴在F键之一上,或者贴在带有
C-c
的前缀上,因为这是指定的\“ custom \”前缀。也许\ 11表示\“ Debug \”。要确保尚未绑定键,请转到ruby缓冲区并按
C-h k
,然后按您的组合键,并确保Emacs告诉您未定义。     
我通常将全局按键绑定放在单独的文件中(我的配置的一部分),将特定于模式的配置放在特定于模式的配置文件中。这样,一切都变得精简,紧凑且易于查找。您提到的某些内容(例如注释/取消注释)已经附加了键绑定。我已经实现了带有函数indent-buffer-or-region(EDT的一部分)的缩进缓冲区,该函数已绑定到标准C-M-\\缩进键。对于用户应使用哪些键进行自定义键绑定有正式的规则,当然也有常识。没有什么是一成不变的。 以下是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)))
    
我对此提出了一种非常规的方法,我强烈建议这样做。 我已经将C-1(\'ell \')键重新定义为前缀键,并使用它来 给我最喜欢的命令加上前缀。此密钥非常易于键入, 它绑定到一个使用不多的函数(\'recenter)。 好吧,我使用的不是'recenter',但是即使您使用了'recenter',也可以将其分配给 C-1 C-1几乎一样容易键入,而且价格不菲 Ctrl-L-map打开的可能性。 (实际上,我更喜欢\'redraw-display而不是\'recenter,所以我给了 荣誉地点。) 我不记得我从何而来的神奇咒语:
(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)
然后,您可以定义心脏内容的键。 C-1是放置您自己的命令的绑定的好地方, 以及未绑定到键的功能, 或与您不记得或难以键入的键绑定。 以下是一些与标准函数的绑定示例:
(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)
    
这是我的。 注意,我重新映射了移动键。这是因为我使用了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)
    

要回复问题请先登录注册