;; Time-stamp: <2020-04-26 20:33:20 (tslil@bison)> ;; ----------------------------------------------------------------------------- ;; Mode-line ;; ;; The mode-line is set to eliminate duplicate information between buffers. ;; Everything else is intended to be displayed in another, centralised location. (setq display-time-format "%d/%H.%M" display-time-default-load-average nil) (display-time-mode 1) (setq global-mode-string nil) (setq-default mode-line-format '("" mode-line-front-space mode-line-modified "%@" " %l:%c %[" mode-line-buffer-identification "%] %I" " " mode-line-modes ;; (vc-mode vc-mode) (:eval (abbreviate-file-name default-directory)) mode-line-misc-info mode-line-end-spaces)) ;; ----------------------------------------------------------------------------- ;; System information ;; ;; If running under exwm with its system tray, then put the clock and workspace ;; indicator in a posfrmae as provided by statusbar.el. Othewrise, use ;; minibuffer-line as the central location. (if (fboundp 'exwm-systemtray-enable) (progn ;; ----------------------------------------------------------------------------- ;; Statusbar.el (add-to-list 'load-path (expand-file-name "~/.emacs.d/scripts/statusbar.el/")) (use-package posframe :ensure t) (use-package statusbar :config (advice-add 'exwm-update-workspace-lighter :after #'statusbar-refresh) (setq statusbar-modeline-variables '(exwm-workspace-lighter display-time-string)) (statusbar-mode 1) (exwm-update-workspace-lighter))) ;; ----------------------------------------------------------------------------- ;; Not running under EXWM, use minibuffer-line ;; ;; First we define two ``modules'' for use in the mode-line ;; ----------------------------------------------------------------------------- ;; Remind me of my mortality (defvar my-mortality "") (defun my-mortality-update () (setq my-mortality (format "%.4f" (/ (float-time (time-subtract (current-time) (encode-time 0 0 0 DAY MONTH YEAR))) (* 60 60 24 364.25))))) (defvar my-mortality-update-timer (run-at-time nil (* 60 60) 'my-mortality-update)) ;; ----------------------------------------------------------------------------- ;; Battery status and CPU temperature (defvar sys-status "") (defvar sys-status-cpu-temp-threshold "45") (defun linux-sys-status () (let ((bat-s (string-trim (shell-command-to-string (expand-file-name "~/.local/bin/battery")))) (temp-s (if (not (file-exists-p "/sys/class/thermal/thermal_zone1/temp")) "" (with-temp-buffer (insert-file-contents "/sys/class/thermal/thermal_zone1/temp") (let ((temp (substring-no-properties (buffer-string) 0 -4))) (if (string-greaterp temp sys-status-cpu-temp-threshold) (concat " " temp "C") "")))))) (if (and (string-blank-p bat-s) (string-blank-p temp-s)) "" (format " [%s%s]" bat-s temp-s)))) (defun sys-status-update () (setq sys-status (linux-sys-status))) (defvar sys-status-update-timer (run-at-time nil 60 'sys-status-update)) ;; ----------------------------------------------------------------------------- ;; Minibuffer-line (use-package minibuffer-line :ensure t :config (setq minibuffer-line-refresh-interval 60 minibuffer-line-format '("" display-time-string " " my-mortality sys-status)) ;; We redefine this function to centre the text ;; Is there a better way? (defun minibuffer-line--update () (with-current-buffer minibuffer-line--buffer (erase-buffer) (insert (format-mode-line minibuffer-line-format 'minibuffer-line)) (setq fill-column (frame-width)) (center-line))) (minibuffer-line-mode 1) (when (symbolp exwm-workspace-switch-hook) (push #'minibuffer-line--update exwm-workspace-switch-hook))) ;; really want to hook buffer changes at all, and focus (add-hook 'minibuffer-exit-hook #'minibuffer-line--update)) ;; ----------------------------------------------------------------------------- ;; Minions to clean mode-line (use-package minions :ensure t :config (setq minions-mode-line-lighter ":") (minions-mode 1))