Jak powiedzieć Ido, aby zszedł z drogi, gdy mogę już wkleić nazwę pliku?

14

Próbuję zmusić się do korzystania z trybu Ido. Czasami jest fajnie, ale innym razem jest wyjątkowo głupio. Oto moje największe rozczarowanie.

Przeczytałem jakiś dziennik z pełnymi nazwami plików, a następnie skopiowałem jedną nazwę, spróbuj otworzyć ten plik.

Sposób na zrobienie tego bez Ido: C-aC-yC-kRET

W przypadku Ido istnieją dwa główne problemy:

  1. Jeśli mam całą nazwę pliku, nie ma możliwości, aby ją wprowadzić (muszę usunąć pierwszy ukośnik, w przeciwnym razie nawet naciśnięcie //nie pomoże.

  2. Nie mogę edytować pośrednich części nazwy pliku, pozostawiając resztę niezmodyfikowaną.

Czy mogę?

wvxvw
źródło
2
Można spaść z powrotem na magazynie find-filez C-x C-fi wkleić normalnie. Ale to więcej naciśnięć klawiszy. Możesz też użyć Hełmu, jeśli chcesz mieć bogatą funkcjonalność find-filei nadal zaspokajać swój własny przypadek użycia.
Tu Do
1
Ach, dzięki, nie, nie robię tego tak często, że narzekałem na dwa dodatkowe naciśnięcia klawiszy. To właściwie na razie odpowiada na moje potrzeby. Dzięki!
wvxvw
@ Tu Czy powinieneś to zapisać jako odpowiedź poniżej. Zastanawiałem się C-x C-ftak wiele razy!
Kaushal Modi,

Odpowiedzi:

17

Podczas gdy idopolecenie jest aktywne ( ido-find-filew tym przypadku), można spaść z powrotem do non-ido wersji tego samego polecenia ( find-filew tym przypadku) za pomocą wiązania IDO-default C-x C-fdla ido-fallback-command.

Aby odpowiedzieć na twoje pytanie,

  • Pierwszy C-x C-fzadzwoni ido-find-file.
  • Drugi C-x C-fwróci do find-file.
  • Następnie możesz zrobić C-a C-y C-k RETtak, jak zwykle, aby przeciągnąć skopiowaną ścieżkę pliku do minibufora.

Uwaga: W ido, C-x C-f C-x C-fzrobi to samo co C-x C-f C-f, tj. Cofnie się do find-file.

O C-fwido In ido-mode, C-fjest związany ido-magic-forward-char. Z ido.el,

(defun ido-magic-forward-char (arg)
  „Przejdź do przodu, wprowadzając dane użytkownika lub wykonaj magiczną akcję.
Jeśli nie ma danych wejściowych użytkownika lub na końcu danych wejściowych, wykonaj magiczne działania:
Cx Cb ... Cf przełącz na `ido-find-file '.
Cx Cf ... Cf powrót do „znajdź plik” innego niż Ido.
Cx Cd ... Cf powrót do non-Ido short `dired '.
Cx d ... Por. Powrót do „dired” nie-Ido.
Do zrobienia
źródło
2
Dla mnie to tylko C-fpowrót find-file, nie C-x C-f. Nie widzę, żebym go dostosował (i podobnie jak inni tutaj polegam bardzo na wycofaniu. idoPo użyciu przez pewien czas mam prawie tyle samo kłopotów, ile warto).
harpo
1
@harpo Właśnie zaktualizowałem powyższą odpowiedź, wyjaśniając, dlaczego C-x C-f C-frównież działa.
Kaushal Modi
Dzięki @kaushalmodi za większość pracy. Moja odpowiedź jest początkowo prosta jak komentarz. To powinna być jego odpowiedź :) Tylko uwaga na wiarygodność.
Tu Do
To uratowało moje zdrowie psychiczne, ponieważ ido nie gra ładnie z trampem, gdy używa absolutnych ścieżek. Dziękuję Ci.
Jérémie
6

Biorąc pod uwagę, że masz do czynienia z pełnymi nazwami ścieżek, inne metody mogą działać:

  • use M-x ffap( find-file-at-point): automatycznie odczyta nazwę ścieżki i otworzy plik
  • aktywuj, M-x compilation-shell-minor-modeco zmieni czcionkę ścieżek i sprawi, że będą „klikalne” (ustami lub RET). Kliknięcie go powoduje przejście do tego pliku i określonej linii oraz umożliwia nawigację next-errori używanie previous-error. Często go używam, jak w trybie powłoki .
Ehvince
źródło
5

Ponieważ zawsze można to zrobić na więcej niż jeden sposób, oto wariant pomysłu @ abo-abo, który sprawia, że ​​uzupełnianie ido jest aktywne, zamiast wracać do normalnego polecenia find.

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

Z tym wiązaniem:

  • Jeśli bieżące zabicie jest prawidłową ścieżką do katalogu, możesz rozpocząć ido-find-file, naciśnij, C-yaby przejść do podciągniętego katalogu, a następnie kontynuować używanie ido uzupełniania, aby wybrać plik.

  • Jeśli bieżące zabicie jest prawidłową ścieżką do pliku, możesz rozpocząć ido-find-file, naciśnij, C-yaby przejść do podciągniętego katalogu i zaoferować podciągniętą nazwę pliku jako zakończenie, a następnie naciśnij RET, aby otworzyć ten plik.

  • Jeśli obecne zabójstwo jest czymś innym, zostaje ono normalnie szarpane.

glucas
źródło
Czy nie lepiej byłoby letpowiązać różne ido-...zmienne niż setqje? W tej chwili wygląda na to, że ustawiasz wartości na stałe, a nie robisz to przez cały okres użytkowania funkcji.
Dan
@Dan Idę zgodnie z wzorcem poleceń ido jak ido-next-work-directory. Myślę, że zmienne są ustawione tak, aby przetrwały w wywołaniu minibufora wyjściowego i późniejszym odświeżeniu. Ale wciąż nie do końca rozumiem wewnętrzne elementy ido!
glucas
Tak, zastanawiałem się, czy i tak zostaną odświeżone. Chciałem tylko postawić jeden na jednego.
Dan
4

Może tak:

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

Jeśli bieżące zabicie jest plikiem, który istnieje, wykonanie C-y C-y prawdopodobnie powinno dać ci to, czego chcesz.

abo-abo
źródło