如何保持目前已形成的ibuffer分组?

我目前在ibuffer里面分组有点快感了,所以想能不能把这次已经形成的分组保留到下次启动了也保持存在呢?类似于用(desktop-save-mode 1)一行解决那种。

对了怎么让第三列Size变成“-h”格式,就是用K,M等单位表达,而不是直接用字节数。

想不出 ibuffer 有什么用

各个buffer快速跳转啊,你一般用什么实现这样的功能,不用鼠标那种方式?

(非 Ibuffer 重度用户)

貌似有个 ibuffer-saved-filters,按 / r 恢复。

定制 ibuffer-formats,应该较为麻烦,需要用 define-ibuffer-column 生成新的 Column。

下面这个方法不好,只是为了引出 file-size-human-readable

(setf (alist-get 'ibuffer-make-column-size ibuffer-inline-columns)
      '((with-current-buffer buffer
          (file-size-human-readable (buffer-size)))))
1 个赞

还有 ibuffer-saved-filter-groups

我是用的 ibuffer-saved-filter-groups

我定义的大概是这样,搞了一个叫default的组,然后里面你可以自己根据mode, filename等等来组合定义分类:

;;; set ibuffer display as group
(setq ibuffer-saved-filter-groups
      (quote (("default"
               ("lldpd" (and (filename . ".*/src/xxxxx-path.*")
                             (not (mode . dired-mode))))
               ("dired" (mode . dired-mode))
               ("tmp" (filename . "/tmp/.*"))
               ("shell-script" (mode . sh-mode))
               ("elisp" (or
                         (name . "^\\*scratch\\*$")
                         (name . "^\\*Messages\\*$")
                         (mode . emacs-lisp-mode)
                         (mode . xah-elisp-mode)))
               ("w3m" (or
                       (mode . w3m-mode)))
               ("python" (mode . python-mode))
               ("magit" (or
                         (mode . magit-status-mode)
                         (mode . magit-process-mode)
                         (mode . magit-diff-mode)
                         (mode . magit-revision-mode)
                         (mode . magit-log-mode)))
               ("org" (mode . org-mode))))))

然后在ibuffer的hook中switch到default这个组就可以了:

(add-hook 'ibuffer-mode-hook
          (lambda ()
            (ibuffer-switch-to-saved-filter-groups "default")))

不过,虽然我这么定义了,但是使用的次数少之又少 :slight_smile:

第二个问题不太清楚。可以参考 @xuchunyang 的建议。

2 个赞
(setq ibuffer-formats
      '((mark " " (name 18 18 :left :elide)
              " " (human-readable-size 6 -1 :right)
              " " (mode 16 16 :left :elide) " " filename-and-process)
        (mark " " (name 16 -1) " " filename)))

(define-ibuffer-column human-readable-size
  (:name "Size"
   :inline t
   :header-mouse-map ibuffer-size-header-map
   :summarizer
   (lambda (column-strings)
     (cl-loop for s in column-strings
              sum (get-text-property (1- (length s)) 'size s) into total
              finally return (file-size-human-readable total))))
  (let ((size (buffer-size)))
    (propertize (file-size-human-readable size)
                'size size)))

1 个赞

Oops,EmacsWiki 上已经有了一个现成的:

https://www.emacswiki.org/emacs/IbufferMode#toc12

当然了,我更喜欢自己实现的。

1 个赞

要多少年我可以练到你这样的emacs水平?

至少3年以后吧

1 个赞

好,我努力的

1 个赞