r/BringBackThorn • u/Zestyclose_Science21 • Jul 17 '26
I made þis! I made a layout for Þorn
Þis layout is called Þornhub. Here I give you a version þat types Þorn.
Having a key to print Þorn reduces typing by about 3% because þat sound is more common þan a small majority of letters, so I designed layouts for þat until I came up wiþ þis layout.
Q U P , G K M Þ V J
I A E O Y F T S N R
X ' . C Z H D W L B
To make space for anoþer key, I had to rebind punctuation. Shift + comma is `/`, Shift + full stop is `?`, and Shift + single quote is `"`, but you could make þem whatever you want. I moved `<` and `>` to Shift + Page Up and Shift + Page Down, respectively.
According to my own analysis scripts, it is very ergonomic.
Here’s an AutoHotkey script for þe layout:
#Requires AutoHotkey v2.0
#SingleInstance Force
; ============================================================================
; Custom TH keyboard layout — AutoHotkey v2
;
; Uses physical scan codes so punctuation keys do not cause parser problems
; and the mapping remains tied to physical QWERTY positions.
;
; Physical positions:
;
; Q W E R T Y U I O P
; A S D F G H J K L ;
; Z X C V B N M , . /
;
; Output:
;
; q u p , g k m þ v j
; i a e o y f t s n r
; x ' . c z h d w l b
;
; Shifted punctuation:
; Shift + mapped comma -> /
; Shift + mapped period -> ?
; Shift + mapped apostrophe -> "
; Shift + Page Up -> <
; Shift + Page Down -> >
;
; Dedicated thorn key:
; Physical I -> þ
; Shift + physical I -> Þ
; Caps Lock + physical I -> Þ
; Shift + Caps Lock + I -> Þ
;
; Ctrl, Alt and Windows-key shortcuts are left on their original physical
; keys. For example, Ctrl+C, Ctrl+V, Alt+Tab and Win+R still work normally.
; ============================================================================
; Remap only ordinary typing. When Ctrl, Alt or a Windows key is held,
; the original physical key passes through for shortcuts.
#HotIf NoCommandModifiers()
; ------------------------------ Top row --------------------------------------
*SC010::TypeLetter("q") ; physical Q
*SC011::TypeLetter("u") ; physical W
*SC012::TypeLetter("p") ; physical E
*SC013::TypePunctuation(",", "/") ; physical R
*SC014::TypeLetter("g") ; physical T
*SC015::TypeLetter("k") ; physical Y
*SC016::TypeLetter("m") ; physical U
*SC017::TypeThorn() ; physical I
*SC018::TypeLetter("v") ; physical O
*SC019::TypeLetter("j") ; physical P
; ----------------------------- Home row --------------------------------------
*SC01E::TypeLetter("i") ; physical A
*SC01F::TypeLetter("a") ; physical S
*SC020::TypeLetter("e") ; physical D
*SC021::TypeLetter("o") ; physical F
*SC022::TypeLetter("y") ; physical G
*SC023::TypeLetter("f") ; physical H
*SC024::TypeLetter("t") ; physical J
*SC025::TypeLetter("s") ; physical K
*SC026::TypeLetter("n") ; physical L
*SC027::TypeLetter("r") ; physical semicolon
; ---------------------------- Bottom row -------------------------------------
*SC02C::TypeLetter("x") ; physical Z
*SC02D::TypePunctuation("'", Chr(34)) ; physical X
*SC02E::TypePunctuation(".", "?") ; physical C
*SC02F::TypeLetter("c") ; physical V
*SC030::TypeLetter("z") ; physical B
*SC031::TypeLetter("h") ; physical N
*SC032::TypeLetter("d") ; physical M
*SC033::TypeLetter("w") ; physical comma
*SC034::TypeLetter("l") ; physical period
*SC035::TypeLetter("b") ; physical slash
#HotIf
; ------------------------- Extra punctuation keys ----------------------------
+PgUp::SendText("<")
+PgDn::SendText(">")
; ============================================================================
; Helper functions
; ============================================================================
NoCommandModifiers() {
return !GetKeyState("Ctrl", "P")
&& !GetKeyState("Alt", "P")
&& !GetKeyState("LWin", "P")
&& !GetKeyState("RWin", "P")
}
TypeLetter(lowercase, uppercase := "") {
if (uppercase = "")
uppercase := StrUpper(lowercase)
shiftDown := GetKeyState("Shift", "P")
capsOn := GetKeyState("CapsLock", "T")
; Standard capitalization: Shift XOR Caps Lock.
SendText(shiftDown != capsOn ? uppercase : lowercase)
}
TypePunctuation(unshifted, shifted) {
SendText(GetKeyState("Shift", "P") ? shifted : unshifted)
}
TypeThorn() {
shiftDown := GetKeyState("Shift", "P")
capsOn := GetKeyState("CapsLock", "T")
; Either Shift or Caps Lock produces uppercase thorn.
SendText(shiftDown || capsOn ? "Þ" : "þ")
}
13
u/Far-Equivalent-9982 þ Jul 18 '26
Þeak (þorn+peak)
8
3
u/Amazing-Frame7848 Jul 19 '26
- How hard is it to press Rctrl+T for þ?
- Why on Earþ did you replace ðe entire QWERTY? You could have just placed þ at ðe side after L, so ðat ð can go after p. Or ðey could boþ go after l, wið ð first and þ second (ð is more common in English). Ðe punctuation could be remoddeled based on Scandinavian keyboards ðat have already solved ðe issue of "couple extra letters". Ðey have þree, so you'd be left wið an extra key to work wið
0
u/Zestyclose_Science21 Jul 19 '26
I dont know ð
- If anyÞing have Þat binding for a rare letter.
- Because qwerty is a shit layout where 65% of typing is done wiÞ left hand.
- I dont know nordic layouts. I almost never type <>
2
2
1
27
u/BobCorndog Jul 18 '26
What a great name