我一直是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
,但没有找到太多帮助。有什么建议吗?
答案 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-message
,ui2-message
和base-message
。使用C-x b
将更容易导航(并记住它们属于哪些文件)。
答案 2 :(得分:3)
除了使用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))))