Emacs在同名文件之间导航

Emacs在同名文件之间导航,emacs,navigation,Emacs,Navigation,我一直是GNU Emacs文件导航模型的粉丝。我一直在用C-xc-f…,C-xb切换缓冲区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 在这种情况下,我常用的

我一直是GNU Emacs文件导航模型的粉丝。我一直在用
C-xc-f…
C-xb
切换缓冲区
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
还是
message.py
中,使用
C-x b
在它们之间切换非常麻烦。我想要的,也许是像标签栏或菜单这样的东西,在那里我可以排列我正在处理的文件,并让它们保持它们的空间排列,这样我就可以在它们之间快速切换。我简单地查看了
speedbar
tabbar模式
,但没有找到多少帮助。有什么建议吗?

您可以重命名缓冲区,而无需更改其附加到的文件<代码>M-x重命名缓冲区新缓冲区名称。之后,您可以使用更方便的缓冲区名称来回跳转,但当您保存任何更改时,它们将转到与每个缓冲区关联的实际文件


在您的情况下,您可以将
message.py
文件重命名为
ui-message
ui2-message
base-message
。使用
C-x b

可以更容易地导航到这些文件(并记住它们属于哪些文件),我从Borbus找到了这个解决方案:

;;uniquify更改文件等中冲突的缓冲区名称
(需要“uniquify”)
(setq uniquify缓冲区名称样式“反向”)
(setq未限定分隔符“/)
(setq uniquify-after-kill-buffer-PT);杀人后改名
(setq uniquify ignore buffers re“^\\\*”);不要弄脏特殊的缓冲器

根据您的示例,您的缓冲区将被命名为“message.py | ui”、“message.py | ui2”等。

除了使用
uniquify
获得更有用的缓冲区名称外,您可能还需要考虑使用
ibuffer
组来满足您的“空间排列”需求。您可以基于筛选器集创建命名组,也可以根据文件路径(*)进行筛选,这样就可以轻松地为每个目录创建单独的组

我强烈建议将C-xC-b绑定到
ibuffer
,以替代默认设置

除此之外,如果将
ido模式
uniquify
config结合使用,那么当您键入C-xb切换缓冲区时,您可以键入并匹配(uniquified)缓冲区名称的任何部分。如果您启用
ido启用flex matching
(或者使用类似的方式),则可以键入该缓冲区名称的未连接部分,模糊匹配将智能地缩小列表(例如,键入“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))))

嘿,我在处理一些python东西(即django)时也遇到了同样的问题。他们需要多少名为settings.py或test.py的文件!?我也对你的问题的解决方案很感兴趣。是的,uniquify是一条路要走,emacs初学者工具包中的标准配置。尽管如此,我更喜欢转发名称样式。emacs-starter-kit?酷,我没听说过!谢谢,
uniquify
ido模式
缓冲区正是我想要的。但是,经过一天的尝试,我无法习惯ido文件。
;; 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))))