Comment dire à Ido de s'écarter quand je peux déjà coller le nom du fichier?

14

J'essaie de me faire utiliser le mode Ido. Parfois c'est agréable, mais d'autres fois c'est extrêmement stupide. Voici ma plus grande déception.

J'ai lu un journal avec des noms de fichiers complets, puis je copie un nom, essayez d'ouvrir ce fichier.

La façon de le faire sans Ido: C-aC-yC-kRET

Avec Ido, il y a deux problèmes majeurs:

  1. Si j'ai le nom complet du fichier, il n'y a aucun moyen de saisir cela (je dois supprimer la première barre oblique, sinon même appuyer sur //n'aidera pas.

  2. Je ne peux pas modifier les parties intermédiaires du nom de fichier en laissant le reste non modifié.

Ou puis-je?

wvxvw
la source
2
Vous pouvez revenir au stock find-fileavec C-x C-fet coller normalement. Mais alors, c'est plus de touches. Ou vous pouvez utiliser Helm si vous voulez une fonctionnalité riche find-fileet toujours satisfaire votre cas d'utilisation.
Tu Do
1
Ah, merci, non, je ne fais pas ça si souvent que je me plaindrais de deux frappes supplémentaires. Cela répondrait en fait à mes besoins pour l'instant. Merci!
wvxvw
@Tu Do Vous devriez noter cela comme une réponse ci-dessous. J'ai trouvé la C-x C-fsolution de rechange utile tant de fois!
Kaushal Modi

Réponses:

17

Lorsqu'une idocommande est active ( ido-find-filedans ce cas), vous pouvez revenir à la version non ido de la même commande ( find-filedans ce cas) à l'aide de la liaison ido-default C-x C-fpour ido-fallback-command.

Pour répondre à votre question,

  • Le premier C-x C-fappellera ido-find-file.
  • La seconde C-x C-fretombera sur find-file.
  • Ensuite, vous pouvez faire C-a C-y C-k RETcomme vous le faites habituellement pour extraire un chemin de fichier copié dans le mini-tampon.

Remarque: dans ido, C-x C-f C-x C-ffera la même chose que C-x C-f C-f, c'est-à-dire se replier sur find-file.

About C-finido In ido-mode, C-fest lié à ido-magic-forward-char. De ido.el,

(defun ido-magic-forward-char (arg)
  "Avancez dans la saisie utilisateur ou effectuez une action magique.
Si aucune entrée utilisateur n'est présente ou à la fin de l'entrée, effectuez des actions magiques:
Cx Cb ... Cf passer à `ido-find-file '.
Cx Cf ... Cf repli sur un "find-file" non-ido.
Cx Cd ... Cf repli sur non-Ido brief `dired '.
Cx d ... Cf repli non-ido "dired". "
Tu Do
la source
2
Pour moi, c'est juste C-fpour y revenir find-file, non C-x C-f. Je ne vois pas que je l'ai personnalisé (et moi, comme d'autres ici, je compte beaucoup sur le repli. idoC'est presque autant de problèmes que cela en vaut la peine, après l'avoir utilisé pendant un certain temps maintenant).
harpo
1
@harpo Je viens de mettre à jour la réponse ci-dessus en expliquant pourquoi cela C-x C-f C-ffonctionne également.
Kaushal Modi
Merci à @kaushalmodi pour la majeure partie du travail. Ma réponse est initialement simple comme le commentaire. Cela devrait être sa réponse :) Juste une note de crédibilité.
Tu Do
Cela a sauvé ma raison, car ido ne joue pas bien avec le clochard lors de l'utilisation de chemins absolus. Je vous remercie.
Jérémie
6

Étant donné que vous avez affaire à des noms de chemin complets, d'autres méthodes peuvent fonctionner:

  • use M-x ffap( find-file-at-point): il lira automatiquement le nom du chemin et ouvrira le fichier
  • activer M-x compilation-shell-minor-modequi va changer la police des chemins et les rendre "cliquables" (avec la bouche ou RET). En cliquant dessus, vous accédez à ce fichier et à la ligne spécifique, et vous pouvez utiliser next-erroret previous-errornaviguer. Je l'utilise souvent, comme en mode shell .
Ehvince
la source
5

Puisqu'il y a toujours plus d'une façon de le faire, voici une variante de l'idée de @ abo-abo qui maintient l'achèvement de l'ido actif plutôt que de revenir à la commande find normale.

(defun ido-yank ()
  (interactive)
  (let ((path (current-kill 0)))
    (if (file-exists-p path)
        (progn
          (let ((dir (file-name-directory path)))
            (if dir (ido-set-current-directory dir)))
          (setq ido-exit 'refresh)
          (setq ido-text-init (if (file-directory-p path) nil (file-name-nondirectory path)))
          (setq ido-rotate-temp t)
          (exit-minibuffer))
      (yank))))

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)

Avec cette reliure:

  • Si le kill actuel est un chemin de répertoire valide, vous pouvez commencer ido-find-file, C-yappuyer sur pour accéder au répertoire yanked, puis continuer à utiliser l'achèvement ido pour choisir un fichier.

  • Si le kill en cours est un chemin de fichier valide, vous pouvez commencer ido-find-file, C-yappuyer sur pour accéder au répertoire yanked et proposer le nom du fichier yanked comme achèvement, puis sur RET pour ouvrir ce fichier.

  • Si le kill actuel est autre chose, il est tiré normalement.

glucas
la source
Ne serait-il pas préférable de letlier les différentes ido-...variables plutôt setqqu'eux? À l'heure actuelle, il semble que vous définissiez des valeurs de façon permanente plutôt que de le faire pour la durée de vie de la fonction.
Dan
@ Dan, je suis le modèle des commandes ido comme ido-next-work-directory. Je pense que les variables sont définies de sorte qu'elles survivent à l'appel de sortie-mini-tampon et au rafraîchissement suivant. Mais je ne comprends toujours pas complètement les ido internes!
glucas
Ouais, je me demandais s'ils seraient rafraîchis par la suite de toute façon. Je voulais juste mettre un heads-up.
Dan
4

Peut-être comme ça:

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)
(defun ido-yank ()
  (interactive)
  (if (file-exists-p (current-kill 0))
      (ido-fallback-command)
    (yank)))

Si le kill actuel est un fichier qui existe, faire C-y C-y devrait probablement vous donner ce que vous voulez.

abo-abo
la source