【问题标题】:Set TAB as shortcut for autocompletion in Emacs Haskell mode将 TAB 设置为 Emacs Haskell 模式下自动完成的快捷方式
【发布时间】:2014-10-31 02:58:40
【问题描述】:

当我在 Emacs 中使用 Haskell REPL (GHCI) 时(使用 C-c C-b 调用),我想使用 TAB 来自动完成事情。 M-/ 对我来说已经足够好了,但我不知道将 TAB 绑定到它的这个函数的名称(TAB 适用于制表(惊讶?)在交互模式下,我发现它完全没用)。

TAB 适用于缩进时,我希望这些更改仅适用于交互模式,而不适用于一般编辑(可能还有其他用途,我还没有完全理解所有内容)。

【问题讨论】:

  • IIRC, C-h k M-/ 应该告诉你绑定到 M-/ 的 Lisp 函数的名称。发现该名称后,您必须在交互模式下将TAB 绑定到它。不过,我的 elisp 不够流利,无法回忆如何做到这一点。

标签: haskell emacs autocomplete


【解决方案1】:

扩展@chi 的评论,您可以使用C-h k M-/ 找到Lisp 函数的名称,它给出了hippie-expand 函数。

要在 ghci 交互模式下绑定 TAB,请使用以下 elisp 代码:

(define-key haskell-interactive-mode-map (kbd "TAB") 'hippie-expand)

或者如果你想将它绑定在普通的haskell-mode 那么:

(define-key haskell-mode-map (kbd "TAB") 'hippie-expand)

【讨论】:

  • 它不起作用,Emacs 说:Symbol's value as variable is void: haskell-interactive-mode-map
  • 另外,如果没有<>,通常不能使用(kbd "TAB")
  • @Mark 它对我有用。您的方法和我的方法之间的区别似乎在于使用的模式:您使用inferior-haskell-mode 进行ghci 集成,而我使用Interactive-mode。不同之处在于交互模式支持更多功能,如cabal sandbox repl等。
  • 实际上,我使用的是您链接中的haskell-mode(v.13.07,下载的表单发布页面)。
  • @Mark haskell-mode 同时拥有interactive and inferior mode
【解决方案2】:

好的,使用great comment by chi,我发现绑定到M-/ 的函数的名称是dabbrev-expand(通过Ch k M-/)。

现在我们需要 Haskell REPL 的主要模式的名称,我发现我们可以用 C-h v major-mode 得到它,实际上是inferior-haskell-mode

然后,我想有inferior-haskell-mode-hook,我们可以在创建 REPL 框架时使用它来调整一些东西。

要添加本地快捷方式绑定,应使用define-key。参数keymap的值可以通过current-local-map获取。

知道了这些事实,我们可以写:

(add-hook 'inferior-haskell-mode-hook
          (lambda ()
            (define-key (current-local-map) (kbd "<tab>") 'dabbrev-expand)))

据我所知,它运行良好,现在 TAB 可用于 REPL 模式下的自动完成和其他模式下的缩进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 2012-02-06
    • 1970-01-01
    • 2014-12-29
    • 2019-09-04
    • 2011-10-02
    • 2015-02-13
    • 2012-04-18
    相关资源
    最近更新 更多