From 13ffbda4cc641a3c048eb2344f8c7303dc341fa0 Mon Sep 17 00:00:00 2001 From: tslil clingman <> Date: Sun, 11 Feb 2024 13:13:30 +0100 Subject: BQN setup --- atom.xml | 62 ++++++++--------- index.gmi | 3 +- log-240211-1.gmi | 200 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 232 insertions(+), 33 deletions(-) create mode 100644 log-240211-1.gmi diff --git a/atom.xml b/atom.xml index 33d9e47..8079553 100644 --- a/atom.xml +++ b/atom.xml @@ -2,7 +2,7 @@ gemini://l-3.space/ l-3.space - 2021-10-06T22:28:53.414000+00:00 + 2024-02-11T12:13:00+00:00 tslil hello@l-3.space @@ -10,63 +10,63 @@ - gemini://l-3.space/log-201204-1.gmi - Experiencing a classic for the first time: DOOM (1993) - 2020-12-04T17:35:50.643000+00:00 - + gemini://l-3.space/log-210226-1.gmi + Burnout & the slow climb back + 2021-02-26T17:44:00+00:00 + gemini://l-3.space/log-201206-1.gmi Emacs + gemini ==> automatic footnotes - 2020-12-06T22:30:28.697000+00:00 + 2020-12-06T22:30:00+00:00 - gemini://l-3.space/log-210226-1.gmi - Burnout & the slow climb back - 2021-02-26T17:44:13.020000+00:00 - - - - gemini://l-3.space/log-210317-1.gmi - Hindsight is always 20-20 - 2021-03-17T15:28:20.567000+00:00 - + gemini://l-3.space/log-201204-1.gmi + Experiencing a classic for the first time: DOOM (1993) + 2020-12-04T17:35:00+00:00 + - gemini://l-3.space/log-210415-1.gmi - Modding my Thinkpad x230 - 2021-04-15T17:06:04.403000+00:00 - + gemini://l-3.space/log-201116-1.gmi + Plausible authorship deniability + 2020-11-16T15:49:00+00:00 + gemini://l-3.space/dwm.gmi Why tiling - 2021-04-20T18:22:32.170000+00:00 + 2023-12-23T13:59:51.221083+00:00 + + gemini://l-3.space/tak.gmi + Tak + 2023-12-23T13:59:51.267749+00:00 + + gemini://l-3.space/split-keys.gmi Qubes split-SSH - 2021-04-20T18:23:16.337000+00:00 + 2023-12-23T13:59:51.267749+00:00 - gemini://l-3.space/log-210421-1.gmi - l-3.space is now automatically compiled to the web - 2021-04-21T18:50:32.944000+00:00 - + gemini://l-3.space/log-211006-1.gmi + Play Tak against a bot over Gemini! + 2021-10-06T22:28:00+00:00 + gemini://l-3.space/log-211004-1.gmi Switched to gmnisrv - 2021-10-06T03:03:30.476000+00:00 + 2021-10-04T01:35:00+00:00 - gemini://l-3.space/log-211006-1.gmi - Play Tak against a bot over Gemini! - 2021-10-06T22:28:53.414000+00:00 - + gemini://l-3.space/log-240211-1.gmi + Finally an APL for my flying saucer? + 2024-02-11T12:13:00+00:00 + diff --git a/index.gmi b/index.gmi index 0256344..6112092 100644 --- a/index.gmi +++ b/index.gmi @@ -22,6 +22,7 @@ Contact: hello@l-3.space ## Recent posts +=> gemini://l-3.space/log-240211-1.gmi 2024-02-11 - Finally an APL for my flying saucer? => gemini://l-3.space/log-211006-1.gmi 2021-10-06 - Play Tak against a bot over Gemini! => gemini://l-3.space/log-211004-1.gmi 2021-10-04 - Switched to gmnisrv => gemini://l-3.space/log-210421-1.gmi 2021-04-21 - l-3.space is now automatically compiled to the web @@ -31,8 +32,6 @@ Contact: hello@l-3.space => gemini://l-3.space/log-201206-1.gmi 2020-12-06 - Emacs + gemini ==> automatic footnotes => gemini://l-3.space/log-201204-1.gmi 2020-12-04 - Experiencing a classic for the first time: DOOM (1993) => gemini://l-3.space/log-201116-1.gmi 2020-11-16 - Plausible authorship deniability -=> gemini://l-3.space/dwm.gmi 2020-09-04 - A ramble on DWM and my Qubes-specific glue -=> gemini://l-3.space/split-keys.gmi 2020-09-02 - Keeping keys separate from the VMs that use them ## Indices diff --git a/log-240211-1.gmi b/log-240211-1.gmi new file mode 100644 index 0000000..2d151ab --- /dev/null +++ b/log-240211-1.gmi @@ -0,0 +1,200 @@ +Time-stamp: <2024-02-11 12h13 UTC> + +# Finally an APL for my flying saucer? + +> Let's postpone the why and what of BQN, and address the how + +Suppose that you're interested in using + +=> https://mlochbaum.github.io/BQN/index.html BQN + +but you're troubled by not having any. Well, if you're an Arch linux and using emacs, the following should see you through + +## Building and installing + +### CBQN + +I found the AUR package for CBQN lacking, in that it didn't compile the shared libraries which i wanted for the LSP integration below. To that end, here's what i'm using + +``` +$ cat PKGBUILD +# Maintainer: Firegem +pkgname=cbqn-git +pkgver=r2743.8c18fddd +pkgrel=1 +pkgdesc="A BQN implementation in C." +arch=('x86_64' 'i686' 'aarch64' 'arm') +url="https://github.com/dzaima/CBQN" +license=('Apache' 'Boost' 'GPL3' 'MIT') +depends=('glibc' 'libffi') +optdepends=('ttf-bqn386: BQN and APL compatible font') +makedepends=('git' 'clang') +provides=("${pkgname%-git}") +conflicts=("${pkgname%-git}") +source=("${pkgname%-git}::git+${url}.git") +md5sums=('SKIP') + +pkgver() { + cd "${srcdir}/${pkgname%-git}" + printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" +} + +build() { + cd "${srcdir}/${pkgname%-git}" + make PIE='-pie' o3n + make PIE='-pie' shared-o3 +} + +package() { + cd "${srcdir}/${pkgname%-git}" + make PREFIX="${pkgdir}/usr/" install +} +``` + +the changes to build() and package() are minor, but appear to be necessary. + +With that it should be possible to install a functioning BQN compiler and REPL. + +#### BQN LSP + +=> https://git.sr.ht/~detegr/bqnlsp + +Cloning and building this should work now that the above PKGBUILD puts /usr/lib/libcbqn.so onto the file system. Not too much to say here, other than copy the resulting bqnlsp into your path somewhere + +## Emacs integration + +Fortunately for us, all of the hard work has already been done + +``` +(use-package bqn-mode + :ensure t + :defer + :bind (:map bqn-mode-map + ("M-TAB" . expand-abbrev) + ("C-c r r" . bqn-comint-eval-dwim) + ("C-c r b" . bqn-comint-eval-buffer)) + :hook (bqn-mode . (lambda () (eglot-ensure) (bqn-comint-buffer))) + :config + (require 'bqn-keymap-mode) + (require 'bqn-glyph-mode)) +``` + +Note that the first time this is run eglot may ask for the path of bqnlsp, simply provide it. + +### Bonus round: abbrev-mode for entering symbols + +At first when using BQN i found that while i could remember the names of the various glyphs in which i was interested, i could not recall where they were on the "BQN Keyboard"---a task not aided by the fact that i don't use QWERTY⁰. To that end i wrote some abbrev aliases so that i could type the names and press either space or whatever the favourite abbrev trigger was to replace the word with the glyph + +``` +(define-abbrev-table 'bqn-mode-abbrev-table + '( ;; funtions + ("abs" "│") + ("assert" "!") + ("ceiling" "⌈") + ("classify" "⊐") + ("conj" "∧") + ("couple" "≍") + ("deduplicate" "⍷") + ("depth" "≡") + ("deshape" "⥊") + ("dgrade" "⍒") + ("disj" "∨") + ("divide" "÷") + ("drop" "↓") + ("dsort" "∧") + ("enlist" "⋈") + ("find" "⍷") + ("floor" "⌊") + ("group" "⊔") + ("gt" ">") + ("gte" "≥") + ("indices" "/") + ("join" "∾") + ("left" "⊣") + ("length" "≠") + ("lshift" "«") + ("lt" "<") + ("lte" "≤") + ("match" "≡") + ("maximum" "⌈") + ("member" "∊") + ("minimum" "⌊") + ("minus" "¯") + ("modulus" "│") + ("multiply" "×") + ("neg" "¬") + ("neq" "≠") + ("nmatch" "≢") + ("occurrence" "⊒") + ("pair" "⋈") + ("pick" "⊑") + ("power" "⋆") + ("prefix" "↑") + ("range" "↕") + ("recip" "÷") + ("replicate" "/") + ("reshape" "⥊") + ("reverse" "⌽") + ("right" "⊢") + ("root" "√") + ("rshift" "»") + ("select" "⊏") + ("shape" "≢") + ("sign" "×") + ("solo" "≍") + ("span" "¬") + ("sqrt" "√") + ("suffix" "↓") + ("take" "↑") + ("transpose" "⍉") + ("ugrade" "⍋") + ("usort" "∨") + ;; combinators + ("atop" "∘") + ("catch" "⎊") + ("choose" "◶") + ("constant" "˙") + ("lhook" "⊸") + ("over" "○") + ("rhook" "⟜") + ("self" "˜") + ("swap" "˜") + ("under" "⌾") + ("valence" "⊘") + ;; 1-modifiers + ("cell" "˘") + ("each" "¨") + ("fold" "´") + ("insert" "˝") + ("scan" "`") + ("table" "⌜") + ("undo" "⁼") + ;; 2-modifiers + ("depth" "⚇") + ("rank" "⎉") + ("repeat" "⍟") + ;; syntax + ("define" "←") + ("export" "⇐") + ("change" "↩") + ("nothing" "·") + ("sep" "⋄") + ;; constants + ("pi" "π") + ("infty" "∞"))) +``` + +to make this not irritating i found myself also setting + +``` +(setq save-abbrevs 'silently) +``` + +and adding (abbrev-mode) to the bqn-mode hook. + +Happy BQN'ing! + +--- + +⁰ For the curious +=> https://git.sr.ht/~tslil/keyboard -- cgit v1.3.1