Tukaj se nahaja celotna konfiguracija za emacs urejevalnik, ki jo uporabljam, v ORG obliki. Na ta - "literate programming" oz. pismeni način - podana konfiguracija daje v ospredje opis posameznih sekcij in s tem poveča preglednost, olajša pa tudi navigacijo po konfiguraciji.
Razdeljena je na poglavja ohlapno glede na vlogo oz področje. Področja so nekoliko raznosvrstna (evil način - tipkovnične bližnjice v slogu VIM so ena sekcija, programiranje druga...), bi pa moralo biti iz naslovov precej jasno, za kaj gre.
S paketom ~general~ je definiranih več kategorij tipkovničnih bližnjic, ki so združene po svoji funkciji, podobno kot poglavja tega dokumenta. Če v ukaznem načinu kliknemo ~SPC~ (ali pa v tekstovnem načinu ~C-SPC~), se nam prikažejo tipke kategorij, po kliku na posamezno pa ukazi, ki jih sprožimo (ali pa podkategorije).
V sledečim podpoglavjih so navedene kategorije posameznih bližnjic. Imajo dokaj samoopisna imena. Paket ~which key~ sproti izpisuje, kaj kateri gumb počne oz. kam nas pelje dalje.
Navigacijo med okni izvajamo s klasičnimi HJKL UNIX smernimi tipkami, recimo okno pod trenutnim izberemo s ~SPC w j~. Posamezno okno pa lahko razdvojimo vertikalno ali horizontalno s ~SPC w v~ oz. ~SPC w s~. ~SPC w d~ "ubije" trenutni buffer in okno.
Emacs nudi kup uporabnih funkcij, ki so nepogrešljive na poti učenja o funkcionalnosti. Zaenkrat sem definiral bližnjice do štirih od njih; opis funkcije, tipke, simbola (to so recimo rezervirana imena spremenljivk), načina (~mode~).
V evil mode lahko linke znotraj ORG dokumentov odpiramo kar z ~RET~.
#+begin_src emacs-lisp
(defun odpri-org-link ()
"Odpri link v ORG fajlu pod kurzorjem"
(interactive)
(if (org-in-regexp org-link-any-re nil t)
(org-open-at-point)
nil))
(general-evil-define-key
'normal
org-mode-map
"RET" 'odpri-org-link))
#+end_src
Evil v ~treemacs~ drevesu datotečnega sistema.
#+begin_src emacs-lisp
(use-package treemacs-evil :after treemacs)
#+end_src
* Emacs splošno
** Kolaborativno urejanje - CRDT
Paket ~crdt~ omogoča istočasno urejanje bufferjev, kar je superuporabno :)
Paziti pa moramo na verzije emacsa; zaznali smo težave pri mešanju emacs 30/29 s starejšimi (28, 27) - znaki se lahko med odjemalci pomešajo. Emacs 29 in 30 bi morala vredu sodelovati.
~swiper~ je ivy-jev iskalnik po bufferjih, ki nudi lep vmesnik s predogledom rezultatov, nastavimo ga na ~C-S~.
#+begin_src emacs-lisp
(use-package swiper
:defer t
:config
(global-set-key "\C-s" 'swiper))
#+end_src
~counsel~ pa nudi kup zamenjav privzetih emacs ukazov/operacij za prijetnejša opravila. Nastavimo nekaj bližnjic za njih. Recimo ~M-x~ menjava ki kaže predoglede v minibuferju, ~SPC RET~ za shranjevanje in menjavo med zaznamki, ~SPC /~ za ripgrep rekurzivno iskanje po vsebini datotek (potrebuje nameščen ~ripgrep~!).
Paket ~helpful~ obarva strani za pomoč ter doda več kontekstualnih informacij in pa nekaj funkcij za lažje razumevanje kaj je kje, recimo ~helpful-at-point~, ~helpful-callable~, ~helpful-command~...
~which-key~ prikazuje minibuffer z razlago, katere tipkovnične bližnjice so na voljo.
#+begin_src emacs-lisp
(use-package which-key
:defer t
:config
;; Allow C-h to trigger which-key before it is done automatically
(setq which-key-show-early-on-C-h t)
;; make sure which-key doesn't show normally but refreshes quickly after it is
;; triggered.
(setq which-key-idle-delay 0.4)
(setq which-key-idle-secondary-delay 0.05)
(which-key-mode))
#+end_src
** Varnostne kopije
Privzeto emacs dodaja varnostne kopije fajlov v iste direktorije kot so originali, kar zna malo nasmetiti. Zato nastavimo direktorij, kam naj jih shranjuje ter nastavimo nekaj drugih priročnih stvari, naj kopira fajle namesto preimenovanja, brisanje starih (z nastavljenimi omejitvami ter verzioniranje varnostnih kopij.
#+begin_src emacs-lisp
(setq
backup-directory-alist
`(("." . ,(concat user-emacs-directory "saves")))
backup-by-copying t
delete-old-versions t
kept-new-versions 6
kept-old-versions 2
version-control t)
#+end_src
Za vsak odprt fajl emacs ustvari lockfile, kar tudi zna smetiti (so pa zato, da obvestijo če več ljudi istočasno odpre fajl). To izklopimo.
#+begin_src emacs-lisp
(setq create-lockfiles nil)
#+end_src
** Ne odpiraj pdf datotek
PDF dokumenti so včasih zelo veliki, raje jih odpirajmo s sistemskim preglejevalnikom.
Dodamo tudi bližnjice za ~org-capture~ ter ~org-agenda~.
TODO dodaj več!
#+begin_src emacs-lisp
:general
(start/leader-keys
"o" '(:ignore t :wk "orgmode")
"o c" 'org-capture
"o a" 'org-agenda
"o w" 'writeroom-mode
"o t" 'org-time-stamp)
#+end_src
V org dokumente lahko vnašamo bloke vsebin, kot so programska koda, citati in podobno. Privzeto to dosežemo s ~C-c C-,~ in izbiro vrste željenega bloka, s sledečo konfiguracijo pa vklopimo bližnjico; na prazni vrstici samo "<s" ~TAB~ vstavi blok izvorne kode.
#+begin_src emacs-lisp
:config
(require 'org-tempo)
(setq org-src-tab-acts-natively nil)
#+end_src
Za lepšo preglednost skrijemo znake za krepitev črk, podčrtovanje in podobno.
#+begin_src emacs-lisp
(setq org-hide-emphasis-markers t)
#+end_src
Nastavimo lokacije ~org-agenda~ dokumentov in pa privzeto datoteko za zapiske
#+begin_src emacs-lisp
(setq org-agenda-files (list "~/rs/org" "~/org"))
(setq org-default-notes-file "~/org/zapiski.org")
#+end_src
Koledarski teden naj se začne s ponedeljkom, kot je pri nas konvencija.
Način ~writeroom-mode~ omogoča nemoteno pisanje; trenutni buffer raztegne čez cel zaslon in v sredino centrira širinsko-omejen tekst. Tako buffer izgleda bolj kot popisan list papirja.
Omogočimo gladko piksel skrolanje, v emacsu od verzije 29 dalje in nastavimo dve opciji, ki sta skopirani od drugje in za njih nevem kaj počneta. Mislim da vpivata na to, kako je, ko pridrsaš do dna okna.
V široko paleto funkcionalnosti emacsa spada tudi urejanje navadnega teksta.
Tekst naj se prelamlja ob robu okna! Skrolanje na stran je naporno...
#+begin_src emacs-lisp
(global-visual-line-mode)
#+end_src
Ponavadi nas tudi zanimajo številke vrstic. Predvsem zaradi urejanje kode, morda bi to bolj pasalo v odsek programiranja TODO.
#+begin_src emacs-lisp
(global-display-line-numbers-mode)
#+end_src
Namesto navadnega undo/redo lahko uporabimo drevesne razveljavitve. Teh dreves nisem zares nikoli neposredno uporabljal, je pa praktično shranjevanje zgodovine undoja v emacsov nastavitveni direktorij.
Zaradi težav pri uporabi =projectile= preko SSH povezav spremenimo način indeksiranja datotečnega drevesa. Dodajanje večjega projekta zato traja nekoliko dlje
Samodejno zapiranje oklepajev. Tega ne rabimo ker imamo ~electric-pair-mode~, ki je vgrajen v emacs in lepše obravnava zamik teksta ob vstopu v novo vrstico.
Tree-sitter je knjižnica za inkrementalno razčlenjevanje (parsing) programske kode. Na podlagi definicij slovnic za različne programske jezike (namestimo jih z ~M-x treesit-install-language-grammar~) omogoča obarvanja kode, priporočila in podobno. To počne nekoliko hitreje kot klasični načini. Tukaj so definicije nadomestnih treesit načinov za določene programske jezike.
S ~treesit-auto~ paketom se avtomatsko naredijo asociacije za treesit načine, vedno ko odpremo fajl s podporo ze treesitter pa nas obvesti o tem, da ga lahko namestimo. Tako ni treba ročno nastavljat za vsak programski jezik posebej.
#+begin_src emacs-lisp
(use-package treesit-auto
:defer t
:custom
(treesit-auto-install 'prompt)
:config
(treesit-auto-add-to-auto-mode-alist 'all)
(global-treesit-auto-mode))
#+end_src
Spodaj pa je primer nastavitev ročnih asociacij s fajli, za menjavo z klasičnimi major načini.
To poglavje zajema nastavitve raznih LISP dialektov.
Vsi LISPi, tudi vgrajeni emacs-lisp, so bolj berljivi z mavričnim obarvanjem oklepajev.
#+begin_src emacs-lisp
(use-package rainbow-delimiters
:hook ((prog-mode . rainbow-delimiters-mode)))
#+end_src
~Geiser~ lajša delo s scheme jeziki, nastavljeno za [[https://www.gnu.org/software/guile/][GNU Guile]]. Omogoča recimo povezovanje v REPL (read-eval-print-loope).
CSS zamike nastavimo na 2 presledka, kot je drugje.
#+begin_src emacs-lisp
(setq css-indent-level 2)
(setq css-indent-offset 2)
#+end_src
Pri spletnem programiranju zelo prav pride tudi [[https://github.com/pashky/restclient.el][restclient]] odjemalec za pošiljanje HTTP poizvedb in pregled odzivov.
Vue način lajša razvoj z [[https://vuejs.org/][vue javascript ogrodjem]]. Integriran je z LSP, moramo pa za integracijo globalno namestiti npm paket: ~sudo npm i -g vue-language-server~
#+begin_src emacs-lisp
(use-package vue-mode
:mode "\\.vue\\'"
:config (add-hook 'vue-mode-hook #'lsp))
#+end_src
~rjsx~ pride prav pri recimo ogrodju [[https://react.dev/][react]].
[[https://supercollider.github.io/][supercollider]] je platforma za zvočno sintezo in algoritmično kompozicijo. Uporabna tudi za živo kodiranje. Vključuje svoje integrirano razvijalsko okolje, integrira se pa tudi z emacsom.
Najprej moramo vključit direktorij, v katerem se nahajajo emacs paketi zanj (pridejo z namestitvijo supercolliderja), pot pa je odvisna od linux distribucije ali nastavitev pri prevajanju iz izvorne kode:
[[http://www.pawfal.org/Software/fluxus_/][fluxus]] je programsko okolje za hitro prototipiranje ter igranje z oz. učenje 3d grafike. Pisam je v schemu.
#+begin_src emacs-lisp
(use-package fluxus-mode :defer t)
#+end_src
[[https://extemporelang.github.io/][Extempore]] je programski jezik za kiberfizično programiranje.
#+begin_src emacs-lisp
(use-package extempore-mode :mode "\\.xtm\\'")
#+end_src
[[http://tidalcycles.org/][Tidal cycles]] omogoča kodiranje glasbe z algoritmičnimi vzorci. Pred uporabo moramo namestiti še supercollider.
#+begin_src emacs-lisp
(use-package tidal
:defer t
#+end_src
Nastaviti mu moramo lokacijo ~BootTidal.hs~ datoteke, ki jo lahko namestimo s [[https://www.haskell.org/cabal/][cabal]]-om ali kako drugače.
[[https://sardine.raphaelforment.fr/presentation/what_is_sardine.html][sardine]] je glasbeni inštrument v pythonu. Gre za pythonovski vmesnik v supercollider, namenjen živemu kodiranju. Supercollider in sardine najprej namestimo, pri uporabi pa nam pomagajo sledeče emacs funkcije.
Podpora za protokol jezikovnega strežnika (LSP - Language Server Protocol) precej izboljša izkušnjo programiranja s priporočevanjem in dopolnjevanjem. Emacs spremeni v IDE (integrirano razvojno okolje).
#+begin_src emacs-lisp
(use-package lsp-mode
:defer t
#+end_src
S sledečimi nastavitvami pospešimo delovanje.
#+begin_src emacs-lisp
:config
;; Make gc pauses faster by decreasing the threshold.
(setq gc-cons-threshold (* 100 1000 1000))
;; Increase the amount of data which Emacs reads from the process
Emacs že vključuje ~mu4e~ ([[https://www.djcbsoftware.nl/code/mu/][mu]] za emacs), modul ki omogoča brskanje po prejeti e-pošti.
Pred uporabo je treba konfigurirati nekaj več stvari, potrebujemo recimo ~isync~ za pridobivanje pošte (tudi starejši ~mbsync~ je vredu), program ~mu~ za indeksiranje prejetih mejlov, oba pa tudi primerno nastavljena.
Vključimo paket in nastavimo ukaz za pridobivanje mejlov, ki ga sproži ~mu4e~.
#+begin_src emacs-lisp
(use-package mu4e
:ensure f
:defer t
:config
(setq mu4e-get-mail-command "mbsync -a"))
#+end_src
Preglednost lahko izboljšamo s paketom za ikone.
#+begin_src emacs-lisp
(use-package mu4e-marker-icons
:after mu4e
:config
(mu4e-marker-icons-mode 1))
#+end_src
~mu4e-dashboard~ omogoča pripravo "nadzorne plošče", torej domačega zaslona pregleda mejlov, ki je pravzaprav ORG dokument z ~mu4e~ poizvedbami. Recimo, da prikaže koliko imamo skupno neprebranih sporočil in pa da skočimo na skupek vseh z zastavico označenih sporočil.
#+begin_src emacs-lisp
(use-package mu4e-dashboard
:after mu4e
:vc "https://github.com/rougier/mu4e-dashboard")
#+end_src
TODO spisat dodatne konfiguracije, tega še ne uporabljam res.