Как заставить нажатие <RET> в helm-find-files открыть каталог?

25

Когда я запускаю #'helm-find-filesи перемещаю точку в каталог, нажатие <ret>приводит к открытию этого каталога в режиме Dired. Нужно нажать, C-jчтобы войти в этот каталог в Хелм.

Я хотел бы <RET>действовать так C-jже, как здесь, но не обязательно везде. Я проверил и C-jсвязан с #'helm-maybe-exit-minibuffer, тогда <RET>как связан с #'helm-execute-persistent-action. Привязка <RET>к #'helm-maybe-exit-minibufferработает в этом случае, но нарушает другие случаи: например, автозаполнение руля describe-function.

Итак, когда я использую Helm для поиска файла, как я могу сделать нажатие, чтобы <RET>открыть этот каталог в Helm?

zck
источник
1
@TuDo я привык ido-mode, где нажатие <RET>выбирает папку для поиска файлов внутри нее. Я думаю, что это наиболее последовательное поведение при попытке найти файл - что вы хотите сделать, когда обнаружили, что файл открыт; то, что вы хотите сделать, когда нашли папку, - это зайти в нее, чтобы найти файл.
zck
2
У Helm противоположное поведение - когда он находится в файле, он <RET>автоматически заполняется и выбирается. Вам не нужно нажимать, <tab>чтобы завершить заполнение имени файла. Но мы спорим о предпочтениях - я просто хочу, чтобы «войти» означало «выбрать вещь в точке». И для меня это не означает «открытое dired». Если бы я был в оболочке, я ожидаю другого поведения.
zck
4
Я здесь с Зком, мышечная память налицо после многих лет использования Идо (и наиболее ожидаемое действие - тренировка вниз), и это было основной болезненной точкой при привыкании к рулю. С тех пор я переключился на использование клавиши со стрелкой вправо для детализации (потребовалось около недели, чтобы привыкнуть)
ustun
1
Я также с Zck. Навигация в ido намного более интуитивна, чем стандартное поведение руля. Особенно клавиша возврата. Он удаляет символ из поиска или возвращается к папке, если ничего не вставлено. Есть ли способ перемонтировать ключи, чтобы получить эту функцию все?
Fu86
1
Начиная с версии 2.6.1, поведение, которое вы хотите, является стандартным.
amitp

Ответы:

19

Я также использовал ido-modeв много и обучил свою мышечную память :) Я думаю , что idoстиль более интуитивный , чем helmподход. Я ищу вещи (набираю несколько символов) и фиксирую поиск (попадание RET), как в строке поиска / адреса моего веб-браузера. Если выбран каталог, я вхожу в этот каталог и снова начинаю поиск в этом каталоге. Это кажется естественным для меня, поэтому я написал небольшой совет, helm-execute-persistent-actionчтобы заставить этого механика.

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

Я также backspaceнемного оптимизировал ключ. Если я что-то наберу и захочу сделать исправление, я нажму клавишу Backspace. Это удалит один символ. Если я нахожусь в начале каталога и снова нажимаю клавишу Backspace, я перемещаюсь на один уровень вверх. Это значительно ускоряет навигацию!

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

Чтобы удалить ненужные .и ..в самом начале, вы можете добавить его в helm-boring-file-regexp-listпеременную конфигурации.

Fu86
источник
1
Подход Хелма согласуется с запасом, find-fileхотя. И, .и ..не очень бесполезно, когда вы хотите открыть Dired в текущем или родительском каталоге. И я считаю, что C-lэто быстрее, чем нажимать backspace.
Ту До
Я возвращаюсь немного назад, чтобы настроить это поведение - есть ли причина, по которой вы используете здесь совет, а не связываете fu / helm-find-files-navigate-forward напрямую (kbd "<return>")? Кажется немного чище просто вызвать helm-execute-persistent-action непосредственно внутри новой функции.
zck
К сожалению, это не работает для меня. Прежде всего, я получаю Symbol's value as variable is void: helm-find-files-map. Когда я ставлю (helm-mode 1)после (require 'helm), я не получаю такой ошибки, но она тоже не работает. Любая идея, что я мог бы пропустить? Вот мой полный init.el: pastebin.com/drFZsDxW Версия Emacs - 24.4.1 (i686-pc-mingw32)
Geier
Не работал для меня Даже с define-key, если я пытаюсь C-h k RETна Teh находкой-файл минибуфер он все еще показывает , helm-confirm-and-exit-minibufferкак связаны.
Рафаэль Ибраим
@RafaelIbraim попробуйте использовать (kbd "RET")
netawater
0

Я не могу комментировать ответ Fu86 из-за повторения, но я не могу его поддержать (извините, если это не нормальный протокол). Я получил функцию void, используя его ответ из-за "helm-find-files-map". У меня получилось использовать вместо этого карту ключей helm-map. Пока никаких конфликтов, и это именно то поведение, которое я искал.

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

Iceback
источник
-1

Я не смог получить ответ @ Fu86 на работу, но у меня сработало следующее:

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

см. также: /programming/27652371/how-can-i-change-emacs-helm-find-file-default-action-on-directory-to-be-go-insid

редактировать

Мое решение работает в helm-20141112.946, но в helm-20160211.934 оно не работает, и ответ @ Fu86 является решением

Джейсон Фертни
источник