6

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

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

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

编辑澄清:

我正在使用Debianemacs23-nox的标准版本urxvt-256colors,除了我已经用它--disable-iso405776(或类似的东西)重新编译它,这样Ctrl+Shift就不会做奇怪的“插入字符”的事情。我不知道这是否会影响任何事情。例如,C-M-i发送M-TAB,我不明白。

编辑二

我很抱歉没有说清楚。该函数djhaskin987-untab-to-tab-stop中有行(interactive)。这部分有效。

4

5 回答 5

10

接受的答案与第一条评论中的链接相结合,足以开始一个完整的解决方案。步骤是:

  1. 使您的终端输出密钥的转义码
  2. 让 Emacs 将转义码识别为标准按键
  3. 在模式映射中绑定按键

第一个非常依赖终端和/或操作系统。

第一条评论中的链接显示了 X Window System 的一些示例。键名在/usr/X11R6/include/X11/keysymdef.h(或 try 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 SequenceAction

iTerm 键映射

Emacs Wiki列出了其他终端的一些配置方法。

现在您可以教 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-\..

于 2016-10-24T15:38:13.217 回答
9

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

于 2012-05-20T02:09:43.170 回答
1

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

于 2012-05-18T23:46:24.517 回答
1

您可以使用默认的 ascii 代码映射 C-=:^[[61;5u. 然后你可以使用以下方法在 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/CS-TAB 的内置首选项键并使用他的方法来做到这一点。使用以下内容,我可以通过 ssh 连接到远程 Linux 机器并快速切换项目中的大量打开缓冲区,就像桌面编辑器一样。 在此处输入图像描述

(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)))))
于 2019-10-12T10:15:33.833 回答
0

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

(define-key global-map (kbd "C-=") 
    (lambda () (interactive) (djhaskin987-untab-to-tab-stop)))
于 2012-05-18T21:49:00.727 回答