emacs中有哪些好的自定义键绑定?

emacs中有哪些好的自定义键绑定?,emacs,keyboard,keyboard-shortcuts,emacs23,Emacs,Keyboard,Keyboard Shortcuts,Emacs23,Emacs似乎已经将所有可能的键盘组合随机分配到了它的命令中p 如果我要定义新的键盘快捷键,我应该把它们放在哪里?我应该使用哪些前缀 例如:我想为以下函数定义快捷方式: (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-stri

Emacs似乎已经将所有可能的键盘组合随机分配到了它的命令中p

如果我要定义新的键盘快捷键,我应该把它们放在哪里?我应该使用哪些前缀

例如:我想为以下函数定义快捷方式:

(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)
  • 缩进缓冲区(C-CI,在我得到答案后)
  • 注释或取消注释区域(C-C)
  • rdebug(ruby调试器)(C-C-R)
  • rsense完成(ruby自动完成)(C-CE)

你会把这些放在哪里?为什么?

默认情况下,
C-x h
标记整个缓冲区,
C-M-\
运行
indent region
,因此依次执行这两个操作将缩进整个缓冲区

默认情况下,
注释dwim
已绑定到
M-
,并且可能比
注释或取消注释区域
做得更好。(“DWIM”代表“我的意思”)

为了完成,我建议设置,它可以与rsense进行互操作。自动完成具有用于所有完成的标准键绑定


至于rdebug,我可能只会将它粘贴在其中一个F键上,或者用
C-C
作为前缀,因为这是一种指定的“自定义”前缀。可能是“调试”的
C-cd
。要确保密钥尚未绑定,请转到ruby缓冲区并按
C-hk
,然后按您的组合键,并确保Emacs告诉您未定义。

我通常将全局密钥绑定放在单独的文件中(我的配置的一部分)和特定于模式的配置文件中的特定于模式的配置。这样一来,所有的东西都很瘦,很紧,很容易找到。您提到的一些东西,如注释/取消注释,已经附加了键绑定。我用一个函数indent buffer或region(EDT的一部分)实现了indent buffer,该函数绑定到标准C-M-\indentation键。对于用户自定义键绑定应该使用哪些键,有正式的规则,当然也有常识。没有什么是用石头写的

以下是以下几个例子:

;;你知道,就像Readline。
(全局设置键(kbd“C-M-h”)'反向终止字)
;; 以漂亮的方式对齐代码。
(全局设置键(kbd“C-x\\”)对齐regexp)
;; 执行常规清理。
(全局设置键(kbd“C-C n”)'清除缓冲区)
;; 字号
(定义键全局映射(kbd“C-”)文本比例增加)
(定义键全局映射(kbd“C-”)的文本比例减小)
;; 跳转到当前文件中的定义。(这太棒了。)
(全局设置键(kbd“C-x C-i”)‘ido imenu)
;; 文件查找
(全局设置键(kbd“C-x M-f”)“ido查找文件其他窗口)
(全局设置键(kbd“C-x C-M-f”)'在项目中查找文件)
(全局设置键(kbd“C-x f”)'recentf ido查找文件)
(全局设置键(kbd“C-C r”)'缓存)
(全局设置密钥(kbd“M-”)'文件缓存小缓冲区已完成)
;; 窗口切换。(C-x o转到下一个窗口)
(全局设置键(kbd“C-x O”)(λ()
(互动)
(其他窗口-1));;后面一个
;; 缩进帮助
(全局设置键(kbd“C-x^”)连接行)
(全局设置键(kbd“C-M-\\”)缩进区域或缓冲区)
;; 以类似于dired的方式启动进程
(已处理全局设置键(kbd“C-x p”))
;; 启动eshell或切换到它(如果它处于活动状态)。
(全局设置键(kbd“C-x m”)‘eshell)
;; 启动新的eshell,即使其中一个处于活动状态。
(全局设置键(kbd“C-x M”)(lambda()(交互式)(eshell t)))
;; 如果你喜欢的话,开始一个普通的shell。
(全局设置键(kbd“C-x M-M”)'外壳)
;; 如果你想在没有meta的情况下实现M-x
(全局设置键(kbd“C-x C-m”)'执行扩展命令)
;; 获取URL上的内容,将其显示为原始内容。
(全局设置键(kbd“C-x C-h”)'视图url)
;; 帮助应该不仅仅搜索命令
(全局设置键(kbd“C-h a”)“适当地”)
;; 应该能够评估和更换任何地方。
(全局设置键(kbd“C-C e”)“评估和更换)
;; 魔法法则!
(全局设置键(kbd“C-x g”)“magit状态)
;; 在isearch中很容易发生激活
(定义关键isearch模式映射(kbd“C-o”)
(lambda()(交互式)
(let((案例折叠搜索为案例折叠搜索))
(如果isearch regexp
isearch字符串
(regexp引号isearch string((()())))
;; 循环缓冲区
(全局设置键(kbd“”)“缓存)
;; 用嬉皮士来代替达布列夫
(全局设置键(kbd“M-/”)嬉皮士扩展)
;; 保加利亚文拼写检查
(全局设置键(kbd“C-C B”)
(lambda()(交互式)
(ispell变化字典“保加利亚语”)
(拼写缓冲区)
;; 用ibuffer替换缓冲区菜单
(全局设置键(kbd“C-x C-b”)‘ibuffer)
;; 交互式文本替换
(全局设置键(kbd“C-C-r”)‘iedit模式)
;; 交换窗口
(全局设置键(kbd“C-C s”)“交换窗口)
;; 复制当前行或区域
(全局设置键(kbd“C-C d”)'复制当前线路或区域)
;; 重命名缓冲区文件(&V)
(全局设置键(kbd“C-C r”)'重命名文件和缓冲区)
;; 打开ansi术语缓冲区
(全局设置键(kbd“C-x t”)'访问术语缓冲区)
;; 切换输入法
(全局设置键(kbd“C-\\”)切换保加利亚语输入法)
;; 用谷歌搜索
(全局设置键(kbd“C-C g”)“谷歌)
;; 切换菜单栏可见性
(全局设置键(kbd“”)(lambda()(交互式)(菜单栏模式)))

Emacs实际上有一个非常明确的绑定模式,如图所示

至于应该在何处定义键,如果查看,您将看到C-ca(其中a是任何小写或大写字符)是为用户保留的

另外,如果要定义一个仅在特定模式下才有意义的键,那么应该在该键映射中定义它

例如,M-/绑定到
dabbrev expand
,这是一种自动完成所键入单词的简便方法。使用
rsense complete
可能非常有意义,但仅限于(add-hook 'ruby-mode-hook (lambda () (define-key ruby-mode-map (kbd "M-/") 'rsense-complete)))
(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)
(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)
;;;;;;;; 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)