sublimerepl getenv失败

Kev*_*ter 7 clojure sublimetext sublimetext2 sublimetext3

我想将SiblimeREPL包与Sublime Text一起使用.当我尝试启动REPL时,我明​​白了

SublimeREPL: obtaining sane environment failed in getenv()
Check console and 'getenv_command' setting
WARN: Falling back to SublimeText environment
Run Code Online (Sandbox Code Playgroud)

无论我尝试启动哪种REPL,都会发生这种情况.(我尝试过Ruby,Python和Clojure.)我尝试了Sublime Text 2和Sublime Text 3,结果相同.这是在Mac OS X上,如果这很重要.

我查看了包装设置,我看到了

"getenv_command": ["/bin/bash", "--login", "-c", "env"],
Run Code Online (Sandbox Code Playgroud)

如果我在终端提示符下运行"/ bin/bash --login -c env",我会列出我的环境.

为了获得成功的getenv_command,我需要更改什么?

Vec*_*ohn 15

我和ssgam有同样的问题.我的问题在于getenv方法.它调用subprocess.check_output(getenv_command),它在python 2.6中不存在,ST2似乎使用它.

诀窍是,如果getenv_command是真的,它只调用subprocess.check_output(),否则默认为os.environ.copy().因此,为了在不修改SublimeREPL包的情况下获得ssgam的修复,在Preferences> Package Settings> SublimeREPL> Settings - User中,执行以下操作:

{
  "getenv_command": false
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我对此问题进行了更深入的研究,看起来SublimeText 3也受到了影响.在我的例子中,问题与bash-completion特性有关,特别是COMP_WORDBREAKS环境变量.

使用以下命令显示COMP_WORDBREAKS的内容:

$ echo "$COMP_WORDBREAKS"
Run Code Online (Sandbox Code Playgroud)

将输出

"'><=;|&(:
Run Code Online (Sandbox Code Playgroud)

您还可以使用:

$ echo $COMP_WORDBREAKS
Run Code Online (Sandbox Code Playgroud)

但请注意,使用第二个命令(不带引号),您将看不到该变量还包含换行符.

这里的问题是换行符,它打破了getenv_command功能中的输出解析.如果您提取SublimeREPL的部分源代码,您可以从python解释器获取真正的错误消息.

Traceback (most recent call last):
  File "main.py", line 71, in getenv
    env = dict(line.split('=', 1)  for line in lines)
ValueError: dictionary update sequence element #6 has length 1; 2 is required
Run Code Online (Sandbox Code Playgroud)

您可以将元素#6与env列表中COMP_WORDBREAKS的位置匹配.

解决方案(首先出现在我的脑海中)

在应用以下解决方案之后,我现在无法判断对bash-completion特性的真正影响,当然SublimeREPL也应该相应地修复.请评论我的答案,以填补缺少的知识.

我们可能想删除令人不安的字符以摆脱错误.首先让我们识别那些角色

$ echo -n "${COMP_WORDBREAKS}" | od -t x1c
Run Code Online (Sandbox Code Playgroud)

将输出

0000000  20  09  0a  22  27  3e  3c  3b  7c  26  28  3a
             \t  \n   "   '   >   <   ;   |   &   (   :
0000014
Run Code Online (Sandbox Code Playgroud)

所以我们要删除三个.最简单的方法是添加到.bashrc以下行:

COMP_WORDBREAKS="${COMP_WORDBREAKS#???}"
Run Code Online (Sandbox Code Playgroud)

瞧!没有更多错误消息.

我最后的想法是删除字符.我不完全了解bash-completion是如何工作的,我知道修改COMP_WORDBREAKS会影响使用它的其他脚本.现在你可以随时改变它.

我希望这有帮助.

干杯


Kev*_*ter 3

找到了。修复。SublimeREPL 假设运行 getenv_command 将仅产生运行 env 的输出,并且每一行都将包含一个等号。但我的 .bash_profile 将一些内容回显到标准输出。

解决方案是将我的 .bash_profile 输出包装在

if [[ $- == *i* ]] 
Run Code Online (Sandbox Code Playgroud)

除了执行的命令之外不产生额外的输出。