Mit første indtryk: WAAAUW!

Jeg har været en del igennem de sidste par år, som man også kan se på min dotfiles:

  1. vanilla emacs opsætning, over i
  2. spacemacs, over i
  3. vanilla emacs, igen, over i
  4. doom emacs

Quite a travel, men jeg synes det er sjovt, og jeg kan anbefale at gøre det samme. Hjørnestenenen her er: evil. Det skal være tilstede. Den anden sten er selvfølgelig emacs: emacs kan programmeres til alt, og det er sjovt, svært og tilfredsstillende, når ens editor gør lige præcis det man gerne vil have den til. Har man først fået cracked nødden, så føler man som en handicappet, når man åbner VS, VS Code eller en tredje editor.

Windows

Jeg kører mit setup på Windows 10, men igennem WSL 2. Hvis du selv vil prøve, så anbefaler jeg at du:

  1. installerer WSL 2, Ubuntu (WSL 1 er utrolig langsom, og det vil man ikke ud i)
  2. Tilføjer sudo add-apt-repository ppa:kelleyk/emacs
  3. Afinstallerer emacs: sudo apt remove emacs (Det her er version 26, og vi vil gerne have version 27)
  4. Installerer emacs: sudo apt install emacs27

Derefter installerer du VcXsrv. Her skal du huske:

  1. Åbn op for VcXsrv i inbound og outbound i firewall'en
  2. Start VcXsrv via XLaunch
  3. Disable access control (sidste checkbox i billedet under)

/images/vcxsrvsetup.png

Det er ikke den sikreste måde, og jeg er selv ved at kigge på gøre det her mere sikker, så man ikke åbner op for alt trafik.

Du kan eventuel gemme din konfiguration

/images/setupcompleted.png

Trykke Win+r, og køre shell:startup. Her smider du din gemte konfiguration, og du sørger derved for at X serveren starter op når windows loader.

Start emacs

For at starte emacs fra WSL, skal vi fortælle vores WSL at den skal sende din GUI til din installerede X Server. Det er … meget let når man lige ved hvad man skal smide ind hvor.

Du skal:

  1. Exporte DISPLAY: export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0 - basically fortæller du Ubuntu: alt display trafik skal sendes til den IP, som står konfigureret i /etc/resolv.conf. i er så heldige at WSL har smidt en IP ind for os
  2. Har man mange DPI smid også export GDK_SCALE=0.5=og =export GDK_DPI_SCALE=2. Nogen skærme kræver også export LIBGL_ALWAYS_INDIRECT=1.

Da jeg kører med zsh har jeg disse i henholdvis .zprofile=og =.zshrc. Jeg tror faktisk godt jeg blot kunne smide alt i .zprofile. Har du en anden shell, skal du selvfølgelig smide det i dennes respektive opstartsfiler. Jeg vil dog anbefale at tage et kig på zsh (og oh-my-zsh samt p10k - M M M MMM M).

Leg med disse settings (SCALE og LIBGL)! Hvis du ikke tager stilling vil du opleve:

  1. små fonte i vanilla emacs
  2. blørede skrift i vanilla emacs

Og det er IKKE til at se på.

På min bærbar har jeg GDK_SCALE og DPI_SCALE sat, samt ingen LIBGL, hvor jeg på min stationære har det lige omvendt.

Opstart

Du burde nu fra din WSL prompt skrive =emacs=og få en RIMELIG grim emacs op på skærmen

/images/plainemacs.png

Bvadr :/ Jeg undskylder. Som jeg sagde tidligere:

Vi kan lide emacs da vi kan programmere den og installere evil (og ikke fordi den er flot)

Thats it. Der findes en herlig gut, som har lavet doom emacs. Lad os installere DOOM, og få en lidt mere beautified version op.

Installer DOOM Emacs

Åbn din browser og peg den på https://github.com/hlissner/doom-emacs. Og find install sektionen, og følg den. Basically skal du:

  1. git clone --depth 1 https://github.com/hlissner/doom-emacs ~/.emacs.d
  2. ~/.emacs.d/bin/doom install

That it! Jeg kan dog anbefale, som author'en af DOOM Emacs også gør, at smide ~/.emacs.d/bin i din PATH:

  1. export PATH=$PATH:$HOME/.emacs.d/bin

Jeg har blot smidt denne i min .zshrc, men den burde nok ligge i .profile (som du måske kan høre, eksperimentere jeg rimelig meget med min setup).

Når doom er færdig start den op ved at køre =emacs=i din shell igen, og du burde se

/images/doomemacs.png

Pga WSL vil den ikke være fullscreen og man kan ikke helt få det til at virke. Man skal lige manuelt køre den op i fuld skærm. Jeg har smidt følgende i min config.el

    (add-to-list 'initial-frame-alist '(fullscreen . maximized))

Men emacs vil stadig starte lidt off screen. You cant have it all.

Hvad får man?

Grunden til at jeg skriver

You can't have it all

er at man med WSL 2 og X serveren får:

  1. en hurtig emacs, opstart for mig er omkring 800 ms til 1 sekund
  2. en hurtig git (magit modulet er 1000x hurtigere i WSL2)

Smed man det samme på nativ windows vil man opleve:

  1. opstartstid på 10-20 sekunder
  2. langsom magit - som i utrolig langsom magit

Derfor kan jeg godt leve med en offscreen opstart, indtil det er fikset.

Whats next

Hvis det her er din første take på emacs og evil, vil jeg råde dig til at læse lidt op på emacs evil: https://github.com/noctuid/evil-guide.

Optional features

Grunden til at jeg godt kan lide DOOM emacs er:

  1. du får swiper (counsel og ivy) ud af boksen - bedre dialog bokse og søgemuligheder
  2. org mode, org journal og org mode er sat op - org mode er THE BOMB! Once you go org, you never go black! Jeg kan på det kraftigste anbefale at kigge mere på org mode
  3. magit - gits svar på org mode - once you go magit you never … quit
  4. workspaces - denne feature er WILD!!! Læs mere her (forstil dig at du har en editor åben, med flere workspaces - i stedet for 10 VS code instanser - med søgning, naming og navigering right from your keyboard WOWSA!!!)
  5. det er forholdsvis let at få en mail klient og en irc klient smidt ind i stakken
  6. LSP er let at sætte op - er du programmør så er LSP et must. LSP understøtter et hav af sprog, og det er let at sætte op i DOOM Emacs

DOOM emacs har 150 moduler, som du kan installere via init.el.

Mail klient siger du? WHAT???

Ja. Emacs brugere vil gerne smide alt hvad de kan ind i emacs, og jeg er ingen undtagelse. Jeg NYDER at rode med det her. Jeg finder det sjovt, brugbart og lærerigt. DOOM Emacs har et helt community på Discord, hvor der snakkes livligt omkring alt, inklusiv email, org mode, LSP, calendar osv. Det er sjovt, og man får snakket med ligesindede. Men hvordan gør man så? Let me show you.

For at læse og sende mails i emacs (eller på en hvilken som helst Linux, fra CLI'en) skal man forstå følgende filosofi. Man skal have tre dele:

  1. noget at hente emails med: jeg bruger offlineimap
  2. noget at læse emails med: jeg bruger emacs og mu4e
  3. noget at sende mails med: jeg bruger msmtp

Lad os gå igang.

Noget at hente emails med: offlineimap

Start med at installere offlineimap

    sudo apt install offlineimap
    sudo apt install maildir-utils mu4e w3m

opret .offlineimaprc i din hjemmemappe med følgende indhold (jeg bruger privat office365, men ændre din smtp server så den passer til din email pusher):

    [general]
    accounts = Outlook
    maxsyncaccounts = 1

    [Account Outlook]
    localrepository = LocalOutlook
    remoterepository = RemoteOutlook

    [Repository LocalOutlook]
    type = Maildir
    localfolders = ~/.mail/your_mail_box

    [Repository RemoteOutlook]
    type = IMAP
    ssl = yes
    sslcacertfile = /etc/ssl/certs/ca-certificates.crt
    auth_mechanisms = PLAIN
    remotehost = outlook.office365.com
    remoteuser = your_email_user
    remotepass = your_email_password
    readonly = true
    folderfilter = lambda folder: folder in [ 'Sent', 'INBOX', 'Archive', 'Drafts']

Læg mærke til at vi smider email i ~/.mail under `your_mail_box: ændr det til noget sigende (og husk det: du skal bruge det til at konfigurere mu4e med i næste afsnit (som du læser emails med)) <– vi lisp brugere elsker paranteser.

Kør nu (hvis din mu < 1.4)

    offlineimap
    mu index --maildir=~/.mail

Hvis mu versionen er >= 1.4, skal du bruge

    mu init --maildir ~/.mail --my-address your_email_address
    mu index

Du skal køre mu før du kan bruge mu4e i emacs (når du henter nye mails, sørger emacs selv for reindeksere din mails). Og ja: mu er til at indeksere og søge efter mails. Efter du har indekseret, prøv at hammer mu find from:et_HEL_eller_delvis_mail_adresse i terminalos, og se magien ske :O. Wupsan!!

Noget at læse mails med

Aktiver mail klienten i init.el=(Du kan finde dine config filer nemt ved at trykke =SPC f P):

       (mu4e)

Luk emacs, og kør doom sync. Doom vil nu hente og installere modulet for dig.

I din config.el smider du følgende

    (setq +mu4e-backend 'offlineimap)
    (setq mu4e-sent-messages-behavior 'delete)

    (setq send-mail-function 'sendmail-send-it
          sendmail-program email_msmtp_bin_path
          mail-specify-envelope-from t
          message-sendmail-envelope-from 'header
          mail-envelope-from 'header)

    (setq mu4e-html2text-command "w3m -T text/html" ; how to handle html-formatted emails
          mu4e-view-show-images t                   ; show images in the view buffer
          mu4e-use-fancy-chars t)                   ; allow fancy icons for mail threads

    (set-email-account! email_personal_folder_prefix
      `((mu4e-sent-folder       . "/your_mail_box/Sent")
        (mu4e-drafts-folder     . "/your_mail_box/INBOX")
        (mu4e-trash-folder      . "/your_mail_box/Trash")
        (mu4e-refile-folder     . "/your_mail_box/Archive")
        (smtpmail-smtp-user     . "your_email_user")
        (user-mail-address      . "your_email@address.tld")    ;; only needed for mu < 1.4
        (mu4e-compose-signature . "your_signature"))
      t)

Husk at skifte alle settings ud med de korrekte ;) Du man nu genstarte emacs, og åbne mu4e med SPC o m. Herefter kan du:

  1. u for at opdatere (denne kommando kører offlineimap og mu)
  2. bu for at læse ulæste emails
  3. og mere til

alt står forklaret på startskærmen når du har fyret SPC o m af. Får du HTML mails, har du installeret w3m til at rendere disse! Det er smart! We sure love open sauce <3

Noget at sende mails med: msmtp

Jeg bruger msmtp til at sende mails med. Installer den

    sudo apt install msmtp

Efterfølgende kan du konfigurere den. Jeg bruger som sagt office365, men smid gerne din egen opsætning ind. Filen skal ligge i din hjemme folder, og hedde .msmtprc:

    defaults
    port 587
    tls on
    account your_account_name

    # Host name of the SMTP server
    host outlook.office365.com
    from your_email_address
    auth on
    user uour_email_user
    password your_email_password
    account default : your_account_name

Du kan nu fortælle emacs at den skal bruge msmtp til at relay dine mails. Har du kopieret min konfiguration fra mu4e så har du det allerede

    (setq send-mail-function 'sendmail-send-it
          sendmail-program email_msmtp_bin_path
          mail-specify-envelope-from t
          message-sendmail-envelope-from 'header
          mail-envelope-from 'header)

Det eneste du egentlig skal huske er at finde ud af path til msmtp. Kør en which msmtp i din terminalos, og smid det den giver dig ind.

Du kan nu åbne en buffer, eller bruge SPC o m efterfulgt af C for at compose en ny mail. Jeg fjerner altid det org der smides ind, men templaten har FROM, TO og SUBJECT indsat, lige til at udfylde:

    From: your_name <your_email>
    To: 
    Subject: 
    --text follows this line--
    #+OPTIONS: html-postamble:nil toc:nil author:nil email:nil d:nil
    #+STARTUP: inlineimages
    :PROPERTIES:
    :reply-to: nil
    :attachment: nil
    :alternatives: (html text)
    :END:

    -- 

    your_signature

Jeg fjerner det org relaterede, så den ser således ud

    From: your_name <your_email>
    To: 
    Subject: 

    your_text

    your_signature

Efterfølgende kan du sende bufferen afsted til msmtp ved at fyre M-x send-mail og vupti! Du har sendt en mail.

EASY!

IRC

Bruger du IRC, som jeg, kan du nemt få den presset ind i DOOM emacs. Du skal blot installere modulet ved at uncommente den i din init.el:

           irc               ; how neckbeards socialize

Den ligger under :app. Forlad emacs, og kør doom sync. Find din =config.el=fil og smid dine login oplysninger etc ind:

    (after! circe
      (set-irc-server! irc_server
        `(
          :port your_irc_port
          :nick your_irc_nick
          :user your_irc_user
          :pass your_irc_pass
          :channels (channels_goes_here))))

genstart emacs, og fyr op for klienten ved at trykke M-x =irc. Lighedstegnet sørger for at starte klienten op i et workspace for sig selv. Meget behageligt. Jeg sidder dagligt på Freenode netværket, på kanalen ##csharp. Kom og vær med! Det er meget hyggeligt.

Sikkerhed: det skal være bedre, men det bliver i fase 2 ;)

Jeg har bevidst valgt at have mine passwords og usernames liggende i klartekst filer, indtil jeg får løst følgende: https://emacs.stackexchange.com/questions/64412/doom-emacs-pass-integration, eller finder ud af at have et krypteret drev liggende. Jeg ved ikke hvad jeg hælder mest til. Jeg har hevet alle mine credentials ud af min config.el fil, og har dem liggende ved siden af i en local-config.el. Denne fil (samt mine offlineimap og msmtprc kunne man eventuel smide i det krypterede drev. Man kunne også bruge PGP. Det er IKKE I MIN FASE 2, men noget jeg har kig på. Det kan være der kommer et indlæg om det i fremtiden.

Alt det her er da ikke let?

Ser man bort fra offlineimap og msmtp, og kigger man kun på opsætningen af IRC klienten og mail klienten, så tilføjede man maks 10-15 linjers kode. Havde det været vanilla emacs, var man nok røget op på 50-100. Så det er en del lettere. DOOM emacs har så mange gode default keybindings, og at man kun skal konfigurere selve klienterne, og ikke tænke på keybindings. DEJLIGT!

Afsluttende kommentarer

Hvorfor ikke bare køre den ind med VS og VS Code, og be done with it? Hvad betyder det egentlig at man kan bevæge sig rundt med hjkl, og er det ikke bare mere besværligt at have to modes (faktisk er der flere)? Man har da præcis de samme muligheder i andre editorer!? Ja. Det har man, og man kan endda være mere produktiv, hvis man vil. Jeg synes at VIM keybindings passer perfekt til min mentalitet, og jeg elsker at kunne springe rundt i tekst, flytte rundt på tekst, og manipulere tekst med alle de muligheder, som VIM, og de dertilhørende emacs pakker tilbyder mig. DOOM emacs er ikke bare emacs med VIM bindings. DOOM emacs (og spacemacs for den sags skyld) er en videreudvikling af editoren som vi kender det. Du før:

  1. multiple workspaces
  2. rig mulighed for at søge dine editor kommandoer frem (ivy, counsel, helm)
  3. VIM bindings via evil
  4. Swiper (eller helm) til avanceret tekstsøgning
  5. Org mode - nogen folk kører emacs bare for det her. Tager du noter, burde kigge på det
  6. magit

Og der er meget mere. Teknisk set kan man få det til VS Code via BSpaceCode, selv org mode kan tilføjes, men prøver man at bruge det mangler der rigtig mange ting. Det føles hellere ikke indbygget, men det føles tilføjet. Disse ting tilføjer man også til emacs, bevares, men det er nærmest groet frem af emacs, hvor VS Code, eller VS er bygget til nogen helt andre arbejdsgange.

Hvis du ikke gider, men er nået hertil, vil jeg anbefale at du i det mindste tager et kig på:

  1. VIM bindingen ciw, diw og di"
  2. kigger nærmere på avy-goto-char-2

Der er fire ting som har ændret mit syn på tekst fremsøgning og editering. Alene disse vil holde dine pølsefingre på keyboardet, og kede din mus ihjel. DEJLIGT!!

Thats all folks!