A long time I presented a simple hack that allowed you to
quickly navigate to your shell’s user config file (e.g.
.zshrc). While the solution gets the job done it was pretty basic and
limited - most notably it’d ignore the fact that you typically have several
shell config files that are often built on top of each other - e.g.
~/.bashrc. Fortunately the original
hack evolved rather nicely and today lives in the
crux library under the name
Provided you’ve installed
crux all you need to do is run that command
M-x crux-find-shell-init-file) and you’ll get something like this
as the result:
Pretty neat, right? Even in its updated state the command is not complex at all:
(defun crux-find-shell-init-file () "Edit the shell init file in another window." (interactive) (let* ((shell (file-name-nondirectory (getenv "SHELL"))) (shell-init-file (cond ((string= "zsh" shell) crux-shell-zsh-init-files) ((string= "bash" shell) crux-shell-bash-init-files) ((string= "tcsh" shell) crux-shell-tcsh-init-files) ((string= "fish" shell) crux-shell-fish-init-files) ((string-prefix-p "ksh" shell) crux-shell-ksh-init-files) (t (error "Unknown shell")))) (candidates (cl-remove-if-not 'file-exists-p (mapcar 'substitute-in-file-name shell-init-file)))) (if (> (length candidates) 1) (find-file-other-window (completing-read "Choose shell init file: " candidates)) (find-file-other-window (car candidates)))))
I guess one thing that we can improve down the road is adding an option to
display the shell config in the same window, but that’s a small thing. The variables
crux-shell-bash-init-files are simply lists of all potential files that
we should look for, that’s why I’ve opted to omit them from the code listing.
I stand by my original suggestion to bind this useful command to
(global-set-key (kbd "C-c S") #'crux-find-shell-init-file)
That’s all I have for you today! Meta-x forever!
Did you notice the subtle difference in the names of the original and the updated article? ↩