我的.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)
。这部分有效。
答案 0 :(得分:7)
与link in the first comment to it结合使用的已接受答案足以开始使用完整的解决方案。步骤是:
第一种是非常终端和/或依赖于操作系统。
第一条评论中的链接显示了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
。例如,我有:
其他终端的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机器中,并快速切换项目中的许多开放缓冲区。
(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)))))