Mac OS X TextMate 运行 OCaml代码提示出错

Mac OS X TextMate 运行 OCaml代码提示出错 Uncaught exception: Invalid_argument("Fl_package_base.query")  
解决办法,修改 ~/Library/Application\ Support/TextMate/Managed/Bundles/OCaml.tmbundle/Support/OCamlMate/run_script.rb 文件

@ocamlc = ARGV[0]
#修改为:
@ocamlc = File.basename(ARGV[0])

搞定。

顺便美化一下输出,最终修改文件:

#!/usr/bin/env ruby18

require "#{ENV["TM_SUPPORT_PATH"]}/lib/escape"

require ‘open3‘
require ‘cgi‘
require ‘fcntl‘

def esc(str)
  CGI.escapeHTML(str).gsub(/\n/, ‘<br/>‘)
end

class UserScript
  def initialize
    @ocamlc = File.basename(ARGV[0])
    @srcfile = ARGV[1]
    @dstfile = ARGV[2]

    if ENV.has_key? ‘TM_FILEPATH‘ then
      @path = ENV[‘TM_FILEPATH‘]
      @display_name = File.basename(@path)
    else
      @path = ‘-‘
      @display_name = ‘untitled‘
    end
    
    @findlibpackages = (ENV[‘TM_OCAML_FINDLIB_PACKAGES‘] || ‘‘).strip()
    @findlib = "ocamlfind"
  end

  # looks for the location of the threads library
  def find_threads()
    possibilities = [
        ‘/opt/local/godi/lib/ocaml/std-lib/threads‘,
        ‘/usr/local/godi/lib/ocaml/std-lib/threads‘,
        ‘/godi/lib/ocaml/std-lib/threads‘,
        ‘/opt/local/lib/ocaml/threads‘,
        ‘/usr/local/lib/ocaml/threads‘,
        ‘/usr/lib/ocaml/threads‘
      ]
      
    possibilities.each() do |p|
      if File.exists?(p)
        return p
      end
    end
    
    return ""
  end

  def compile
    threadsincludedir = find_threads()
    
    
    # compile it
    if threadsincludedir != ""
      command = "#{e_sh @findlib} #{e_sh @ocamlc} -o #{e_sh @dstfile} -I #{e_sh(threadsincludedir)} -package #{e_sh @findlibpackages} -linkpkg str.cma unix.cma threads.cma #{e_sh @srcfile} 2>&1"
    else
      command = "#{e_sh @findlib} #{e_sh @ocamlc} -o #{e_sh @dstfile} -package #{e_sh @findlibpackages} -linkpkg str.cma unix.cma #{e_sh @srcfile} 2>&1"
    end
    puts "<div style=\"color: #999; border-bottom: 1px solid #CCC;\">#{command}</div>"
    output = `#{command}`
    
    onlywarnings = true
    if output != ""
      output.each_line() do |line|
        if line =~ /^File "(?:.*?)", (line ([0-9]+), characters [0-9]+-[0-9]+):/
          location, line = $1, $2
          print "<span>File \"#{@path}\", <a style=\"color: blue;\" href=\"txmt://open?url=file://#{e_url(@path)}&line=#{line}\">#{location}</a>:</span><br/>"
        else
          print esc(line)
          if line !~ /^Warning/
            onlywarnings = false
          end
        end
      end
      
      if !onlywarnings
        exit 1
      end
    end
  end

  def run
    # run it if the compile suceeded
    stdin, stdout, stderr = Open3.popen3(@dstfile)
    Thread.new { stdin.write @content; stdin.close } unless ENV.has_key? ‘TM_FILEPATH‘

    [stdout, stderr]
  end

  attr_reader :display_name, :path
  
end

error = ""
STDOUT.sync = true

script = UserScript.new
map = {
  ‘SCRIPT_NAME‘       => script.display_name,
  ‘BUNDLE_SUPPORT‘    => "file://#{ENV[‘TM_BUNDLE_SUPPORT‘].gsub(/ /, ‘%20‘)}",
}
puts DATA.read.gsub(/\$\{([^}]+)\}/) { |m| map[$1] }

script.compile
stdout, stderr = script.run
descriptors = [ stdout, stderr ]

descriptors.each { |fd| fd.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK) }
until descriptors.empty?
  select(descriptors).shift.each do |io|
    str = io.read
    if str.to_s.empty? then
      descriptors.delete io
      io.close
    elsif io == stdout then
      print esc(str)
    elsif io == stderr then
      print "<span style=‘color: red‘>#{esc str}</span>"
    elsif io == stack_dump then
      error << str
    end
  end
end

puts ‘</div></pre></div>‘
puts error
puts ‘<div id="exception_report" class="framed">Program exited.</div>‘
puts ‘</body></html>‘

__END__
<html>
  <head>
    <title>OCamlMate</title>
    <link rel="stylesheet" href="${BUNDLE_SUPPORT}/pastel.css" type="text/css">
  </head>
<body>
  <div id="script_output" class="framed">
  <pre><strong>OCamlMate</strong>
<strong>${SCRIPT_NAME}</strong>
<div id="actual_output" style="word-wrap: break-word; border-top: 1px solid #CCC;">

