From 5e329be394888aa2e3ca76026db4cb5d9f1499dd Mon Sep 17 00:00:00 2001 From: tmu Date: Mon, 18 Dec 2023 13:48:30 -0800 Subject: single-header.el --- emacs/single-header.el | 131 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 emacs/single-header.el diff --git a/emacs/single-header.el b/emacs/single-header.el new file mode 100644 index 0000000..5ca4afc --- /dev/null +++ b/emacs/single-header.el @@ -0,0 +1,131 @@ +(defvar single-header--current-header-buffer nil "Read the name") + +(defvar single-header-format '(make-header-info-string) "evaluated to fill the header") + +(defface single-header '((default . (:background "#000000" :family "Source Code Pro"))) "Face for top line") + +(require 'battery) +(defun with-face (str &rest face-plist) + (add-face-text-property 0 (length str) face-plist t str) + str) + +;; disable normal emms-state and move it to the header +;; (require 'emms-state) +;; (setq single-header-emms-state-format-string +;; '(emms-state +;; (" " emms-state +;; (emms-state-current-playing-time +;; (" " +;; (:propertize emms-state-current-playing-time +;; face emms-state-current-playing-time))) +;; (emms-state-total-playing-time +;; ("(" +;; (:propertize emms-state-total-playing-time +;; face emms-state-total-playing-time) +;; ")")) +;; emms-mode-line-string))) +;; (setq emms-state-mode-line-string "") + +(defun make-header-info-string () + "generates the mode line string that contains all the info to the right" + (let ((win (when (buffer-live-p single-header--current-header-buffer) + (get-buffer-window single-header--current-header-buffer))) + (str (concat + (format-time-string "%a, %b %+4Y-%0m-%0d ") + (with-face (format-time-string "%R ") + :weight 'bold) + (with-face (format "<%03.2f> " (car (load-average 1))) + :foreground "#da70d6") + (with-face (let* ((mi (memory-info)) + (tm (float (car mi))) + (fm (float (car (cdr mi)))) + (ts (float (car (cdr (cdr mi))))) + (fs (float (car (cdr (cdr (cdr mi))))))) + (format "{%.2f %.2f} " (- 1 (/ fm tm)) (- 1 (/ fs ts)))) + :foreground "#00ced1") + (with-face (battery-format "[%b%p%%] " (and battery-status-function (funcall battery-status-function))) + :weight 'bold) + ;; (format-mode-line single-header-emms-state-format-string) + ))) + (setq str (concat str + (cond (win (make-string + (- (window-max-chars-per-line win 'single-header) (length str)) ? )) + (t "")) + )) + (with-face str 'single-header))) + + +(setq global-mode-string '("" (:eval (concat (with-face (format " [%s] " default-directory) + :weight 'bold + :foreground "green2"))))) + +(defun single-header-init-buffer (buf) + (with-current-buffer buf + (insert "header test") + (jit-lock-mode nil) + (font-lock-mode -1) + (buffer-disable-undo) + (setq-local mode-line-format nil) + (setq-local header-line-format nil) + (setq-local cursor-type nil) + (setq-local cursor-in-non-selected-windows nil) + (setq-local overflow-newline-into-fringe nil) + (setq-local word-wrap nil) + (setq-local show-trailing-whitespace nil))) + +(defun single-header-init-window (win) + (with-selected-window win + (set-window-dedicated-p win t) + (set-window-parameter win 'no-other-window t) + (set-window-parameter win 'no-delete-other-windows t) + (set-window-margins win 0 0) + (set-window-fringes win 0 0) + (set-window-scroll-bars win 0 nil 0 nil) + (setq-local window-min-height 1) + (setq-local window-safe-min-height 1) + (let + (window-size-fixed) + (fit-window-to-buffer win 1)) + (setq-local window-size-fixed t) + (when + (fboundp 'window-preserve-size) + (window-preserve-size win nil t)))) + +(defun single-header-show (buf) + "show / make a header" + (if (buffer-live-p buf) + (let ((win (display-buffer-in-side-window buf '((side . top) + (slot . -100))))) + (single-header-init-window win)) + (single-header-make))) + +(defun single-header-make () + "create the fake header line" + (interactive) + (unless (buffer-live-p single-header--current-header-buffer) + (let ((buf (generate-new-buffer "*header*"))) + (single-header-init-buffer buf) + (setq single-header--current-header-buffer buf) + (single-header-show buf)))) + +(defun single-header-delete () + "remove an existing header buffer" + (interactive) + (when (buffer-live-p single-header--current-header-buffer) + (kill-buffer single-header--current-header-buffer))) + +(defun single-header-update () + "update the contents of the header line according to `single-header-format'" + (when (buffer-live-p single-header--current-header-buffer) + (with-current-buffer single-header--current-header-buffer + (erase-buffer) + (insert (eval single-header-format))))) + +(add-hook 'after-make-frame-functions (lambda (frame) + (with-selected-frame frame + (single-header-show single-header--current-header-buffer)))) + +;; do init frame seperately +(single-header-show single-header--current-header-buffer) +(run-with-timer 0 1 'single-header-update) + -- cgit v1.2.3