From 6e0a93233dd48b91332d3ea6aa2963de00bd7ab6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 Oct 2019 12:07:54 -0400 Subject: [PATCH] Add emacs/ibuffer module And bind 'SPC b i' to ibuffer --- init.example.el | 1 + modules/README.org | 1 + modules/config/default/+evil-bindings.el | 1 + modules/emacs/ibuffer/README.org | 36 +++++++++++++ modules/emacs/ibuffer/config.el | 68 ++++++++++++++++++++++++ modules/emacs/ibuffer/packages.el | 5 ++ 6 files changed, 112 insertions(+) create mode 100644 modules/emacs/ibuffer/README.org create mode 100644 modules/emacs/ibuffer/config.el create mode 100644 modules/emacs/ibuffer/packages.el diff --git a/init.example.el b/init.example.el index 09d229e34..5ce4ab515 100644 --- a/init.example.el +++ b/init.example.el @@ -60,6 +60,7 @@ :emacs dired ; making dired pretty [functional] electric ; smarter, keyword-based electric-indent + ibuffer ; interactive buffer management vc ; version-control and Emacs, sitting in a tree :term diff --git a/modules/README.org b/modules/README.org index da193e85a..5292a0f34 100644 --- a/modules/README.org +++ b/modules/README.org @@ -65,6 +65,7 @@ Modules that reconfigure or augment packages or features built into Emacs. + [[file:emacs/dired/README.org][dired]] =+ranger +icons=: + electric: ++ [[file:emacs/ibuffer/README.org][ibuffer]] =+icons=: + vc: * :term diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index b08c743d0..6c9ab0932 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -596,6 +596,7 @@ (:unless (featurep! :ui workspaces) :desc "Switch buffer" "b" #'switch-to-buffer) :desc "Kill buffer" "d" #'kill-current-buffer + :desc "ibuffer" "i" #'ibuffer :desc "Kill buffer" "k" #'kill-current-buffer :desc "Switch to last buffer" "l" #'evil-switch-to-windows-last-buffer :desc "Next buffer" "n" #'next-buffer diff --git a/modules/emacs/ibuffer/README.org b/modules/emacs/ibuffer/README.org new file mode 100644 index 000000000..cd92b42e6 --- /dev/null +++ b/modules/emacs/ibuffer/README.org @@ -0,0 +1,36 @@ +#+TITLE: emacs/ibuffer +#+DATE: October 20, 2019 +#+SINCE: v2.1.0 +#+STARTUP: inlineimages + +* Table of Contents :TOC_3:noexport: +- [[#description][Description]] + - [[#module-flags][Module Flags]] + - [[#plugins][Plugins]] +- [[#prerequisites][Prerequisites]] +- [[#features][Features]] +- [[#configuration][Configuration]] +- [[#troubleshooting][Troubleshooting]] + +* Description +This module augments ibuffer. + ++ Adds project-based grouping of buffers ++ Support for file-type icons ++ Uses human-readable file-size + +** Module Flags ++ =+icons= Enables filetype icons for buffers + +** Plugins ++ [[https://github.com/purcell/ibuffer-projectile][ibuffer-projectile]] ++ [[https://github.com/purcell/ibuffer-vc][ibuffer-vc]] + +* Prerequisites +This module has no prereqisites. + +* TODO Features + +* TODO Configuration + +* TODO Troubleshooting diff --git a/modules/emacs/ibuffer/config.el b/modules/emacs/ibuffer/config.el new file mode 100644 index 000000000..e928358d7 --- /dev/null +++ b/modules/emacs/ibuffer/config.el @@ -0,0 +1,68 @@ +;;; emacs/ibuffer/config.el -*- lexical-binding: t; -*- + +(after! ibuffer + (set-popup-rule! "^\\*Ibuffer\\*$" :ignore t) + + (setq ibuffer-show-empty-filter-groups nil + ibuffer-filter-group-name-face '(:inherit (success bold)) + ibuffer-formats + `((mark modified read-only ,(if EMACS26+ 'locked "") + ,@(if (featurep! +icons) + `(;; Here you may adjust by replacing :right with :center + ;; or :left According to taste, if you want the icon + ;; further from the name + " " (icon 2 2 :left :elide) + ,(propertize " " 'display `(space :align-to 8))) + '(" ")) + (name 18 18 :left :elide) + " " (size 9 -1 :right) + " " (mode 16 16 :left :elide) + ,@(when (require 'ibuffer-vc nil t) + '(" " (vc-status 12 :left))) + " " filename-and-process) + (mark " " (name 16 -1) " " filename))) + + ;; Display buffer icons on GUI + (define-ibuffer-column icon (:name " ") + (let ((icon (if (and (buffer-file-name) + (all-the-icons-auto-mode-match?)) + (all-the-icons-icon-for-file (file-name-nondirectory (buffer-file-name)) :v-adjust -0.05) + (all-the-icons-icon-for-mode major-mode :v-adjust -0.05)))) + (if (symbolp icon) + (setq icon (all-the-icons-faicon "file-o" :face 'all-the-icons-dsilver :height 0.8 :v-adjust 0.0)) + icon))) + + ;; Redefine size column to display human readable size + (define-ibuffer-column size + (:name "Size" + :inline t + :header-mouse-map ibuffer-size-header-map) + (file-size-human-readable (buffer-size))) + + (when (featurep! :completion ivy) + (defadvice! +ibuffer-use-counsel-maybe-a (file &optional wildcards) + "Use `counsel-find-file' instead of `find-file'." + :override #'ibuffer-find-file + (interactive) + (counsel-find-file + (let ((buf (ibuffer-current-buffer))) + (if (buffer-live-p buf) + (with-current-buffer buf + default-directory) + default-directory))))) + + (map! :map ibuffer-mode-map :n "q" #'kill-current-buffer)) + + +(use-package! ibuffer-projectile + ;; Group ibuffer's list by project root + :hook (ibuffer . ibuffer-projectile-set-filter-groups) + :config + (setq ibuffer-projectile-prefix + (if (featurep! +icons) + (concat (all-the-icons-octicon + "file-directory" + :face ibuffer-filter-group-name-face + :v-adjust -0.05) + " ") + "Project: "))) diff --git a/modules/emacs/ibuffer/packages.el b/modules/emacs/ibuffer/packages.el new file mode 100644 index 000000000..5328e5d93 --- /dev/null +++ b/modules/emacs/ibuffer/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; emacs/ibuffer/packages.el + +(package! ibuffer-projectile) +(package! ibuffer-vc)