TextMate的PATH变量里,需要有 ~/.opam/system/bin/ 路径

时间: 2024-08-25 22:51:12

Mac OS X TextMate 运行 OCaml代码提示出错的相关文章

Mac OS X 10.10 编译代码出错 fatal error: &#39;__debug&#39; file not found #include &lt;__debug&gt;

1. 错误描述 在mac系统升级到yosemite,或者Xcode版本升级后,在编译c++程序的时候无法通过,错误类型如下: 2. 解决方案 创建一个临时文件"__debug",可以解决这个问题.在命令行中执行以下代码: $ echo '#define _LIBCPP_ASSERT(x, m) ((void)0)' | sudo tee -a /Library/Developer/CommandLineTools/usr/include/c++/v1/__debug > /dev

简单理解在Mac OS X上运行ASP.NET程序

运行ASP.NET程序的三要素: 1) CLR(.NET运行时) 2) KRE(ASP.NET运行时) 3) Web服务器 所以在Mac OS X上运行ASP.NET程序,就需要对应这三要素的东西: 1) CLR - Mono(目前只有Mono可以用,以后可以用Core CLRE) 2) KRE - KRE-Mono(基于Mono的KRE) 3)Web服务器 - Kestrel 接着,用下面的4个命令将这三样东西安装上即可: brew tap aspnet/k brew install kvm

如何在Mac OS X 中运行Lua (Running Lua on Mac OS X)

参考文章:1) http://www.oschina.net/question/12_769552) http://rudamoura.com/luaonmacosx.html 最近在为iOS开发游戏,我的开发机是iPhone5.在开发的游戏项目中需要使用Lua语言,所以想在我的苹果MacBook Pro 中安装Lua语言的解释器,以便进行脚本调试.我的Mac OS X的版本是10.8.3.Lua 是一个轻量级的脚本语言,在游戏开发上使用非常多.它是开源的.我们可以下载它的源码进行编译. 到本文

Mac OS命令行运行Sublime Text

Opening Sublime Text on command line as subl on Mac OS? Mac OS subl http://www.phodal.com/blog/mac-os-command-line-sublime/ http://stackoverflow.com/questions/16199581/opening-sublime-text-on-command-line-as-subl-on-mac-os http://www.sublimetext.com/

Mac os安装MySQL数据库,系统提示mysql: command not found该怎么办

当我们安装好MySQL后,在终端输入mysql命令,发现并不能看到自己安装的数据库,这是因为你没有配置环境变量. 在os系统中安装MySQL数据库默认保存在/usr/local/mysql 那么我们应该如何配置环境变量呢? 1.打开terminal,输入:sudo su   回车  进入系统管理员管理目录(当然你要输入你的用户密码才能进入) 2.输入命令:vim /etc/profile   接着就进入到vim编辑界面 3.在vim编辑界面,按i进入编辑状态,接着,就可以增加路径名称,输入命令:

Mac OS X 10.10 执行 Eclipse 提示须要安装 Java

于 OS X 的 Java 2014-001 Download "适用于 OS X 的 Java 2014-001"改进了安装过程,并会代替之前全部版本号的"适用于 OS X 的 Java". 本软件包会安装 Java 6.它与"适用于 OS X 的 Java 2013-005"中的版本号同样. 在尚未安装"适用于 OS X 的 Java 2012-006"或更高版本号的系统上.本更新会停用 Java SE 6 applet

Mac OS X 背后的故事

Mac OS X 背后的故事 作者: 王越  来源: <程序员>  发布时间: 2013-01-22 10:55  阅读: 25840 次  推荐: 49   原文链接   [收藏] 作者王越,美国宾夕法尼亚大学计算机系研究生,中国著名 TeX 开发者,非著名 OpenFOAM 开发者. Mac OS X 背后的故事(一)力挽狂澜的Ellen Hancock Mac OS X 背后的故事(二)Linus Torvalds的短视 Mac OS X 背后的故事(三)Mach之父Avie Tevan

VMware Workstation 12 Mac OS 安装

准备工作: 1.VMware Workstation 12 Pro 2.Mac OS映像下载 Yosemite Install(14A389).cdr 3.VMware Workstation插件下载 unlocker206.zip或者unlock-all-v120.zip unlocker它是VM虚拟机用来安装mac操作系统必备的补丁,运行这个补丁后,你才可以看到Apple Mac OS X 的安装选项.否则是无法加载ISO(DMG)镜像文件进行安装的.想安装黑苹果这个补丁是不可缺少的 安装过

VMware 12安装Mac OS X 10.11

去年写了一篇安装Mac OS X 10.10的文章,看到大家都想体验OS X,大多数都能成功,但也在其中发现了一些问题,所以更新一下,希望对大家有所帮助. 1048VMware 11安装Mac OS X 10.10 工具/原料 1. VMware Workstation 2. unlocker 206(for OS X 插件补丁) 3. Mac OS X 10.11镜像 步骤一 1 下载以上文件: 1. VM百度一下版本无所谓了,都能满足需要: 2. unlocker 206       链接: