Emacs在具有相同名称的文件之间导航

时间:2012-01-27 21:07:01

标签: emacs navigation

我一直是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在它们之间切换是非常繁琐的。也许,我想要的是像标签栏或菜单,我可以安排我正在处理的文件,让它们保持空间排列,这样我就可以快速切换它们。我简要地查看了speedbartabbar-mode,但没有找到太多帮助。有什么建议吗?

3 个答案:

答案 0 :(得分:6)

我从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”等...

答案 1 :(得分:3)

您可以重命名缓冲区而不更改其附加的文件。 M-x rename-buffer <ret> new-buffer-name <ret>。之后,您可以使用更方便的缓冲区名称来回跳转,但是当您保存任何更改时,它们会转到与每个缓冲区关联的实际文件。

在您的情况下,您可以将message.py<n>个文件重命名为ui-messageui2-messagebase-message。使用C-x b将更容易导航(并记住它们属于哪些文件)。

答案 2 :(得分:3)

除了使用uniquify获取更多有用的缓冲区名称外,您可能还需要考虑使用ibuffer组来满足“空间布局”需求。您可以根据过滤器集创建命名组,并且可以过滤文件路径(*),这样您就可以轻松地为每个目录分别创建组。

我强烈建议将 C-x C-b 绑定到ibuffer作为默认值的替代。

除此之外,如果您将ido-modeuniquify配置一起使用,那么当您键入 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))))