aboutsummaryrefslogtreecommitdiff
path: root/shoshin-config.org
diff options
context:
space:
mode:
Diffstat (limited to 'shoshin-config.org')
-rw-r--r--shoshin-config.org823
1 files changed, 0 insertions, 823 deletions
diff --git a/shoshin-config.org b/shoshin-config.org
deleted file mode 100644
index b597e19..0000000
--- a/shoshin-config.org
+++ /dev/null
@@ -1,823 +0,0 @@
-#+AUTHOR: Grant Shoshin Shangreaux
-#+EMAIL: shoshin@cicadas.surf
-#+DESCRIPTION: Html version of an Emacs literate org configuration
-#+STARTUP: overview
-#+PROPERTY: header-args:emacs-lisp :lexical t
-#+OPTIONS: broken-links:mark
-
-* A New Start
-
-To welcome in Emacs 28 I intend to re-aquaint myself with the application
-and its ecosystem. I've been perusing the packages available through the
-default ELPA and non-gnu ELPA repos and trying to put together the various
-things that I've grown accustomed to.
-
-However, with a beginner's mind, I've been trying to avoid going down the
-same old idiosyncratic paths. Courting a bit of discomfort in order to learn
-what newcomers might experience coming to Emacs in this current version.
-
-** Overview
-
-This document is a journal, manual, and a program at once. I'm no expert at
-writing a document like this. If you happen to be reading it, the journal
-nature may be confusing. Over time, the journal will be incorporated into the
-bits that are a manual, solidified knowledge gained through the experience.
-
-The program bits will be tangled into [[file:shoshin-config.el]]. As a program, it
-requires a certain structure from top to bottom. Here, the snippets may be
-scattered around. I'll attempt to have a system to keep them organized, but
-this is all an experiment.
-
-The following code block is the "table of contents" that determines what
-is tangled into the resulting elisp file:
-
-#+begin_src emacs-lisp :tangle yes :noweb no-export
- ;;; shoshimacs.el --- Beginner's Mind Config -*- lexical-binding:t -*-
-
- <<preamble>>
-
- <<defvars>>
-
- ;;; Package Management
- <<package-management>>
-
- ;;; Major Keybinding
- <<keybinding>>
-
- ;;; Completion
- <<completion>>
-
- ;;; Editing
- <<editing>>
-
- ;;; Programming
- <<programming>>
-
- ;;; Projects
- <<projects>>
-
- ;;; External Services
- <<external-services>>
-
- ;;; User Interface
- <<user-interface>>
-#+end_src
-
-** Preamble
-:PROPERTIES:
-:header-args:emacs-lisp+: :noweb-ref preamble :noweb-sep "\n\n" :results silent
-:END:
-
-This section covers initialization that works best before anything else is
-configured. For example, it is much easier to manage the "custom variables"
-if they are not automatically tacked onto your initialization file. You can
-set and load a separate file to keep it clean:
-
-#+begin_src emacs-lisp
- (let ((my-custom-file (expand-file-name
- "shoshimacs-custom.el" user-emacs-directory)))
- (unless (file-exists-p my-custom-file)
- (make-empty-file my-custom-file))
- (setq custom-file my-custom-file)
- (load custom-file))
-#+end_src
-
-* Package Management
-:PROPERTIES:
-:header-args:emacs-lisp+: :noweb-ref package-management :noweb-sep "\n\n" :results silent
-:END:
-
-I've been using [[https://github.com/radian-software/straight.el#start-of-content][straight.el]]
-as my package manager since 2019 when I moved away from Spacemacs as my
-main configuration for day-to-day work. While I definitely recommend it
-as a flexible yet minimal package manager, it is certainly more useful
-to experienced Emacs users.
-
-This configuration will stick to packages available through the built-in
-~package.el~ system. As of Emacs 28, this is everything in the ELPA and
-non-gnu ELPA package repositories.
-
-** ELPA and Non-GNU ELPA
-
-ELPA packages have their copyright assigned to the FSF, which is a requirement
-for any code to be included into Emacs itself. ELPA packages are thus the
-most likely to be merged into Emacs as a new feature. Some, like EMMS, are
-likely to continue as "add-on" optional features only some users may choose.
-
-Non-gnu ELPA is relatively new, and does not require copyright assignment
-to the FSF. Packages are added to both repositories through the emacs-devel
-mailing list and the maintainers there. It intends to extend the packages
-available to the base Emacs installation while providing a bridge to inclusion
-in ELPA or Emacs proper at some time in the future.
-
-*** Add non-gnu ELPA to Emacs < 28
-
-Emacs 28 is the first version to include non-gnu ELPA by default. Some
-distributions may not yet have it as an available package.
-
-#+name: add-nongnu-elpa
-#+begin_src emacs-lisp
- (when (< emacs-major-version 28)
- (add-to-list 'package-archives '("nongnu" . "https://elpa.nongnu.org/nongnu/")))
-#+end_src
-
-** Installing Packages
-
-~package.el~ provides the [[help:package-install][package-install]] command which can be used interactively
-or from Lisp code like this configuration. If a package is already installed,
-it won't try to install it again. When you install a package this way, Emacs will
-add its name to [[help:package-selected-packages][package-selected-packages]].
-
-You can also use ~list-packages~ to browse, install and upgrade packages as
-well.
-
-I'll initialize the package functionality and refresh the contents to look for
-updates, and ensure any additional archives are fetched. this may have a startup
-impact, but i'm not concerned about that.
-
-#+begin_src emacs-lisp
- (package-initialize)
- (package-refresh-contents)
-#+end_src
-
-** Packages not in the default repos
-
-Any elisp package that is in Emacs's [[help:load-path][load-path]] can be ~require~'d and used.
-~(add-to-list 'load-path (expand-file-name "some-package/" user-emacs-directory))~
-is an example of putting the directory ~some-package/~ into the load path.
-
-*** COMMENT xah-fly-keys
-
-muscle memory has bound me to xah-fly-keys, and so i've decided to just
-manually install it by cloning the repo and adding it to the
-
-#+begin_src shell :var dir=(expand-file-name "xah-fly-keys" user-emacs-directory) :tangle no
- git clone https://github.com/xahlee/xah-fly-keys $dir
-#+end_src
-
-#+begin_src emacs-lisp
- (add-to-list 'load-path (expand-file-name "xah-fly-keys/" user-emacs-directory))
- (require 'xah-fly-keys)
- (xah-fly-keys-set-layout "qwerty")
- (xah-fly-keys t)
-#+end_src
-
-however, it is now in non-gnu elpa! so i don't need this anymore.
-
-** Emacs 28 native compilation
-
-[[info:elisp#Native Compilation][elisp#Native Compilation]]
-
-This is a new feature in Emacs 28 that will compile all of the Elisp as native
-machine code, rather than byte-code, which can result in major performance boosts.
-Compilation will happen in the background and is logged to the
-=*Async-native-compile-log*= buffer if you are curious. Mostly you shouldn't
-have to worry about it, though you may see some compilation warnings at times.
-
-#+begin_src emacs-lisp
- (when (and (functionp #'native-comp-available-p) (native-comp-available-p))
- (setq native-comp-always-compile t
- package-native-compile t))
-#+end_src
-
-* Keybinding
-:PROPERTIES:
-:header-args:emacs-lisp+: :noweb-ref keybinding :noweb-sep "\n\n" :results silent
-:END:
-
-Keybindings are the key to playing Emacs like an instrument. no matter
-what you choose, keep in mind that you can always bind keys to your
-most commonly used commands to make things convienient.
-
-I highly recommend creating a personal key map bound to a "leader key".
-You initiate it with the leader, and then bind following key sequences
-to commands you use. creating your own will make it easier to remember
-and keep organized.
-
-** xah-fly-keys
-
-This is what I adopted to combat RSI. my muscle memory is tied into it
-tightly right now. you may have other opinions about keybindings
-
-#+begin_src emacs-lisp
- ;; these need to be set before requiring the package
- (setq xah-fly-use-control-key nil
- xah-fly-use-meta-key nil)
- (package-install 'xah-fly-keys)
- (require 'xah-fly-keys)
- (xah-fly-keys-set-layout "qwerty")
- (xah-fly-keys t)
-#+end_src
-
-i'm setting it up early in the config so that its keymaps are available
-to modify / integrate with other packages.
-
-*** adding some custom commands to xah maps
-**** SPC 1 delete-other-windows
-
-i want this often, feels as if i'm constantly wanting that other window
-to go away.
-
-#+begin_src emacs-lisp
- (define-key 'xah-fly-leader-key-map (kbd "1") #'delete-other-windows)
-#+end_src
-
-** with-map-defkey
-
-#+begin_src emacs-lisp
- (defmacro with-map-defkey (keymap leader &rest pairs)
- "Define a new KEYMAP with prefix key LEADER, and list of bindings in it."
- (declare (indent 2))
- `(progn
- (defvar ,keymap (make-sparse-keymap))
- (define-prefix-command (quote ,keymap))
- (global-set-key (kbd ,leader) ,keymap)
- (mapc (lambda (pair)
- (define-key ,keymap
- (kbd (if (numberp (car pair)) (number-to-string (car pair))
- (symbol-name (car pair))))
- (cadr pair)))
- (quote ,(seq-partition pairs 2)))))
-
- (defvar *my-config* "~/projects/shoshimacs/shoshin-config.org"
- "Path to my main configuration file.")
-
- (defun my-configuration ()
- (interactive)
- (find-file *my-config*))
-
- (defun my-reload-config ()
- "Tangles and reloads a literate config with `org-babel-load-file'"
- (interactive)
- (org-babel-load-file *my-config*))
-
- (with-map-defkey my-key-map "M-m"
- 1 delete-other-windows
- a apropos
- b consult-buffer
- c my-configuration
- d embark-act
- e eshell
- f find-file
- g magit
- h info
- i consult-imenu
- j describe-function
- k describe-variable
- n tab-next
- s consult-ripgrep
- t consult-theme
- w which-key-mode
- <f1> my-reload-config)
-#+end_src
-
-** COMMENT bind-map
-
-there is a package available in nongnu elpa that offers a macro that
-sort of generalizes the leader key idea. it also hooks into the evil package
-a bit to allow definition of bindings over different "states" that your
-editor might be in, like command or insert mode in xah-fly-keys. its fairly
-geared toward evil in that way, so i'm not sure how it will interact, but let us
-find out. the other option would be to make a simple macro of our own to hook
-into leader key maps.
-
-#+begin_src emacs-lisp
- (package-install 'bind-map)
-
- (bind-map my-keymap
- :keys ("M-m"))
-
- (bind-map my-org-map
- :keys ("M-m m")
- :major-modes (org-mode)
- :bindings ("," #'org-insert-structure-template))
-
- (bind-map my-elisp-map
- :keys ("M-m m")
- :major-modes (emacs-lisp-mode
- lisp-interaction-mode)
- :bindings ("e" #'edebug-instrument-function))
-
- (bind-map my-ruby-map
- :keys ("M-m m")
- :major-modes (ruby-mode)
- :bindings ("d" #'ruby-beginning-of-defun))
-
- (bind-map-set-keys my-keymap
- "b" #'consult-buffer
- "c" #'my-config
- "g" #'magit
- "j" #'consult-grep
- "k" #'consult-imenu
- "n" #'tab-next
- "t" #'consult-theme)
-#+end_src
-
-* Completion
-:PROPERTIES:
-:header-args:emacs-lisp: :noweb-ref completion :noweb-sep "\n\n" :results silent
-:END:
-
-Completion is a huge part of my experience using Emacs. I have been on
-an evolving journey of from the basic type of terminal tab completion
-to spaceship level UI implemented as almost a sub-application in Emacs.
-
-This configuration is aiming at using a new crop of completion enhancements
-that tie into Emacs's native completion API. This is a more modular approach
-that allows a sort of composition of extensions to completion behavior and
-its appearance in the user interface.
-
-** Two kinds of completion
-
-I want to point out that there are two distinct but similar features
-both grouped under the concept of "completion". The first is *Minibuffer*
-completion. Any time you use the minibuffer to enter commands or arguments,
-there is a completion system available to help you enter text there.
-The second is *Buffer* completion, offering candidates for text you are
-typing in any buffer. Code completion provided by a language server
-is one example. In vanilla Emacs, you get [[info:emacs#Symbol Completion][Symbol Completion]]
-for free, since Emacs itself is a running Lisp process with knowledge of
-all the defined symbols in the system.
-
-I've been confused by this in the past, because the features are so similar.
-However, completing text in an arbitrary buffer really depends on context,
-and it is much more complex than completing commands and arguments that are
-appropriate to a specific situation.
-
-** Emacs completion styles
-
-Emacs has a quite sophisticated way of selecting candidates for completion.
-You can read about them here: [[info:emacs#Completion Styles][emacs#Completion Styles]]
-
-I've grown used to the =flex= style of completion where typing
-=pr/s/sho.o= at the find file prompt expands to
-=projects/shoshimacs/shoshin-config.org=. There are other alternatives
-and you can even write your own. The ~completion-styles~ is a list of
-all the styles you'd like to use. It starts at the front, and if no matches
-are found, moves to the next style of completion. In this config, I just
-added =flex= to the front of the default completion styles.
-
-#+begin_src emacs-lisp
- (setq completion-styles '(flex basic partial-completion emacs22)
- completion-cycle-threshold 3
- tab-always-indent 'complete)
-#+end_src
-
-~completion-cycle-threshold~ defines when you want to just cycle through
-alternatives on each <TAB> (or whatever key you use) rather than presenting
-options. Setting it to 3 means if my options are "FOO, FOP, FOR" or less,
-hitting complete will change FOO->FOP, FOP->FOR, FOR->FOO.
-
-~tab-always-indent~ changes the behavior of the TAB key:
-
-#+begin_quote
- If ‘complete’, TAB first tries to indent the current line, and if the line
- was already indented, then try to complete the thing at point.
-#+end_quote
-
-** [[info:consult#Top][consult]] - Consulting [[info:elisp#Minibuffer Completion][completing-read]]
-
-consult offers enhanced completion similar to ivy and helm, but with the
-built in completing read functionality of the minibuffer.
-
-#+begin_src emacs-lisp
- (package-install 'consult)
-#+end_src
-
-main entry point would be ~consult-buffer~. however, there are many consult
-commands that can enhance any completing read function.
-
-*** "Virtual Buffers"
-
-it introduces this concept of "Virtual Buffers", but i'm not certain what
-it means. consult "supports ... narrowing to the virtual buffer types".
-
-perhaps a Virtual Buffer is a "grouping" of actual Emacs buffers or "things"
-that can be materialized in a buffer. For example, I can ~consult-buffer~
-and press ~m SPC~ to narrow the "buffer list" to any bookmarks.
-
-*** consult keybindings
-
-#+begin_src emacs-lisp
- (global-set-key (kbd "C-x b") #'consult-buffer)
- (define-key xah-fly-leader-key-map (kbd "f") #'consult-buffer)
- (define-key xah-fly-command-map (kbd "n") #'consult-line)
-#+end_src
-
-*** consult-themes
-
-i had a bit of a mess with it at first, because i'd implemented my own
-solution to a quirk of theme loading. enabling themes is additive,
-and can cause unexpected results. so i added [[info:elisp#Advising Functions][advice]]
-to ~load-theme~ to automatically disable the old one before enabling
-the new.
-
-it seems like ~consult-theme~ does this as well. additionally, as
-it will preview the theme as you are narrowing the selection. i did not
-expect this behavior and it got all kinds of wonky. the manual has a
-nice example of delaying the theme-switch-preview since it is slow.
-this way you can scroll / narrow your list of themes without the colors
-changing with every keypress.
-
-#+begin_src emacs-lisp
- (with-eval-after-load 'consult
- (consult-customize consult-theme :preview-key '(:debounce 0.5 any))
- (setq consult-themes my-chosen-themes))
-#+end_src
-
-*** TODO consult-project-buffer
-
-how do project buffers get filtered? i'm seeing buffers assigned to a project
-that in my mind, shouldn't be.
-
-looks like it interfaces with ~project-switch-to-buffer~ which has its own
-logic about which project a buffer belongs to. some of the mistakes i was seeing
-earlier were simply due to starting a repl in a particular directory.
-
-it appears that "special" buffers may get assigned to a particular project as
-well. for example the EWW buffer is part of a project, but it is unclear as
-to why. appears likely to have to do with the behavior of the ~default-directory~
-variable which is buffer-local.
-
-i may want to figure out ways to mark "special" buffers as having a non-project
-default-directory set so they don't show up, or just filter them out if it
-becomes annoying. i'm accustomed to ~perspectives~ provided by a MELPA package
-that hooked into ~projectile~'s project definitions. it would keep a list of
-perspective-local buffers where the perspective was tied to a project.
-
-** embark
-
-#+begin_src emacs-lisp
- (package-install 'embark)
- (package-install 'embark-consult)
- (global-set-key (kbd "C-;") #'embark-act)
- (setq prefix-help-command #'embark-prefix-help-command)
-#+end_src
-
-** marginalia
-
-#+begin_src emacs-lisp
- (package-install 'marginalia)
- (marginalia-mode)
-#+end_src
-
-** vertico
-
-#+begin_src emacs-lisp
- (package-install 'vertico)
- (setq minibuffer-prompt-properties
- '(read-only t cursor-intangible t face minibuffer-prompt))
- (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode)
- (setq read-extended-command-predicate
- #'command-completion-default-include-p)
- (setq enable-recursive-minibuffers t)
- (vertico-mode)
-#+end_src
-
-*** vertico-directory
-
-i'd like to emulate the behavior in ~find-file~ that i'm used to from Ivy.
-basically, when i press DEL it should act normally until i hit a directory
-boundary, then it should jump up a dir with the following press.
-
-this is implemented with the ~vertico-directory~ extension.
-
-#+begin_src emacs-lisp
- (require 'vertico-directory)
- (define-key vertico-map (kbd "RET") #'vertico-directory-enter)
- (define-key vertico-map (kbd "DEL") #'vertico-directory-delete-char)
- (define-key vertico-map (kbd "M-DEL") #'vertico-directory-delete-word)
- (define-key vertico-map (kbd "M-j") #'vertico-quick-insert)
-#+end_src
-
-** corfu
-
-#+begin_src emacs-lisp
- (package-install 'corfu)
- (setq corfu-auto t
- corfu-cycle t
- corfu-quit-no-match t)
- (global-corfu-mode t)
-#+end_src
-
-*** corfu-terminal enables in terminal interface
-
-#+begin_src emacs-lisp
- (package-install 'corfu-terminal)
- (unless (display-graphic-p)
- (corfu-terminal-mode +1))
-#+end_src
-** which-key
-
-which-key is an excellent package that helps provide guide posts for command
-discoverability. many key commands in Emacs are in sequences. for example,
-~org-babel-tangle~ is ~C-c C-v t~. as a user, the commands you use often
-become muscle memory, or you map them to something more convienient. but
-sometimes you know there is some command to do what you want but you don't
-quite remember what the sequence is. or perhaps you're in a new major-mode
-and you know there must be several handy commands under ~C-c~. ~which-key~
-pops up a buffer with a listing of all the possible continuations from where
-you are in a key sequence. for that reason, it can be useful at times even
-for experienced users.
-
-this config installs which-key, but does not activate it automatically.
-some advice from Daniel Mendler (consult author) suggested that limiting the
-amount Emacs pops things up automatically is a better user experience.
-which-key is just a toggle away when needed, and there is also [[*embark][embark]]
-which has a command to show prefix key continuations.
-
-#+begin_src emacs-lisp
- (package-install 'which-key)
- (which-key-mode)
-#+end_src
-
-* Editing
-:PROPERTIES:
-:header-args:emacs-lisp: :noweb-ref editing :noweb-sep "\n\n" :results silent
-:END:
-** [[info:emacs#Matching][electric pair mode]]
-I've been using smartparens -> (bookmark-jump "smartparens package") in my
-main config. electric pair mode does some of what smartparens does out of
-the box. what i'm missing is the generalized ~sp-hybrid-slurp~ or
-whatever it was called. but using the built in is good for now. further
-config might get what i want with vanilla built ins.
-
-#+begin_src emacs-lisp
- (electric-pair-mode)
-#+end_src
-
-** markdown mode
-#+begin_src emacs-lisp
- (package-install 'markdown-mode)
-#+end_src
-
-** org mode
-*** jump to top level parent heading
-
-a friend was wanting this functionality, so i dug around in the org functions
-to find one i could build a command out of:
-
-#+begin_src emacs-lisp
- (defun my-org-top-level-heading ()
- (interactive)
- (let ((moo 1))
- (while moo (setq moo (org-up-heading-safe)))))
-#+end_src
-
-~org-up-heading-safe~ is designed not to throw an error and returns the level
-of the headline found (as it goes up) or nil if no higher level is found.
-this just uses a dumb while loop to call it until it returns nil, which should
-get us where we are looking to go 😃
-
-*** exporting
-#+begin_src
- (require 'ox-md)
-#+end_src
-**** htmilze
-
-this seems to be required to fontify source blocks
-
-#+begin_src emacs-lisp
- (package-install 'htmlize)
-#+end_src
-
-** recentf-mode
-
-this tracks recently operated on files (by default) and enables quick selection
-from them in various Emacs menus. [[*\[\[info:consult#Top\]\[consult\]\] - Consulting \[\[info:elisp#Minibuffer Completion\]\[completing-read\]\]][consult]] hooks into it as well.
-
-#+begin_src emacs-lisp
- (recentf-mode)
-#+end_src
-
-** tabs and spaces
-
-#+begin_src emacs-lisp
- (setq indent-tabs-mode nil)
-#+end_src
-
-* Programming
-:PROPERTIES:
-:header-args:emacs-lisp: :noweb-ref programming :noweb-sep "\n\n" :results silent
-:END:
-** Languages
-*** Common Lisp
-#+begin_src emacs-lisp
- (package-install 'sly)
-#+end_src
-
-*** Javascript
-
-#+begin_src emacs-lisp
- (package-install 'json-mode)
-#+end_src
-
-*** Ruby
-**** inf-ruby
-
-inf-ruby provides an interface to the various REPLs available in the Ruby-verse
-its currently provided by non-gnu ELPA:
-
-#+begin_src emacs-lisp
- (package-install 'inf-ruby)
-#+end_src
-
-** Dev Docs
-#+begin_src emacs-lisp
- (package-install 'devdocs)
-#+end_src
-* Projects
-:PROPERTIES:
-:header-args:emacs-lisp: :noweb-ref projects :noweb-sep "\n\n" :results silent
-:END:
-
-** project.el
-
-~project.el~ is the built in project management tool. previously, I've used
-~projectile~, which is great, but some of the more recent tools (like eglot)
-use the built in ~project.el~ api for their features.
-
-I've got the ~project-prefix-map~ on the key =p= in [[*with-map-defkey][my-key-map]].
-
-** version control
-*** magit
-
-its the best! 🪄
-
-#+begin_src emacs-lisp
- (package-install 'magit)
-#+end_src
-* External Services
-:PROPERTIES:
-:header-args:emacs-lisp: :noweb-ref external-services :noweb-sep "\n\n" :results silent
-:END:
-
-Packages that enable communication via HTTP or connect with external APIs or other
-resources outside of Emacs and/or the local machine.
-
-** plz - http library
-
-this is an http library that intends to solve some of the "pain points" of url.el.
-i ran into some of them trying to download and install the Victor Mono font used
-by my configuration. the downside of ~plz~ is that it is dependent on ~curl~, rather
-than being pure elisp. however, this is a non-issue for me, especially since my
-use case had devolved into using ~make-process~ to call ~wget~ and then implement
-a "callback" with a process sentinel. kinda neat, but maybe too much.
-
-#+begin_src emacs-lisp
- (package-install 'plz)
-#+end_src
-
-the sourcehut package in this config also depends on ~plz~
-
-** sourcehut
-there's a new package in GNU ELPA for some basic interaction with the sr.ht http api.
-i'm interested to try it out since i still pay for the account, plus the forge is
-free software and could be self-hosted if it comes to it.
-
-it also depends on ~plz~ which is another new package providing a nicer API for
-HTTP requests.
-
-#+begin_src emacs-lisp
- (package-install 'srht)
- (setq srht-username "shoshin")
-#+end_src
-
-an API token is stored in my ~.authinfo~ file.
-
-* UI
-:PROPERTIES:
-:header-args:emacs-lisp: :noweb-ref user-interface :noweb-sep "\n\n" :results silent
-:END:
-** basic Emacs UI tweaks
-
-#+begin_src emacs-lisp
- (when (display-graphic-p)
- (scroll-bar-mode -1)
- (fringe-mode '(8 . 0)))
-
- (tab-bar-mode t)
- (display-battery-mode t)
-#+end_src
-
-** darkroom - distraction free writing
-
-the notes suggest using ~darkroom-tentative-mode~ which auto switches
-depending on the window layout currently in use.
-
-#+begin_src emacs-lisp
- (package-install 'darkroom)
-#+end_src
-
-** Fonts
-For code, I've grown fond of Victor Mono.
-
-#+begin_src emacs-lisp
- (set-frame-font "Victor Mono")
-#+end_src
-
-*** COMMENT Attempt to install the font via Emacs, url.el and ~make-process~
-
-in the end, this "works" but isn't very useful. the font cache needs to be updated
-before Emacs runs for the font to register anyway. This will instead be implemented
-as a shell script that can be run as a pre-req before initializing emacs.
-
-however, i did learn a bit about [[info:elisp#Sentinels][Sentinels]] they are kinda neat.
-
-#+begin_src emacs-lisp
- ;; this actually doesn't work right, because the process unzipping starts
- ;; before the file is completely written i think.
- (url-retrieve "https://rubjo.github.io/victor-mono/VictorMonoAll.zip"
- #'victor-mono-download-callback)
-
- (make-process :name "getting victor mono"
- :buffer "*Download Victor Mono*"
- :command '("wget" "--output-document=/home/shoshin/.fonts/VictorMonoAll.zip"
- "https://rubjo.github.io/victor-mono/VictorMonoAll.zip")
- :sentinel #'victor-mono-download-callback)
-
- (defun victor-mono-download-callback (process event)
- (if (string-equal "finished\n" event)
- (let ((default-directory "~/.fonts/VictorMono"))
- (unless (file-directory-p default-directory)
- (make-directory default-directory))
- (make-process :name "unzipping victor mono"
- :buffer "*Unzip Victor Mono*"
- :command `("unzip" ,(expand-file-name "~/.fonts/VictorMonoAll.zip"))
- :sentinel #'victor-mono-sentinel))))
-
- (defun victor-mono-sentinel (process event)
- (print event)
- (if (string-equal "finished\n" event)
- (progn (message "works!")
- (make-process :name "run fc-cache" :command '("fc-cache")))))
-#+end_src
-** Highlights
-*** [[help:global-hl-line-mode][global-hl-mode]]
-i enjoy having the current line highighted as a visual cue.
-
-#+begin_src emacs-lisp
- (global-hl-line-mode t)
-#+end_src
-
-can be toggled with <leader> l 2
-
-*** COMMENT lin-global-mode
-Make `hl-line-mode' more suitable for selection UIs
-
-add other hooks to ~lin-mode-hooks~
-
-#+begin_src emacs-lisp
- (setq my-lin-mode-hooks
- '())
-#+end_src
-
-#+begin_src emacs-lisp
- (package-install 'lin)
- (require 'lin)
- (setq lin-face 'lin-blue)
- (mapc (lambda (e) (cl-pushnew e lin-mode-hooks)) my-lin-mode-hooks)
- (lin-global-mode)
-#+end_src
-** Themes
-*** theme packages / installation
-
-to keep it concise, i'll define a special variable to hold the theme packages
-i'd like to install anytime this config is loaded on a system where they are
-not there. then i can ~mapc~ #'package-install over the list of themes.
-
-#+begin_src emacs-lisp :noweb-ref defvars
- (defvar my-themes-to-install
- '(cyberpunk-theme dracula-theme nano-theme)
- "List of themes to install when loading shoshimacs config.")
-#+end_src
-
-#+begin_src emacs-lisp
- (load-theme (seq-random-elt my-chosen-themes))
-#+end_src
-
-*** chosen theme list and random loading on init
-
-i generally haven't used built-in themes much, but there's a few i like,
-and the ones i specifically install i'd like to keep in a list of "chosen"
-ones. i can load one at random if i please, and perhaps provide it as
-candidates to ~consult-themes~.
-
-#+begin_src emacs-lisp :noweb-ref defvars
- (defvar my-chosen-themes
- '(cyberpunk dichromacy dracula leuven modus-operandi modus-vivendi
- nano-dark nano-light tango tango-dark)
- "List of themes I prefer for narrowing and random selection.")
-#+end_src
-
-#+begin_src emacs-lisp
- (mapc #'package-install my-themes-to-install)
-#+end_src
-
-** windresize
-
-#+begin_src emacs-lisp
- (package-install 'windresize)
-#+end_src
-
-