From 4966e990798b197d36b357275df16b4d70f1351b Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Mon, 15 Apr 2024 20:58:37 +0100 Subject: [PATCH] Add the modeline module only with 'Emacs' support --- flake.nix | 3 - nix/fg42/unit.nix | 9 ++ nix/modules/editor/default.nix | 2 + nix/modules/editor/lisp/fg42/editor.el | 3 +- .../editor/lisp/fg42/modeline-noether.el | 83 ++++++++++++++ nix/modules/editor/lisp/fg42/modeline.el | 37 +++++++ .../editor/lisp/fg42/modeline/units.el | 90 ++++++++++++++++ .../editor/lisp/fg42/modeline/views.el | 102 ++++++++++++++++++ nix/modules/editor/lisp/fpkg.el | 2 +- 9 files changed, 325 insertions(+), 6 deletions(-) create mode 100644 nix/modules/editor/lisp/fg42/modeline-noether.el create mode 100644 nix/modules/editor/lisp/fg42/modeline.el create mode 100644 nix/modules/editor/lisp/fg42/modeline/units.el create mode 100644 nix/modules/editor/lisp/fg42/modeline/views.el diff --git a/flake.nix b/flake.nix index 8132b45..c26b0ad 100644 --- a/flake.nix +++ b/flake.nix @@ -64,9 +64,6 @@ ''; }; - - # factory = params: pkgs.callPackage ./nix/factory.nix ({ inherit noether; } // params); - # default = (factory { }); in { packages = { diff --git a/nix/fg42/unit.nix b/nix/fg42/unit.nix index e2ad772..66a5ffd 100644 --- a/nix/fg42/unit.nix +++ b/nix/fg42/unit.nix @@ -104,6 +104,15 @@ in ''; }; + fg42.modeline = mkOption { + type = types.enum [ "emacs" "noether" ]; + default = "emacs"; + description = '' + What modeline mode to ues. Options are "emacs" for a normal modeline and + "noether" to disable Emacs's modeline and replace it by the noether mode. + ''; + }; + fg42.docstrings = mkOption { type = types.attrsOf types.str; readOnly = true; diff --git a/nix/modules/editor/default.nix b/nix/modules/editor/default.nix index a5e1271..49edf1c 100644 --- a/nix/modules/editor/default.nix +++ b/nix/modules/editor/default.nix @@ -51,6 +51,8 @@ let base16-theme ] ++ lib.optionals (config.fg42.emojify) [ emojify + ] ++ lib.optionals (config.fg42.modeline == "noether") [ + noether ]); drv = makeFG42Drv { diff --git a/nix/modules/editor/lisp/fg42/editor.el b/nix/modules/editor/lisp/fg42/editor.el index 7cd62ff..5479ec6 100644 --- a/nix/modules/editor/lisp/fg42/editor.el +++ b/nix/modules/editor/lisp/fg42/editor.el @@ -42,8 +42,7 @@ (require 'fg42/org) (require 'fg42/minibuffer) (require 'fg42/graphics) - ;; (require 'fg42/modeline) - ) + (require 'fg42/modeline)) (require 'server) (require 'fg42/utils) diff --git a/nix/modules/editor/lisp/fg42/modeline-noether.el b/nix/modules/editor/lisp/fg42/modeline-noether.el new file mode 100644 index 0000000..649ac6d --- /dev/null +++ b/nix/modules/editor/lisp/fg42/modeline-noether.el @@ -0,0 +1,83 @@ +;;; FG42 --- The mighty editor for the emacsians -*- lexical-binding: t; -*- +;; +;; Copyright (c) 2010-2024 Sameer Rahmani +;; +;; Author: Sameer Rahmani +;; URL: https://devheroes.codes/FG42/FG42 +;; Version: 4.0.0 +;; +;; This program 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 3 of the License, or +;; (at your option) any later version. +;; +;; This program 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 this program. If not, see . +;; +;;; Commentary: +;;; Code: +(eval-when-compile + (require 'fpkg)) + +(require 'fg42/utils) + +(defvar fg42/modeline-views nil + "A list of Noether views to use for modeline.") + +(defvar fg42/modeline-active-face nil + "Override the active modeline face via this var.") + +(defvar fg42/modeline-inactive-face nil + "Override the inactive modeline face via this var.") + +(defface fg42/-disabled-modeline-active-border + '((t + :background "#bd93f9" :height 0.1 :box nil)) + "A new face for modeline in active state." + :group 'fg42) + + +(defface fg42/-disabled-modeline-dective-border + '((t + :background "#44475a" :height 0.1 :box nil)) + "A new face for modeline in active state." + :group 'fg42) + + +(use! noether + "Smart mode line is a pretty simple yet fantastic alternative +to Emacs modeline." + :if (display-graphic-p) + ;;:after projectile + :commands noether-global-mode + :config + (require 'noether-views) + (require 'fg42/modeline/views) + + (let ((active-border (get-base16-color-or :base0A "#bd93f9")) + (inactive-border (get-base16-color-or :base03 "#44475a"))) + (set-face-attribute 'fg42/-disabled-modeline-active-border nil :background active-border) + (set-face-attribute 'fg42/-disabled-modeline-dective-border nil :background inactive-border)) + + ;; Disable the default modeline + (setq-default mode-line-format "") + (let ((face-remaps (default-value 'face-remapping-alist))) + (setf (alist-get 'mode-line face-remaps) + (if fg42/modeline-active-face fg42/modeline-active-face 'fg42/-disabled-modeline-active-border) + (alist-get 'mode-line-inactive face-remaps) + (if fg42/modeline-inactive-face fg42/modeline-inactive-face 'fg42/-disabled-modeline-dective-border) + (default-value 'face-remapping-alist) face-remaps)) + + ;; Setup modelines + (when-not-wm + (setq-default noether-views (list fg42/modeline))) + (when-wm + (setq-default noether-views nil))) + +(provide 'fg42/modeline-noether.el) +;;; modeline-noether.el ends here diff --git a/nix/modules/editor/lisp/fg42/modeline.el b/nix/modules/editor/lisp/fg42/modeline.el new file mode 100644 index 0000000..e57d836 --- /dev/null +++ b/nix/modules/editor/lisp/fg42/modeline.el @@ -0,0 +1,37 @@ +;;; FG42 --- The mighty editor for the emacsians -*- lexical-binding: t; -*- +;; +;; Copyright (c) 2010-2024 Sameer Rahmani +;; +;; Author: Sameer Rahmani +;; URL: https://devheroes.codes/FG42/FG42 +;; Version: 4.0.0 +;; +;; This program 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 3 of the License, or +;; (at your option) any later version. +;; +;; This program 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 this program. If not, see . +;; +;;; Commentary: +;;; Code: +(eval-when-compile + (require 'fpkg) + (require 'fg42/config)) + +(require 'fg42/utils) + +(if (string= (fg42/config-get-or modeline "") "noether") + (require 'fg42/modeline-noether) + (progn + ;; TODO: Setup the normal mode line + )) + +(provide 'fg42/modeline) +;;; modeline.el ends here diff --git a/nix/modules/editor/lisp/fg42/modeline/units.el b/nix/modules/editor/lisp/fg42/modeline/units.el new file mode 100644 index 0000000..7900167 --- /dev/null +++ b/nix/modules/editor/lisp/fg42/modeline/units.el @@ -0,0 +1,90 @@ +;;; FG42 --- The mighty editor for the emacsians -*- lexical-binding: t; -*- +;; +;; Copyright (c) 2010-2024 Sameer Rahmani +;; +;; Author: Sameer Rahmani +;; URL: https://devheroes.codes/FG42/FG42 +;; Version: 4.0.0 +;; +;; This program 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 3 of the License, or +;; (at your option) any later version. +;; +;; This program 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 this program. If not, see . +;; +;;; Commentary: +;;; Code: +(eval-when-compile + (require 'fpkg)) + +(require 'noether) +(require 'noether-units) +(require 'projectile) +(require 'nerd-icons) + + +(defvar fg42/-mode-icon) + +(defun fg42/-update-mode-icon () + "Set the current buffer name to the watched var." + (setq fg42/-mode-icon major-mode)) + + +(defun fg42/-format-mode-icon (_ v _ _) + "Format the icon V." + (format " %s " (nerd-icons-icon-for-mode v))) + + +(noether-defunit fg42/mode-icon + "Draws an icon for the current major mode." + :label "" + :len 3 + :init (lambda () + (add-hook 'post-command-hook #'fg42/-update-mode-icon)) + + :deinit (lambda () + (remove-hook 'post-command-hook #'fg42/-update-mode-icon)) + + :var 'fg42/-mode-icon + :fn #'fg42/-format-mode-icon) + +;; ============================================================================ +;; Exwm input mode +;; ============================================================================ +(defvar fg42/-exwm-input-mode nil) + +(defun fg42/-set-exwm-input-mode () + "Set the EXWM input mode for the current buffer." + (setq fg42/-exwm-input-mode (format "%s" exwm--input-mode))) + + +(defun fg42/-format-exwm-input-mode (_ v _ _) + "Just return the input mode name V." + (if (=string v "line") + (propertize "L" 'font-lock-face `(:foreground ,(get-base16-color-or :base07 "eeeeec"))) + (propertize "C" 'font-lock-face `(:foreground ,(get-base16-color-or :base0A "eeeeec"))))) + + +(noether-defunit fg42/exwm-input-mode-unit + "Show the input mode of EXWM for the current buffer." + :label "I:" + :len 4 + :init (lambda () + (when (featurep 'exwm) + (add-hook 'noether-on-buffer-change-hook #'fg42/-set-exwm-input-mode))) + :deinit (lambda () + (when (featurep 'exwm) + (remove-hook 'noether-on-buffer-change-hook #'fg42/-set-exwm-input-mode))) + :var 'fg42/-exwm-input-mode + :fn #'fg42/-format-exwm-input-mode) + + +(provide 'fg42/modeline/units) +;;; units.el ends here diff --git a/nix/modules/editor/lisp/fg42/modeline/views.el b/nix/modules/editor/lisp/fg42/modeline/views.el new file mode 100644 index 0000000..7662162 --- /dev/null +++ b/nix/modules/editor/lisp/fg42/modeline/views.el @@ -0,0 +1,102 @@ +;;; FG42 --- The mighty editor for the emacsians -*- lexical-binding: t; -*- +;; +;; Copyright (c) 2010-2024 Sameer Rahmani +;; +;; Author: Sameer Rahmani +;; URL: https://devheroes.codes/FG42/FG42 +;; Version: 4.0.0 +;; +;; This program 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 3 of the License, or +;; (at your option) any later version. +;; +;; This program 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 this program. If not, see . +;; +;;; Commentary: +;;; Code: +(eval-when-compile + (require 'fpkg)) + +(require 'fg42/modeline/units) + + +(defun fg42/--bottom-right (info) + "Keep the modeline at bottom right by using the data from INFO." + (cons -1 -1)) + +(defun fg42/--bottom-right-padded (info) + "Keep the modeline at bottom right by using the data from INFO." + (cons -70 -1)) + + +(defun fg42/adjust-modeline (view) + "Adjust the VIEW after parent frame resize." + (noether-show view)) + + +(noether-defview fg42/modeline + "A simple and minimalist mode-line like status bar" + :managed? t + :binding (kbd "C-c 0") + :buffer "*modeline*" + :visible? t + :timeout 0 + :on-parent-resize #'fg42/adjust-modeline + :frame + (list + :right-fringe 5 + :poshandler #'fg42/--bottom-right + :border-width 0 + :font (format "%s %s" (car fg42/font) (- (cadr fg42/font) 1)) + :border-color "#bd93f9") + + :units + (list + (buffer-name-unit + :label (format "%s " (nerd-icons-codicon "nf-cod-layers")) + :len 20) + (projectile-project-unit + :label (format "%s " (nerd-icons-octicon "nf-oct-project")) + :len 20) + (git-branch-unit + :label (format "%s " (nerd-icons-devicon "nf-dev-git_branch")) + :len 20) + (fg42/mode-icon) + (line-unit :label (format "%s " (nerd-icons-codicon "nf-cod-location"))) + (time-unit :label (format " %s " (nerd-icons-mdicon "nf-md-clock_time_three"))))) + + +(noether-defview fg42/minimal-exwm + "A super simple bar containing the line number and column number that +Appears on the center of the current window." + :managed? t + :buffer "*exwm-status*" + :binding (kbd "C-c 1") + :separator " | " + + :timeout 10 + :frame + (list + :poshandler #'fg42/--bottom-right-padded + :border-width 0 + :border-color "#bd93f9") + + :units + (list + (fg42/exwm-input-mode-unit :label (format "%s " (nerd-icons-faicon "nf-fa-linux"))) + (buffer-name-unit + :label (format "%s " (nerd-icons-codicon "nf-cod-layers")) + :len 30) + + (time-unit :label (format "%s " (nerd-icons-mdicon "nf-md-clock_time_three"))))) + + +(provide 'fg42/modeline/views) +;;; views.el ends here diff --git a/nix/modules/editor/lisp/fpkg.el b/nix/modules/editor/lisp/fpkg.el index 72fa85f..79ee748 100644 --- a/nix/modules/editor/lisp/fpkg.el +++ b/nix/modules/editor/lisp/fpkg.el @@ -26,7 +26,7 @@ ;;; Code: (require 'map) (eval-when-compile - (require 'fg42-config)) + (require 'fg42/config)) (defvar package-names ())