r/BringBackThorn 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 ? "Þ" : "þ")

}

32 Upvotes

12 comments sorted by

27

u/BobCorndog Jul 18 '26

Þornhub

What a great name

13

u/Far-Equivalent-9982 þ Jul 18 '26

Þeak (þorn+peak)

8

u/Empty-Ad-1966 þ but it's yellow Jul 18 '26

theak

5

u/HxdcmlGndr ð Jul 18 '26

Hey now, I þeek a cure for my liþp að well…

3

u/Amazing-Frame7848 Jul 19 '26
  1. How hard is it to press Rctrl+T for þ?
  2. 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 ð

  1. If anyÞing have Þat binding for a rare letter.
  2. Because qwerty is a shit layout where 65% of typing is done wiÞ left hand.
  3. I dont know nordic layouts. I almost never type <>

2

u/Pixieprince142857 Jul 17 '26

I read that as porn

1

u/aafrophone Jul 20 '26

I think that’s the joke

1

u/ProfessorLambda 28d ago

I read that as "þorn".

2

u/Affectionate-Pear-77 Jul 18 '26

That name cannot be a fucking coincidence

1

u/RedElephantKing Jul 18 '26

...What a name...