Wie mache ich das Drücken von <RET> in Helm-Find-Dateien, um das Verzeichnis zu öffnen?

25

Wenn ich laufe #'helm-find-filesund auf ein Verzeichnis <ret>zeige , führt das Drücken von zum Öffnen dieses Verzeichnisses im dired-Modus. Man muss drücken C-j, um das Verzeichnis in Helm aufzurufen.

Ich hätte gerne so <RET>gehandelt wie C-jhier, aber nicht unbedingt überall anders. Ich habe nachgesehen und bin C-jgebunden an #'helm-maybe-exit-minibuffer, wohingegen <RET>gebunden an #'helm-execute-persistent-action. Die Bindung <RET>an #'helm-maybe-exit-minibufferfunktioniert in diesem Fall, bricht jedoch andere Fälle ab: Beispielsweise wird der Helm automatisch vervollständigt describe-function.

Wie kann ich das <RET>Öffnen dieses Verzeichnisses in Helm veranlassen , wenn ich Helm verwende, um eine Datei zu finden ?

zck
quelle
1
@TuDo Ich bin daran gewöhnt ido-mode, dass durch Drücken von <RET>den Ordner ausgewählt wird, in dem sich Dateien befinden. Ich denke, dies ist das beständigste Verhalten beim Versuch, eine Datei zu finden - was Sie tun möchten, wenn Sie festgestellt haben, dass die Datei geöffnet ist; Was Sie tun möchten, wenn Sie einen Ordner gefunden haben, ist, ihn zu durchsuchen, damit Sie die Datei finden können.
zck
2
Helm hat das gegenteilige Verhalten: Wenn er sich in einer Datei befindet, werden <RET>beide automatisch vervollständigt und ausgewählt . Sie müssen nicht drücken <tab>, um den Dateinamen zu vervollständigen. Aber wir streiten uns über Präferenzen - ich möchte nur "eingeben", um "das Ding am Punkt auswählen" zu bedeuten. Und das heißt für mich nicht "offen". Wenn ich in einer Shell wäre, würde ich ein anderes Verhalten erwarten.
zck
4
Ich bin mit zck hier, das Muskelgedächtnis ist da, nachdem ich jahrelang Ido benutzt habe (und die am meisten erwartete Aktion ist Drilldown) und dies war der Hauptschmerzpunkt, als ich mich an das Steuern gewöhnt habe. Ich bin seitdem dazu
übergegangen
1
Ich bin auch bei zck. In Ido zu navigieren ist viel intuitiver als das normale Verhalten des Ruders. Besonders die Rücktaste. Es löscht ein Zeichen aus der Suche oder springt zurück zum Ordner, wenn nichts eingefügt ist. Gibt es eine Möglichkeit, die Tasten neu zu verdrahten, um diese Funktionalität zu erhalten?
Fu86
1
Ab Helm 2.6.1 ist das gewünschte Verhalten die Standardeinstellung.
6.

Antworten:

19

Ich habe auch verwendet ido-modeeine Menge und trainiert meine Muskelgedächtnis :) Ich denke , der idoStil ist intuitiver als der helmAnsatz. Ich suche nach Dingen (tippe einige Zeichen ein) und gebe den Suchbefehl (Treffer RET) ein, genau wie die Such- / Adressleiste meines Webbrowsers. Wenn es sich bei der Auswahl um ein Verzeichnis handelt, gebe ich dieses Verzeichnis ein und beginne erneut, in diesem Verzeichnis zu suchen. Das erscheint mir natürlich, deshalb habe ich einen kleinen Rat geschrieben, um helm-execute-persistent-actiondiesen Mechaniker zu zwingen.

