Wie kann ich Ido anweisen, aus dem Weg zu gehen, wenn ich den Dateinamen bereits einfügen kann?

14

Ich versuche, mich in den Ido-Modus zu versetzen. Manchmal ist es schön, aber manchmal ist es extrem dumm. Hier ist meine größte Enttäuschung.

Ich habe ein Protokoll mit vollständigen Dateinamen gelesen, dann kopiere ich einen Namen und versuche, diese Datei zu öffnen.

Der Weg, dies ohne Ido zu tun: C-aC-yC-kRET

Mit Ido gibt es zwei Hauptprobleme:

  1. Wenn ich den gesamten Dateinamen habe, gibt es keine Möglichkeit, diesen einzugeben (ich muss den ersten Schrägstrich entfernen, sonst //hilft auch das Drücken von nicht.

  2. Ich kann keine Zwischenteile des Dateinamens bearbeiten, der Rest bleibt unverändert.

Oder kann ich?

wvxvw
quelle
2
Sie können auf Lager zurückfallen find-filemit C-x C-fund in der Regel einfügen. Aber das sind mehr Tastenanschläge. Oder Sie können Helm verwenden, wenn Sie eine Fülle von Funktionen wünschen find-fileund dennoch Ihren Anwendungsfall erfüllen möchten .
Tu Do
1
Ah, danke, nein, ich mache das nicht so oft, dass ich mich über zwei zusätzliche Tastenanschläge beschwere. Dies würde tatsächlich meine Bedürfnisse für den Moment beantworten. Vielen Dank!
wvxvw
@ Tu Do Du solltest das unten als Antwort aufschreiben. Ich fand den C-x C-fFallback so oft nützlich!
Kaushal Modi

Antworten:

17

Während ein idoBefehl aktiv ist ( ido-find-filein diesem Fall), können Sie mithilfe der IDO-Standardbindung für auf die Nicht-IDO- Version desselben Befehls zurückgreifen ( find-filein diesem Fall) .C-x C-fido-fallback-command

Um Ihre Frage zu beantworten,

  • Der erste C-x C-fwird anrufen ido-find-file.
  • Der zweite C-x C-fwird auf zurückgreifen find-file.
  • Dann können Sie C-a C-y C-k RETwie gewohnt einen kopierten Dateipfad in den Minipuffer ziehen.

Hinweis: In ido, C-x C-f C-x C-fwird dasselbe tun wie C-x C-f C-f, dh zurückgreifen auf find-file.

Über C-finido In ido-mode, C-fist verpflichtet , zu ido-magic-forward-char. Von ido.el,

(defun ido-magic-forward-char (arg)
  Msgstr "Bei Benutzereingaben vorwärts gehen oder magische Aktionen ausführen.
Wenn keine Benutzereingabe vorhanden ist oder am Ende der Eingabe, führen Sie magische Aktionen aus:
Cx Cb ... Cf wechselt zu ido-find-file.
Cx Cf ... Cf Fallback auf Nicht-Ido-Find-File.
Cx Cd ... Cf Fallback auf Non-Ido-Brief "dired".
Cx d ... Cf Fallback auf Non-Ido "dired". "
Tu Do
quelle
2
Für mich ist es nur C-fum zurück zu kommen find-file, nicht C-x C-f. Ich sehe nicht, dass ich es angepasst habe (und ich, wie andere hier, verlasse mich viel auf den Fallback. Ist idofast so viel Mühe, wie es sich lohnt, nachdem ich es für eine Weile benutzt habe).
Harpo
1
@harpo Ich habe gerade die Antwort oben aktualisiert und erklärt, warum das C-x C-f C-fauch funktioniert.
Kaushal Modi
Vielen Dank an @kaushalmodi für die meiste Arbeit. Meine Antwort ist zunächst einfach wie der Kommentar. Es sollte seine Antwort sein :) Nur eine Anmerkung zur Glaubwürdigkeit.
Tu Do
Das hat mir den Verstand gerettet, da Ido mit Tramp nicht gut spielt, wenn man absolute Pfade benutzt. Vielen Dank.
Jérémie
6

Wenn Sie mit vollständigen Pfadnamen arbeiten, funktionieren möglicherweise andere Methoden:

  • use M-x ffap( find-file-at-point): liest automatisch den Pfadnamen und öffnet die Datei
  • Aktivieren Sie M-x compilation-shell-minor-modediese Option, um die Schriftart der Pfade zu ändern und sie "anklickbar" zu machen (mit dem Mund oder RET). Wenn Sie darauf klicken, gelangen Sie zu dieser Datei und der entsprechenden Zeile, und Sie können mit next-errorund previous-errornavigieren. Ich benutze es oft, wie im Shell-Modus .
Ehvince
quelle
5

Da es immer mehr als eine Möglichkeit gibt, dies zu tun, gibt es eine Variante der Idee von @ abo-abo, mit der die Ido-Vervollständigung aktiviert bleibt, anstatt auf den normalen Befehl find zurückzugreifen.

(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)

Mit dieser Bindung:

  • Wenn es sich bei dem aktuellen Kill um einen gültigen Verzeichnispfad handelt, können Sie starten ido-find-file, C-ymit der Taste zum ausgewählten Verzeichnis springen und anschließend die IDO-Vervollständigung zum Auswählen einer Datei verwenden.

  • Wenn es sich bei dem aktuellen Kill um einen gültigen Dateipfad handelt, können Sie starten ido-find-file, C-ydrücken, um zum Verzeichnis zu springen und den Dateinamen als Vervollständigung anzugeben. Drücken Sie dann die Taste RET, um die Datei zu öffnen.

  • Wenn der aktuelle Kill etwas anderes ist, wird er normal gerissen.

Glucas
quelle
letKönnte es nicht besser sein, die verschiedenen ido-...Variablen zu binden, als setqsie? Momentan scheint es so, als würden Sie permanent Werte einstellen, anstatt dies für die Lebensdauer der Funktion zu tun.
Dan
@Dan Ich folge dem Muster von Ido-Befehlen wie ido-next-work-directory. Ich denke, die Variablen werden so gesetzt, dass sie über den Exit-Minibuffer-Aufruf und die anschließende Aktualisierung überleben. Aber ich habe die Ido-Interna immer noch nicht voll im Griff!
Glucas
Ja, ich habe mich gefragt, ob sie nachträglich sowieso aufgefrischt werden. Ich wollte nur ein Heads-up machen.
Dan
4

Vielleicht so:

(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)))

Wenn es sich bei dem aktuellen Kill um eine vorhandene Datei handelt, C-y C-y sollten Sie wahrscheinlich das tun , was Sie möchten.

abo-abo
quelle