Ipython: Complétions d'onglets pour les chemins cassés à nouveau dans 7.2.0

Créé le 14 déc. 2018  ·  32Commentaires  ·  Source: ipython/ipython

L'achèvement des tabulations pour les chemins dans les chaînes semble à nouveau être interrompu (précédemment noté à de nombreux endroits, comme # 10961, # 10996, problème de bloc - v7.2.0 :

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

Comparé au comportement dans v7.1.1 :

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

Probablement lié à # 11503, car la désactivation de Jedi (paramètre c.IPCompleter.use_jedi = False dans ipython_config.py ) donne le bon comportement.

Information système

{'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

Commentaire le plus utile

La mise à niveau vers ipython == 7.1.1 semblait fonctionner comme un correctif pour moi.

Tous les 32 commentaires

J'ai le même problème, ipython 7.2.0.

La mise à niveau vers ipython == 7.1.1 semblait fonctionner comme un correctif pour moi.

Quelqu'un pourrait-il partager si l'activation de jedi aidé son flux de travail, et si c'est le cas, j'aimerais savoir comment?

Cela a certainement rendu ma vie beaucoup plus difficile: pas de complétion à plusieurs niveaux, pas de complétion de dossier, et je ne peux pas non plus utiliser la saisie semi-automatique avant d'exécuter la cellule ( df = pd.DataFrame(); df.val<TAB> échoue)

Le bogue a certainement rendu ma vie beaucoup plus difficile aussi.

l'auto-complétion est probablement l'une des caractéristiques les plus importantes d'un shell interactif. Existe-t-il un moyen de coexister entre Jedi et l'auto-complétion de chemin?
Quelques heuristiques très simples pour décider d'utiliser jedi ou la complétion héritée aideront beaucoup: si l'on est dans une chaîne, alors il est peu probable que l'on veuille des noms de l'espace de noms actuel.

Pour ceux qui ont rencontré des problèmes de rétrogradation, j'ai trouvé le commentaire de @ivirshup très utile - pour désactiver jedi autocomplete dans la configuration ipython. Si vous ne l'avez pas déjà fait, vous pouvez générer un ipython_config.py avec:

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

Et changez c.IPCompleter.use_jedi = False en ipython_config.py

[Le completer Jedi] a certainement rendu ma vie beaucoup plus difficile: pas de complétion à plusieurs niveaux, pas de complétion de dossier, […]

Non non Non. Ce n'est pas le completer Jedi qui fait ça. Il y a plusieurs finissants et vous décrivez que le mauvais completer est sélectionné parce que le code de sélection du completer est cassé. Et toucher la liste des finissants en activant les jedi a découvert ce bogue. @takluyver décrit le problème dans https://github.com/ipython/ipython/pull/10996#issuecomment -378288569.

Désactiver à nouveau jedi est une solution de contournement temporaire, mais la correction du code de sélection complet (# 11064 je pense) serait bien sûr une bien meilleure solution.

Je crois comprendre que tous les finissants travaillent en même temps. Les compléteurs sont définis ici , et ils sont tous utilisés en même temps . La liste matches (le résultat de l'auto-complétion) contiendra la concaténation de tous les résultats des compléteurs, et le compléteur file_matches fait toujours partie.

Ainsi, la complétion du chemin / nom de fichier n'est pas "cassée" lorsque jedi est activé, c'est juste qu'il y a tellement de résultats (provenant de jedi) que vous ne pouvez plus voir votre chemin de fichier correspondant.

Ma première idée de solution serait de désactiver l'auto-complétion Jedi lors de la saisie d'une chaîne? Cela fonctionnerait-il?
La seule chose qui ne fonctionnerait pas est l'auto-complétion lors de l'exécution de code avec eval ou exec , mais je pense que nous ne pouvons pas résoudre tous les cas d'utilisation. Et il semble que certaines personnes aiment la complétion automatique du chemin du fichier.

EDIT: En lisant l'autre problème que vous avez lié à @ flying-mouton # 11064, je comprends qu'il existe déjà une logique pour ne pas utiliser de jedi lors de la saisie d'une chaîne, mais il est cassé?

Juste pour illustrer ce que je dis. Les deux captures d'écran ont été prises à l'aide de jedi, vous voyez que l'auto-complétion du chemin fonctionne toujours, il vous suffit de taper un peu plus car il y a plus de correspondances.
test1
test2

C'est généralement mon problème: taper un peu aide, mais ce n'est pas toujours une option si vous ne connaissez pas la première lettre du fichier. Même si vous avez clairement commencé à taper un chemin, après chaque "/", le completer "réinitialise" le mode par défaut de me montrer abs (), all () et d'autres fonctions intégrées.
image

C'est un gros problème si vous avez de longs chemins avec quelques dossiers imbriqués. L'auto-complétion Bash ajouterait simplement des éléments sur "onglet". Avec la saisie semi-automatique ipython actuelle, vous devez vous souvenir de la première lettre ou de quelques-uns de chaque dossier / fichier, tapez-le, puis continuez à parcourir quelques éléments intégrés avant de trouver votre fichier / dossier.

S'il y avait un moyen de supprimer toutes les fonctions intégrées de l'autocomplétion, et toute la magie d'ipython - ce serait déjà beaucoup mieux!

Je sais comment taper «abs», et la plupart d'entre nous peuvent le taper plusieurs fois plus rapidement que de le sélectionner dans la liste de saisie semi-automatique. Je ne suis pas sûr qu'il y ait une bonne raison à cela, et d'autres fonctions intégrées de 3-4 lettres, d'être là en premier lieu! Idéalement, s'il y avait un moyen de modifier la liste des fonctions intégrées, je laisserais juste quelques noms longs que j'utilise, comme DepercationWarning, et je me débarrasserais de tout le reste.

Regardez simplement le cas d'utilisation dans l'image: Pourquoi voudrais-je taper un nom d'objet Python à l'intérieur d'une chaîne littérale?

Je peux trouver un cas d'utilisation simple:

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

C'est peut-être un cas d'utilisation moins courant, mais cela peut arriver. Je conviens que l'achèvement du chemin est plus important que ce cas d'utilisation pour la plupart des utilisateurs.

Ouais, c'est une possibilité, et certaines personnes comptent beaucoup sur l'exécutif.

Idéalement, la saisie semi-automatique devrait détecter qu'elle est dans un mode de nom de fichier, et à partir de là, fonctionner comme une complétion normale de tabulation bash. Un bon proxy commence par "/", "./" ou "C:" "D:" etc.

Il est encore moins probable que la chaîne commençant par ces variables contienne des expressions python valides.

Je suis sûr que l'on peut faire un exemple de a = "C:print(abs(-3))"; exec(a[2:]) mais c'est très peu probable.

Ouais, en fait, le code est censé ignorer l'achèvement du Jedi lorsque vous tapez une chaîne. Voir cette ligne: https://github.com/ipython/ipython/blob/65778adec13a65f82c5d2bab123e7a63516702c8/IPython/core/completer.py#L1375
Et cela s'appuie sur la logique d'analyse interne du Jedi pour essayer de déterminer si nous sommes dans une chaîne ou non.
J'ai testé un peu ce code et il s'avère qu'il est un peu cassé, par exemple en tapant path = " il verra que vous êtes dans une chaîne, mais pas avec path = "./ . Je suppose que nous pouvons trouver une meilleure solution en utilisant tokenize .

Est-ce parce que Jedi ne pense pas que c'est une ErrorLeaf, ou est-ce parce que revenir en arrière par deux nœuds est insuffisant?

Je ne suis pas sûr, et j'ai rapidement changé d'avis sur tokenize parce que je n'aimais pas le fait qu'il repose sur des trucs Jedi internes (API privée).

tokenize a aussi son problème. Que faire si la cellule lève une IndentationError ou SyntaxError avant l'ouverture de la chaîne?

Vous devrez peut-être revenir en arrière progressivement, mais vous vous attendez toujours à une erreur près du curseur en raison de la déclaration de chaîne incomplète?

Avec tokenize, je pense à une logique simple comme cela se fait dans inputtransformer2.py . Il y a une certaine logique pour savoir si l'utilisateur tape une liste ou un dictionnaire dans le terminal, de sorte qu'en appuyant sur enter vous n'exécutez pas le code, vous mettez une nouvelle ligne:
test1
test2
Peut-être que nous pouvons essayer quelque chose d'équivalent avec les caractères " et ' (je peux essayer de trouver un PR).

Une autre idée pourrait également être d'utiliser une expression régulière, je serais inutile dans ce cas cependant: P

tokenize a aussi son problème. Que faire si la cellule lève une IndentationError ou SyntaxError avant l'ouverture de la chaîne

Je suppose que ce ne serait tout simplement pas complet ... Quel est le comportement actuel? La saisie semi-automatique fonctionne-t-elle toujours lorsque vous avez une SyntaxError dans votre code? On devrait vérifier

Même problème après la mise à jour vers la version 7.3.0.

Oui, cela fonctionne lorsque vous avez une SyntaxError.

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

IIRC tokenize est assez robuste en ce qui concerne les erreurs de syntaxe - le type d'extrait que vous montrez peut toujours être symbolisé correctement, l'erreur ne survient que lorsque vous essayez de donner un sens aux jetons.

Je ne suis pas sûr de ce que cela ferait avec quelque chose comme une chaîne non terminée sur la ligne précédente, ce qui pourrait être une erreur de syntaxe au niveau de la tokenisation.

Problèmes similaires avec la dernière installation de conda:

python                    3.7.3
ipykernel                 5.1.0              
ipython                   7.4.0           

En fait, je n'obtiens aucun onglet. Ce n'est que dans une fonction (shift + double-tab) que j'obtiens la complétion docstring. Pas de complétion de méthode sur les objets du tout. La saisie de chemins dans les chaînes fonctionne comme prévu, c'est-à-dire qu'aucune variable globale n'est répertoriée.

Le problème persiste dans IPython 7.7.0 installé via conda:

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

Et ce sera le cas jusqu'à ce que ce numéro et # 10926 soient fermés. @ JeremySikes73 et moi

Merci d'avoir essayé d'aider, mais je pense qu'il est plus productif de lire # 10926, de plonger dans le code et de découvrir comment améliorer la situation que de dire «c'est toujours un problème».

Aide pour le tag

@meeseeksdev tag tab-complétion

Pour ceux qui ont rencontré des problèmes de rétrogradation, j'ai trouvé le commentaire de @ivirshup très utile - pour désactiver jedi autocomplete dans la configuration ipython. Si vous ne l'avez pas déjà fait, vous pouvez générer un ipython_config.py avec:

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

Et changez c.IPCompleter.use_jedi = False en ipython_config.py

Quel fichier éditer? ipython_kernel_config.py ou ipython_config.py ?

Une solution temporaire pour ce problème consiste à ajouter une deuxième barre oblique après avoir appuyé sur l'onglet.

Après avoir tapé '/<TAB>
image

Après avoir tapé /
image

Une fois qu'un élément est sélectionné, il n'y aura qu'une seule barre oblique comme séparateur:

Après avoir appuyé sur retour
image

Notez que l'ajout de la deuxième barre oblique avant d' appuyer sur tab ne change pas le menu contextuel.

J'ai mis à niveau vers la dernière version d'ipython à partir d'aujourd'hui (7.11.0), et le problème persiste.

@ Flying- Sheep @augustogoulart Êtes-vous

Cela ne corrige pas complètement # 10926 ou ceci, car ce serait bien de désactiver (à mon avis):

  • la complétion de fichier correspond à une chaîne de clé de dictionnaire
  • la complétion magique correspond à n'importe quelle chaîne

mais cela désactive au moins les jedi dans une chaîne, ce qui contribue grandement à rendre mes propres modèles d'utilisation réalisables.

Je ne suis moi-même qu'un petit contributeur, mais je parie qu'ils aimeraient avoir de l'aide pour résoudre ce problème!

Cette page vous a été utile?
0 / 5 - 0 notes