play-code.el:把代码发送到在线的 playgrounds 执行


#1

当本地不具备环境或本地电脑太慢(比如我的),可利用在线的 playgrounds 来验证一些简单的代码。

通常只需 M-x play-code 调用即可,只有当无法断定语言版本(例如py2 / py3)的时候,需要在弹出的列表中进行选择。

play-code 函数可作用于:

  • region
  • buffer
  • block (或 block 中的 region ) ;; require org-mode / markdown

目前实现了向 rextester.com(优先)和 labstack.com 两个后端发送代码,用户可通过修改 play-code-ground-alist 变量来调整优先级(即先后顺序)。

wikipedia#Comparison_of_online_source_code_playgrounds 有整理一个各种 playground 对比的表格,其中大部分我都不了解。

还有哪些靠谱并且没太多限制(例如无需注册、允许匿名提交)的 playground 欢迎推荐。

另,对于 https://jsfiddle.net 之类的目前还没什么思路。一是要考虑如何组织本地代码(js/css/html);二是如何展示返回结果。如果太复杂了这个包就失去意义了,我的初衷是:直接把代码片段/block 发送到远程执行,无需在代码中增加帮助识别的标记之类的,因为 markdown / orgmode 本身已经具备了,加了影响阅读。


APPEND:

给 org-babel 增加了一个 :playonline 关键字,详见 #22 楼。


#2

好东西 怎么没人顶


#3

加了一行代码 可以在python-mode下面用了


#4

加了一行什么?原本不是就可以在 python-mode 下用吗?


#5

试了下 Go 的 Hello World 提示

Compiler args must contain ‘-o a.out’

换用 play-code-send-to-labstack 没这个问题。


https://code.labstack.com 的 API 文档在哪?Google https://code.labstack.com/api/v1/run 没发现。


#6

我也没看到文档。

这个错误是 rextester 返回的,它竟然需要提交额外的参数😅,我先前试过 js/python/swift/rust… 就是没试 go。

可以暂时先把 labstack 放在优先位置:

(setq play-code-ground-alist
  '((play-code-labstack-languages  . play-code-send-to-labstack)
    (play-code-rextester-languages . play-code-send-to-rextester)))

另外,C 类的代码需要包裹在 main 函数:

package main

import (
  "fmt"
)

func main() {
  fmt.Println("Hello from Go!")
}

稍后我会加上自动包裹 mian 的功能。


#7

替换了

(_ (error "Don't know how to detect the block, please use `play-code-region' instead"))


#8

那你的代码中用到的 https://code.labstack.com/api/v1/run 是从何得知的?


#9

用 Chrome Developer Tools 看来的。


#10

你是在执行 markdown / org-mode 代码块的时候遇到这个问题?


#11

怪不到 Google 不到 https://code.labstack.com/api/v1/run,而 GitHub 只有一个搜索结果(就是你写的)。


#12

@xuchunyang

增加一个 play-code-rextester-compiler-args 来存放额外的编译参数,目前只有 go 的:

还有哪些语言需要参数我没有一一去核对(应该是大部分都不需要),等出错了再来添加吧。


#13

我觉得 没有必要区分region和block

在.py文件中发送region的意义不大 因为两次region之间没有联系


#14

C GCC 也有同样问题,https://rextester.com/l/c_online_compiler_gcc 用的是

-Wall -std=gnu99 -O2 -o a.out source_file.c

估计哪些需要编译的语言会需要

https://en.wikipedia.org/wiki/Compiled_language


#15

不完全是,目前发现 c/cpp/d/go/haskell/objc 需要编译参数(已提交 commit:603551e),但 cl/ocaml/rust/swift… 等其它却又不需要。


#16

好东西啊,顶一下。


#17

把 3 个方法合并了,现在只提供一个 play-code


#18

对于https://jsfiddle.net

只能是通过给浏览器写个插件 让他能接收emacs传来的数据 并把数据变成浏览器内的要编辑的内容

输出的内容还得靠浏览器显示 emacs只能算是附属品


#19

ensure-main-wrap 系列函数

重复的代码太多了 可以用宏精简代码


#20

我有想过定义一个 define-main-wrapper 宏来生成函数,减少 if then 的部分,else 部分还是少不了,函数的个数也少不了。

不过我的打算是先上 travis,把测试用例给补完再说。