2014-09-06 70 views
0

自动完成我想用TAB自动完成的事情,当我使用的Haskell REPL(GHCI)在Emacs(与C-C C-B调用)。 M-/对我来说已经够用了,但是我不知道这个函数的名字绑定TAB它(TAB在交互模式下用于制表(惊讶?),我发现它完全无用)。设置TAB作为快捷方式在Emacs Haskell的模式

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

+1

IIRC,'章ķM- /'应该告诉你绑定到'M- /'的Lisp函数的名字。在发现该名称后,当您处于交互模式时,必须将“TAB”绑定到它。尽管如此,我在elisp方面还不够流畅。 – chi 2014-09-06 08:04:12

回答

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) 
+0

它不起作用,Emacs说:'作为变量的符号值是void:haskell-interactive-mode-map'。 – Mark 2014-09-06 08:49:57

+0

另外,如果没有'<>',通常不能使用'(kbd“TAB”)''。 – Mark 2014-09-06 08:52:00

+0

@Mark它适合我。你的方法和我的区别似乎是使用的模式:你正在使用'inferior-haskell-mode'来进行'ghci'集成,而我正在使用[Interactive-mode](https://github.com/haskell/)哈斯克尔模/维基/哈斯克尔交互式模式)。区别在于交互模式支持更多功能,如cabal sandbox repl等。 – Sibi 2014-09-06 08:57:00

0

行,使用great comment by chi,我发现势必M-/的函数名是dabbrev-expand(经由C-HķM-/)。

现在我们需要Haskell REPL主要模式的名称,我发现我们可以用C-h v主模式,它实际上是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模式自动完成,并在其他缩进。