Ipython: 在7.2.0中再次断开的路径的制表符补全

创建于 2018-12-14  ·  32评论  ·  资料来源: ipython/ipython

字符串中的路径的制表符补全似乎又被破坏了(以前注意到很多地方,例如#10961,#10996,笔记本问题#3333 )。 这是我在v7.2.0得到的东西:

screen shot 2018-12-14 at 12 39 17 pm

v7.1.1的行为相比:

screen shot 2018-12-14 at 12 38 20 pm

可能与#11503有关,因为禁用Jedi(在ipython_config.py设置c.IPCompleter.use_jedi = False ipython_config.py )会给出正确的行为。

系统信息

{'commit_hash': '523ed2fe5',
 'commit_source': 'installation',
 'default_encoding': 'UTF-8',
 'ipython_path': '/usr/local/lib/python3.6/site-packages/IPython',
 'ipython_version': '7.2.0',
 'os_name': 'posix',
 'platform': 'Darwin-17.7.0-x86_64-i386-64bit',
 'sys_executable': '/usr/local/opt/python/bin/python3.6',
 'sys_platform': 'darwin',
 'sys_version': '3.6.5 (default, Jun 17 2018, 12:13:06) \n'
                '[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]'}

help wanted tab-completion

最有用的评论

降级到ipython == 7.1.1似乎可以解决我的问题。

所有32条评论

我有同样的问题,ipython 7.2.0。

降级到ipython == 7.1.1似乎可以解决我的问题。

如果启用jedi帮助他们共享工作流程,有人可以分享吗?如果可以,我想知道如何?

这无疑使我的生活更加困难:没有多级完成,没有文件夹完成,也无法在运行单元之前使用自动完成功能( df = pd.DataFrame(); df.val<TAB>失败)

该错误当然也使我的生活更加艰难。

自动完成可能是交互式外壳程序最重要的功能之一。 jedi和路径自动完成可以共存吗?
决定使用jedi或旧式补全的一些非常简单的启发式方法将大有帮助:如果一个字符串中有一个字符串,则不太可能需要从当前名称空间中获取名称。

对于那些遇到降级问题的人,我发现@ivirshup的注释最有用-在ipython配置中禁用jedi自动完成功能。 如果还没有,可以使用以下命令生成ipython_config.py

# Generate config
ipython profile create
# Edit config file in vim
vim .ipython/profile_default/ipython_kernel_config.py 

并在ipython_config.py更改c.IPCompleter.use_jedi = False ipython_config.py

[绝地完成者]当然使我的生活更加艰难:没有多级完成,没有文件夹完成,[…]

不不不。 不是绝地完成者这样做。 有多个完成程序,您正在描述选择了错误的完成程序,因为完成程序选择代码已损坏。 通过启用jedi接触完成者列表,发现了该错误。 @takluyverhttps://github.com/ipython/ipython/pull/10996#issuecomment -378288569中描述了该问题。

再次禁用jedi是一个暂时的解决方法,但是实际上修复完整的选择代码(我认为是#11064)当然是更好的解决方案。

我的理解是所有完成者都在同时工作。 此处定义同时使用matches列表(自动完成的结果)将包含所有完成者结果的串联,而file_matches仍然是其中的一部分。

因此,启用jedi时,路径/文件名的完成不会“中断”,只是有太多结果(来自jedi),您看不到文件路径匹配了。

我要解决的第一个想法是在输入字符串时禁用jedi自动补全功能? 那行得通吗?
唯一不起作用的是使用evalexec执行代码时自动完成,但是我认为我们无法修复每个用例。 看起来有些人喜欢自动完成文件路径。

编辑:阅读链接到@ flying-sheep#11064的另一个问题,我知道在输入字符串时已经存在不使用jedi的逻辑,但是它坏了吗?

只是为了说明我的意思。 这两个屏幕截图都是使用jedi拍摄的,您会看到路径自动补全仍然有效,您只需要再输入一点,因为有更多的匹配项。
test1
test2

通常这是我的问题:键入一点帮助,但是如果您不知道文件的第一个字母,则并非总是这样。 即使您清楚地开始输入路径,在每个“ /”之后,完成程序也会“重置”为默认模式,向我显示abs(),all()和其他内置函数。
image

如果您的路径较长且带有几个嵌套的文件夹,这将是一个很大的问题。 Bash自动补全只会在“选项卡”上添加内容。 使用当前的ipython自动完成功能,您必须记住每个文件夹/文件的第一个字母或其中的几个字母,键入它,然后在找到文件/文件夹之前仍然需要处理一些内置函数。

如果有一种方法可以从自动补全中删除所有内置函数,以及所有ipython魔术-那就更好了!

我知道如何键入“ abs”,我们大多数人可以比从自动补全列表中选择它快几倍。 我不确定是否有充分的理由,以及其他3-4个字母长的内置文件是否会排在第一位! 理想情况下,如果有一种方法可以编辑内置列表,则只需留下一些我使用的长名称,例如DepercationWarning,然后删除其他所有内容。

只需查看图中的用例:为什么我要在字符串文字内键入Python对象名?

我可以找到一个简单的用例:

exec("print(abs(-3))", [globals()])

也许这是一个不太常见的用例,但它可能发生。 我同意对于大多数用户而言,路径完成比该用例更为重要。

是的,这是一种可能,有些人非常依赖exec。

理想情况下,自动完成功能应检测到它处于文件名模式,并从那里开始像正常的bash选项卡完成一样起作用。 一个好的代理应该以“ /”、“./”或“ C:”,“ D:”等开头。

以这些变量开头的字符串包含有效python表达式的可能性更低。

我敢肯定,可以举一个a = "C:print(abs(-3))"; exec(a[2:])的例子,但这是不太可能的。

是的,实际上,当您键入字符串时,代码应该跳过jedi完成。 看到这一行: https :
并且它依赖于jedi内部解析逻辑来尝试弄清楚我们是否在字符串中。
我测试了一下这段代码,结果发现它有点破损,例如,键入path = " ,会看到您在一个字符串中,但没有使用path = "./ 。 我想我们可以使用tokenize提出一个更好的解决方案。

是因为Jedi认为这不是一个ErrorLeaf,还是因为返回两个节点不足?

我不确定,我很快就将想法转向tokenize因为我不喜欢它依赖于内部jedi东西(私有API)这一事实。

tokenize也有其问题。 如果单元格在字符串打开之前引发了IndentationError或SyntaxError怎么办?

您可能需要逐渐回溯行,但是由于字符串声明不完整,您总是期待光标附近出现错误吗?

使用令牌化,我正在考虑一个简单的逻辑,就像它在inputtransformer2.py 。 有一些逻辑可以知道用户是在终端中键入列表还是字典,因此在按enter时不执行代码,而是添加新行:
test1
test2
也许我们可以尝试使用"'字符进行等效的操作(我可以尝试提出PR)。

另外一个想法可能是使用regexp,但是在这种情况下,我:P

tokenize也有其问题。 如果单元格在字符串打开之前引发了IndentationError或SyntaxError怎么办

我想这只是不完整...当前行为是什么? 当代码中出现SyntaxError时,自动补全功能仍然有效吗? 我们应该检查一下

更新到7.3.0后出现相同的问题。

是的,当您遇到SyntaxError时,它确实起作用。

Screenshot from 2019-03-28 10-48-20

IIRC tokenize在语法错误方面相当强大-您显示的代码段仍然可以进行标记化,只有当您尝试理解标记时,该错误才会出现。

我不确定这将对之前的行中的未终止字符串造成什么影响,这可能是令牌化级别的语法错误。

最新的conda安装类似的问题:

python                    3.7.3
ipykernel                 5.1.0              
ipython                   7.4.0           

我实际上一点都没有完成制表符。 仅在一个函数中(Shift + Double-Tab),我才能获得文档字符串补全。 完全没有对象上的方法完成。 在字符串中键入路径确实可以按预期工作,即未列出全局变量。

通过conda安装的IPython 7.7.0仍然存在问题:

ipython                   7.7.0            py37h5ca1d4c_0    conda-forge
ipython_genutils          0.2.0                      py_1    conda-forge
jedi                      0.14.1                   py37_0    conda-forge
python                    3.7.3                h33d41f4_1    conda-forge

直到此问题和#10926关闭。 @ JeremySikes73和我在哪里出了什么问题的解释,我很确定问题是相同的:IPython的匹配器全部返回结果,而我们应该a)仅运行相关的匹配器或b)向匹配器添加代码,使当结果无关紧要时,它们什么也不返回。

感谢您的帮助,但我认为阅读#10926,深入研究代码并找出改善状况的方法比说“这仍然是一个问题”更有效率。

@meeseeksdev标签需要帮助

@meeseeksdev标签的制表符完成

对于那些遇到降级问题的人,我发现@ivirshup的注释最有用-在ipython配置中禁用jedi自动完成功能。 如果还没有,可以使用以下命令生成ipython_config.py

# Generate config
ipython profile create
# Edit config file in vim
vim .ipython/profile_default/ipython_kernel_config.py 

并在ipython_config.py更改c.IPCompleter.use_jedi = False ipython_config.py

要编辑哪个文件? ipython_kernel_config.pyipython_config.py

此问题的临时解决方法是在按Tab键后添加第二个斜杠。

输入'/<TAB>
image

输入/
image

选择一个项目后,将只有一个斜杠作为分隔符:

按回车后
image

请注意,按Tab键

截至今天(7.11.0),我已升级到最新版本的ipython,问题仍然存在。

@ flying-sheep @augustogoulart您愿意为此提出要求吗? (我的意思是,“ helpwanted”标记表明了这一点,但是我不是现有的参与者,因此不确定此处的开发人员规范。)在检测我们是否在字符串中时,我对逻辑进行了一些细微更改。 ,虽然不是完美的解决方案,但至少可以更好地关闭jedi。

这不能完全解决#10926或这个问题,因为最好关闭电源(在我看来):

  • 在字典关键字字符串中时,文件补全匹配
  • 任意字符串中的魔术补全匹配

但是它在字符串中时至少会关闭jedi,这在使我自己的使用模式可行方面大有帮助。

我本人只是一个小贡献者,但我敢打赌他们希望得到帮助来解决此问题!

此页面是否有帮助?
0 / 5 - 0 等级