【发布时间】:2019-11-09 13:33:58
【问题描述】:
我正在尝试将 Rubocop 的格式化程序集成到编辑器中:给定一些 Ruby 代码作为输入,返回一个表示等效格式化代码的字符串。我正在考虑 Rubocop 的帮助建议的 -s 选项:
-s FILE - 来自 STDIN 的管道源,在攻击报告中使用 FILE。这对于编辑器集成很有用。
在终端中,以下命令成功读取输入内容并将格式化的输出打印到标准输出:
cat some_file.rb | rubocop -a -f fi -s some_file.rb
但是,我无法使用 Rubocop API 以编程方式重现类似内容。我希望以某种方式将输入提供给RuboCop::Runner,但是,在我到达这一点之前,只需解析选项就挂起:
require 'rubocop'
input = "some_var = 'hello'"
options, paths = RuboCop::Options.new.parse(['-a', '-f', 'fi', '-s', 'some_file.rb'])
runner = RuboCop::Runner.new(options, RuboCop::ConfigStore.new)
...
当然,一种选择是删除-s 并对临时文件进行操作,但这会增加复杂性并且效率较低。
如何使用 API 方便地生成格式化输出?
【问题讨论】:
-
我能问一下您正在尝试为哪个编辑器集成构建集成,您是否有关于如何执行此操作的指南或说明?
-
@lacostenycoder 我的目标是 Solagraph 项目,因此任何支持语言服务器协议的编辑器。我提交了一个使用临时文件(github.com/castwide/solargraph/pull/239)触发格式化的 PR,但我觉得它有点慢和笨重,因此这个问题试图想出一个更好的方法。
-
调用
Options::parse将尝试从stdin读取,因此您的进程会卡住。为什么不直接使用popen(3)作为另一个进程调用 Rubocop,然后写入该进程的标准输入。