Sublime Text 2 "Goto Anything" (или мгновенный поиск) для Emacs?
Недавно я опробовал 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):
-
Я не нашел способ включить helm-follow-mode
автоматически при запуске helm-multi-occur
. Я должен вызвать его вручную с помощью C-c C-f
. Кто-нибудь хочет сделать снимок с помощью фрагмента elisp? (см. Править # 2 ниже)
-
он не "интеллектуальный", как 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)
Ответы
Ответ 1
Просто используйте шлем.
Возможно, это больше настроек, чем вы просили, но как только вы его получите
как вам нравится, это должно быть довольно удобно. Очень похоже на Emacs
;.)
И вы должны подать сообщение об ошибке с Thierry для получения еще нескольких новичков
по умолчанию. Он очень отзывчив с проблемами.
Helm-мульти-происходит
В первую очередь интерактивное взаимодействие с несколькими буферами осуществляется через
helm-multi-occur
. Если вы выполните команду, вы заметите, что у вас есть
сначала выбрать некоторые буферы (используйте C-SPC для выбора из списка,
M-SPC, чтобы выбрать все). Затем вы можете ввести свой запрос на следующем
незамедлительный. Легко сделать свою собственную версию, которая пропускает выбор буфера
так:
(eval-after-load "helm-regexp"
'(setq helm-source-moccur
(helm-make-source "Moccur"
'helm-source-multi-occur :follow 1)))
(defun my-helm-multi-all ()
"multi-occur in all buffers backed by files."
(interactive)
(helm-multi-occur
(delq nil
(mapcar (lambda (b)
(when (buffer-file-name b) (buffer-name b)))
(buffer-list)))))
штурвал-буферы-список
Часто вам не нужны точные вхождения строки запроса, но вы хотите, чтобы
список всех буферов, которые его содержат.
helm-buffers-list
имеет некоторые трюки в рукаве. Первый символ, который вы
define - фильтрация по основному режиму, и вы можете использовать префикс "@" для сужения
список для буферов, содержащих строку.
Для этого "ruby @prompt" покажет вам список буферов, основной режим
содержит "ruby" и содержимое которого содержит "подсказку". Или вы можете просто использовать "@prompt", чтобы показать все буферы, содержащие "подсказку".
Мощный и удобный, когда вы привыкнете к нему.
ИЗМЕНИТЬ изменен my-helm-multi-all
, чтобы включить режим слежения за рулем.
EDIT 2 обновить код helm-follow-mode
, чтобы отразить изменения шлема.
EDIT 3 снова обновлен, чтобы отразить изменения шлема
Ответ 2
Emacs имеет Projectile, чтобы удовлетворить ваши потребности:
- перейти к файлу в проекте
- multi-происходят в буферах проекта
Ответ 3
-
Heml далек от нечеткого поиска ST3.
-
Fiplr выглядит многообещающим, но не работает на моем ноутбуке (см. первый выпуск на github)
-
Simp.el выглядит как Fiplr, но не работает ни на моем конце.
-
Projectile работает для меня! Здесь ваше решение!
Я использовал также ido-mode и flx-ido для нечеткого поиска,
и для вертикального отображения результатов я использую это в своем .emacs:
;; Display ido results vertically, rather than horizontally
(setq ido-decorations (quote ("\n-> " "" "\n " "\n ..." "[" "]" " [No match]" " [Matched]" " [Not readable]" " [Too big]" " [Confirm]")))
(defun ido-disable-line-truncation () (set (make-local-variable 'truncate-lines) nil))
(add-hook 'ido-minibuffer-setup-hook 'ido-disable-line-truncation)
(defun ido-define-keys () ;; C-n/p is more intuitive in vertical layout
(define-key ido-completion-map (kbd "C-n") 'ido-next-match)
(define-key ido-completion-map (kbd "C-p") 'ido-prev-match))
(add-hook 'ido-setup-hook 'ido-define-keys)
Ответ 4
Icicles предлагает некоторые функции, похожие на то, что, по вашему мнению, вы ищете.
-
C-x b
и C-x C-f
, чтобы выбрать буферы или файлы, разрешите многократное завершение: вы можете ввести шаблон, соответствующий имени буфера/файла и/или шаблону, в сопоставить контент в buffer/file. Кандидаты отфильтровываются пошагово по мере ввода (то, что вы называете "мгновенным", - это то, что Emacs называет "инкрементным" ). Вы можете уточнить один или оба шаблона поиска постепенно, сужая выбор по-разному. Вы можете посетить любое количество буферов/файлов, которые совпадают, в то же время. Вы также можете использовать тот же метод для поиска отмеченных файлов в Dired: C-F
.
-
C-c
`
(icicle-search
) постепенно выполняет поиск по нескольким буферам или файлам. Опять же, прогрессивное уточнение и т.д.
Основное отличие между # 1 и # 2 заключается в следующем:
-
Для # 1 вы просто хотите найти соответствующие буферы или файлы. Вы сразу же не заботитесь о том, чтобы найти конкретные события. Любое совпадение достаточно.
-
Для # 2 вы предоставляете буферы или файлы для поиска, и вы хотите перемещаться между поисковыми образами.
Вы также можете использовать # 1 для поиска буферов и файлов, которые вы хотите, а затем для поиска их содержимого: шаблон соответствия содержимого, который вы использовали последним, доступен в качестве шаблона поиска для Isearch (C-s
).
Ответ 5
для emacs Я настраиваю и модифицирую это решение (для использования шлема установки):
(defun helm-occur-from-point (initial-value)
"Invoke `helm-occur' from point."
(interactive)
(let ((input initial-value)
(bufs (list (buffer-name (current-buffer)))))
;; (isearch-exit)
(helm-occur-init-source)
(helm-attrset 'moccur-buffers bufs helm-source-occur)
(helm-set-local-variable 'helm-multi-occur-buffer-list bufs)
(helm-set-local-variable
'helm-multi-occur-buffer-tick
(cl-loop for b in bufs
collect (buffer-chars-modified-tick (get-buffer b))))
(helm :sources 'helm-source-occur
:buffer "*helm occur*"
:history 'helm-grep-history
:input input
:truncate-lines t)))
(defun get-point-text ()
"Get 'interesting' text at point; either word, or region"
(if mark-active
(buffer-substring (mark) (point))
(thing-at-point 'symbol)))
(defun helm-occur-1 (initial-value)
"Preconfigured helm for Occur with initial input."
(helm-occur-from-point initial-value))
(defun bk-helm-occur ()
"Invoke helm-occur with initial input configured from text at point"
(interactive)
(helm-occur-1 (get-point-text)))
(global-set-key (kbd "M-s-o") 'bk-helm-occur)
первичный, основанный на
@see https://news.ycombinator.com/item?id=6872508, но на последних версиях шлема не работает, но исправлено с моими изменениями (просто скопируйте/вставьте из некоторых внутренних модулей шлема)