---
title: 'Förkortningar överallt - AutoHotkey'
date: 2025-03-27T17:54:43+01:00
draft: false
---

![Animation](/images/autohotkey.gif)

Jag har under åren testat lite olika program för att kunna skriva med förkortningar överallt. Jag tröttnade ganska snabbt på gränsnittet för att skapa och hantera listor i [PhraseExpress](https://www.phraseexpress.com/). Och även om textfilsformatet i [Espanso](https://espanso.org) till en början kändes jättesmidigt, så känns det som att programmets default-funktionalitet står ivägen när jag försöker texta något.

Det jag vill ha av ett sånt här verktyg är dessa funktioner:
- Enkelt textformat för att skapa och hantera förkortningar och listor
- Tab skippar förkortningar
- Alla vanliga skiljetecken slår ut förkortningar
- Förkortningar ska fungera med små bokstäver och med stor initialbokstav
    - vkm -> välkommen
    - Vkm -> Välkommen
- Verktyget ska göra textutbytet snabbt
    - Samtliga av dessa lösningar infogar simulerade knapptryckningar för att först ta bort ordet med backspace och skriver sen ut hela det nya ordet.

Enligt lite övertalning kollade jag upp [AutoHotkey](https://www.autohotkey.com/) (AHK), ett program jag är väl bekant med sen innan, för att det går att använda för att automatisera typ vad som helst. {{<marginnote>}}När det gäller import/export av förkortnings-listor i PhraseExpress så finns ingen funktion i själva programmet.<br />Istället tipsar forumen om att använda ett AutoHotkey-skript för att automtaisera det...{{</marginnote>}} Jag vet t.ex. att folk gjorde fusk till datorspel med hjälp av AHK när jag var tonåring, för att göra omänskligt snabba och/eller noggranna manövrar med en knapptryckning.
Jag hade dock missat hur otroligt lätt det är att konfigurera för att skriva med förkortningar på ett sätt jag gillar.

I grunden bygger förkortningsfunktionen på någon som heter "hotstrings". Den kan fånga ett inmatat textmönster och sen utföra en manöver som respons. Hotstrings går att trigga med olika kommandon eller som respons på specifika tangentnedslag. Det ställer jag in med kommandot `#HotString EndChars` nedan.

Jag skapar också kommandon för att byta mellan min svenska- och engelska-lista med <kbd>CTRL+1</kbd> respektive <kbd>CTRL+2</kbd>. En notifikationsruta visar att jag byter lista. Vill jag se vilken lista jag är i kan jag skriva förkortningen "langgg" så löser den ut till antineng "sv" eller "en".

Då jag vill kunna skippa förkortningar så har jag lagt till den funktionen på <kbd>Tab</kbd>. Den infogar istället ett vanligt mellanslag.

Här kan du [ladda ner en zip](/Abbreviator_0.1.zip) med mina AutoHotkey-filer inklusive förkortningar. Du behöver ladda ner och installera AutoHotkey i sig för att kunna öppna och använda filerna.

Nedan följer en genomgång av hur skriptet fungerar.

---

```
;; inställningar för att sätta upp skriptet korrekt
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
#SingleInstance Force
#WinActivateForce
SetBatchLines -1


;; löser ut förkortningar med alla vettiga skiljetecken
;; inklusive vid ny rad, och det gör den innan blocket skickas iväg
;; om man skriver undertexter
#Hotstring EndChars -()[]{}:;'"/\,.?!`n `  

;; förvalt språk är engelska
Language := "en"


;; byt förkortningslista till svenska med ctrl+1
;; kan vara bråkigt med flera flikar i webbläsaren
;; skapar en notifikationsruta som indikerar bytet
^1:: 
Language = sv 
TrayTip #1, "Byter till svenska"
Sleep 1250
HideTrayTip()
Return

;; byt förkortningslista till engelska med ctrl+2
^2::                                        
Language = en   
TrayTip #2, "Byter till engelska"
Sleep 1250   
HideTrayTip()                               
Return

;; tryck tab för att sänd ett mellanslag utan att lösa ut förkortning
tab::                                       
  SendInput {Space}                         
Return

;; förkortningen "langgg" skriver ut vilken förkortningslista
;; man är i som om det var en vanlig förkortning
::langgg::                                  
  Send % Language                           
  Send {Space}
Return

;; här börjar engelska-listan i formatet ::förk::förkortning
#If Language == "en"                        
::abb::abbreviation
::abbs::abbreviations

;; men vi importerar den från en separat fil i samma mapp
;; då den innehåller över 10 000 förkortningar
;; i den filen jag vill importa räcker det med att jag 
;; skriver enligt ::abb::abbreviation-formatet ovan
#Include Abbreviator_list_eng.ahk                                                       

;; här börjar svenska-listan i formatet ::förk::förkortning
#If Language == "sv"                        
::ahkk::AutoHotkey
::qws::Qwertyist Tangentbordsservice
;;men jag gör samma med svenskalistan och importerar den
#Include Abbreviator_list_sv.ahk            

;; En hjälpfunktion för att stänga notifikationsrutan
HideTrayTip() {                             
  TrayTip
  if SubStr(A_OSVersion,1,3) = "10." {
      Menu Tray, NoIcon
      Sleep 200 
      Menu Tray, Icon
  }
}
```


## Appendix: Espanso

Här följer instruktioner för hur jag fick Espanso att fungera iallafall hyfsat.

Ändra `default.config` så att backspace beter sig som vanligt
```
undo_backspace: false
```

För att lösa ut förkortningar oavsett stor eller liten bokstav så behöver varje ersättningsrad följa det här mönstret. Förkortningen går in mellan `\b` och `(?`. Det är dock sådär kul att ALLA förkortningar behöver se ut såhär. Det gör det väldigt oöverskådligt om inte annat. Sen kan jag tänka mig att en regex-trigger är lite långsammare än en vanlig trigger, men jag nog egentligen testar för lite för att kunna uttrycka mig säkert om det.

```yaml
    - regex: (?i)\bex(?P<w>\W)
        replace: exempel{{w}}
```
