summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.org5
-rw-r--r--header-info.el149
2 files changed, 154 insertions, 0 deletions
diff --git a/README.org b/README.org
new file mode 100644
index 0000000..9381d0d
--- /dev/null
+++ b/README.org
@@ -0,0 +1,5 @@
+* Header Info Mode
+
+This package provides the =header-info= minor mode to display parts of the normal modeline in the header line instead.
+
+It is inspired by [[https://www.reddit.com/r/emacs/comments/i3ff3n/weekly_tipstricketc_thread/g0pm74u][this reddit comment]].
diff --git a/header-info.el b/header-info.el
new file mode 100644
index 0000000..035f50e
--- /dev/null
+++ b/header-info.el
@@ -0,0 +1,149 @@
+;;; header-info.el --- Display buffer information in the header line
+
+;; Copyright (C) 2020 Ferdinand Pieper
+
+;; Author: Ferdinand Pieper <mail@pie.tf>
+;; Created: 23 Aug 2020
+;; URL: https://github.com/fpiper/header-info
+
+;; This file is not part of GNU Emacs.
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, see
+;; <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Minor mode to display part of the mode line in the header line
+;; instead. Customize `header-info-header-line-format' and
+;; `header-info-mode-line-format' to determine what to show in the
+;; header and mode line when turned on.
+;;
+;;; Code:
+
+(defvar header-info-old-header-line nil)
+(defvar header-info-old-mode-line nil)
+(make-local-variable 'header-info-old-header-line)
+(make-local-variable 'header-info-old-mode-line)
+
+(defvar mode-line-major-mode
+ (list `(:propertize ("" mode-name)
+ help-echo "Major mode\n\
+mouse-1: Display major mode menu\n\
+mouse-2: Show help for major mode\n\
+mouse-3: Toggle minor modes"
+ mouse-face mode-line-highlight
+ local-map ,mode-line-major-mode-keymap)
+ '("" mode-line-process))
+ "Mode line construct for displaying major and minor modes.")
+(defvar mode-line-minor-modes
+ (let ((recursive-edit-help-echo "Recursive edit, type C-M-c to get out"))
+ (list (propertize "%[" 'help-echo recursive-edit-help-echo)
+ "("
+ `(:propertize ("" minor-mode-alist)
+ mouse-face mode-line-highlight
+ help-echo "Minor mode\n\
+mouse-1: Display minor mode menu\n\
+mouse-2: Show help for minor mode\n\
+mouse-3: Toggle minor modes"
+ local-map ,mode-line-minor-mode-keymap)
+ (propertize "%n" 'help-echo "mouse-2: Remove narrowing from buffer"
+ 'mouse-face 'mode-line-highlight
+ 'local-map (make-mode-line-mouse-map
+ 'mouse-2 #'mode-line-widen))
+ " )"
+ (propertize "%]" 'help-echo recursive-edit-help-echo)
+ " "))
+ "Mode line construct for displaying minor modes.")
+
+(defgroup header-info nil
+ "Display information in the header line."
+ :group 'tools)
+
+(defcustom header-info-header-line-format
+ (list " "
+ '(:eval (let ((name (buffer-name)))
+ (cond ((not buffer-file-truename)
+ ;; (propertize name 'face 'bold)
+ mode-line-buffer-identification
+ )
+ ((equal name (file-name-nondirectory buffer-file-truename))
+ (concat
+ ;; (propertize (f-filename buffer-file-truename) 'face 'bold)
+ (format-mode-line mode-line-buffer-identification)
+ " "
+ (f-dirname buffer-file-truename)
+ "/…" ))
+ (t
+ (concat (propertize name 'face 'bold)
+ " "
+ buffer-file-truename)))))
+
+ ;; Right aligned
+ '(:eval (let* ((right-text (format-mode-line mode-line-major-mode)))
+ (concat (propertize
+ " " 'display
+ `((space :align-to (- (+ right right-fringe right-margin)
+ ,(+ 3 (string-width right-text))))))
+ right-text))))
+ "`header-line-format' to use in `header-info-mode'."
+ :group 'header-info
+ :type '(list))
+
+(defcustom header-info-mode-line-format
+ `("%e"
+ (:eval (window-numbering-get-number-string))
+ mode-line-front-space
+ mode-line-mule-info
+ mode-line-client
+ mode-line-modified
+ mode-line-remote
+ mode-line-frame-identification
+ ;; mode-line-buffer-identification
+ " "
+ mode-line-position
+ (vc-mode vc-mode)
+ " "
+ ,mode-line-minor-modes
+ ;; mode-line-modes
+ mode-line-misc-info
+ mode-line-end-spaces
+ )
+ "`mode-line-format' to use in `header-info-mode'."
+ :group 'header-info
+ :type '(list))
+
+(defun turn-on-header-info-mode ()
+ (setq header-info-old-header-line header-line-format
+ header-line-format header-info-header-line-format)
+ (setq header-info-old-mode-line mode-line-format
+ mode-line-format header-info-mode-line-format))
+(defun turn-off-header-info-mode ()
+ (setq header-line-format header-info-old-header-line)
+ (setq mode-line-format header-info-old-mode-line))
+
+(define-minor-mode header-info-mode
+ "Minor mode to show file information in the header line."
+ nil
+ nil
+ nil
+ (if header-info-mode
+ (turn-on-header-info-mode)
+ (turn-off-header-info-mode)))
+
+(define-globalized-minor-mode global-header-info-mode
+ header-info-mode turn-on-header-info-mode)
+
+
+(provide 'header-info)
+;;; header-info.el ends here