It is works anywhere but it is easier to remember if you add it to an existing Hydra.
Here is the code.
("H" (lambda () (interactive) (hack-local-variables) (message "Local variables hacked")))
Here is the documentation.
_H_ hack-local-variables (see also normal-mode)
_N_ normal-mode (see also hack-local-variables)
There are two situations where I end up with really important Lisp code that is squashed up into one un-readable and consequently painful line:
- Reading Backtrace when
toggle-debug-on-error is true
- Using Lisp in a YAS template like this for example
The thing is that those lines are really important to me. I need to get them readable.
My solution had always been to manually re-indent them. Uggh. But after doing this way too many times, I ran into an issue tonight that demanded my full attention. Fortunately there is a really simple solution.
Continue reading “(Emacs+Org-Mode) If You Go Insane Trying To Deal With Lisp Code Squashed Into One Line Then Read On To See The Fix”
The EM-DASH provokes mixed feelings mostly in writers, and maybe readers if they notice it (probably the writers are the ones noticing it while reading). But the EM-DASH is a really nice way to break up a sentence when a COMMA or a SEMI-COLON or a COLON just won’t do it.
Continue reading “(Emacs+Org-Mode) If You Enjoy Writing Even A Little Bit With Emacs Then Add This Em-Dash Code Now”
As they say on the radio:
Emacs, you may not be perfect, but you are perfect for me 💘.
It is satisfying to perfectly configure a program for me to write any other kind of program.
Emacs is a great place to read man pages and write shell scripts. It gets simpler but not by much.
abo-abo’s Hydra functionality makes it easy to build great GUIs. I like the head feature. The problem I’m running into is that I keep stomping on my head definitions. For example I define one Hydra as
_R_esolve and then somehow I overlook the fact and I create another another as
_R_emember, forgetting about the first one.
How do you make sure not to stomp on other Hydra heads when you forget?
abo-abo’s Hydra functionality has changed both my learning and Emacs workflow. If you give it a chance with my workflow below you will get even more power-user type stuff out of it.
The Emacs workflow part is easy: it introduces a new logical namespace for function calls and brings a nice GUI along for the ride.
The learning workflow is that while I am learning a new package (or anything) I can stick everything that seems important into a Hydra for that mode. Instead of writing notes or worrying about settings keybindings for things that I may or may not use I just put it in the Hydra and keep reading along. The Hydra becomes the notebook. It is like super lightweight literate programming because it becomes executable documentation.
Is there a single person out there who can remember all of the features they have configured in their Emacs?
I sure can’t 😄(Joy)😮(Surprise)😢(Sadness).
Am I the only one?
My Emacs is like a kitchen that I’ve perfected over the years to prepare just about every kind of meal.
The meals are configurations for example of the Go language, SML, OCaml, APL, IRC, and writing LaTeX, Pandoc, or Org-Mode. Some of the meals have been around and will stay around for a long time. Some of the meals are short lived, and welcome to come back. Either way I’m glad to be able to cook in such a great kitchen.
There are always improvements to the kitchen. They are welcome because it can always get better. At this point there aren’t going to be any major changes to the kitchen itself unless I have some major changes in the way that I think. It works how I like to work. Everything is where I like it to be. It is easy for me to add new things and remove them in a pleasant manner. Most importantly it is a reflection of my cognitive landscape, so I am happy there.
Once you are at home in Emacs you will welcome new meals and say farewell to some, but you will always have a kitchen that you love. That is why the “Perfect Emacs Configuration” is never to be found and never will be: we are all unique and see the world with with a curiosity that is all our own.
Fortunately we have a lot of similarities so good ideas spread fast and they bring great ease. Of even greater fortune we have a lot of differences so we can grow and learn from perspectives and preferences so totally different from our own. It is delightful and refreshing to see a cognitive landscape different from our own. That is where the fun is: going to new lands and being welcomed to learn about how people see the world. Our Emacs configurations are a sweet reminder of the joy and creativity that comes with computing. Emacs is the selfless and benevolent home where that kitchen lives.
Long live Emacs—our eternal home of the joy and creativity of computing, shared learning, and flat out fun.
Thank you Greg for the big correction here <2018-01-12 Fri>…
The documentation for
delete-char suggests that
delete-forward-char ought to be used for interactive use instead of
(global-set-key (kbd "C-d") #'delete-forward-char)
Once you’ve been using Emacs for a while you end up using
eval-expression a lot. 99% of the time I use it to make function calls. I never noticed before that it is kind of tedious to reach for
S-M-; and then
() despite using it so much. Here is a binding and a function definition that make it easier to use binding it close to home and inserting the round parentheses.
(global-set-key (kbd "M-;") #'my-eval-expression)
(define-key org-mode-map (kbd "M-;") nil)
(let ((map (make-sparse-keymap)))
(set-keymap-parent map read-expression-map)
(define-key map [(control ?g)] #'minibuffer-keyboard-quit)
(define-key map [up] nil)
(define-key map [down] nil)
(defun my-read--expression (prompt &optional initial-contents)
(let ((minibuffer-completing-symbol t))
(setq font-lock-mode t)
(funcall font-lock-function 1)
(read-from-minibuffer prompt initial-contents
(defun my-eval-expression (expression &optional arg)
"Attribution: URL `https://lists.gnu.org/archive/html/help-gnu-emacs/2014-07/msg00135.html'."
(interactive (list (read (my-read--expression ""))
(insert (pp-to-string (eval expression lexical-binding)))
(pp-display-expression (eval expression lexical-binding)
"*Pp Eval Output*"))))