在Mac OS X上为Haskell编程设置TextMate

时间:2011-04-15 21:00:16

标签: macos haskell ide text-editor textmate

我是mac新手,我正在使用我需要的所有程序安装计算机,其中一个是Haskell。

令我惊讶的是,OS X的Haskell平台与Windows不同(在平台安装上有一个GUI编辑器 - winGHiC)。看了很多,我发现这个编辑器 TextMate 应该与Haskell兼容,但我觉得为它设置Haskell Bundle非常复杂。

我已经下载并安装了以下内容:

  • 适用于Mac OS X的Haskell平台
  • Xcode 3.4 (Haskell先决条件)
  • TextMate的
    • haskell.tmbundle files (如上所述)

是否有人熟悉如何使其正常工作?这对我来说意味着一个详细的逐步解释,就像我说的那样,自从我第一次使用OS X以来,我只有一天。

非常感谢。

1 个答案:

答案 0 :(得分:28)

好的工作是你发现这些日子里的傻瓜在Github上了。

您应该可以点击Bundles,然后点击Haskell来查找内置选项。标准Haskell.tmbundle中相当少。最明显有用的是...加载文件command-shift-rcommand-R。如果你已经写了一个结尾为.hs或.lhs的模块,那么......在ghci中打开它。

(有一些关于TextMate II中集成终端的讨论,但是谁知道呢?非集成终端的一个令人讨厌的特性是,人们很想通过单击命令-R而不是通过执行来重新加载:r inside ghci;在某些疯狂事件中,我会发现我有15份终端开放。)

许多不错的功能只是一般TextMate的东西,由语言描述决定,因此阅读TextMate细节的一般描述可能会很好。例如,如果多行是高亮的,那么用-- s命令/注释它们;或者,如果它们已被评论,则取消评论它们。在我意识到它已经存在之前,我已经把一些东西一起砍掉了,但是我没有仔细研究过这本手册。

当然,一切都有键绑定,并且很容易添加自己的脚本来运行小脚本并插入一些小片段,比Emacs更多。

Bundles下点击Bundle Editor并查看不同类型的文字。

因此,例如,要创建一个制表符触发器来启动语言扩展编译指示{-#LANGUAGE ... #-},其中光标位于空格...中,复制Snippet并替换

{-#LANGUAGE ${1}#-}

选择Activation: Tab Trigger和(比方说)LANG作为触发器。

一个好处是它们都是shell脚本,或者(就像这一个)部分shell脚本,周围有一些TextMate变量,你几乎可以用自己喜欢的语言编写它们。 (对于Haskell包,我没有任何Haskell可以说的,但对于我做的其他包。)

语法突出显示令人惊讶的声音,但跳过一些奇特的扩展,例如“PackageImports”,GADT语法,Haddock文档系统的标记,以及其他一些奇怪的东西。我已经自己攻击了,但是我发现语法文件的格式非常难以理解,所以发送副本没用。在过去的两三年里,Haskell.tmbundle已经被一些知识渊博的Haskellers所推崇。最初制作它的人只是学习Haskell,并没有例如组成Haddocked模块,但另一方面,他似乎非常熟练并且对TextMate机器有深入的了解。

请注意,TextMate以相当奇怪的方式存储您在Bundle Editor中所做的修正。 TextMate附带的捆绑包,例如CRubyHTMLLaTeX等位于/Applications/Textmate.app/.../Bundles。您安装的是/Library/Application\ Support/TextMate/Bundles。当您通过Bundle Editor进行修改时,它们会存储在您的本地~/Library/Application\ Support/TextMate/Bundles.中。这有点意义,但它有点复杂,并阻碍Haskell捆绑的公共改进。 (我与人分享的一个捆绑包,而不是Haskell的捆绑包,我保留在git版本下的最终目录中,因此原始版本和我的修订版本在一起。)

“查看Hoogle”键绑定/选项对突出显示的术语起作用;这是hayoo网站的副本,可以搜索类型签名的使用

echo "<meta http-equiv=\"refresh\" content=\"0; 
http://holumbus.fh-wedel.de/hayoo/hayoo.html?query=${TM_SELECTED_TEXT:=$TM_CURRENT_WORD}\">"

如果你cabal安装了hoogle,那么你可以使用如下脚本对hoogle进行本地调用:

 hoogle --w --n=100 '${TM_SELECTED_TEXT:=$TM_CURRENT_WORD}'

选择保存:无,输入:选定文本,或:Word,输出:显示为HTML

我所做的其他修正大多是微不足道的,比如`{ - #LANGUAGE ...# - }的标签触发片段,或者我自己的怪癖。

我设法集成的一件事是来自Hackage的typeof可执行文件cabal install typeof,它运行到ghci以获得推断类型签名。我有一个键绑定,以显示推断类型为html的显示位,但也插入它。它有点精致,但这里是类型的显示器的文本

#!/bin/bash
word=${TM_SELECTED_TEXT:-$TM_CURRENT_WORD}
module="${TM_FILEPATH}"
echo $word | typeof $module 

选择Input: Selected TextOr: Line; Output: Show as Tool TipActivation : Key Equivalent(然后选择一个键绑定,我的是control-option-command-j)同样,对于通过typeof的类型插入,创建一个新的C(命令文件)标题并包括:< / p>

#!/bin/bash
word=${TM_SELECTED_TEXT:-$TM_CURRENT_WORD}
module="${TM_FILEPATH}"
echo $word | typeof $module | typeof_wordorder

# typeof_wordorder is the following hack compiled
# in my local ~/bin
# module Main where
# main = interact reword where
#  reword :: String -> String
#  reword xs = 
#     xs ++  (head . words . concat . lines $ xs)

这里typeoftypeof_worderorder是Haskell可执行文件,第一个安装了cabal,第二个是上面评论的白痴,在我的本地~\bin编译,以绕过一些逃避废话。在这里,您应该选择Output : Insert as Snippet

对不起,我只想到随意的事情。你应该继续在这个标题下发帖提问,因为我认为值得看看一个人如何绊倒,还有我们聪明的Haskeller朋友可能会想到的。我一直意味着把我的tmbundle的'fork'放在github上,但它并不太令人兴奋,而Bundle目录的组织永远会让我失望。