aboutsummaryrefslogtreecommitdiff
path: root/shoshin-config.org
diff options
context:
space:
mode:
Diffstat (limited to 'shoshin-config.org')
-rw-r--r--shoshin-config.org343
1 files changed, 343 insertions, 0 deletions
diff --git a/shoshin-config.org b/shoshin-config.org
new file mode 100644
index 0000000..5aaa2fc
--- /dev/null
+++ b/shoshin-config.org
@@ -0,0 +1,343 @@
+#+STARTUP: overview
+#+PROPERTY: header-args:emacs-lisp :lexical t
+
+* ANUSTART
+
+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 yes
+ ;;; shoshimacs.el --- Beginner's Mind Config -*- lexical-binding:t -*-
+
+ ;;; Package Management
+ <<package-management>>
+
+ ;;; Completion
+ <<completion>>
+
+ ;;; Editing
+ <<editing>>
+
+ ;;; Programming
+ <<programming>>
+
+ ;;; Projects
+ <<projects>>
+
+ ;;; External Services
+ <<external-services>>
+
+ ;;; User Interface
+ <<user-interface>>
+#+end_src
+
+* Package Management
+:PROPERTIES:
+:header-args:emacs-lisp+: :noweb-ref package-management :noweb-sep "\n\n" :results silent
+:END:
+
+i've been using ~straight.el~ in my "main" config, primarily because i liked
+having the package repos cloned onto my machine for easy contribution
+possibilities. additionally, at the time it was a nice easy way to install
+a package without the custom package installation snippets borrowed from
+the web ages ago.
+
+however, these days ~package.el~ offers the [[help:package-install][package-install]] command (since
+Emacs 25 apparently) which "does the right thing" if used in one's init
+file. so for the time being, packages will have their installation and
+configuration happen in place in this literate config file.
+
+** Packages not in repos (flykeys)
+
+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 load
+
+#+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
+
+Set this up first, so other keymap changes will add onto flykeys (hopefully).
+
+* 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.
+
+** [[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. ~consult-themes~ for
+example.
+
+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 does this as well as switching themes
+/as you narrow your selection/.
+
+*** consult keybindings
+
+** corfu
+
+#+begin_src emacs-lisp
+ (package-install 'corfu)
+#+end_src
+
+** marginalia
+
+#+begin_src emacs-lisp
+ (package-install 'marginalia)
+#+end_src
+
+** embark
+
+#+begin_src emacs-lisp
+ (package-install 'embark)
+#+end_src
+
+** vertico
+
+#+begin_src emacs-lisp
+ (package-install 'vertico)
+#+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
+
+* Programming
+:PROPERTIES:
+:header-args:emacs-lisp: :noweb-ref programming :noweb-sep "\n\n" :results silent
+:END:
+** Languages
+*** Javascript
+
+#+begin_src emacs-lisp
+ (package-install 'json-mode)
+#+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
+* 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 I was going
+
+#+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
+ (scroll-bar-mode nil)
+ (fringe-mode '(8 . 0))
+ (tab-bar-mode t)
+ (display-battery-mode t)
+#+end_src
+
+** [[file:elpa/darkroom-0.3/darkroom.el::;;; Commentary:][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
+
+*** comp warnings
+#+begin_example
+Warning (comp): darkroom.el:337:13: Warning: Use keywords rather than deprecated positional arguments to `define-minor-mode' Disable showing Disable logging
+Warning (comp): darkroom.el:338:9: Warning: reference to free variable ‘darkroom-tentative-mode’ Disable showing Disable logging
+Warning (comp): darkroom.el:361:13: Warning: Use keywords rather than deprecated positional arguments to `define-minor-mode' Disable showing Disable logging
+Warning (comp): darkroom.el:365:10: Warning: function ‘darkroom-tentative-mode’ defined multiple times in this file Disable showing Disable logging
+#+end_example
+
+** Fonts
+For code, I've grown fond of Victor Mono.
+
+#+begin_src emacs-lisp
+ (set-frame-font "Victor Mono" t t t)
+#+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
+
+#+begin_src emacs-lisp
+ (setq my-chosen-themes
+ '(cyberpunk-theme dracula-theme))
+ (mapc #'package-install my-chosen-themes)
+#+end_src
+
+** windresize
+
+#+begin_src emacs-lisp
+ (package-install 'windresize)
+#+end_src
+
+