(require 'helm)
(defun fu/helm-find-files-navigate-forward (orig-fun &rest args)
  (if (and (equal "Find Files" (assoc-default 'name (helm-get-current-source)))
           (equal args nil)
           (stringp (helm-get-selection))
           (not (file-directory-p (helm-get-selection))))
      (helm-maybe-exit-minibuffer)
    (apply orig-fun args)))
(advice-add 'helm-execute-persistent-action :around #'fu/helm-find-files-navigate-forward)
(define-key helm-find-files-map (kbd "<return>") 'helm-execute-persistent-action)

Ich habe auch den backspaceSchlüssel etwas optimiert . Wenn ich etwas eingebe und korrigieren möchte, drücke ich die Rücktaste. Dies löscht ein Zeichen. Wenn ich mich am Anfang des Verzeichnisses befinde und erneut die Rücktaste drücke, navigiere ich eine Ebene nach oben. Dies beschleunigt die Navigation erheblich!

(defun fu/helm-find-files-navigate-back (orig-fun &rest args)
  (if (= (length helm-pattern) (length (helm-find-files-initial-input)))
      (helm-find-files-up-one-level 1)
    (apply orig-fun args)))
(advice-add 'helm-ff-delete-char-backward :around #'fu/helm-find-files-navigate-back)

Um die nutzlos zu entfernen .und ..gleich am Anfang, können Sie es zum hinzufügen helm-boring-file-regexp-listKonfigurationsvariable.

Fu86
quelle
1
Der Helm-Ansatz steht jedoch im Einklang mit der Aktie find-file. Und das .und ..ist nicht wirklich nutzlos, wenn Sie plötzlich Dired im aktuellen oder übergeordneten Verzeichnis öffnen möchten. Und ich finde, das C-list schneller als Drücken backspace.
Di Do
Ich kreise zurück, um dieses Verhalten ein wenig genauer anzupassen. Gibt es einen Grund, warum Sie hier Ratschläge verwenden und nicht direkt an fu / helm-find-files-navigate-forward binden (kbd "<return>")? Es scheint ein wenig sauberer zu sein, wenn Sie die Funktion helm-execute-persistent-action direkt in der neuen Funktion aufrufen.
zck
Leider funktioniert das bei mir nicht. Zuallererst verstehe ich Symbol's value as variable is void: helm-find-files-map. Als ich legte (helm-mode 1)nach (require 'helm), erhalte ich keinen solchen Fehler, aber es funktioniert auch nicht. Irgendeine Idee, was mir fehlen könnte? Hier ist meine komplette init.el: pastebin.com/drFZsDxW Emacs Version 24.4.1 (i686-pc-mingw32)
Geier
Hat bei mir nicht funktioniert. Selbst define-keywenn ich den C-h k RETFind-File-Minibuffer anprobiere, wird er immer noch helm-confirm-and-exit-minibufferals gebunden angezeigt .
Rafael Ibraim
@ RafaelIbraim versuchen (kbd "RET")
Netawater
0

Ich kann die Antwort von Fu86 aufgrund eines Vertreters nicht kommentieren, aber ich mache mir keine Sorgen (sorry, wenn dies kein normales Protokoll ist). Ich habe eine Stornofunktion mit seiner Antwort wegen "Helm-Find-Files-Map". Es hat bei mir funktioniert, stattdessen die "Steuerkarten" -Tastenkarte zu verwenden. Bisher keine Konflikte und es ist das Verhalten, das ich gesucht habe.

... (define-key helm-map (kbd "<return>") 'helm-execute-persistent-action) ...

Iceback
quelle
-1

Ich konnte die Antwort von @ Fu86 nicht zur Arbeit bringen, aber das Folgende funktionierte für mich:

(defun jkf/helm-find-files-navigate-forward (orig-fun &rest args)
  (if (file-directory-p (helm-get-selection)) 
      (helm-execute-persistent-action)
    (apply orig-fun args)))
(advice-add 'helm-confirm-and-exit-minibuffer 
   :around #'jkf/helm-find-files-navigate-forward)

Siehe auch: /programming/27652371/how-can-i-change-emacs-helm-find-file-default-action-on-directory-to-be-go-insid

Bearbeiten

Meine Lösung funktioniert in helm-20141112.946, aber in helm-20160211.934 funktioniert es nicht und @ Fu86 answer ist die Lösung

Jason Furtney
quelle