Подтвердить что ты не робот

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)
4b9b3361

Ответ 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, но на последних версиях шлема не работает, но исправлено с моими изменениями (просто скопируйте/вставьте из некоторых внутренних модулей шлема)