Ergonomi vid datorn

Lite tankar och ideer om ergonomi vid datorn. Se också min ergonomiska anpassning av Emacs: Modal Mode.

Jag använder ett ergonomiskt utformat tangentbord och försöker undvika ackord på tangentbordet eftersom det lätt leder till konstiga fingersträckningar och handledsvridningar. Ovanpå det sitter ett litet numeriskt tangentbord, fäst med kardborretejp av samma typ som används för effektpedaler. Till vänster finns styrkulan, som endast används som pekdon och klickandet sköts istället med det numeriska tangentbordet.

Knapp(ar)Funktion(er)
Enter, + och -Musknapp 1, 2 och 3
0Växla till senaste fönster
.Minimera fönster
/Maximera eller återställ fönster
*Programberoende, stäng fönster eller flik
1, 2 och 3Terminalemulator, Emacs och Firefox
7, 8 och 9Outlook, Teams och Telavox
4, 5 och 6Tillfälligt bokmärkta fönster
HusetProgrammerar in ett bokmärke
BrevetProgramberoende, kopiera, om inte annat
MiniräknarenProgramberoende, klistra in, om inte annat

En bild på Logitech Trackman Marble (pekdon), Kinesis Advantage2 (för vanlig inmatning) och Trust Xalas (för kortkommandon).

Sawfish (fönsterhanterare)

Jag brukar använda Sawfish för fönsterhanteringen i X. För att utöka Sawfish används en scheme-liknande lisp som författarna valt att kalla REP. Manualen är bra skriven och en Emacs-användare känner sig snart bekväm. Här nedanför klistrar jag in ett exempel på hur keypadens 2:a (pil ner) binds till att aktivera eventuella Emacs-fönster, och om fler än ett Emacs-fönster finns, rotera fokus bland dessa.

(defun floatp-kp-cycle-windows (predicate)
  (let ((windows (remove-if-not predicate
                                (remove-if-not window-in-cycle-p
                                               (workspace-windows current-workspace t)))))
    (display-window (or (nth 1 (memq (input-focus) windows))
                        (car windows)))))

(defun floatp-kp-make-window-cycler-by-class (class)
  (lambda ()
    (interactive)
    (floatp-kp-cycle-windows (lambda (window) (equal (window-class window) class)))))

(bind-keys global-keymap "KP_Down" (floatp-kp-make-window-cycler-by-class "Emacs"))

Microsoft Windows

Jag upplever tyvärr Windows som rörigt att rätta efter särskilda behov. Anpassningar behöver göras med tredjepartsprogram och det känns både påklistrat och otillförlitligt. Utbudet av dessa tredjepartsprogram är försvinnande litet. Jag har tvingats landa i att använda AutoHotkey. Detta fullkomligt gräsliga programspråk har mot alla odds en stor användarbas och förhoppningsvis innebär det i alla fall att mina script inte plötsligt kommer sluta fungera. Känsliga läsare varnas för programlistningen nedan.

Jag har provat ut ett script för det numeriska tangentbordet. Musknapp 1, 2 och 3 klickas här istället för på styrkulans knappar. De flesta knapparna används dock för fönsterhantering. Ett par stycken är fast programmerade för vissa program och några andra används som tillfälliga "bokmärken". Minimera, maximera, återställ och växla till senaste fönster har också sina egna knappar.


#SingleInstance Force ; Skips the dialog box and replaces the old instance automatically.
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
#Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.

bookmarks := {}

return ; End of autoexecute section.

InsertBookmark() {
        global bookmarks
        WinGet, curr, PID, A

        ih := InputHook("L1")
        ih.Start()
        ih.Wait()

        bookmarks[ih.Input] := curr
}

RecallBookmark(k) {
        global bookmarks
        WinGet, curr, PID, A

        bookmark := bookmarks[k]
        if (0 < StrLen(bookmark) and WinExist("ahk_pid" bookmark)) {
                if (curr = bookmark) {
                        WinActivateBottom, ahk_pid %bookmark%
                } else {
                        WinActivate, ahk_pid %bookmark%
                }
        }
}

; Detta för att scrolla med extraknapparna på trackman marble ...
~XButton1::
MouseClick WheelUp
return
~XButton2::
MouseClick WheelDown
return

Browser_Home::InsertBookmark()
Numpad4::RecallBookmark(4)
Numpad5::RecallBookmark(5)
Numpad6::RecallBookmark(6)

; Musknapp 1
NumpadEnter::
Send {LButton Down}
KeyWait NumpadEnter
return
NumpadEnter Up::
Send {LButton Up}
return

; Musknapp 2
NumpadAdd::
Send {RButton Down}
KeyWait NumpadAdd
return
NumpadAdd Up::
Send {RButton Up}
return

; Musknapp 3
NumpadSub::
Send {MButton Down}
KeyWait NumpadSub
return
NumpadSub Up::
Send {MButton Up}
return

Numpad1::
if WinActive("ahk_class mintty") {
        WinActivateBottom, ahk_class ConsoleWindowClass
} else {
        WinActivate, ahk_class mintty
}
return

Numpad2::
WinActivate, ahk_class Emacs
return

Numpad3::
if WinActive("ahk_class MozillaWindowClass") {
        WinActivateBottom, ahk_class MozillaWindowClass
} else {
        WinActivate, ahk_class MozillaWindowClass
}
return

Numpad7::
if WinActive("ahk_class rctrl_renwnd32") {
        WinActivateBottom, ahk_class rctrl_renwnd32
} else {
        WinActivate, ahk_class rctrl_renwnd32
}
return

; Firefox: byt mellan flikarna framåt och bakåt.  Detta kräver att
; inställningen "Ctrl+Tab cycles through tabs in recently used order"
; inaktiveras.

Launch_Mail::
if WinActive("ahk_exe knime.exe") {
        Send, {LButton}
        Sleep, 500
        Send, {F6}
} else if WinActive("ahk_class MozillaWindowClass") {
        Send, {Ctrl Down}{Shift Down}{Tab}{Shift Up}{Ctrl Up}
} else {
        Send, {Ctrl Down}{Insert}{Ctrl Up}
}
return

Launch_App2:: ; Calculator button
if WinActive("ahk_exe knime.exe") {
        Send, {LButton}
        Sleep, 500
        Send, {Shift Down}{F6}{Shift Up}
} else if WinActive("ahk_class MozillaWindowClass") {
        Send, {Ctrl Down}{Tab}{Ctrl Up}
} else {
        Send, {Shift Down}{Insert}{Shift Up}
}
return

Numpad8::WinActivate, ahk_exe Teams.exe
Numpad9::WinActivate, ahk_exe Flow.exe

NumpadDiv::
WinGet, state, MinMax, A
if (state) {
        WinRestore, A
} else {
        WinMaximize, A
}
return

NumpadMult::
if WinActive("ahk_class MozillaWindowClass") {
        Send, {Ctrl Down}{w}{Ctrl Up}
} else {
        WinClose, A
}
return

Numpad0::
Send, {Alt Down}{Tab}{Alt Up}
return

NumpadDot::WinMinimize, A