如何在emacs中绑定C-=?
my如何在emacs中绑定C-=?,emacs,key-bindings,Emacs,Key Bindings,my.emacs文件中的此s表达式未生成所需的结果: (define-key global-map (kbd "C-=") 'djhaskin987-untab-to-tab-stop) 为什么我不能将命令绑定到Ctrl+= 编辑以澄清: 我在Debian标准版的urxvt-256colors上使用了emacs23 nox,除了我重新编译了--disable-iso405776(或类似的东西),这样Ctrl+Shift就不会执行奇怪的“插入字符”操作。我不知道这会不会影响什么。例如,C-M-i
.emacs
文件中的此s表达式未生成所需的结果:
(define-key global-map (kbd "C-=") 'djhaskin987-untab-to-tab-stop)
为什么我不能将命令绑定到Ctrl+=
编辑以澄清:
我在Debian标准版的urxvt-256colors
上使用了emacs23 nox
,除了我重新编译了--disable-iso405776
(或类似的东西),这样Ctrl+Shift就不会执行奇怪的“插入字符”操作。我不知道这会不会影响什么。例如,C-M-i发送M-TAB,我不理解
编辑II:
我很抱歉没有说清楚。功能
djhaskin987 untab to tab stop
中有一行(交互式)
。此部分有效。您绑定的函数必须是交互式的。尝试:
(define-key global-map (kbd "C-=")
(lambda () (interactive) (djhaskin987-untab-to-tab-stop)))
问题是您在终端中使用了emacs。 终端不允许“C-=”。 在图形化的emacs中尝试您的函数,它将起作用。
您必须为终端找到另一个键绑定。在终端中,TAB由与C-i相同的字节序列表示。通常,终端对于C-=没有特殊的字节序列,所以它只发送一个=。Emacs对此无能为力。但是,您可能可以教您的终端仿真器发送一些您选择的特殊字节序列(请查看终端仿真器的文档),然后您可以教Emacs将其识别为C-=(类似于
(定义键输入解码映射“…字节…”[?\C-=])
).接受的答案与的结合足以开始一个完整的解决方案。这些步骤是:
/usr/X11R6/include/X11/keysymdef.h
中找到(或尝试查找keysymdef.h
),前缀为XK_
(出于我们的目的应将其删除)。我读到符号名比关键文本更受欢迎
我目前没有运行X,但我认为在您的情况下应该是这样的:
XTerm.VT100.Translations: #override \
Ctrl ~Meta ~Shift <Key> equal: string(0x1b) string("[emacs-C-=")\n
那么:
(my/global-map-and-set-key "C-=" 'some-function-to-bind-to)
某些键(当前:)需要在字符串中转义,如
C-\。
您可以使用默认的ascii码映射C-=代码:^[[61;5u
。然后您可以使用以下两种方式在Emacs中绑定它:
(global-set-key (kbd "C-=") 'djhaskin987-untab-to-tab-stop))
或者让我们去做,例如:
(use-package expand-region
:ensure t
:bind (("C-=" . er/expand-region)))
我真的要感谢Sam Brightman,感谢他出色的解决方案。这是一种非常干净的方法,尽管很繁重,但适用于任何无法通过普通ascii码发送的键。我一直希望C-TAB在iterm2中工作。我可以通过删除C-TAB/C-s-TAB的内置首选项键并使用h使用下面的方法,我可以通过ssh连接到远程Linux设备中,并在项目中快速切换大量打开的缓冲区,就像桌面编辑器一样。
(使用包nswbuff
:延期1
:在(投射物)之后
:命令(nswbuff切换到上一个缓冲区
nswbuff(切换到下一个缓冲区)
:config
(项目
(我的/全局映射并将键“C-TAB”nswbuff开关设置为上一个缓冲区)
(我的/全局映射并设置键“C-S-TAB”‘nswbuff开关到下一个缓冲区))
:init
(setq nswbuff显示中间缓冲器t
nswbuff排除缓冲区regexp'(“^”
"^\*.*\*"
“\*树形图。*\*”
“^magit.*:.+”)
nswbuff包含缓冲区regexp'(“^*Org Src”)
nswbuff从以电流为中心的t开始
nswbuff缓冲区列表函数“(lambda()
(互动)
(如果(投射物-project-p)
(nswbuff射弹缓冲区列表)
(缓冲区列表‘‘‘‘)
恐怕不行,但谢谢你的提示。当我使用这条线路(或我的线路)时在emacs中,C-i通常被翻译成TAB
。因此,如果C-M-i
被翻译成M-TAB
,我并不感到惊讶。谢谢Stefan。这是非常有用的。例如,在这个包中,有人花了很多心血让xterm更好地与emacs一起工作。(参见.Xresource文件的注释)+1谢谢你帮我解决了我的问题。我知道这是解决问题的方法。也许最好在实际解决方案中进行编辑-链接文件经过压缩,链接很容易断开。在终端中C-=
特别吗?一般策略似乎是将X键转换为未使用的终端转义序列,然后定义这些和其他以前未定义的终端转义的emacs键(然后将这些键绑定到函数)@SamBrightman:请注意,第一条评论中的链接使用了键翻译映射
,但它应该使用输入解码映射
。这可能是因为输入解码映射
仅在Emacs-23中引入,在此之前,最好使用键翻译映射
或功能键映射
@Stefan它实际上在守护程序模式下使用输入解码映射
时会中断,而功能键映射
在这两种模式下都可以工作。我现在已经更改了我的答案,因为我不明白是什么中断了。我意识到这一点,但出于个人偏好的目的(这样我甚至可以通过SSH访问emacs,并且我的所有东西都在终端中),我想让C-=即使在终端中也能工作。
(use-package expand-region
:ensure t
:bind (("C-=" . er/expand-region)))