2019-10-14 17:38:14 +02:00
|
|
|
;;; ui.el --- Configure user interfaces. -*- lexical-binding: t; -*-
|
|
|
|
|
2020-02-18 16:46:49 +01:00
|
|
|
;; Time-stamp: <2020-02-18T16:44:07+0100>
|
2019-10-14 17:38:14 +02:00
|
|
|
|
|
|
|
;;; Commentary:
|
2019-11-09 18:55:55 +01:00
|
|
|
;; * treemacs
|
2019-10-14 18:02:20 +02:00
|
|
|
;; * ivy + counsel.
|
2019-10-14 17:38:14 +02:00
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
2019-11-09 18:55:55 +01:00
|
|
|
;; Directory tree.
|
|
|
|
(use-package treemacs
|
2020-01-20 20:25:29 +01:00
|
|
|
:pin melpa ; We need > 2.6 for lsp-treemacs.
|
2020-02-18 16:46:49 +01:00
|
|
|
:defer 2
|
2019-11-09 19:29:49 +01:00
|
|
|
:after (display-line-numbers)
|
2019-10-14 17:38:14 +02:00
|
|
|
|
|
|
|
:custom
|
2020-01-22 03:36:34 +01:00
|
|
|
(treemacs-project-follow-cleanup t) ; Collapse projects when leaving.
|
2019-11-09 21:57:10 +01:00
|
|
|
(treemacs-silent-refresh t) ; No log message on refresh.
|
2019-10-14 17:38:14 +02:00
|
|
|
|
|
|
|
:bind
|
2019-11-09 18:55:55 +01:00
|
|
|
("<f8>" . treemacs-select-window) ; Focus treemacs.
|
|
|
|
("C-<f8>" . treemacs) ; Toggle treemacs.
|
|
|
|
("M-<f8>" . treemacs-add-and-display-current-project) ; Add current project.
|
|
|
|
(:map treemacs-mode-map
|
|
|
|
("<mouse-1>" . treemacs-single-click-expand-action))
|
2019-11-09 19:29:49 +01:00
|
|
|
|
|
|
|
:hook
|
|
|
|
(treemacs-mode . my/disable-line-numbers)
|
2019-11-09 18:55:55 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
(use-package treemacs-projectile
|
|
|
|
:after (treemacs projectile)
|
|
|
|
)
|
|
|
|
|
|
|
|
(use-package treemacs-magit
|
|
|
|
:after (treemacs magit)
|
2019-10-14 17:38:14 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
;; Completion in many Emacs commands.
|
|
|
|
(use-package ivy
|
2019-10-15 14:23:28 +02:00
|
|
|
:demand t
|
2020-02-11 17:48:50 +01:00
|
|
|
:diminish ivy-mode
|
2019-10-15 14:23:28 +02:00
|
|
|
|
2019-10-14 17:38:14 +02:00
|
|
|
: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-<up>" . ivy-previous-history-element)
|
|
|
|
("M-<down>" . ivy-next-history-element)
|
2019-12-23 03:50:56 +01:00
|
|
|
("S-<return>" . ivy-immediate-done) ; Ignore completion.
|
2019-10-14 17:38:14 +02:00
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
;; Extensions for ivy
|
|
|
|
(use-package counsel
|
2019-10-15 14:23:28 +02:00
|
|
|
:after (ivy)
|
|
|
|
:demand t
|
|
|
|
|
2019-10-14 17:38:14 +02:00
|
|
|
: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
|
2020-02-06 20:13:30 +01:00
|
|
|
(defun my/ivy-rich-switch-buffer-icon (candidate)
|
|
|
|
"Return icon for `candidate'."
|
2019-10-14 17:38:14 +02:00
|
|
|
(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))))
|
|
|
|
|
2020-02-06 20:13:30 +01:00
|
|
|
;; Add icons to buffer switcher.
|
|
|
|
;; <https://github.com/Yevgnen/ivy-rich/issues/37#issuecomment-583033211>
|
|
|
|
(setq ivy-rich-display-transformers-list
|
|
|
|
(plist-put ivy-rich-display-transformers-list 'ivy-switch-buffer
|
|
|
|
'(:columns
|
|
|
|
((my/ivy-rich-switch-buffer-icon (:width 1))
|
|
|
|
(ivy-rich-candidate (:width 0.25))
|
|
|
|
(ivy-rich-switch-buffer-size (:width 0.05 :face font-lock-comment-face))
|
|
|
|
(ivy-rich-switch-buffer-indicators (:width 0.05 :face error :align right))
|
|
|
|
(ivy-rich-switch-buffer-major-mode (:width 0.1 :face font-lock-function-name-face))
|
|
|
|
(ivy-rich-switch-buffer-project (:width 0.15 :face success))
|
|
|
|
(ivy-rich-switch-buffer-path (:width (lambda (x) (ivy-rich-switch-buffer-shorten-path x (ivy-rich-minibuffer-width 0.4))) :face font-lock-keyword-face)))
|
|
|
|
:predicate
|
|
|
|
(lambda (cand) (get-buffer cand))
|
|
|
|
:delimiter "\t"
|
|
|
|
)))
|
|
|
|
|
2019-10-14 17:38:14 +02:00
|
|
|
(ivy-rich-mode 1)
|
|
|
|
(setcdr (assq t ivy-format-functions-alist) #'ivy-format-function-line)
|
|
|
|
)
|
|
|
|
|
2020-01-21 02:52:03 +01:00
|
|
|
(use-package ivy-purpose
|
|
|
|
:after (window-purpose)
|
|
|
|
|
|
|
|
:config
|
|
|
|
(ivy-purpose-setup)
|
|
|
|
|
|
|
|
:bind
|
|
|
|
(:map purpose-mode-map
|
2020-01-27 05:36:45 +01:00
|
|
|
("C-x b" . ivy-switch-buffer)
|
|
|
|
;; ("C-x b" . ivy-purpose-switch-buffer-without-purpose)
|
2020-01-21 02:52:03 +01:00
|
|
|
)
|
|
|
|
)
|
|
|
|
|
2020-02-11 16:47:12 +01:00
|
|
|
(use-package counsel-projectile
|
|
|
|
:after (projectile)
|
|
|
|
|
|
|
|
:custom
|
|
|
|
(counsel-projectile-mode t) ; Turn on projectile-mode and enable keybindings.
|
2020-02-11 18:35:29 +01:00
|
|
|
(projectile-switch-project-action 'my/switch-project)
|
|
|
|
|
|
|
|
:config
|
|
|
|
(defun my/counsel-projectile-switch-project-action (project)
|
|
|
|
"Call `my/switch-project'."
|
|
|
|
(let ((projectile-switch-project-action 'my/switch-project))
|
|
|
|
(counsel-projectile-switch-project-by-name project)))
|
|
|
|
|
|
|
|
(counsel-projectile-modify-action
|
|
|
|
'counsel-projectile-switch-project-action
|
|
|
|
'((add ("Y" my/counsel-projectile-switch-project-action
|
|
|
|
"open project in treemacs") 1)))
|
2020-02-11 16:47:12 +01:00
|
|
|
)
|
|
|
|
|
2019-12-26 21:30:46 +01:00
|
|
|
;; Switch between named persistent window configurations.
|
|
|
|
(when (>= emacs-major-version 27)
|
|
|
|
(use-package tab-bar
|
|
|
|
:bind
|
|
|
|
("C-<prior>" . tab-bar-switch-to-prev-tab)
|
|
|
|
("C-<next>" . 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"))))
|
2019-12-26 21:38:03 +01:00
|
|
|
(tab-line-highlight ((t (:inherit tab-line-tab-current
|
|
|
|
:foreground "white"))))
|
2019-12-26 21:30:46 +01:00
|
|
|
))
|
|
|
|
|
2019-10-14 17:38:14 +02:00
|
|
|
(provide 'basics/ui)
|
|
|
|
;;; ui.el ends here
|