ibuffer: cómo crear automáticamente grupos por proyecto

9

Me gustaría agrupar mi lista de búferes en ibuffer por proyecto. Proyecto se entiende en el sentido proyectil de la palabra.

No quiero cambiar mi configuración de Emacs cada vez que estoy trabajando en un nuevo proyecto. ¿Hay alguna manera de lograr esto automáticamente?

ckruse
fuente

Respuestas:

5

Puede definir grupos de filtros para proyectos conocidos usando algo como esto:

;; Define ibuffer filter groups for each known project
(defun my/define-projectile-filter-groups ()
  (when (boundp 'projectile-known-projects)
    (setq my/project-filter-groups
        (mapcar
         (lambda (it)
           (let ((name (file-name-nondirectory (directory-file-name it))))
             `(,name (filename . ,(expand-file-name it)))))
         projectile-known-projects))))

;; Set up default ibuffer filter groups
(setq ibuffer-saved-filter-groups
      (list
       (cons "default"
             (append
              (my/define-projectile-filter-groups)
              ;; ... whatever other groups you want, e.g.
              '(("dired" (mode . dired-mode))
                ("erc" (mode . erc-mode)))
              ))))

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

;; You probably don't want to see empty project groups
(setq ibuffer-show-empty-filter-groups nil)

Actualizar

Desde que originalmente escribí esta respuesta, @sanityinc ha creado una variante ibuffer-vcque crea grupos de filtros por raíz del proyecto de proyectil. Puedes encontrarlo ibuffer-projectileen MELPA o en GitHub .

glucas
fuente
Esto es exactamente lo que he estado buscando, ¡gracias!
ckruse
Esto podría fusionarse en proyectil.
Tu Do
Sí, debería enviar una solicitud de extracción para admitir grupos de ibuffer. Surgió una vez antes pero no hice seguimiento. : D Voy a echar un vistazo más de cerca, podría tener más sentido hacer algo como ibuffer-vc y construir los grupos en función de los buffers actuales en lugar de la lista de proyectos conocidos. Pero una opción simple sería hacer que el proyectil defina un grupo de filtros con nombre de proyectos conocidos como se muestra aquí.
glucas
Como @Silex señaló en otra respuesta, alguien ya agregó soporte de ibuffer a principios de este año, me lo había perdido. Es un enfoque diferente en el sentido de que filtra ibuffer solo para el proyecto actual, pero parece útil.
glucas
@glucas bien, pero creo que los comportamientos actuales de Ibuffer en Projectile son redundantes projectile-switch-buffer. Ibuffer está diseñado para administrar una gran cantidad de buffers, y es por eso que tiene agrupación y filtrado. Me gusta el enfoque actual que agrupa según la lista de proyectos conocidos, lo que lo hace más coherente con Projectile.
Tu Do
5

Proyecto se entiende en el sentido proyectil de la palabra.

Usando Projectile, hay una manera de cambiar a un buffer dentro de un proyecto específico C-c p b

¿Puedo sugerir ibuffer-vc ? Una forma de agrupar sus búferes por su directorio raíz padre vc.

Nsukami _
fuente
ibuffer-vcestá bastante cerca de lo que estoy buscando. Pero sobreescribe mi ibuffer-saved-filter-groups; ¿Hay alguna manera de crear los grupos de VC además de mis grupos estándar?
ckruse
@ckruse no lo sé; déjame cavar por favor.
Nsukami _
Esto podría ayudar: github.com/reinh/dotemacs/blob/master/conf/init.org#ido . Específicamente el comienzo de la parte nox/ibuffer-apply-filter-groups.
tirocinium
3

Usando proyectil, simplemente puede escribir C-c p I(projectile-ibuffer) y solo los buffers para ese proyecto aparecerán en ibuffer.

Sílex
fuente