From a9ce3c1d27e4bd81b8dbab49d66f67a78a4097f8 Mon Sep 17 00:00:00 2001 From: Howard Abrams Date: Sat, 10 Aug 2024 21:58:05 -0700 Subject: [PATCH] Fixed a "race condition" startup bug I wanted to have an icon associated with the major mode hydra, but the display system wasn't available at this time. So, now we can override it. --- bootstrap.org | 38 ++++++++++++++++++++++---------------- ha-config.org | 4 +--- ha-display.org | 16 +++++++++++++++- ha-programming.org | 3 ++- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/bootstrap.org b/bootstrap.org index f7b8437..bc3e7d5 100644 --- a/bootstrap.org +++ b/bootstrap.org @@ -116,8 +116,8 @@ The [[help:shell-command][shell-command]] function is useful, but having it spli (thread-last command shell-command-to-string s-lines - (-map 's-trim) - (-remove 's-blank-str?))) + (seq-map 's-trim) + (seq-remove 's-blank-str?))) #+end_src And let’s see the results: @@ -156,15 +156,19 @@ I actually run two instances of Emacs on some systems, where one instance has al #+end_src And now start the server with an appropriate tag name: -#+begin_src emacs-lisp - (if (not (ha-emacs-for-work?)) - (setq server-name "personal") - (setq server-name "work") - (when (ha-running-on-macos?) - (set-exec-path-from-shell))) - (server-start) +#+begin_src emacs-lisp + (when (display-graphic-p) + (if (not (ha-emacs-for-work?)) + (setq server-name "personal") + (setq server-name "work") + (when (ha-running-on-macos?) + (set-exec-path-from-shell))) + + (server-start)) #+end_src + +*Note:* When starting Emacs as a terminal program (only happens when I am attempting to evaluate code), we don’t start the server. * Load the Rest The following /defines/ the rest of my org-mode literate files, that I load later with the =ha-hamacs-load= function: #+begin_src emacs-lisp @@ -227,14 +231,17 @@ With this function, we can test/debug/reload any individual file, via: "Load or reload an org-mode FILE containing literate Emacs configuration code." (interactive (list (completing-read "Org file: " - (ha-hamacs-files :all)))) - ;; TODO: Replace concat here: - (let ((full-file (file-name-concat hamacs-source-dir file))) + (ha-hamacs-files :all)))) + (let ((full-file (expand-file-name file hamacs-source-dir))) (when (file-exists-p full-file) - (ignore-errors - (org-babel-load-file full-file))))) + (message ">>> %s" full-file) + (if (called-interactively-p) + (org-babel-load-file full-file) + (ignore-errors (org-babel-load-file full-file)))))) #+end_src +Notice that when we call this function /non-interactively/ (e.g. from the Lisp function, =ha-hamacs-reload-all=), we suppress any errors. Obviously, I want to see the errors when calling interactively. + ** Tangling the Hamacs And this similar function, will /tangle/ one of my files. Notice that in order to increase the speed of the tangling process (and not wanting to pollute a project perspective), I use a /temporary buffer/ instead of =find-file=. @@ -272,8 +279,7 @@ And we can tangle /all/ the files: "Tangle all my Org initialization/configuration files." (interactive) (dolist (file (ha-hamacs-files)) - (unless (equal file "bootstrap.org") - (ha-hamacs-tangle file)))) + (ha-hamacs-tangle file))) #+end_src ** Edit my Files Changing my Emacs configuration is as simple as editing an Org file containing the code, and evaluating that block or expression. Or even /re-loading/ the entire file as described above. Calling =find-file= (or more often [[file:ha-config.org::*Projects][project-find-file]]) is sufficient but quicker if I supply a /focused list/ of just the files in my project: diff --git a/ha-config.org b/ha-config.org index 1ed1914..cd920d4 100644 --- a/ha-config.org +++ b/ha-config.org @@ -373,9 +373,7 @@ Since I seldom remember keybindings, or even function names, for major-modes, I (string-replace "-" " ") (string-replace " mode" "") (s-titleize)))) - (s-concat ; (s-repeat 5 " ") - (all-the-icons-icon-for-mode mode :v-adjust 0.05) - " " title " Commands"))))) + (concat "ϻ " title " Commands"))))) #+end_src For this feature, I may want to pull it out into its own file, so as to keep all of its features together... however, those feature often /depend/ of the functions they are calling. If so, we would have a series like this: diff --git a/ha-display.org b/ha-display.org index 1c57d88..1dabc1b 100644 --- a/ha-display.org +++ b/ha-display.org @@ -37,10 +37,24 @@ Let's turn off the menu and other settings: #+end_src And let’s make this Emacs look more like a fancy IDE with [[https://github.com/domtronn/all-the-icons.el][all-the-icons]]: + #+begin_src emacs-lisp (use-package all-the-icons - :if (display-graphic-p)) + :if (display-graphic-p) + :config + (setq major-mode-hydra-title-generator + '(lambda (mode) + (let ((title (thread-last mode + (symbol-name) + (string-replace "-" " ") + (string-replace " mode" "") + (s-titleize)))) + (s-concat ; (s-repeat 5 " ") + (all-the-icons-icon-for-mode mode :v-adjust 0.05) + " " title " Commands"))))) #+end_src + +This also expands the [[file:ha-config.org::*Leader Sequences][Major Mode Hydra]] title sequence with a pretty icon. * Mode Line Let's install and load some of packages from the [[https://github.com/hlissner/doom-emacs][Doom Emacs]] project, like [[https://github.com/seagle0128/doom-modeline][doom-modeline]] and maybe the themes: #+begin_src emacs-lisp diff --git a/ha-programming.org b/ha-programming.org index 156a3f3..06c95b3 100644 --- a/ha-programming.org +++ b/ha-programming.org @@ -1198,7 +1198,8 @@ Support for [[https://docutils.sourceforge.io/rst.html][reStructuredText]] is [[ #+begin_src emacs-lisp (use-package rst :config - (set-face-attribute 'rst-literal nil :font ha-fixed-font)) + (when (and (display-graphic-p) (boundp 'ha-fixed-font)) + (set-face-attribute 'rst-literal nil :font ha-fixed-font))) #+end_src ** Docker Edit =Dockerfiles= with the [[https://github.com/spotify/dockerfile-mode][dockerfile-mode]] project: