2023-12-22 02:18:54 +01:00
#+TITLE : EMACS konfiguracija
2023-12-27 19:44:27 +01:00
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.
2023-12-22 02:18:54 +01:00
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.
2023-12-27 19:44:27 +01:00
V primeru napak pri nalaganju ne pozabimo na uporaben ukaz ~emacs --debug-init~ .
2023-12-22 02:18:54 +01:00
2024-03-06 18:33:28 +01:00
* Bližnjice do drugih konfiguracij
- [[file:~/.config/sway/config ][Sway window manager ]]
- [[file:~/.config/i3/config ][i3 window manager ]]
- shell: [[file:~/.zshrc ][zshrc ]], [[file:~/.profile ][profile ]], [[file:~/.bashrc ][bashrc ]]
- [[file:~/sredstva/dotfiles/guix/home/home-configuration.scm ][guix home config ]]
2024-02-01 15:12:21 +01:00
* Zagon
2023-12-22 02:18:54 +01:00
~debug-on-error~ uresničimo, če bi radi sprožili razhroščevalnik, kadar pride do napake (zelo priročno pri reševanju težav).
#+begin_src emacs-lisp
2024-12-15 16:45:22 +01:00
(setq debug-on-error t)
2023-12-22 02:18:54 +01:00
#+end_src
Pospešimo zagon z zmanjšanjem frekvence zbiranja smeti (garbage collection).
#+begin_src emacs-lisp
(setq gc-cons-threshold (* 50 1024 1024))
#+end_src
2023-12-27 19:44:27 +01:00
Vedno sledi simboličnim linkom. To potrebujem, ker se konfiguracijski fajli
ponavadi nahajajo v ločenem direktoriju zbirke konfiguracij in je tečno
vsakič potrjevati sledenje v dialogu.
#+begin_src emacs-lisp
(setq vc-follow-symlinks t)
#+end_src
Po zagunu izpiši čas nalaganja.
#+begin_src emacs-lisp
(add-to-list 'after-init-hook
(lambda ()
(message (concat "emacs (" (number-to-string (emacs-pid)) ") started in "
(emacs-init-time)))))
#+end_src
2024-02-01 15:12:21 +01:00
* Nalaganje paketov
2023-12-22 02:18:54 +01:00
Vklopi prikazovanje statistik naloženih paketov (prikažemo jih z ~M-x use-package-report~ ).
#+begin_src emacs-lisp
(setq use-package-compute-statistics t)
#+end_src
Nastavimo vire nalaganja paketov in pa vklopimo privzeto nalaganje ~use-package~ paketov iz spletnih zbirališč.
#+begin_src emacs-lisp
(require 'package)
(setq use-package-always-ensure t)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/ ") t)
(add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/ ") t)
(add-to-list 'package-archives '("elpa" . "https://elpa.gnu.org/packages/ ") t)
(package-initialize)
2024-08-21 17:30:42 +02:00
;(require 'use-package)
2023-12-22 02:18:54 +01:00
#+end_src
Vklop merjenja časa nalaganja posameznih paketov.
Rezultate merjenja lahko pogledamo z ~M-x benchmark-init/show-durations-tabulated~ ali ~M-x benchmark-init/show-durations-tree~
#+begin_src emacs-lisp
(use-package benchmark-init
:config
;; To disable collection of benchmark data after init is done.
(add-hook 'after-init-hook 'benchmark-init/deactivate))
#+end_src
2024-02-01 15:12:21 +01:00
* Vezane tipke
2023-12-22 02:18:54 +01:00
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).
2023-12-27 19:44:27 +01:00
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.
2023-12-22 02:18:54 +01:00
#+begin_src emacs-lisp
(use-package general
:config
2024-05-16 13:05:05 +02:00
(general-evil-setup t)
2023-12-22 02:18:54 +01:00
;; Leader key nastavitev (za prozenje ukazov)
(general-create-definer start/leader-keys
2024-05-16 13:05:05 +02:00
:states '(normal insert visual emacs rcirc)
2023-12-22 02:18:54 +01:00
:keymaps 'override
:prefix "SPC"
:global-prefix "C-SPC")
#+end_src
2024-02-01 15:12:21 +01:00
** Splošne bližnice
2023-12-22 02:18:54 +01:00
Tukaj se nahajate samo bližnjici za preklop med bufferji (kako bi to lepo prevedli?).
2023-12-27 19:44:27 +01:00
In pa ukaz za ponovno naložit konfiguracijo emacsa.
2023-12-22 02:18:54 +01:00
#+begin_src emacs-lisp
2024-12-10 12:39:21 +01:00
(defun ponovno-nalozi-config ()
"Ponovno naloži emacs konfiguracijo"
(interactive)
(load-file "~/.emacs.d/init.el"))
2023-12-27 19:44:27 +01:00
2023-12-22 02:18:54 +01:00
(start/leader-keys
;; Osnovne bliznjice
"[" 'previous-buffer
2023-12-27 19:44:27 +01:00
"]" 'next-buffer
"r" 'ponovno-nalozi-config
2024-12-10 12:39:21 +01:00
"u" 'font-lock-update
2023-12-27 19:44:27 +01:00
)
2023-12-22 02:18:54 +01:00
#+end_src
2024-02-01 15:12:21 +01:00
** Upravljanje z okni
2023-12-22 02:18:54 +01:00
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.
#+begin_src emacs-lisp
(start/leader-keys
"w" '(:ignore t :wk "window")
"w j" 'windmove-down
"w k" 'windmove-up
"w h" 'windmove-left
"w l" 'windmove-right
"w s" 'split-window-below
"w v" 'split-window-right
"w d" 'kill-buffer-and-window)
#+end_src
2024-02-01 15:12:21 +01:00
** Upravljanje z bufferji
2023-12-22 02:18:54 +01:00
2023-12-27 19:44:27 +01:00
Bližnjice za delo z bufferji se začnejo z ~b~ . Ne pozabimo na splošni
bližnjici (~[~ in ~]~ za prejšnji / naslednji buffer).
2023-12-22 02:18:54 +01:00
#+begin_src emacs-lisp
(start/leader-keys
"b" '(:ignore t :wk "buffer")
"b p" 'previous-buffer
"b n" 'next-buffer
"b s" (defun scratch-buffer () "Show scratch buffer" (interactive) (switch-to-buffer "*scratch* "))
"b d" 'kill-current-buffer
"b k" 'kill-buffer)
#+end_src
2024-02-01 15:12:21 +01:00
** Evalviranje
2023-12-22 02:18:54 +01:00
2024-05-16 13:05:05 +02:00
Sledeči ukazi so za evalviranje ELISP kode
2023-12-22 02:18:54 +01:00
TODO napiši navodila
#+begin_src emacs-lisp
2023-12-27 19:44:27 +01:00
(start/leader-keys
2024-05-16 13:05:05 +02:00
:keymaps 'emacs-lisp-mode-map
2023-12-27 19:44:27 +01:00
;; EVAL ukazi
"e" '(:ignore t :wk "eval")
"e b" 'eval-buffer
"e e" 'eval-expression
2024-05-16 13:05:05 +02:00
"e r" 'eval-region
"b e" 'eval-buffer)
2023-12-22 02:18:54 +01:00
#+end_src
2024-02-01 15:12:21 +01:00
** Datoteke
2023-12-22 02:18:54 +01:00
2023-12-27 19:44:27 +01:00
Bližnjice za delo z datotekami se začnejo s ~f~ .
2023-12-22 02:18:54 +01:00
#+begin_src emacs-lisp
2023-12-27 19:44:27 +01:00
(defun odpri-konfiguracijo () (interactive) (find-file "~/.emacs.d/config.org"))
(defun odpri-init () (interactive) (find-file "~/.emacs.d/init.el"))
2024-12-10 12:39:21 +01:00
(defun odpri-todo () (interactive) (find-file "~/org/TODO.org"))
2023-12-27 19:44:27 +01:00
(start/leader-keys
2023-12-22 02:18:54 +01:00
"f" '(:ignore t :wk "file")
"f f" 'counsel-find-file
2023-12-27 19:44:27 +01:00
"f c" 'odpri-konfiguracijo :wk "odpri konfiguracijo (config.org)"
2024-02-01 15:12:21 +01:00
"f i" 'odpri-init :wk "odpri init.el"
"f z" 'odpri-zapiske
"f t" 'odpri-todo)
2023-12-22 02:18:54 +01:00
#+end_src
2024-02-01 15:12:21 +01:00
** Vplogled / introspekcija
2023-12-22 02:18:54 +01:00
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~ ).
#+begin_src emacs-lisp
2023-12-27 19:44:27 +01:00
(start/leader-keys
"d" '(:ignore :t :wk "describe")
"d f" 'describe-function
"d k" 'describe-key
2024-12-15 17:37:10 +01:00
"d l" 'find-library
"d m" 'describe-mode
2023-12-27 19:44:27 +01:00
"d s" 'describe-symbol
2024-12-15 17:37:10 +01:00
"d v" 'describe-variable)
2023-12-22 02:18:54 +01:00
#+end_src
2024-12-10 12:39:21 +01:00
** Info
Branje navodil, SICP, še kaj.
#+begin_src emacs-lisp
(start/leader-keys
"i" 'info)
#+end_src
2024-02-01 15:12:21 +01:00
** Konec
2023-12-22 02:18:54 +01:00
Dodamo manjkajoči zaklepaj. :)
To pa je malo grdo pri pismenem programiranju.
#+begin_src emacs-lisp
)
#+end_src
2024-02-01 15:12:21 +01:00
* EVIL
Ta sekcija vsebuje razne konfiguracije povezane z ~evil-mode~ - modalnim načino editiranja, podobnim vi/vim urejevalnikom.
Vklopi evil mode!
2024-12-10 12:39:21 +01:00
~evil-shift-width~ nastavi širino tabulacije ko pritisnemo ~>~
2024-02-01 15:12:21 +01:00
#+begin_src emacs-lisp
(setq evil-want-integration t
2024-12-10 12:39:21 +01:00
evil-want-keybinding nil
evil-shift-width 2)
2024-02-01 15:12:21 +01:00
;org-return-follows-link t
(require 'evil)
(evil-mode 1)
#+end_src
Paket ~evil-collection~ pa vsebuje še dodatne evil bližnjice (recimo za ~help-mode~ , ~eshell~ in tako dalje).
#+begin_src emacs-lisp
(use-package evil-collection
:after evil
:config
(evil-collection-init))
#+end_src
Evil v ~orgmode~ načinu (pa tudi v ~org-agenda~ ).
#+begin_src emacs-lisp
(use-package evil-org
:after org
:hook ((org-mode . evil-org-mode))
:config
(require 'evil-org-agenda)
(evil-org-set-key-theme '(navigation insert textobjects additional calendar))
(evil-org-agenda-set-keys)
#+end_src
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
2024-08-21 17:30:42 +02:00
;(use-package treemacs-evil :after treemacs)
2024-02-01 15:12:21 +01:00
#+end_src
* Emacs splošno
2024-12-10 12:39:21 +01:00
** Dashboard
Prvi zaslon ob zagonu (~homescreen~ ), prikaže uporabne stvari.
#+begin_src emacs-lisp
(use-package dashboard
:general
(start/leader-keys
"b h" 'dashboard-open)
:after nerd-icons
:init
(dashboard-setup-startup-hook)
(setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard* ")))
(setq dashboard-banner-logo-title "EMA☭S")
(setq dashboard-startup-banner 3)
(setq dashboard-center-content t)
(setq dashboard-items '((agenda . 5)
(bookmarks . 3)
(recents . 5)))
;(setq dashboard-display-icons-p t) ;; display icons on both GUI and terminal
;(setq dashboard-icon-type 'nerd-icons) ;; use `nerd-icons' package
(setq dashboard-set-heading-icons t)
(setq dashboard-set-file-icons t)
(setq dashboard-set-navigator t)
(setq dashboard-set-init-info t))
#+end_src
2024-05-16 13:05:05 +02:00
** Vertico dopolnjevanje
Paket za dopolnjevanje, nadomestek ~ivy~ . Nudi nekoliko lepšo iskušnjo priporočil pri izvajanju emacs ukazov.
2024-02-01 15:12:21 +01:00
2024-05-16 13:05:05 +02:00
#+begin_src emacs-lisp
(use-package vertico
:config
(setq vertico-cycle t)
(setq vertico-resize nil)
(vertico-mode 1))
#+end_src
~savehist~ sortira priporočila glede na preteklo rabo.
2024-02-01 15:12:21 +01:00
#+begin_src emacs-lisp
2024-05-16 13:05:05 +02:00
(use-package savehist
:init
(savehist-mode))
2024-02-01 15:12:21 +01:00
#+end_src
2024-05-16 13:05:05 +02:00
~marginalia~ prikaze v minibufferju dopolni z uporabnimi informacijami, odvisno od konteksta.
2023-12-27 19:44:27 +01:00
#+begin_src emacs-lisp
2024-05-16 13:05:05 +02:00
(use-package marginalia
:config
(marginalia-mode 1))
2023-12-27 19:44:27 +01:00
#+end_src
2024-05-16 13:05:05 +02:00
~orderless~ poskrbi, da minibuffer dopolnjevanje deluje tudi kadar v kakšnem drugem vrstnem redu napišemo besede. Recimo: ~inst pac~ ponudi ~package-install~ .
2023-12-27 19:44:27 +01:00
#+begin_src emacs-lisp
2024-05-16 13:05:05 +02:00
(use-package orderless
:config
(setq completion-styles '(orderless basic)))
2023-12-27 19:44:27 +01:00
#+end_src
2024-05-16 13:05:05 +02:00
~nerd-icons-completion~ nam dired in ostalo dopolnjevanje pojača z ikonami.
#+begin_src emacs-lisp
2024-12-10 12:39:21 +01:00
(use-package nerd-icons-completion
2024-12-15 16:45:22 +01:00
:after marginalia
:config
(nerd-icons-completion-mode)
:hook (marginalia-mode-hook . #'nerd-icons-completion-marginalia-setup))
2024-05-16 13:05:05 +02:00
#+end_src
** Iskanje
2024-12-15 17:37:10 +01:00
~consult~ 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~ !).
2023-12-27 19:44:27 +01:00
2024-12-15 17:37:10 +01:00
@TODO raziskat več o morebitno uporabni ~consult~ funkcionalnosti.
2024-05-16 13:05:05 +02:00
2023-12-27 19:44:27 +01:00
#+begin_src emacs-lisp
2024-12-15 17:37:10 +01:00
(use-package consult
2023-12-27 19:44:27 +01:00
:config
2024-12-15 17:37:10 +01:00
(general-define-key
2024-05-16 13:05:05 +02:00
;(global-set-key (kbd "M-x") 'counsel-M-x)
2024-12-15 17:37:10 +01:00
"C-s" 'consult-line
"C-c j" 'consult-git-grep
"C-c k" 'consult-ag
"C-x l" 'consult-locate)
2023-12-27 19:44:27 +01:00
(start/leader-keys
2024-12-15 17:37:10 +01:00
"RET" 'consult-bookmark
"/" 'consult-ripgrep
"b b" 'consult-buffer
"f r" 'consult-recent-file :wk "nedavno odprto")
2023-12-27 19:44:27 +01:00
#+end_src
~counsel-M-x~ poganjalnik ukazov doplnimo s paketom ~smex~ za prikazovanje nedavno uporabljenih ukazov pri vrhu.
#+begin_src emacs-lisp
(use-package smex)
#+end_src
Šum pri iskalnih rezultatih ripgrep-a zmanjšamo z ignoriranjem ~node_modules~ direktorija javascript odvisnih paketov.
#+begin_src emacs-lisp
(defvar my-rg-excludes '("node_modules")
"List of directories to exclude from `counsel-rg' results.")
(define-advice counsel-rg
(:around (fn &optional in dir opts &rest args) my-glob)
"Exclude `my-rg-excludes' from `counsel-rg' results."
(let ((dir (or dir default-directory)))
(dolist (x my-rg-excludes)
(let ((glob (and (file-in-directory-p x dir)
(file-relative-name (expand-file-name "**" x) dir))))
(when glob (setq opts (concat "-g !" glob (and opts " ") opts))))))
(apply fn in dir opts args)))
#+end_src
2024-05-16 13:05:05 +02:00
2024-02-01 15:12:21 +01:00
** Pomoč / introspekcija
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~ ...
#+begin_src emacs-lisp
(use-package helpful :defer t)
#+end_src
2023-12-27 19:44:27 +01:00
2024-02-01 15:12:21 +01:00
~which-key~ prikazuje minibuffer z razlago, katere tipkovnične bližnjice so na voljo.
#+begin_src emacs-lisp
(use-package which-key
: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.
2024-05-16 13:05:05 +02:00
(setq which-key-idle-delay 0.2)
2024-02-01 15:12:21 +01:00
(setq which-key-idle-secondary-delay 0.05)
(which-key-mode))
#+end_src
2024-05-16 13:05:05 +02:00
** 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.
#+begin_src emacs-lisp
(use-package crdt
:defer t
2024-12-15 16:45:22 +01:00
:after general
2024-05-16 13:05:05 +02:00
:general
(start/leader-keys
"c" '(:ignore t :wk "crdt")
2024-12-15 16:45:22 +01:00
"c c" 'crdt-connect
; "c c" 'crdt-connect)
;:general-config
;(start/leader-keys
2024-05-16 13:05:05 +02:00
"c" '(:ignore t :wk "crdt")
"c u" 'crdt-list-users
"c s" 'crdt-share-buffer
"c b" 'crdt-list-buffers))
#+end_src
2024-02-01 15:12:21 +01:00
** 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.
#+begin_src emacs-lisp
(use-package openwith
:config
(setq openwith-associations '(("\\.pdf\\'" "xdg-open" (file))))
(openwith-mode t))
#+end_src
2024-12-10 12:39:21 +01:00
** Lepši REPL (ielm)
Nekoliko bolj prijazen elisp REPL, ki ima med drugim zgodovino.
#+begin_src emacs-lisp
(defun g-ielm-init-history ()
"Obstojna ielm zgodovina."
(let ((path (expand-file-name "ielm/history" user-emacs-directory)))
(make-directory (file-name-directory path) t)
(setq-local comint-input-ring-file-name path))
(setq-local comint-input-ring-size 10000)
(setq-local comint-input-ignoredups t)
(comint-read-input-ring))
(defun g-ielm-write-history (&rest _args)
"Tole je povezano z obstojno ielm zgodovino."
(with-file-modes #o600
(comint-write-input-ring)))
(use-package ielm
:defer t
:hook (ielm-mode-hook . (lambda ()
(eldoc-mode)
;(paredit-mode)
(g-ielm-init-history)))
:general
(start/leader-keys
";" 'ielm)
:config
(advice-add 'ielm-send-input :after 'g-ielm-write-history)
2024-12-15 17:37:10 +01:00
(general-define-key
:keymaps 'inferior-emacs-list-mode-map
"C-l" 'comint-clear-buffer)
2024-12-10 12:39:21 +01:00
#+end_src
2024-02-01 15:12:21 +01:00
* ORG
2023-12-27 19:44:27 +01:00
Orgmode je način, v katerem je spisan tale dokument. Orgmode je marsikaj, lahko bi ga pa strnili v razširitev navadnega (plain) teksta.
#+begin_src emacs-lisp
(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
(use-package org
#+end_src
Dodamo tudi bližnjice za ~org-capture~ ter ~org-agenda~ .
TODO dodaj več!
#+begin_src emacs-lisp
2024-12-15 16:45:22 +01:00
:after general
2023-12-27 19:44:27 +01:00
:general
(start/leader-keys
"o" '(:ignore t :wk "orgmode")
"o c" 'org-capture
2024-05-16 13:05:05 +02:00
"o a" 'org-agenda)
:general-config
(start/leader-keys
:keymaps 'org-mode-map
"o i" 'org-toggle-inline-images
2024-12-10 12:39:21 +01:00
"o t" 'org-time-stamp
"o r" 'org-refile)
2023-12-27 19:44:27 +01:00
#+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
2024-12-10 12:39:21 +01:00
(setq org-agenda-files (list "~/org/TODO.org" "~ /org/projekti.org"))
(setq org-default-notes-file "~/org/TODO.org")
2023-12-27 19:44:27 +01:00
#+end_src
Koledarski teden naj se začne s ponedeljkom, kot je pri nas konvencija.
#+begin_src emacs-lisp
(setq calendar-week-start-day 1)
#+end_src
2024-08-21 17:30:42 +02:00
Slike naj bodo omejene širine.
#+begin_src emacs-lisp
(setq org-image-actual-width (list 600))
#+end_src
2024-02-01 15:12:21 +01:00
** Diagrami
2023-12-27 19:44:27 +01:00
Razširitev orgmode z diagramiranje preko [[https://graphviz.org/docs/layouts/dot/ ][DOT ]] ter [[https://ditaa.sourceforge.net/#usage ][ditaa ]].
#+begin_src emacs-lisp
(org-babel-do-load-languages
'org-babel-load-languages
'((dot . t)
2024-12-10 12:39:21 +01:00
(ditaa . t)
(clojure . t)))
2023-12-27 19:44:27 +01:00
#+end_src
Z ~ob-mermaid~ paketom pa dodamo še podporo za prikazovanje [[https://mermaid.js.org/intro/ ][mermaid diagramov ]]!
Delovanje tega paketa je odvisno od globalne namestitve javascript paketa z npm: ~sudo npm i -g @mermaid-js/mermaid-cli~ .
#+begin_src emacs-lisp
(use-package ob-mermaid
2024-05-16 13:05:05 +02:00
:after org
2023-12-27 19:44:27 +01:00
:config
;; sudo npm install -g @mermaid-js/mermaid-cli
(setq ob-mermaid-cli-path "/usr/local/bin/mmdc")
(org-babel-do-load-languages
'org-babel-load-languages
'((mermaid . t)
(scheme . t))))
#+end_src
2024-02-01 15:12:21 +01:00
** Stanja opravil
2023-12-27 19:44:27 +01:00
Stanja opravil. Stanja (v naslovih) menjamo s ~S-<levo>~ in ~S-<desno>~ .
#+begin_src emacs-lisp
(setq org-todo-keywords
2024-05-16 13:05:05 +02:00
'((sequence "TODO" "NEXT" "V DELU" "TESTIRANJE" "DOKUMENTIRANJE" "DONE"))))
2023-12-27 19:44:27 +01:00
#+end_src
2024-02-01 15:12:21 +01:00
** Nemoteno pisanje
2023-12-27 19:44:27 +01:00
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.
#+begin_src emacs-lisp
(use-package writeroom-mode
:defer t
2024-05-16 13:05:05 +02:00
:general
(start/leader-keys
"w w" 'writeroom-mode)
2023-12-27 19:44:27 +01:00
:config
:hook ((org-mode . (lambda () (display-line-numbers-mode -1)))))
#+end_src
2024-02-01 15:12:21 +01:00
** Sinhronizacija koledarjev
2023-12-27 19:44:27 +01:00
Paket ~org-caldav~ omogoča sinhronizacijo koledarskih dogodkov v org dokumente.
TODO popravi/preveri delovanje?
#+begin_src emacs-lisp
(use-package org-caldav
:defer t
:init
(setq org-caldav-url "https://goba.rhiz0.me/remote.php/dav/calendars/g1smo"
2024-12-10 12:39:21 +01:00
org-caldav-files '("~/org/TODO.org")
2023-12-27 19:44:27 +01:00
org-icalendar-timezone "Europe/Ljubljana"
org-caldav-calendars '((:calendar-id "org"
;:files '("~/org/todo.org")
:inbox "~/org/koledarji/org-in.org")
(:calendar-id "personal"
:inbox "~/org/koledarji/osebno-in.org")
(:calendar-id "megla"
:inbox "~/org/koledarji/megla-in.org"))))
#+end_src
2024-02-01 15:12:21 +01:00
** Izgled
2023-12-27 19:44:27 +01:00
Za šminko olepšamo predpone (pod)poglavij v simbole namesto vrst zvezdic.
#+begin_src emacs-lisp
(use-package org-bullets
:after org
:hook ((org-mode . (lambda () (org-bullets-mode 1)))))
#+end_src
Pri seznamih prikaži pike namesto vezajev.
#+begin_src emacs-lisp
(font-lock-add-keywords
'org-mode
'(("^ *\\([-]\\) "
(0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•"))))))
#+end_src
Za lepšo preglednost osvetlimo ozadje org blokov (recimo primere izvorne kode).
#+begin_src emacs-lisp
(require 'color)
(set-face-attribute 'org-block nil :background
(color-darken-name
(face-attribute 'default :background) 3))
#+end_src
Lepše pisave v blokih izvorne kode.
#+begin_src emacs-lisp
(setq org-src-fontify-natively t)
#+end_src
Naslov dokumenta ter naslove in podnaslove prikaži z drugimi pisavami in velikostmi.
#+begin_src emacs-lisp
;; Drugačne pisave za naslove, svoje velikosti
;; Vir: https://zzamboni.org/post/beautifying-org-mode-in-emacs/
(let* ((variable-tuple
(cond ((x-list-fonts "ETBembo") '(:font "ETBembo"))
((x-list-fonts "Lucida Grande") '(:font "Lucida Grande"))
2024-12-15 16:45:22 +01:00
; tale pa ni free
;((x-list-fonts "Verdana") '(:font "Verdana"))
2023-12-27 19:44:27 +01:00
((x-family-fonts "Sans Serif") '(:family "Sans Serif"))
(nil (warn "Cannot find a Sans Serif Font. Install Source Sans Pro."))))
(headline `(:inherit default :weight bold)))
(custom-theme-set-faces
'user
`(org-level-4 ((t (,@headline ,@variable-tuple :height 1.1))))
`(org-level-3 ((t (,@headline ,@variable-tuple :height 1.25))))
`(org-level-2 ((t (,@headline ,@variable-tuple :height 1.45))))
`(org-level-1 ((t (,@headline ,@variable-tuple :height 1.75))))
`(org-document-title ((t (,@headline ,@variable-tuple :height 2.0 :underline nil))))))
#+end_src
2024-02-01 15:12:21 +01:00
(lepši) zamiki naslovov. Potrebuje ~svg-lib~ .
#+begin_src emacs-lisp
;(use-package svg-lib :defer t)
;(use-package org-margin
; :after org svg-lib
; :vc "https://github.com/rougier/org-margin"
; :init (org-margin-mode 1))
#+end_src
** Izvoz
2023-12-27 19:44:27 +01:00
V HTML org izvozu obarvaj bloke kode.
#+begin_src emacs-lisp
(use-package htmlize :after org-mode :defer t)
#+end_src
2024-12-10 12:39:21 +01:00
** Predstavitve
Bližnjice:
- ~left/right~ for movement
- ~C-c C-=~ for large txt
- ~C-c C--~ for small text
- ~C-c C-q~ for quit (which will return you back to vanilla org-mode)
- ~C-c <~ and ~C-c >~ to jump to first/last slide
- ~C-c C-r~ for buffer read-only
- ~C-c C-w~ for buffer read/write
- ~C-c C-1~ for one big page showing all slides
2023-12-27 19:44:27 +01:00
2024-12-10 12:39:21 +01:00
#+begin_src emacs-lisp
(use-package org-present :after org-mode :defer t)
#+end_src
#+begin_src emacs-lisp
(use-package htmlize :after org-mode :defer t)
#+end_src
* Grafični vmesnik
2024-03-06 18:33:28 +01:00
Barvna tema je [[https://github.com/greduan/emacs-theme-gruvbox ][gruvbox ]], v varjanti ~gruvbox-dark-soft~ , s pisavo Iosevka.
2023-12-27 19:44:27 +01:00
#+begin_src emacs-lisp
(use-package gruvbox-theme
:config
2024-07-06 13:36:55 +02:00
(load-theme 'gruvbox-dark-medium t))
2024-03-06 18:33:28 +01:00
(set-frame-font "Iosevka Medium 11" nil t)
2023-12-27 19:44:27 +01:00
#+end_src
Modeline vrstica (v bufferjih spodaj) je iz doom emacsa.
#+begin_src emacs-lisp
(use-package doom-modeline
:init (doom-modeline-mode 1))
#+end_src
Uporabimo nerd ikone. ~POZOR~ pisavo naložimo z ukazom ~M-x nerd-icons-install-fonts~ .
#+begin_src emacs-lisp
(use-package nerd-icons)
#+end_src
2024-02-01 15:12:21 +01:00
** Drsenje (skrolanje)
2023-12-27 19:44:27 +01:00
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.
#+begin_src emacs-lisp
(pixel-scroll-precision-mode)
;; Nevem kaj to dela
(setq scroll-conservatively 10)
(setq scroll-margin 8)
#+end_src
2024-02-01 15:12:21 +01:00
** Prihranimo prostor
2023-12-27 19:44:27 +01:00
Nekaj prostora prihranimo z umikom menija in orodne vrstice, iz katere tudi umaknemo ikone.
#+begin_src emacs-lisp
(menu-bar-mode -1)
(tool-bar-mode -1)
(setq ns-use-proxy-icon nil)
#+end_src
Onemogočimo grafične dialoge. Namesto tega tekstovno odgovorimo y/n (skrajšana oblika).
#+begin_src emacs-lisp
(setq use-dialog-box nil)
(fset 'yes-or-no-p 'y-or-n-p)
#+end_src
Umaknemo tudi naslove okvirjev.
#+begin_src emacs-lisp
(setq frame-title-format nil)
#+end_src
Ob strani piksle pridobimo s skrivanjem drsnega traka.
#+begin_src emacs-lisp
(scroll-bar-mode -1)
#+end_src
Zmanjšamo razmike med okni.
#+begin_src emacs-lisp
(setq window-divider-default-bottom-width 3)
(window-divider-mode t)
#+end_src
2024-07-06 13:36:55 +02:00
** Transparentno ozadje
#+begin_src emacs-lisp
(set-frame-parameter nil 'alpha-background 90)
(add-to-list 'default-frame-alist '(alpha-background . 90))
#+end_src
2024-02-01 15:12:21 +01:00
* Tekst
2023-12-27 19:44:27 +01:00
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.
#+begin_src emacs-lisp
(use-package undo-tree
:config
(global-undo-tree-mode)
(evil-set-undo-system 'undo-tree)
;; Drevo razveljavitev shrani v emacsov folder
(setq undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo"))))
#+end_src
In pa nenazadnje, čeravno je ORGMODE superioren, naložimo še podporo za [[https://www.markdownguide.org/ ][markdown ]].
#+begin_src emacs-lisp
(use-package markdown-mode :mode "\\.(md|markdown)\\'")
#+end_src
2024-08-21 17:30:42 +02:00
* GNU/Guix
#+begin_src emacs-lisp
2024-12-10 12:39:21 +01:00
(use-package guix :ensure f :defer t)
#+end_src
** Pretty SHA path
Minor mode, ki SHA hashe v bufferju skrajša in tako poveča preglednost.
#+begin_src emacs-lisp
(use-package pretty-sha-path
:ensure t
:config
(pretty-sha-path-global-mode))
2024-08-21 17:30:42 +02:00
#+end_src
2024-02-01 15:12:21 +01:00
* Delo s projekti
2023-12-27 19:44:27 +01:00
Knjižnica za projektne interakcije. Vsak projekt je svoja git zbirka. Lajša menjavo med projekti, iskanje datotek v posameznem projektu in tako dalje.
#+begin_src emacs-lisp
(use-package projectile
#+end_src
2024-05-16 13:05:05 +02:00
Vlopimo projectile način, prezrimo direktorij z javascript paketi in priklopimo na ~ivy~ mehanizem za avtomatsko dopolnjevanje. ~SPC p~ odpre preddefinirano drevo bližnjic za delo s ~projectile~ .
2023-12-27 19:44:27 +01:00
#+begin_src emacs-lisp
:config
2024-05-16 13:05:05 +02:00
(projectile-mode 1)
(start/leader-keys "p" 'projectile-command-map)
2023-12-27 19:44:27 +01:00
(setq projectile-globally-ignored-directories '("node_modules"))
#+end_src
Zaradi težav pri uporabi =projectile= preko SSH povezav spremenimo način indeksiranja datotečnega drevesa. Dodajanje večjega projekta zato traja nekoliko dlje
#+begin_src emacs-lisp
2024-07-06 13:36:55 +02:00
(setq projectile-indexing-method 'hybrid)
2023-12-27 19:44:27 +01:00
(setq projectile-enable-caching t)
;(add-to-list 'tramp-remote-path 'tramp-own-remote-path)
;(setq-default projectile-indexing-method 'alien)
#+end_src
Datoteke sortiraj glede na nedavno uporabljene bufferje in nato nedavno odprte.
#+begin_src emacs-lisp
(setq projectile-sort-order 'recently-active))
#+end_src
~counsel-projectile~ nudi dodatne integracije z ~ivy~ sistemom dopolnjevanja.
#+begin_src emacs-lisp
(use-package counsel-projectile :after projectile)
#+end_src
2024-12-10 12:39:21 +01:00
~org-projectile~ omogoča vzdrževanje ORG TODO list na posameznih projektih.
#+begin_src emacs-lisp
(use-package org-projectile :after projectile)
#+end_src
#+begin_src
#+end_src
2024-02-01 15:12:21 +01:00
** Oblikovanje teksta
2023-12-27 19:44:27 +01:00
[[https://editorconfig.org/ ][Editorconfig ]] omogoča nastavljanje oblikovanje tekstovnih fajlov na ravni posameznega projekta.
#+begin_src emacs-lisp
(use-package editorconfig
:config
(editorconfig-mode 1))
#+end_src
2024-02-01 15:12:21 +01:00
** Datotečno drevo
2023-12-27 19:44:27 +01:00
~treemacs~ nudi vizualni drevesni pregled nad datotekami in direktoriji za posamezni projekt.
Vklop je nastavljen na ~SPC t~ . Številke vrstic nas v drevesnem bufferju ne zanima. Pridodamo še paket za ~projectile~ podporo.
#+begin_src emacs-lisp
(use-package treemacs
:defer t
:general
(start/leader-keys
"t" 'treemacs)
:hook ((treemacs-mode . (lambda () ;; Brez stevilk vrstic v file drevesu!
(display-line-numbers-mode -1)))))
(use-package treemacs-projectile :after treemacs)
#+end_src
2024-02-01 15:12:21 +01:00
* Programiranje
** Splošno
Za začetek nastavimo uporabo dveh navadnih presledkov za tab zamik.
#+begin_src emacs-lisp
(setq-default tab-width 2)
(setq-default indent-tabs-mode nil)
2024-12-10 12:39:21 +01:00
(setq indent-line-function 'insert-tab)
2024-02-01 15:12:21 +01:00
#+end_src
Vklopimo avtomatsko zapiranje oklepajev ter emacsovo avtomatsko zamikanje.
2023-12-27 19:44:27 +01:00
2024-02-01 15:12:21 +01:00
#+begin_src emacs-lisp
(electric-indent-mode 1)
; (electric-pair-mode 1)
#+end_src
2023-12-27 19:44:27 +01:00
2024-02-01 15:12:21 +01:00
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.
2023-12-27 19:44:27 +01:00
#+begin_src emacs-lisp
(use-package smartparens-mode
:ensure smartparens
:hook (prog-mode text-mode markdown-mode)
:config
2024-08-21 17:30:42 +02:00
(require 'smartparens-config)
(sp-pair "'" "'" :actions nil))
2023-12-27 19:44:27 +01:00
#+end_src
Avtomatsko dopolnjevanje izrazov.
#+begin_src emacs-lisp
(use-package company
:config
(setq lsp-completion-provider :capf)
:init (global-company-mode))
#+end_src
~flycheck~ sproti preverja sintakso kode in opozarja na morebitne nečednosti.
#+begin_src emacs-lisp
(use-package flycheck
:defer t
:init (global-flycheck-mode))
#+end_src
Avtomatsko oblikovanje kode za razne programske jezike. Kličemo ga ročno. TODO dodamo kakšno bližnjico?
#+begin_src emacs-lisp
(use-package format-all :defer t)
#+end_src
2024-02-01 15:12:21 +01:00
~direnv~ integracija omogoča uporabo definiranih okoljskih spremenljivk na posameznih projektih (recimo vključitev drush v PATH za drupal).
#+begin_src emacs-lisp
(use-package direnv :config (direnv-mode))
#+end_src
** GIT
2023-12-27 19:44:27 +01:00
~magit~ paket je super za delo z git sistemom za deljeno verzioniranje kode ali drugih podatkov.
#+begin_src emacs-lisp
(use-package magit
:defer t
:general
(start/leader-keys
"g" '(:ignore t :wk "magit")
2024-02-01 15:12:21 +01:00
"g s" 'magit-status)
:config
#+end_src
Sledeča konfiguracija prepreči zamrznitev ko stage-amo spremembe preko TRAMP povezave.
#+begin_src emacs-lisp
(defun my--tramp-send-command--workaround-stty-icanon-bug (conn-vec orig-command &rest args)
"See: https://github.com/magit/magit/issues/4720"
(let ((command
(if (string= "stty -icrnl -icanon min 1 time 0" orig-command)
"stty -icrnl"
orig-command)))
(append (list conn-vec command) args)))
(defun my--tramp-send-command--workaround-stty-icanon-bug--filter-args (args)
(apply #'my--tramp-send-command--workaround-stty-icanon-bug args))
(advice-add 'tramp-send-command :filter-args
#'my--tramp-send-command--workaround-stty-icanon-bug--filter-args))
2023-12-27 19:44:27 +01:00
#+end_src
2024-02-01 15:12:21 +01:00
Z ~magit-todos~ si malo olajšamo spremlajnje TODO-jev v drevesu kode. Zaenkrat onemogočeno, zaradi težavo preko TRAMP povezav.
2023-12-27 19:44:27 +01:00
#+begin_src emacs-lisp
2024-02-01 15:12:21 +01:00
;(use-package magit-todos
; :after magit
; :config (magit-todos-mode 1))
2023-12-27 19:44:27 +01:00
#+end_src
2024-02-01 15:12:21 +01:00
** Tree-sitter
2023-12-27 19:44:27 +01:00
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
: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.
#+begin_src emacs-lisp
; (dolist
; (item (list '("\\.css\\'" . css-ts-mode)
; '("\\.json\\'" . json-ts-mode)
; '("\\.php\\'" . php-ts-mode)
; '("\\.py\\'" . python-ts-mode)
; '("\\.js\\'" . js-ts-mode)))
; (add-to-list 'auto-mode-alist item))
#+end_src
2024-02-01 15:12:21 +01:00
** LISP
2023-12-27 19:44:27 +01:00
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).
#+begin_src emacs-lisp
2024-02-01 15:12:21 +01:00
(use-package scheme-mode
:ensure f
:mode "\\.scm\\'")
2023-12-27 19:44:27 +01:00
(use-package geiser-guile
2024-02-01 15:12:21 +01:00
:defer t
2024-05-16 13:05:05 +02:00
:general-config
2023-12-27 19:44:27 +01:00
(start/leader-keys
2024-05-16 13:05:05 +02:00
:keymaps 'geiser-mode-map
"s" '(:ignore t :wk "geiser")
"s b" 'geiser-eval-buffer
"s e" 'geiser-eval-expression
"s s" (defun geiser-start-and-eval-buffer ()
(interactive)
(geiser-guile)
(previous-buffer)
(geiser-eval-buffer))
"s s" 'geiser-start-and-eval-buffer
"s g" 'geiser
"s c" 'geiser-connect
"s k" 'geiser-exit-repl
"s r" (defun geiser-restart ()
;(interactive)
(geiser-exit-repl)
(geiser-start-and-eval-buffer))
"e" '(:ignore t :wk "eval (geiser)")
"e b" 'geiser-eval-buffer
"e e" 'geiser-eval-expression
"e r" 'geiser-eval-region
"b e" 'geiser-eval-buffer)
:init
(setq geiser-mode-auto-p nil))
2023-12-27 19:44:27 +01:00
#+end_src
Kdaj delam tudi z [[https://racket-lang.org/ ][racket ]].
#+begin_src emacs-lisp
(use-package racket-mode :mode "\\.rkt\\'")
#+end_src
2024-02-01 15:12:21 +01:00
Poskusimo še common lisp - SLIME!
#+begin_src emacs-lisp
(use-package slime
:defer t
:config (setq inferior-lisp-program "/usr/bin/sbcl"))
#+end_src
** Spletno
2023-12-27 19:44:27 +01:00
Način za obarvanje html, twig in podobne kode (jinja?) se imenuje ~web-mode~ .
Dodamo še pripadajoč paket za olepševanje kode (avtomatsko prilagoditev zamikov kode).
#+begin_src emacs-lisp
2024-05-16 13:05:05 +02:00
(use-package web-mode
2024-12-10 12:39:21 +01:00
:mode "\\.(html|twig)\\'"
:custom
(web-mode-markup-indent-offset 2)
(web-mode-css-indent-offset 2)
(web-mode-code-indent-offset 2))
2024-05-16 13:05:05 +02:00
2023-12-27 19:44:27 +01:00
(use-package web-beautify :after web-mode)
#+end_src
Ozadja pri ~vue-mode~ se z gruvbox temo rada grdo pomešajo, kar lahko rešimo s sledečim hookom:
#+begin_src emacs-lisp
(add-hook 'mmm-mode-hook
(lambda ()
(set-face-background 'mmm-default-submode-face nil)))
#+end_src
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.
#+begin_src emacs-lisp
(use-package restclient :defer t)
#+end_src
2024-02-01 15:12:21 +01:00
*** PHP
2023-12-27 19:44:27 +01:00
Podpora za programiranje s PHP domačo spletno stranjo oz. hipertekstualnim predprocesorjem.
#+begin_src emacs-lisp
(use-package php-mode
:mode "\\.(php|module)\\'"
#+end_src
Bližnjica za cache rebuild na drupalu (dela tudi preko SSH!).
#+begin_src emacs-lisp
2024-05-16 13:05:05 +02:00
:general-config
2024-08-21 17:30:42 +02:00
;:general
2023-12-27 19:44:27 +01:00
(start/leader-keys
2024-05-16 13:05:05 +02:00
:keymaps 'php-mode-map
2023-12-27 19:44:27 +01:00
"d d" (defun drupal-cache-rebuild ()
(interactive)
2024-02-01 15:12:21 +01:00
;(shell-command "drush cr")
(projectile-run-shell-command-in-root "./vendor/bin/drush cr")
)))
2023-12-27 19:44:27 +01:00
#+end_src
Sicer obstaja tudi način ki lajša delanje z drupalom.
#+begin_src emacs-lisp
(use-package drupal-mode :after php-mode)
#+end_src
2024-07-06 13:36:55 +02:00
Geben je za php debugiranje.
#+begin_src emacs-lisp
(use-package geben
:after php-mode
:config
(setq geben-pause-at-entry-line nil)
(setq geben-dbgp-default-port 9003))
#+end_src
2024-02-01 15:12:21 +01:00
*** Javascript
2023-12-27 19:44:27 +01:00
Najprej nastavimo zamike.
#+begin_src emacs-lisp
(setq js2-strict-missing-semi-warning nil
js2-missing-semi-one-line-override nil
js2-basic-offset 2
js-indent-level 2
indent-tabs-mode nil
tab-width 2)
#+end_src
~js2~ je en fajn način za javascriptanje.
#+begin_src emacs-lisp
(use-package js2-mode
:mode "\\.js\\'")
#+end_src
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 ]].
#+begin_src emacs-lisp
(use-package rjsx-mode :after js2-mode)
#+end_src
2024-02-01 15:12:21 +01:00
** Python
2023-12-27 19:44:27 +01:00
Zamik na 2 presledka.
#+begin_src emacs-lisp
(setq python-indent-offset 2)
#+end_src
Podpora za delo z [[https://docs.python.org/3/library/venv.html ][venv ]] okolji.
#+begin_src emacs-lisp
(use-package pyvenv
:mode "\\.py\\'"
2024-07-06 13:36:55 +02:00
:init
2023-12-27 19:44:27 +01:00
(pyvenv-mode t)
#+end_src
Nastavljen naj bo na ~python3~ .
#+begin_src emacs-lisp
(setq pyvenv-post-activate-hooks
(list (lambda ()
(setq python-shell-interpreter (concat pyvenv-virtual-env "bin/python3")))))
(setq pyvenv-post-deactivate-hooks
(list (lambda ()
(setq python-shell-interpreter "python3")))))
#+end_src
2024-02-01 15:12:21 +01:00
** Živo kodiranje
2023-12-27 19:44:27 +01:00
[[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.
2024-08-21 17:30:42 +02:00
Najprej moramo vključit direktorij, v katerem se nahajajo emacs paketi zanj (pridejo iz v supercolliderju nameščenega [[https://github.com/supercollider/scel ][quarka ]]), lahko bi pra prišel iz paketnega upravljalnika linux distribucije ali pa MELPE:
2023-12-27 19:44:27 +01:00
#+begin_src emacs-lisp
2024-12-10 12:39:21 +01:00
(add-to-list 'load-path "~/.local/share/SuperCollider/scel/el")
; (add-to-list 'load-path "~/.guix-profile/share/emacs/site-lisp/scel-20170629-1.aeea3ad")
2023-12-27 19:44:27 +01:00
#+end_src
2024-12-10 12:39:21 +01:00
Nato vključimo emacs modul ter [[https://github.com/yilin-zhang/sclang-helper ][sclang-helper ]] za lažjo evalvacijo kode in nastavimo bližnjice; ~C-RET~ za evalviranje "trenutne regije" (med zunanjimi oklepaji), ~C-c C-c~ za evalvacijo vrstice ali izbrane regije ter ~C-.~ za utišanje (kot v IDE-ju).
2023-12-27 19:44:27 +01:00
#+begin_src emacs-lisp
2024-12-10 12:39:21 +01:00
(require 'sclang)
;; Za branje dokumentacije
(use-package sclang-extensions
:config
(load "~/.emacs.d/sclang-helper.el")
(add-hook 'sclang-mode-hook 'sclang-extensions-mode)
(add-hook 'sclang-mode-hook (lambda () (local-set-key (kbd "C-<return >") 'sclang-helper-eval-paren-region))))
#+end_src
Za branje supercollider dokumentacije potrebujemo še ~w3m~ paket.
#+begin_src emacs-lisp
(use-package w3m :defer t)
2024-08-21 17:30:42 +02:00
#+end_src
2024-12-10 12:39:21 +01:00
Povozimo drug keybinding.
2024-08-21 17:30:42 +02:00
#+begin_src emacs-lisp
2024-12-10 12:39:21 +01:00
(use-package bind-key
:defer t
:init
(bind-key "C-c C-c" 'sclang-helper-eval-region-or-line sclang-extensions-mode-map)
(bind-key* "C-." 'sclang-server-free-all sclang-extensions-mode-map))
2023-12-27 19:44:27 +01:00
#+end_src
[[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.
#+begin_src emacs-lisp
:init
;; Tidal cycles lokacija
(setq tidal-boot-script-path "~/.cabal/store/ghc-9.0.2/tidal-1.9.2-8e9cf9a217d87a6950880512f51893a6434970cd0690e831c563fc64ebd5de8f/share/BootTidal.hs"))
#+end_src
[[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.
#+begin_src emacs-lisp
(setq python-shell-interpreter "python3"
python-shell-interpreter-args "")
(defun sardine/start-sardine ()
"Start a new interactive Sardine Session"
(interactive)
(run-python))
(defun sardine/eval-block ()
"Evaluate a sardine code block"
(interactive)
(mark-paragraph)
(if (and transient-mark-mode mark-active)
(python-shell-send-region (point) (mark))
(python-shell-send-region (point-at-bol) (point-at-eol)))
(forward-paragraph))
(defun sardine/stop-code ()
"Stop all the Sardine code currently running"
(interactive)
(python-shell-send-string "panic()"))
; Unmapping keys from the Python mode
;(add-hook 'python-mode-hook
; (lambda() (local-unset-key (kbd "C-c C-c"))))
;(add-hook 'python-mode-hook
; (lambda() (local-unset-key (kbd "C-c C-s"))))
; Remapping keys
(global-set-key (kbd "C-M-x") #'sardine/eval-block)
(global-set-key (kbd "C-M-.") #'sardine/stop-code)
#+end_src
2024-02-01 15:12:21 +01:00
** Konfiguracijski jeziki
2023-12-27 19:44:27 +01:00
YAML in TOML sta dva primera konfiguracijskih jezikov, s katerima kdaj delam.
#+begin_src emacs-lisp
(use-package yaml-mode :mode "\\.yaml\\'")
(use-package toml-mode :mode "\\.toml\\'")
#+end_src
2024-02-01 15:12:21 +01:00
** Arduino
2023-12-27 19:44:27 +01:00
#+begin_src emacs-lisp
(use-package arduino-mode :mode "\\.ino\\'")
#+end_src
2024-02-01 15:12:21 +01:00
** Jezikovni strežnik
2023-12-27 19:44:27 +01:00
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
(setq read-process-output-max (* 1024 1024))) ;; 1mb
#+end_src
2024-12-10 12:39:21 +01:00
** Clojure
~clojure-mode~ za obarvanje in podobno
#+begin_src emacs-lisp
(use-package clojure-mode)
#+end_src
~CIDER~ integrira clojure repl.
#+begin_src emacs-lisp
(use-package cider
2024-12-15 16:45:22 +01:00
:after clojure-mode
:general-config
2024-12-10 12:39:21 +01:00
(start/leader-keys
2024-12-15 16:45:22 +01:00
:keymaps 'clojure-mode-map
2024-12-10 12:39:21 +01:00
;; EVAL ukazi
"e" '(:ignore t :wk "eval")
"e b" 'cider-eval-buffer
2024-12-15 16:45:22 +01:00
"e c" 'cider-connect
2024-12-10 12:39:21 +01:00
"e e" 'cider-eval-dwim
2024-12-15 16:45:22 +01:00
"e j" 'cider-jack-in
2024-12-10 12:39:21 +01:00
"e r" 'cider-eval-region
"b e" 'cider-eval-buffer)
2024-12-15 16:45:22 +01:00
(cider-mode-map "C-<return >" 'cider-eval-last-sexp))
2024-12-10 12:39:21 +01:00
#+end_src
2024-02-01 15:12:21 +01:00
* E-pošta
2023-12-27 19:44:27 +01:00
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.
2024-03-06 18:33:28 +01:00
** Prejemanje
*** isync
**** Namestitev
2024-12-10 12:39:21 +01:00
2024-03-06 18:33:28 +01:00
Najprej namestimo isync. Primer za guix ter debian.
#+begin_src sh
guix install isync
sudo apt install isync
#+end_src
**** Konfiguracija
2024-12-10 12:39:21 +01:00
2024-03-06 18:33:28 +01:00
Konfiguriramo ga v ~~/.mbsyncrc~ . Primer je za dva poštna nabiralnika, ki bosta shranjena znotraj ~~/.mail~ .
#+begin_src
Create Both
Expunge Both
SyncState *
MaildirStore local
Path ~/.mail/
Trash Trash
IMAPAccount acc1
Host host1.org
User u1
PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.mailpass.acc1.gpg"
SSLType IMAPS
IMAPAccount acc2
Host mail.kompot.si
User u2
PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.mailpass.acc2.gpg"
SSLType IMAPS
IMAPStore acc1-remote
Account acc1
IMAPStore acc2-remote
Account acc2
MaildirStore acc2-local
Subfolders Verbatim
Path ~/.mail/acc2
Inbox ~/.mail/acc2/inbox
MaildirStore acc1-local
Subfolders Verbatim
Path ~/.mail/acc1
Inbox ~/.mail/acc1/inbox
Channel acc1-default
Far :acc1-remote:
Near :acc1-local:
Channel acc2-default
Far :acc2-remote:
Near :acc2-local:
Create Both
SyncState *
Sync All
Group user
Channel acc1-default
Channel acc2-default
2023-12-27 19:44:27 +01:00
2024-03-06 18:33:28 +01:00
#+end_src
***** Kriptiranje gesel
Ker sta gesli za mejle shranjeni kriptirani z gpg, ju najprej kar v navadnem tekstu shranimo v ~~/.mailpass.acc1~ ter ~~/.mailpass.acc2~ , nato pa poženemo:
#+begin_src sh
gpg -c ~/.mailpass.rs.gpg
gpg -c ~/.mailpass.kompot.gpg
#+end_src
*** mu
Najprej namestimo (guix oz. debian):
#+begin_src sh
guix install mu
sudo apt install mu
#+end_src
Nato inicializiramo.
#+begin_src sh
mu init --maildir=~/.mail --my-address=u1@host1.org --my-address=u2@kompot.si
#+end_src
2023-12-27 19:44:27 +01:00
2024-03-06 18:33:28 +01:00
Indeksiramo s sledečim ukazom ali pa kar iz dashboarda ~mu4e~ :
2023-12-27 19:44:27 +01:00
2024-03-06 18:33:28 +01:00
#+begin_src sh
mu index
#+end_src
2023-12-27 19:44:27 +01:00
2024-03-06 18:33:28 +01:00
*** mu4e
2023-12-27 19:44:27 +01:00
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
2024-03-06 18:33:28 +01:00
**** Dodatki
2023-12-27 19:44:27 +01:00
~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
2024-08-21 17:30:42 +02:00
:after mu4e)
; :vc "https://github.com/rougier/mu4e-dashboard")
2023-12-27 19:44:27 +01:00
#+end_src
2024-03-06 18:33:28 +01:00
~mu4e-thread-folding~ nam skrči niti v posamezne vrstice, ki jih lahko razširimo.
#+begin_src emacs-lisp
2024-08-21 17:30:42 +02:00
(use-package svg-icon)
; :vc (svg-icon :url "https://github.com/rougier/emacs-svg-icon"))
;(use-package mu4e-thread-folding
; :after mu4e
; :vc (mu4e-thread-folding :url "https://github.com/rougier/mu4e-thread-folding"))
2024-03-06 18:33:28 +01:00
#+end_src
2023-12-27 19:44:27 +01:00
TODO spisat dodatne konfiguracije, tega še ne uporabljam res.
2024-03-06 18:33:28 +01:00
*** Primeri za (i)zgled
2023-12-27 19:44:27 +01:00
Zanimivi paketi:
- dashboard: https://github.com/rougier/mu4e-dashboard
- thread folding: https://github.com/rougier/mu4e-thread-folding
- svg tag mode: https://github.com/rougier/svg-tag-mode
- views: https://github.com/lordpretzel/mu4e-views
Pedenanje izgleda:
- mu4e look & feel: https://www.reddit.com/r/emacs/comments/mzgsm0/mu4e_look_and_feel/
- nano-mu4e: https://github.com/rougier/nano-emacs/blob/master/nano-mu4e.el
- system crafters o emacs emailu: https://www.youtube.com/watch?v=yZRyEhi4y44&list=PLEoMzSkcN8oM-kA19xOQc8s0gr0PpFGJQ
2024-02-01 15:12:21 +01:00
2024-03-06 18:33:28 +01:00
** Pošiljanje
2024-12-10 12:39:21 +01:00
2024-03-06 18:33:28 +01:00
#+begin_src emacs-lisp
(require 'smtpmail)
(setq send-mail-function 'smtpmail-send-it
smtpmail-smtp-server "kompot.si"
smtpmail-stream-type 'ssl
smtpmail-auth-credentials "~/.mailpass.kompot.gpg"
smtpmail-stream-type 'starttls
smtpmail-smtp-service 587)
#+end_src
2024-08-21 17:30:42 +02:00
2024-02-01 15:12:21 +01:00
* Razno
Zone nyancat!
#+begin_src emacs-lisp
(use-package zone-nyan :defer t)
#+end_src