Files
emacs/settings/gui-settings.el

430 lines
21 KiB
EmacsLisp

;;; gui-settings --- Summary
;;; Commentary:
;;; Requirements:
;; restart-emacs https://melpa.org/#/restart-emacs
;; dashboard https://melpa.org/#/dashboard
;; page-break-lines https://melpa.org/#/page-break-lines
;; all-the-icons https://melpa.org/#/all-the-icons
;; memoize https://melpa.org/#/memoize
;; indent-guide https://melpa.org/#/indent-guide
;; not highlight-indent-guides
;; rainbow-mode https://elpa.gnu.org/packages/rainbow-mode.html
;; focus https://melpa.org/#/focus
;; virtual-auto-fill https://melpa.org/#/virtual-auto-fill
;;; Code:
(use-package emacs
:delight
(auto-fill-function "Fa") ;; "\u21B5"
(compilation-shell-minor-mode "Csh") ;; "\u24B8\uFF53"
(eldoc-mode "Ed") ;; \u24BA e
(visual-line-mode "Vl") ;; " Wrap" "\u21A9"
(whitespace-mode "Ws") ;; "\u2423 \u005F ws"
;; major modes
(calendar-mode "Ca") ;; "Calendar" "\u01F4C6" "\u01F152\uFF41\uFF4C"
(css-mode "Css") ;; "CSS"" "\u01F152ss
(emacs-lisp-mode "El") ;; "EL" "\u01F15B\uFF45"
(eshell-mode "Esh") ;; "Esh" "\u01F162\uFF45
(fundamental-mode "Fu") ;; "F " "\u01F155" ;; not working
(help-mode "H") ;; "H " "\u01F157"
(Info-mode "I") ;; "I " "\u01F158" ;; not working
(latex-mode "La") ;; "LaTeX " "\u01F15B\uFF41"
(lisp-interaction-mode "Lii") ;; "LI \u01F15B\u24A4" "\u01F15B\uFF49
(messages-mode "M") ;; "M " "\u01F15C" ;; not working
(messages-buffer-mode "M") ;; "M " "\u01F15C" ;; not working
(inferior-python-mode "Pyi") ;; "IPy \u01F15F\u24A4" "\u01F15F\uFF49"
:hook
(prog-mode . display-fill-column-indicator-mode)
(help-mode . visual-line-mode)
(messages-buffer-mode . visual-line-mode)
:config
(set-face-attribute 'fill-column-indicator nil :foreground "DarkSlateGray") ;; inherit shadow
;; `scroll-bar-mode' sets for all frames and all windows
;; use `set-window-scroll-bars' for windows only
(scroll-bar-mode 0) ;; 1st deactivate scrolling
(defun my-window-scroll-function (window display-start)
"This function
- is listed in `window-scroll-functions' which is called by
`set-window-buffer' before running `window-configuration-change-hook'
and therefore will be run on every vertical scroll event
- will activate vertical scoll bar if not whole buffer height is
visible
WINDOW: `window' object, its string will look like #<window 3 on gui-settings.el> and
DISPLAY-START: `integer', e.g. 3820"
;; (message "%s" window)
(let ((vertical-type nil)
(horizontal-type nil))
(unless (string-equal (format-mode-line "%p") "All")
(setq vertical-type 'right))
;; `scroll-bar-mode' not used bc/ it's global, therefore:
(set-window-scroll-bars
window nil vertical-type nil horizontal-type nil)))
(add-to-list 'window-scroll-functions #'my-window-scroll-function)
) ;; end of use-package emacs
(use-package frame
:config
(setq window-divider-default-places t))
(use-package tab-bar
:defer 0.5
:config
(tab-bar-mode)
(tab-bar-rename-tab "Default")
(defun my-tab-view-elisp ()
(if (tab-bar--tab-index-by-name "ELisp IDE")
(tab-bar-switch-to-tab "ELisp IDE")
(tab-bar-new-tab)
(tab-bar-rename-tab "ELisp IDE")
(switch-to-buffer "*scratch*")
(my-view-elisp)))
(defun my-tab-view-python ()
(if (tab-bar--tab-index-by-name "Python IDE")
(tab-bar-switch-to-tab "Python IDE")
(tab-bar-new-tab)
(tab-bar-rename-tab "Python IDE")
(if (get-buffer "*scratch-python*")
(switch-to-buffer "*scratch-python*")
(switch-to-buffer "*scratch-python*")
(insert "#!/usr/bin/env python\n")
(insert "\"\"\"\n")
(insert "\"\"\"\n"))
(python-mode)
(my-view-python)))
(defun my-tab-view-shell ()
(if (tab-bar--tab-index-by-name "Shell IDE")
(tab-bar-switch-to-tab "Shell IDE")
(tab-bar-new-tab)
(tab-bar-rename-tab "Shell IDE")
(switch-to-buffer "*scratch-shell*")
(shell-script-mode)
(my-view-shell)))
(defun my-tab-view-org-pdf ()
(if (tab-bar--tab-index-by-name "Org PDF")
(tab-bar-switch-to-tab "Org PDF")
(tab-bar-new-tab)
(tab-bar-rename-tab "Org PDF")
(switch-to-buffer "*scratch-org*")
(org-mode)
(my-view-org-pdf)))
(defun my-tab-view-gnuplot ()
(if (tab-bar--tab-index-by-name "Gnuplot IDE")
(tab-bar-switch-to-tab "Gnuplot IDE")
(tab-bar-new-tab)
(tab-bar-rename-tab "Gnuplot IDE")
(switch-to-buffer "*scratch-gnuplot*")
(gnuplot-mode)
(my-view-gnuplot))))
(use-package awesome-tray
:defer 0.2
:config
(setq awesome-tray-info-padding-right 1)
(setq awesome-tray-buffer-name-buffer-changed t)
(setq awesome-tray-mode-line-active-color "#008b8b")
(setq awesome-tray-mode-line-inactive-color "#333333")
;; see available modules in `awesome-tray-module-alist'
(defun my-awesome-tray-module-flycheck-info ()
(string-trim (flycheck-mode-line-status-text)))
(defface my-awesome-tray-module-flycheck-face
(list (list t (list :foreground (face-foreground 'font-lock-warning-face))))
"Flycheck module face."
:group 'awesome-tray)
(add-to-list 'awesome-tray-module-alist
'("flycheck" . (my-awesome-tray-module-flycheck-info my-awesome-tray-module-flycheck-face)))
(setq awesome-tray-active-modules ;; circe parent-dir battery
'("file-path"
"buffer-name"
"buffer-read-only"
"location"
"mode-name"
"flycheck"
"git"))
(set-face-foreground 'awesome-tray-module-file-path-face (face-foreground 'font-lock-keyword-face))
(set-face-foreground 'awesome-tray-module-buffer-name-face (face-foreground 'font-lock-constant-face))
(set-face-foreground 'awesome-tray-module-location-face (face-foreground 'vertical-border))
(set-face-foreground 'awesome-tray-module-mode-name-face (face-foreground 'font-lock-string-face))
(defun my-awesome-tray-module-file-path-info-advice (&rest args)
"If file path is same as buffer name omit output."
(if (string= (car args) (awesome-tray-module-buffer-name-info))
""
(car args)))
(advice-add 'awesome-tray-module-file-path-info :filter-return #'my-awesome-tray-module-file-path-info-advice)
;; old `awesome-tray-module-buffer-name-info'. new one breaks some org-mod src block return actions.
(defun awesome-tray-module-buffer-name-info ()
(if awesome-tray-buffer-name-buffer-changed
(if (and (buffer-modified-p)
(not (eq buffer-file-name nil)))
(concat (buffer-name) awesome-tray-buffer-name-buffer-changed-style)
(buffer-name))
(format "%s" (buffer-name))))
(awesome-tray-mode 1))
(use-package doc-view
:defer t
:delight (doc-view-mode "Doc") ;; "DocView" "\u01F153\uFF4F\uFF43"
:config
(setq doc-view-continuous t))
(use-package restart-emacs)
(use-package page-break-lines
:delight (page-break-lines-mode "Pb") ;; "\u24C5\uFF42"
:config
(add-to-list 'page-break-lines-modes 'ledger-mode)
(add-to-list 'page-break-lines-modes 'dashboard-mode)
(global-page-break-lines-mode))
(use-package memoize
:defer t)
(use-package all-the-icons
:defer t
:if (display-graphic-p)
:config
(when (and (not (my-font-installed-p "all-the-icons"))
(window-system))
(all-the-icons-install-fonts t)
;;(restart-emacs) ;; infinity loop?
))
(use-package dashboard
:delight (dashboard-mode "Db") ;; "\u01F153
:config
;; see `dashboad-widget'
(setq dashboard-page-separator "\n\f\n")
(setq dashboard-set-heading-icons t)
(setq dashboard-set-file-icons t)
(setq dashboard-set-navigator t)
(setq dashboard-startup-banner 'logo)
(if (display-graphic-p)
(setq dashboard-navigator-buttons
;; list of lines having list of elements
;; element: (icon title help action face prefix suffix)
`(;; 1st line custom views
(("" "Custom Views:" "custom views" nil default "" "")
(,(all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.1) "ELisp" "my-view-elisp" (lambda (&rest _) (my-tab-view-elisp)) )
(,(all-the-icons-alltheicon "python" :height 1.0 :v-adjust 0.0) "Python" "my-view-python" (lambda (&rest _) (my-tab-view-python)) )
(,(all-the-icons-alltheicon "script" :height 1.0 :v-adjust 0.0) "Shell" "my-view-shell" (lambda (&rest _) (my-tab-view-shell)) )
(,(all-the-icons-octicon "file-media" :height 1.0 :v-adjust 0.0) "Gnuplot" "my-view-gnuplot" (lambda (&rest _) (my-tab-view-gnuplot)) )
(,(all-the-icons-octicon "file-pdf" :height 1.0 :v-adjust 0.0) "Org PDF" "my-view-org-pdf" (lambda (&rest _) (my-tab-view-org-pdf)) ))
;; 2nd line major modes 1st part
(("" "Major Modes:" "major modes" nil default "" "")
("" "Deft" "deft" (lambda (&rest _) (deft)) )
("" "EShell" "eshell-mode" (lambda (&rest _) (eshell)) )
("" "Magit" "magit" (lambda (&rest _) (magit)) )
(,(all-the-icons-octicon "mail" :height 1.0 :v-adjust 0.0) "Mu4e" "mu4e" (lambda (&rest _) (mu4e)) )
(,(all-the-icons-octicon "mail" :height 1.0 :v-adjust 0.0) "Notmuch" "notmuch" (lambda (&rest _) (notmuch)) )
("" "Org-Brain" "org-brain-visualize" (lambda (&rest _) (call-interactively 'org-brain-visualize)) ))
;; 3rd line major modes 2nd part
(("" "Org-Drill" "org-drill" (lambda (&rest _) (org-drill)) )
("" "Powershell" "powershell" (lambda (&rest _) (powershell)) )
("" "Shell" "shell" (lambda (&rest _) (shell)) )
("" "Treemacs" "treemacs" (lambda (&rest _) (treemacs)) ))
;; 4th line infos
((,(all-the-icons-material "help_outline" :height 1.1 :v-adjust -0.15) "Help" "?/h" (lambda (&rest _) (describe-mode)) nil)
(,(all-the-icons-material "refresh" :height 1.1 :v-adjust -0.15) "Restart" "restart-emacs" (lambda (&rest _) (restart-emacs)) nil))))
(setq dashboard-navigator-buttons
;; list of lines having list of elements
;; element: (icon title help action face prefix suffix)
`(;; 1st line custom views
(("" "Custom Views:" "custom views" nil default "" "")
("" "ELisp" "my-view-elisp" (lambda (&rest _) (my-tab-view-elisp)) )
("" "Python" "my-view-python" (lambda (&rest _) (my-tab-view-python)) )
("" "Shell" "my-view-shell" (lambda (&rest _) (my-tab-view-shell)) )
("" "Gnuplot" "my-view-gnuplot" (lambda (&rest _) (my-tab-view-gnuplot)) )
("" "Org PDF" "my-view-org-pdf" (lambda (&rest _) (my-tab-view-org-pdf)) ))
;; 2nd line major modes 1st part
(("" "Major Modes:" "major modes" nil default "" "")
("" "Deft" "deft" (lambda (&rest _) (deft)) )
("" "EShell" "eshell-mode" (lambda (&rest _) (eshell)) )
("" "Magit" "magit" (lambda (&rest _) (magit)) )
("" "Mu4e" "mu4e" (lambda (&rest _) (mu4e)) )
("" "Notmuch" "notmuch" (lambda (&rest _) (notmuch)) )
("" "Org-Brain" "org-brain-visualize" (lambda (&rest _) (call-interactively 'org-brain-visualize)) ))
;; 3rd line major modes 2nd part
(("" "Org-Drill" "org-drill" (lambda (&rest _) (org-drill)) )
("" "Powershell" "powershell" (lambda (&rest _) (powershell)) )
("" "Shell" "shell" (lambda (&rest _) (shell)) )
("" "Treemacs" "treemacs" (lambda (&rest _) (treemacs)) ))
;; 4th line infos
(("" "Help" "?/h" (lambda (&rest _) (describe-mode)) nil)
("" "Restart" "restart-emacs" (lambda (&rest _) (restart-emacs)) nil)))))
(setq dashboard-items '((recents . 10)
(bookmarks . 5)
;; (projects . 5)
(agenda . 5)
(registers . 5)
(custom . 5)))
(setq dashboard-item-shortcuts
'((recents . "r")
(bookmarks . "m")
(projects . "p")
(agenda . "a")
(registers . "e")
(custom . "b")))
;; because we use `use-package' include `use-package-statistics' if
;; computed
(setq dashboard-init-info
(lambda ()
(let ((package-count 0) (time (emacs-init-time)))
(when (bound-and-true-p package-alist)
(setq package-count (length package-activated-list)))
(when (boundp 'straight--profile-cache)
(setq package-count (+ (hash-table-count straight--profile-cache) package-count)))
(when (fboundp 'elpaca--queued)
(setq package-count (length (elpaca--queued))))
;; added case
(when use-package-compute-statistics
(setq package-count (+ (hash-table-size use-package-statistics) package-count)))
(if (zerop package-count)
(format "Emacs started in %s" time)
(format "%d packages loaded in %s" package-count time)))))
;; custom section
;; overwrite to supress an inserted whitespace if a pre-defined
;; heading is not found. This is used to include own icon, e.g. in
;; front of executing `dashboard-insert-section'.
(defun dashboard-insert-heading (heading &optional shortcut)
"Insert a widget HEADING in dashboard buffer, adding SHORTCUT if provided."
(when (and (display-graphic-p) dashboard-set-heading-icons)
;; Try loading `all-the-icons'
(unless (or (fboundp 'all-the-icons-octicon)
(require 'all-the-icons nil 'noerror))
(error "Package `all-the-icons' isn't installed"))
(insert (cond
((string-equal heading "Recent Files:")
(all-the-icons-octicon (cdr (assoc 'recents dashboard-heading-icons))
:height 1.2 :v-adjust 0.0 :face 'dashboard-heading))
((string-equal heading "Bookmarks:")
(all-the-icons-octicon (cdr (assoc 'bookmarks dashboard-heading-icons))
:height 1.2 :v-adjust 0.0 :face 'dashboard-heading))
((or (string-equal heading "Agenda for today:")
(string-equal heading "Agenda for the coming week:"))
(all-the-icons-octicon (cdr (assoc 'agenda dashboard-heading-icons))
:height 1.2 :v-adjust 0.0 :face 'dashboard-heading))
((string-equal heading "Registers:")
(all-the-icons-octicon (cdr (assoc 'registers dashboard-heading-icons))
:height 1.2 :v-adjust 0.0 :face 'dashboard-heading))
((string-equal heading "Projects:")
(all-the-icons-octicon (cdr (assoc 'projects dashboard-heading-icons))
:height 1.2 :v-adjust 0.0 :face 'dashboard-heading))
;; (t " "))) ;; REMOVED
(t ""))) ;; ADDED
(insert " "))
(insert (propertize heading 'face 'dashboard-heading))
;; Turn the inserted heading into an overlay, so that we may freely change
;; its name without breaking any of the functions that expect the default name.
;; If there isn't a suitable entry in `dashboard-item-names',
;; we fallback to using HEADING. In that case we still want it to be an
;; overlay to maintain consistent behavior (such as the point movement)
;; between modified and default headings.
(let ((ov (make-overlay (- (point) (length heading)) (point) nil t)))
(overlay-put ov 'display (or (cdr (assoc heading dashboard-item-names)) heading))
(overlay-put ov 'face 'dashboard-heading))
(when shortcut (insert (format " (%s)" shortcut))))
;;; define functions for the section
;; `clean-buffer-list'
(defun my-buffer-name-list (&optional special internal)
"If SPECIAL non-nil then include special buffers.
If INTERNAL non-nil then include internal buffers."
(let ((b-list (mapcar (function buffer-name) (buffer-list)))
new-list head)
(while b-list
(setq head (car b-list))
(when (or internal ;; check if no space is in the fron
(not (string= " " (substring head 0 1))))
(when (or special ;; check if no star are in the front and back
(and (not (string= "*" (substring head 0 1)))
(not (string= "*" (cl-subseq head -1)))))
(push head new-list)))
(setq b-list (cdr b-list)))
(nreverse new-list)))
(defun my-buffer-name-list-special-only ()
"List only special buffers *...*."
(let ((b-list (mapcar (function buffer-name) (buffer-list)))
new-list head)
(while b-list
(setq head (car b-list))
(when (and (string= "*" (substring head 0 1))
(string= "*" (cl-subseq head -1)))
(push head new-list))
(setq b-list (cdr b-list)))
(nreverse new-list)))
;;; define section function
(defun dashboard-insert-custom (list-size)
"Add the list of LIST-SIZE items from buffers list.
Example `dashboard-insert-recent'.
See also `dashboard-insert-section' for the sequence of elements."
;; insert icon
(when (display-graphic-p)
(insert (all-the-icons-octicon
"versions"
:height 1.2 :v-adjust 0.0 :face 'dashboard-heading)))
(dashboard-insert-section
"Special Buffers:"
(my-buffer-name-list-special-only) ;; (my-buffer-name-list t)
list-size
'custom
(dashboard-get-shortcut 'custom)
`(lambda (&rest _) (switch-to-buffer ,el))
(abbreviate-file-name el)))
(add-to-list 'dashboard-item-generators '(custom . dashboard-insert-custom))
;; activate `dashboard'
(dashboard-setup-startup-hook))
(use-package indent-guide
:delight (indent-guide-mode "Ig") ;; "\u24BE\uFF47"
:hook (prog-mode . indent-guide-mode) ;; problem if used in notmuch
:config
(set-face-attribute 'indent-guide-face nil :foreground "DarkSlateGray") ;; foreground #535353
;;(setq indent-guide-char ":")
(setq indent-guide-char "\u2502")
(setq indent-guide-recursive t) ;; NOT RECOMMENDED: To show not only one guide line but all guide lines recursively, set indent-guide-recursive non-nil.
)
;; problem when using 'character in elisp it inserts the guide characters when inserting text before guide characters
;; (use-package highlight-indent-guides
;; :delight (highlight-indent-guides-mode "\u24BE\uFF47")
;; :hook (prog-mode . highlight-indent-guides-mode)
;; :config
;; (setq highlight-indent-guides-method 'character) ;; 'fill 'character 'bitmap
;; (setq highlight-indent-guides-character ?:) ;; ?:
;; (setq highlight-indent-guides-auto-enabled nil) ;; deactivate auto colors
;; (set-face-foreground 'highlight-indent-guides-character-face "gray30")
;; )
(use-package rainbow-mode
:delight (rainbow-mode "Rb") ;; " Rbow" "\u24C7"
:commands rainbow-mode)
(use-package focus
:commands focus-mode
:custom-face (focus-unfocused ((t :inherit shadow))))
(use-package iscroll
:commands iscroll-mode
;; :hook ((special-mode text-mode) . iscroll-mode)
)
(use-package virtual-auto-fill
:delight (virtual-auto-fill-mode "Fv") ;; "\u24CB\uFF46"
:commands virtual-auto-fill-mode
;;:hook (help-mode . virtual-auto-fill-mode)
)
(provide 'gui-settings)
;;; gui-settings.el ends here