Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在emacs中绑定C-=?_Emacs_Key Bindings - Fatal编程技术网

如何在emacs中绑定C-=?

如何在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

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发送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-=])
).

接受的答案与的结合足以开始一个完整的解决方案。这些步骤是:

  • 使终端输出钥匙的转义码
  • 使Emacs将转义码识别为标准按键
  • 在模式映射中绑定按键
  • 第一个非常依赖于终端和/或操作系统

    第一条注释中的链接显示了X窗口系统的一些示例。键名可在
    /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)))