如何在emacs中绑定C- =?

时间:2012-05-18 21:38:17

标签: emacs key-bindings

我的.emacs文件中的这个s表达式无法产生所需的结果:

(define-key global-map (kbd "C-=") 'djhaskin987-untab-to-tab-stop)

为什么我不能将命令绑定到 Ctrl + =

编辑以澄清:

我在Debian的emacs23-nox标准版本上使用urxvt-256colors,除了我已经使用--disable-iso405776重新编译(或类似的东西),以便 Ctrl < / kbd> + Shift 没有做奇怪的'插入字符'的事情。我不知道这是否会影响任何事情。例如, C-M-i 发送 M-TAB ,我不明白。

EDIT II

我为没有说清楚而道歉。函数djhaskin987-untab-to-tab-stop中包含行(interactive)。这部分有效。

5 个答案:

答案 0 :(得分:7)

link in the first comment to it结合使用的已接受答案足以开始使用完整的解决方案。步骤是:

  1. 为密钥
  2. 设置终端输出转义码
  3. 使Emacs将转义码识别为标准按键
  4. 在模式映射中绑定按键
  5. 第一种是非常终端和/或依赖于操作系统。

    第一条评论中的链接显示了X Window System的一些示例。密钥名称位于/usr/X11R6/include/X11/keysymdef.h(或尝试locate keysymdef.h),前缀为XK_(应根据我们的目的移除)。我读到符号名称比关键文字更受欢迎。

    我目前没有运行X但我认为在你的情况下它应该是这样的:

    XTerm.VT100.Translations: #override \
    Ctrl ~Meta ~Shift  <Key> equal:         string(0x1b) string("[emacs-C-=")\n
    

    第一个字符串是转义符号,第二个字符串是您选择的。

    在iTerm中,您可以使用Preferences->Keys并选择Send Escape Sequence作为Action。例如,我有:

    iTerm key mappings

    其他终端的Emacs Wiki lists some configuration methods

    现在,您可以教Emacs将其识别为 C - = 。首先define-key进入input-decode-map。我有几个辅助函数:

    (defun my/global-map-and-set-key (key command &optional prefix suffix)
       "`my/map-key' KEY then `global-set-key' KEY with COMMAND.
     PREFIX or SUFFIX can wrap the key when passing to `global-set-key'."
       (my/map-key key)
       (global-set-key (kbd (concat prefix key suffix)) command))
    
     (defun my/map-key (key)
       "Map KEY from escape sequence \"\e[emacs-KEY\."
       (define-key function-key-map (concat "\e[emacs-" key) (kbd key)))
    

    那么:

    (my/global-map-and-set-key "C-=" 'some-function-to-bind-to)
    

    某些键(目前:()\|;'`"#.,)需要在字符串中进行转义,例如C-\.

答案 1 :(得分:6)

在终端中, TAB 由与 C-i 相同的字节序列表示。通常终端没有 C - = 的特殊字节序列,所以它只发送一个 = 。 Emacs没有什么可以做的。但是你可能会教你的终端模拟器发送你选择的一些特殊的字节序列(检查你的终端模拟器的文档),之后你可以教Emacs将它识别为 C - = (类似于(define-key input-decode-map "...thebytes..." [?\C-=]))。

答案 2 :(得分:1)

问题是您在终端中使用emacs。 终端不允许“C- =”。 在图形化emacs中尝试您的功能,它将工作。 您必须为终端找到另一个键绑定。

答案 3 :(得分:0)

您要绑定的功能必须是交互式的。尝试:

(define-key global-map (kbd "C-=") 
    (lambda () (interactive) (djhaskin987-untab-to-tab-stop)))

答案 4 :(得分:0)

您可以使用默认的ASCII代码^[[61;5u映射C- =。然后,您可以使用以下方法在Emacs中将其绑定:

(global-set-key (kbd "C-=") 'djhaskin987-untab-to-tab-stop))

或让use-package这样做,例如:

(use-package expand-region
  :ensure t
  :bind (("C-=" . er/expand-region)))

我确实要感谢Sam Brightman的出色解决方案。这是一种非常干净的方法,尽管处理繁琐,但适用于无法通过常规ascii代码发送的任何密钥。我一直想让C-TAB在iterm2中工作很长时间。通过删除C-TAB / C-S-TAB的内置首选项键并使用他的方法,我能够做到这一点。通过以下内容,我可以像进入桌面编辑器一样,被切换到远程Linux机器中,并快速切换项目中的许多开放缓冲区。 enter image description here

(use-package nswbuff
  :defer 1
  :after (projectile)
  :commands (nswbuff-switch-to-previous-buffer
             nswbuff-switch-to-next-buffer)
  :config
  (progn
    (my/global-map-and-set-key "C-TAB" 'nswbuff-switch-to-previous-buffer)
    (my/global-map-and-set-key "C-S-TAB" 'nswbuff-switch-to-next-buffer))
  :init
  (setq nswbuff-display-intermediate-buffers t
        nswbuff-exclude-buffer-regexps '("^ "
                                         "^\*.*\*"
                                         "\*Treemacs.*\*"
                                         "^magit.*:.+")
        nswbuff-include-buffer-regexps '("^*Org Src")
        nswbuff-start-with-current-centered t
        nswbuff-buffer-list-function '(lambda ()
                                        (interactive)
                                        (if (projectile-project-p)
                                            (nswbuff-projectile-buffer-list)
                                          (buffer-list)))))