【问题标题】:What are good custom keybindings in emacs?emacs 中有哪些好的自定义键绑定?
【发布时间】:2011-08-06 15:50:26
【问题描述】:

Emacs 似乎已经将所有可能的键盘组合随机分布在它的命令中。 :p

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

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

  • indent-buffer (C-c i, 得到答案后)
  • comment-or-uncomment-region (C-c C)
  • rdebug (ruby 调试器) (C-c R)
  • rsense-complete(ruby 自动完成)(C-c e)

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

【问题讨论】:

    标签: emacs keyboard keyboard-shortcuts emacs23


    【解决方案1】:

    默认情况下,C-x h 标记整个缓冲区,C-M-\ 运行 indent-region,所以这两个一个接一个会缩进整个缓冲区。

    comment-dwim 已经默认绑定到M-;,并且可能比comment-or-uncomment-region 做得更好。 (“DWIM”代表“做我的意思”)

    为了完成,我建议设置auto-complete-mode,它与rsense互操作。自动完成具有所有完成的标准键绑定。

    至于 rdebug,我可能只是将它贴在一个 F 键上,或者以 C-c 为前缀的东西上,因为那是一种指定的“自定义”前缀。也许C-c d 用于“调试”。要确保该键尚未绑定,请转到 ruby​​ 缓冲区并按 C-h k,然后按您的组合键,并确保 Emacs 告诉您这是未定义的。

    【讨论】:

      【解决方案2】:

      我通常将全局键绑定放在一个单独的文件中(我的配置的一部分),并将特定于模式的配置放在特定于模式的配置文件中。这样一来,一切都变得精简、紧凑且易于找到。您提到的某些内容(例如注释/取消注释)已经附加了键绑定。我已经使用绑定到标准 C-M-\ 缩进键的函数 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)))
      

      【讨论】:

      • 我会说这是一个糟糕的答案。这可能会导致我不遵守约定。
      • 您当然有权发表意见。我是 Emacs 的长期用户,我知道这些约定,而且我知道几乎没有人将它们用于您需要的临时键绑定。当一个人设计次要/主要模式时,它们更为重要。
      【解决方案3】:

      Emacs 实际上有一个非常明确的绑定模式,this answer 显示了一些。

      至于你应该在哪里定义键,如果你看一下documentation for conventions,你会看到 Cc a(其中 a 更低或大写字符)为用户保留。

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

      例如,M-/ 绑定到dabbrev-expand,这是一种自动补全您正在输入的单词的便捷方式。改用rsense-complete 可能很有意义,但仅在使用 ruby​​ 时。在这种情况下,您可以这样做:

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

      仅当您处于 ruby-mode 时,这将覆盖 M-/ 的绑定,并在其余模式下保持不变(或可用)。

      【讨论】:

        【解决方案4】:

        对此我有一种非常规的方法,我强烈推荐。 我已将 C-l ('ell') 键重新定义为前缀键,并使用它来 前缀我最喜欢的命令。这把钥匙很容易输入和 它绑定到一个不常用的函数('recenter)。

        好吧,我不怎么用'recenter,但即使你用了,它也可以分配给 C-l C-l 几乎一样容易打字,而且要付出很小的代价 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-l 是为您自己的命令添加绑定的好地方, 以及不绑定键的功能, 或绑定到您不记得或难以键入的键。 以下是标准函数的一些示例绑定:

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

        【讨论】:

          【解决方案5】:

          这是我的。

          请注意,我重新映射了移动键。这是因为我使用的是 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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-01
            • 2011-07-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-31
            • 1970-01-01
            相关资源
            最近更新 更多