Emacs навигация между файлами с одинаковыми именами - PullRequest
5 голосов
/ 28 января 2012

Я давно поклонник модели файловой навигации GNU Emacs.Я переключал буферы с C-x C-f ..., C-x b;C-mouse-1 время от времени.

Однако недавно я обнаружил, что программирую проекты, в которых есть наборы из нескольких файлов с одинаковыми именами, но в разных каталогах, по следующим строкам:

package/message.py
package/message.zcml
package/ui/message.py
package/ui/message.zcml
package/ui2/message.py
package/ui2/message.zcml

В этих условиях мои обычные инструменты переключения буфера не очень эффективны.Трудно вспомнить, находится ли нужный мне файл в буфере message.py<2> или message.py<3>, и переключаться между ними с помощью C-x b довольно сложно.Возможно, мне бы хотелось что-то вроде панели вкладок или меню, где я мог бы расположить файлы, над которыми я работаю, и сохранить их пространственное расположение, чтобы я мог быстро переключаться между ними.Я кратко посмотрел на speedbar и tabbar-mode, но не нашел большой помощи.Есть предложения?

Ответы [ 3 ]

6 голосов
/ 28 января 2012

Я нашел это решение от Borbus: https://stackoverflow.com/a/845311/552421

;; uniquify changes conflicting buffer names from file<2> etc
(require 'uniquify)
(setq uniquify-buffer-name-style 'reverse)
(setq uniquify-separator "/")
(setq uniquify-after-kill-buffer-p t) ; rename after killing uniquified
(setq uniquify-ignore-buffers-re "^\\*") ; don't muck with special buffers

Из вашего примера ваши буферы будут называться "message.py | ui", "message.py | ui2" и т. Д. *

3 голосов
/ 28 января 2012

Наряду с использованием uniquify для получения более полезных имен буферов, вы можете рассмотреть возможность использования ibuffer групп для ваших нужд "пространственного расположения". Вы можете создавать именованные группы на основе наборов фильтров и фильтровать по пути к файлу (*), чтобы вы могли легко иметь отдельные группы для каждого из этих каталогов.

Я настоятельно рекомендую связывание C-x C-b до ibuffer в качестве замены по умолчанию.

Кроме того, если вы используете ido-mode в сочетании с конфигурацией uniquify, то при вводе Cx b для переключения буферов вы можете вводить и сопоставлять любая часть (не унифицированного) имени буфера. Если вы включите ido-enable-flex-matching (или альтернативно, используйте вместо этого что-то вроде LustyExplorer ), то вы можете вводить несвязанные части этого имени буфера, и нечеткое совпадение будет разумно сужать список (например, ввод "mez2" достаточно, чтобы изолировать "message.zcml | ui2").

(*) Лично я предпочитаю, чтобы ibuffer совпадал с буферами Dired, а также с файловыми буферами, когда я делаю фильтр имен файлов, поэтому я переопределяю этот фильтр соответствующим образом:

;; Enable ibuffer-filter-by-filename to filter on directory names too.
(eval-after-load "ibuf-ext"
  '(define-ibuffer-filter filename
     "Toggle current view to buffers with file or directory name matching QUALIFIER."
     (:description "filename"
      :reader (read-from-minibuffer "Filter by file/directory name (regexp): "))
     (ibuffer-awhen (or (buffer-local-value 'buffer-file-name buf)
                        (buffer-local-value 'dired-directory buf))
       (string-match qualifier it))))
3 голосов
/ 28 января 2012

Вы можете переименовать буфер без изменения файла, к которому он прикреплен. M-x rename-buffer <ret> new-buffer-name <ret>. После этого вы можете переходить назад и вперед, используя более удобные имена буферов, но при сохранении любых изменений они переходят к фактическим файлам, связанным с каждым буфером.

В вашем случае вы можете переименовать файлы message.py<n> в ui-message, ui2-message и base-message. К ним будет легче перейти (и запомнить, к каким файлам они принадлежат) с помощью C-x b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...