2013-08-02 21 views
3

我想实现一个函数,让我只能通过打开的目录缓冲区循环,并跳过文件或暂存缓冲区。 我会怎么做呢?函数只循环打开的目录

+1

这看起来非常接近您可能要查找的内容 - 将'my-ido-ignore-dired-buffers'设置为'nil',并将其排除在文件之外:http://scottfrazersblog.blogspot.com/ 2010/01/emacs-filtered-buffer-switching.html它甚至包含与您的其他问题有关的字体锁示例的奖金。 – lawlist

+0

你想要一个返回一个列表(或一个函数参数)或交互功能的库函数吗? – seanmcl

+0

我正在寻找一种交互功能,我可以绑定到一个F键,只需在已打开的目录和另一个功能之间切换以在已打开的文件之间切换 – SFbay007

回答

1

看看的TabBar模式 - 可以定义组,任何你想要的(例如,dired),并与tabbar-backward-grouptabbar-forward-group群体之间的循环:

http://www.emacswiki.org/emacs/TabBarMode

tabbar-buffer-list-function可以用来进一步定义某些文件是否显示(或隐藏)。

tabbar-buffer-groups是默认组,可以用setq修改为默认组。如果您想创建其他分组方法,则可以使用tabbar-buffer-groups-function

如果dired是一个组,那么您可以使用(setq tabbar-cycle-scope 'tabs)tabbar-backwardtabbar-forward在这些缓冲区之间切换。

0

如果您想要实施一些东西, 看看Buffer-menu-mode。它已经得到一个切换T为 只显示文件。 然后它只是一个问题,看看它是如何建立的名单 与

(eq major-mode 'dired-mode) 

源过滤它是相当小的奇怪665线。

0

我为此使用缓冲区堆栈。

我写了两个不同的函数使用该包:一个用于在dired缓冲区之间切换,另一个用于在同一模式的缓冲区之间切换。我都紧张地使用。这就是我要做的事:

;; For shorter keybindings 
(defmacro command (&rest body) 
    `(lambda() 
    (interactive) 
    ,@body)) 

(defvar buffer-stack-mode) 

(defun buffer-op-by-mode (op &optional mode) 
    (let ((buffer-stack-filter 'buffer-stack-filter-by-mode) 
     (buffer-stack-mode (or mode major-mode))) 
    (funcall op))) 

(defun buffer-stack-filter-by-mode (buffer) 
    (with-current-buffer buffer 
    (equal major-mode buffer-stack-mode))) 

(global-set-key [(meta kp-7)] 
       (command (buffer-op-by-mode 'buffer-stack-up))) 
(global-set-key [(meta kp-9)] 
       (command (buffer-op-by-mode 'buffer-stack-down))) 
(global-set-key [(meta kp-3)] 
       (command (buffer-op-by-mode 'buffer-stack-down 'dired-mode))) 
(global-set-key [(meta kp-1)] 
       (command (buffer-op-by-mode 'buffer-stack-up 'dired-mode))) 

编辑:

我包括我使用的命令键绑定

+0

感谢juanleon .... 当我将您的代码添加到我的dotemacs文件中时,我在启动时收到此消息: 符号的函数定义为void:command – SFbay007

+0

@Ammari,ooops ...我忘了包括一个我使用的便利宏。编辑。 – juanleon

+0

有些事情是不对的。首先你有一个额外的)在最后。 然后,我将密钥绑定更改为f1 - f4,如下所示: (global-set-key [f1] (command-by-mode-buffer'stack-up))) 我仍然获取此消息: funcall:符号的函数定义是void:缓冲区堆栈 – SFbay007

0

Icicles提供了几个方法可以做到这一点的宏。

  • 开始在Dired缓冲和做C-0 C-x b TAB

  • C-x b,然后C-x m +,然后输入dired-mode(使用完毕),然后TAB

那些给你只Dired缓冲区作为可用的候选人,然后您可以按名称匹配。 使用箭头键(​​,C-down),可以在与输入匹配的缓冲区之间循环。使用RETC-g结束。

  • 前缀ARG 0意味着候选是在相同的模式作为当前缓冲器中的缓冲器---因此上面的第一个选项。

  • 完成时,C-x C-m +提示输入一个模式,然后过滤掉所有候选,其模式是不一样的或从输入的模式(在这种情况下,dired-mode)衍生---上面因此第二个选项。

C-x bIcicle模式绑定到icicle-buffer。如果您想在不同的窗口中打开缓冲区,请使用C-x 4 bicicle-buffer-other-window)。

有关更多信息,请参阅http://www.emacswiki.org/emacs/Icicles_-_Buffer-Name_Input