2011-04-15 94 views
11

我是mac新手,并且正在让我的计算机安装程序中包含我需要的所有程序,其中之一是Haskell。在Mac OS X上为Haskell编程设置TextMate

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

我已经下载并安装以下软件:

  • 哈斯克尔平台的Mac OS X
  • 的Xcode 3.4 (Haskell的先决条件)
  • TextMate的
    • haskell.tmbundle文件(如上所述)

是否有人熟悉如何让它工作?这对我来说意味着很多详细的逐步解释,就像我说的,自从我第一次使用OS X以来,我一直只有1天。

谢谢一堆。

+0

WinGHCi本身不是“GUI编辑器”*。你可以使用命令行中的'ghci'程序,这在很大程度上是等价的。我就是做这个的。 我其实更喜欢WinGHCi,它的命令完成很糟糕。 – Ezra 2011-04-15 23:02:02

回答

28

嗯,这是很好的工作,你发现tmbundle现在在Github上。

您应该能够通过点击Bundles,然后Haskell找到内置选项。标准Haskell.tmbundle中有相当少的。最明显有用的是...加载文件command-shift-rcommand-R。如果你写了一个结尾为.hs或.lhs的模块,它会以ghci打开它。但是谁知道呢?一个非集成终端的一个令人讨厌的特点是,人们试图通过点击命令-R而不是通过执行来重新加载:r在ghci;在某些疯狂,它会发展,我有15个副本的终端打开。)

很多不错的功能只是一般的TextMate的东西,由语言描述决定,所以它可能是好的阅读一般性描述TextMate细节。例如,如果几个线highlighed,然后命令 - /评论他们与-- S;或者,如果它们已被评论,则取消注释。我砍死在一起的东西要做到这一点,没过多久,我意识到它已经在那里了,没有研究说明书不够紧密。

一切有键绑定,当然,它是很容易的添加自己的运行小脚本,然后插入小片段,远远超过在Emacs,说。

Bundles点击Bundle Editor并研究不同性质的东西的文本。

因此,例如,做一个标签触发启动语言扩展编译{-#LANGUAGE ... #-}光标所在的空间...做出Snippet的副本并替换

{-#LANGUAGE ${1}#-} 

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

一件好事就是它们都是shell脚本,或者(像这样)一些带有一些TextMate变量的部分shell脚本,你可以用你自己的首选语言编写它们。 (对于Haskell包,我没有任何Haskell人可以谈论,但是对于其他捆绑包)。

语法高亮显示出人意料地合理,但是出现了一些奇特的扩展,例如, “PackageImports”,GADT语法,Haddock文档系统的标记以及其他一些古怪的东西。我已经破解了我自己的,但是我发现语法文件的格式非常难以理解,所以发送一份副本是没有用的。 Haskell.tmbundle在过去的两三年中已经被一些知识渊博的哈斯克勒斯所修正。最初做这件事的人只是学习Haskell,并没有例如组成了Haddocked模块,但另一方面,他似乎非常熟练,并且对TextMate机器有深入的了解。

通过TextMate以一种相当奇怪的方式存储您在Bundle Editor中所做的修正的通知。 TextMate附带的捆绑包,例如C,Ruby,HTML,LaTeX等在/Applications/Textmate.app/.../Bundles。你安装的是/Library/Application\ Support/TextMate/Bundles。当你通过Bundle Editor进行修正时,它们被存储在你的本地~/Library/Application\ Support/TextMate/Bundles.这有点合理,但有点复杂,并且阻碍了Haskell包的公共改进。 (我与人分享的一束,而不是哈斯克尔,我保留在git修订版的最后一个最外面的目录中,所以原始和我的校正结合在一起。)

“Hoogle查找”键绑定/选项突出显示的条款;这里是为hayoo网站的翻版,如果你CABAL安装hoogle可搜索式签名

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

的用途,那么你可以做一个本地电话用一个脚本来hoogle像这样:

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

选择保存:没什么,输入:选定的文本,或者:字,输出:显示为HTML

我已经做多琐碎的其他emendations,就像一个标签触发片段的`{ - #语言...# - }或者我自己的怪癖。

值得一提的是,我设法整合了来自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(命令文件)标题和包括这样的:

#!/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的可执行文件,所述第一第二个就是上面评论过的白痴,编在我的当地~\bin左右一些逃脱的废话。在这里您应该选择Output : Insert as Snippet

对不起,我只是在想随机的事情。你应该在这个标题下继续发布问题,因为我认为看看人们如何绊倒是值得的,但也是我们聪明的哈斯克勒朋友可能想到的。我保留在github上放置我的tmbundle的'fork'的意思,但它并不太刺激,并且Bundle目录的组织永远打败了我。

+0

哇谢谢!你不知道我多么感谢你所涵盖的所有细节。如果可以,三倍“接受答案” – Panicos 2011-04-15 23:56:13