;;; ui.el --- Configure user interfaces. -*- lexical-binding: t; -*- ;; Time-stamp: <2019-12-26T21:30:02+0100> ;;; Commentary: ;; * treemacs ;; * ivy + counsel. ;;; Code: ;; Directory tree. (use-package treemacs :demand t :after (display-line-numbers) :custom (treemacs-project-follow-cleanup t) (treemacs-silent-refresh t) ; No log message on refresh. :bind ("" . treemacs-select-window) ; Focus treemacs. ("C-" . treemacs) ; Toggle treemacs. ("M-" . treemacs-add-and-display-current-project) ; Add current project. (:map treemacs-mode-map ("" . treemacs-single-click-expand-action)) :hook (treemacs-mode . my/disable-line-numbers) ) (use-package treemacs-projectile :after (treemacs projectile) ) (use-package treemacs-magit :after (treemacs magit) ) ;; Completion in many Emacs commands. (use-package ivy :demand t :custom (ivy-use-virtual-buffers t) (ivy-count-format "[%d/%d] ") (ivy-wrap t) :config (ivy-mode 1) :bind ("C-c C-r" . ivy-resume) (:map ivy-minibuffer-map ("M-" . ivy-previous-history-element) ("M-" . ivy-next-history-element) ("S-" . ivy-immediate-done) ; Ignore completion. ) ) ;; Extensions for ivy (use-package counsel :after (ivy) :demand t :bind ("C-x C-f" . counsel-find-file) ("M-x" . counsel-M-x) ) ;; Use icons in ivy. (use-package all-the-icons-ivy :after (all-the-icons counsel) :config (all-the-icons-ivy-setup) ) ;; More information in ivy mini-buffers. (use-package ivy-rich ;; all-the-icons-ivy would override the ivy-rich switch-buffer improvements. :after (all-the-icons-ivy counsel) :functions (ivy-format-function-line) :config (defun ivy-rich-switch-buffer-icon (candidate) (with-current-buffer (get-buffer candidate) (let ((icon (all-the-icons-icon-for-mode major-mode))) (if (symbolp icon) (all-the-icons-icon-for-mode 'fundamental-mode) icon)))) (ivy-rich-mode 1) (setcdr (assq t ivy-format-functions-alist) #'ivy-format-function-line) :custom ;; It seems I have to copy this whole list to get icons in switch-buffer. (ivy-rich-display-transformers-list (quote (ivy-switch-buffer (:columns ((ivy-rich-switch-buffer-icon :width 2) (ivy-rich-candidate (:width 30)) (ivy-rich-switch-buffer-size (:width 7)) (ivy-rich-switch-buffer-indicators (:width 4 :face error :align right)) (ivy-rich-switch-buffer-major-mode (:width 12 :face warning)) (ivy-rich-switch-buffer-project (:width 15 :face success)) (ivy-rich-switch-buffer-path (:width (lambda (x) (ivy-rich-switch-buffer-shorten-path x (ivy-rich-minibuffer-width 0.3)))))) :predicate (lambda (cand) (get-buffer cand))) counsel-M-x (:columns ((counsel-M-x-transformer (:width 40)) (ivy-rich-counsel-function-docstring (:face font-lock-doc-face)))) counsel-describe-function (:columns ((counsel-describe-function-transformer (:width 40)) (ivy-rich-counsel-function-docstring (:face font-lock-doc-face)))) counsel-describe-variable (:columns ((counsel-describe-variable-transformer (:width 40)) (ivy-rich-counsel-variable-docstring (:face font-lock-doc-face)))) counsel-recentf (:columns ((ivy-rich-candidate (:width 0.8)) (ivy-rich-file-last-modified-time (:face font-lock-comment-face))))))) ) ;; Switch between named persistent window configurations. (when (>= emacs-major-version 27) (use-package tab-bar :bind ("C-" . tab-bar-switch-to-prev-tab) ("C-" . tab-bar-switch-to-next-tab) )) ;; Shows tabs of all visible buffers per window. (when (>= emacs-major-version 27) (use-package tab-line :custom-face (tab-line ((t (:inherit ruler-mode-default)))) (tab-line-tab ((t (:inherit ruler-mode-default)))) (tab-line-tab-inactive ((t (:inherit tab-line-tab)))) (tab-line-tab-current ((t (:inherit tab-line-tab :background "grey10" :foreground "grey70")))) :hook (find-file . tab-line-mode) )) (provide 'basics/ui) ;;; ui.el ends here