Недавно я опробовал Sublime Text 2, и я нашел Goto Anything превосходно полезен для навигации по исходному коду (Ctrl-P file @symbol, кажется, работает очень хорошо). Есть ли что-то подобное для Emacs? Предпочтительно что-то, что только работает, без тонны пользовательского elisp.
Что я пробовал до сих пор:
-
Я видел Helm и Anything,
, но насколько я понимаю, ни один из них не способен на "мгновенный" поиск(см. ниже). -
Я использовал
multi-occur-in-matching-buffers
, но тоже кажется неспособным удовлетворить "мгновенный" критерий. -
imenu
/idomenu
отлично работает для отдельных файлов, но не работает с файлами.
В настоящее время я использую # 2 и # 3 вместе, как плохую замену Goto Anything.
Если это не точный клон Goto Anything, то я мог бы сделать это с помощью наивного решения мгновенного поиска (которое ищет заданную строку во всех открытых буферах и отображает результаты динамически). Так что это тоже приемлемо.
Я использую Emacs 24.2, поэтому любой elisp с v24 тоже отлично.
EDIT. Я еще раз нажал Helm в event_jr, и обнаружил, что он поддерживает мгновенный поиск во всех открытых буферах. helm-multi-occur
+ helm-follow-mode
на удивление близок к удовлетворению моих потребностей, единственными незначительными проблемами являются (с риском зондирования nit-picky):
-
Я не нашел способ включить(см. Править # 2 ниже)helm-follow-mode
автоматически при запускеhelm-multi-occur
. Я должен вызвать его вручную с помощьюC-c C-f
. Кто-нибудь хочет сделать снимок с помощью фрагмента elisp? -
он не "интеллектуальный", как ST2 Goto Anything (т.е. он не понимает "символы" в исходном коде, например Goto Anything).
EDIT # 2: теперь у меня есть большая часть Goto Anything, благодаря event_jr ответу ниже (и, конечно же, благодаря Создатель шлема, Thierry Volpiatto). Я рекомендую его всем, кто ищет подобную функцию. Ниже показан elisp, который я использую в настоящее время:
;; instant recursive grep on a directory with helm
(defun instant-rgrep-using-helm ()
"Recursive grep in a directory."
(interactive)
(let ((helm-after-initialize-hook #'helm-follow-mode))
(helm-do-grep)))
;; instant search across all buffers with helm
(defun instant-search-using-helm ()
"Multi-occur in all buffers backed by files."
(interactive)
(let ((helm-after-initialize-hook #'helm-follow-mode))
(helm-multi-occur
(delq nil
(mapcar (lambda (b)
(when (buffer-file-name b) (buffer-name b)))
(buffer-list))))))
;; set keybindings
(global-set-key (kbd "C-M-s") 'instant-search-using-helm)
(global-set-key (kbd "C-M-S-s") 'helm-resume)
(global-set-key (kbd "C-M-g") 'instant-rgrep-using-helm)