Hallo Freunde!

Wer genau schaut, wird feststellen, dass ich in r1808 die Grundlage für eine individuelle Ebenen-Funktion gelegt habe. Der Grund war, damit die Möglichkeit zum Experimentieren mit weiteren Ebenen rein über custom.ahk, also ohne Änderungen am Vanilla neovars, zu haben.

Die Tastatur auf meinem Heim-PC hat 108 Tasten, d.h. 105 plus die drei Tasten Power, Sleep und Wake. Auch wenn sie damit relativ komplett ist, fehlen ihr damit immer noch so nützliche Tasten wie die Lautstärkeeinstellung oder Web/Multimedia-Navigationstasten.

Aus der Not habe ich nun eine Tugend gemacht. Erst habe ich mir eine zusätzliche Ebene (die Ebene 9) gebastelt, die aber erst von EbeneAktualisieren() gebildet werden muss. Dafür gibt es die Variable isModXPressed, welche direkt diese Ebene 9 aktiviert. Da die Standard-Funktion nichts von dieser Ebene weiß und ich den Standard-Neo-Code nicht (noch weiter … ;-)) versauen wollte, erfolgte die angesprochene Adaptierung auf einen indirekten Aufruf dieser Funktion, deren zu verwendender Name nunmehr in der Variable %EbeneAktualisieren% steht und standardmäßig auf NEOEbeneAktualisieren() zeigt. In meinem Skript custom.ahk setze ich dieses auf die erweiterte Ebenen-Funktion VMNEOEbeneAktualisieren(), die ebenfalls im Skript definiert ist und die Ebene 9 setzen kann.

Was bleibt ist die Frage, wie diese Ebene 9 nun aktiviert werden soll. Ich habe zwei Varianten ausprobiert: Die bei laufendem Rechner relativ unnötige WAKE-Taste als ModX verwenden, oder die Ebene-1-Bindestrichtaste neben T2 als ModX, da ich für den Bindestrich ausschließlich Mod3+T verwende. Beides funktioniert und ist recht praktikabel, wobei die WAKE-Taste recht weit „vom Schuss“ ist, man also die Hand recht weit weg bewegen muss, dafür ändert sich nichts am Standard-Layout.

Im Ergebnis steht mir nun für die ganze Tastatur eine erweiterte Ebene zur Verfügung, auf die ich Zeichen oder eben die angesprochenen Multimedia-Tastendrücke legen kann. Bislang habe ich nur h-g-f mit Vol-/Vol+/VolMute sowie n/r/t/d mit Prev/Play|Pause/Stop/Next belegt, aber denkbar wäre auch, spezielle Shortcuts für das individuelle technische Fachgebiet unterzubringen oder akzentuierte Buchstaben einer favorisierten Fremdsprache über einen Modifier statt einen toten Präfix zugänglich zu machen.

Ich habe mich schlussendlich für die QWERTZ-ß-Taste, also das Ebene-1-Bindestrich als Modifier entschieden. Meine custom.ahk, die bei mir unter »C:\Dokumente und Einstellungen\Matthias\Anwendungsdaten\NEO2« liegt, habe ich exemplarisch in den Anhang gepackt, für die, die es interessiert.

Mit wenigen geänderten Zeilen in dieser custom.ahk wäre die Ebene 9 auch auf z.B. T3 gelegt, wobei man den Apostroph ersatzweise auf Ebene 2 von T2 zugänglich machen könnte.

– Mœsi
; NEO-VM
; (c) 2009 Matthias Wächter

CharProc___VMt() {
  global
  ; Custom Layout togglen
  isVM := !(isVM)
  if (isVM) {
    CharProc___VM1()
    if (zeigeModusBox)
      TrayTip,NEO-VM-Belegungsvariante,Die Belegungsvariante wurde aktiviert. 
Zum Deaktivieren`, Mod3+F12 drücken.,10,1
  } else {
    CharProc___VM0()
    if (zeigeModusBox)
      TrayTip,NEO-VM-Belegungsvariante,Die Belegungsvariante wurde 
deaktiviert.,10,1
  }
}

CharProc___VM1() {
  global
  ; VM-Tastaturbelegungsvariante aktivieren
  EDS("010",1,"U000079","U000059","U002026","U0022EE","U0003C5","U002207") ; y
  EDS("011",1,"U00006F","U00004F","U00005F","U000008","U0003BF","U002208") ; o
  EDS("012",1,"U000061","U000041","U00005B","S____Up","U0003B1","U002200") ; a
  EDS("013",1,"U000070","U000050","U00005D","S___Del","U0003C0","U0003A0") ; p
  EDS("01E",1,"U000069","U000049","U00005C","S__Home","U0003B9","U00222B") ; i
  EDS("01F",1,"U000075","U000055","U00002F","S__Left","P___Uni","U0000B5") ; u
  EDS("020",1,"U000065","U000045","U00007B","S__Down","U0003B5","U002203") ; e
  EDS("021",1,"U000063","U000043","U00007D","S__Rght","U0003C7","U002102") ; c
  EDS("022",1,"U00006C","U00004C","U00002A","S___End","U0003BB","U00039B") ; l
  EDS("028",1,"U000078","U000058","U000040","U00002E","U0003BE","U00039E") ; x
  EDS("02F",1,"U000076","U000056","U00007E","U00000D",""       ,"U00222E") ; v
  EDS("00C",0,"P___MXD","U002014",""       ,"S__NSub","U002011","U0000AD") ; -
  ED9("016",  "S_VolDn")
  ED9("017",  "S_VolUp")
  ED9("018",  "S_VolMt")
  ED9("024",  "S_MPrev")
  ED9("025",  "S_MPlay")
  ED9("026",  "S_MStop")
  ED9("027",  "S_MNext")
}

CharProc___VM0() {
  global
  ; VM-Tastaturbelegungsvariante deaktivieren
  EDS("010",1,"U000078","U000058","U002026","U0022EE","U0003BE","U00039E") ; x
  EDS("011",1,"U000076","U000056","U00005F","U000008",""       ,"U00222E") ; v
  EDS("012",1,"U00006C","U00004C","U00005B","S____Up","U0003BB","U00039B") ; l
  EDS("013",1,"U000063","U000043","U00005D","S___Del","U0003C7","U002102") ; c
  EDS("01E",1,"U000075","U000055","U00005C","S__Home","P___Uni","U0000B5") ; u
  EDS("01F",1,"U000069","U000049","U00002F","S__Left","U0003B9","U00222B") ; i
  EDS("020",1,"U000061","U000041","U00007B","S__Down","U0003B1","U002200") ; a
  EDS("021",1,"U000065","U000045","U00007D","S__Rght","U0003B5","U002203") ; e
  EDS("022",1,"U00006F","U00004F","U00002A","S___End","U0003BF","U002208") ; o
  EDS("028",1,"U000079","U000059","U000040","U00002E","U0003C5","U002207") ; y
  EDS("02F",1,"U000070","U000050","U00007E","U00000D","U0003C0","U0003A0") ; p
  EDS("00C",0,"U00002D","U002014",""       ,"S__NSub","U002011","U0000AD") ; -
}

CharProc___MXD() {
  global
  if (!isModXPressed) {
    isModXPressed := 1
    wasNonShiftKeyPressed := 0
    %EbeneAktualisieren%()
    PR%PhysKey% := "P___MXU"
  }
}

CharProc___MXU() {
  global
  isModXPressed := 0
  %EbeneAktualisieren%()
}

NEOVMEbeneAktualisieren() {
  global
  Modstate := IsMod4Active() . IsMod3Active()
  Ebene7 := 0
  Ebene8 := 0
  if        (isModXPressed) {    ; Ebene X
    EbeneC := 9
    Ebene  := 9
  } else if (Modstate == "00") { ; Ebene 1 oder 2
    if (IsShiftActive())         ; Ebene 2: Shift oder CapsLock
      EbeneC := 2
    else                         ; Ebene 1: Ohne Mod oder CapsLock mit Shift
      EbeneC := 1
    if (IsShiftPressed)          ; NC: Ebene 2: Shift (ignoriert CapsLock)
      EbeneNC := 2
    else                         ; NC: Ebene 1: Ohne Mod (ignoriert CapsLock)
      EbeneNC := 1
  } else if (Modstate == "01") { ; Ebene 3 oder 5 (ignoriert CapsLock)
    if (IsShiftPressed)          ; Ebene 5: Shift+Mod3
      EbeneC := 5
    else                         ; Ebene 3: Mod3
      EbeneC := 3
    EbeneNC := EbeneC            ; NC: gleich
  } else if (Modstate == "10") { ; Ebene 4 (Mit Shift: Auch Ebene 7) (ignoriert 
CapsLock)
    EbeneC := 4
    if (IsShiftPressed)          ; Ebene 7: Shift+Mod4
      Ebene7 := 1
    EbeneNC := EbeneC            ; NC: gleich
  } else if (ModState == "11") { ; Ebene 6 (Mit Shift Xoder CapsLock: Auch 
Ebene 8)
    EbeneC := 6
    if (IsShiftPressed)          ; Ebene 8: Shift (ignoriert CapsLock)
      Ebene8 := 1
    EbeneNC := EbeneC            ; NC: gleich
  }
  if (guiErstellt) {
    if (striktesMod2Lock)
      BSTSwitch(EbeneC)
    else if ((EbeneNC < 3) and (EbeneNC != EbeneC))
      BSTSwitch(EbeneNC . "C")
    else
      BSTSwitch(EbeneNC)
  }
}

ED9(scpos,e9) {
  global
  pos := vksc%scpos%
  if (pos != "")
    SetKeyPos("CP9" . pos, e9)
}

ActivateNEOVM() {
  global

  EbeneAktualisieren := "NEOVMEbeneAktualisieren"

  CSS_VolDn := "Volume_Down"
  CSS_VolUp := "Volume_Up"
  CSS_VolMt := "Volume_Mute"
  CSS_MPrev := "Media_Prev"
  CSS_MPlay := "Media_Play_Pause"
  CSS_MStop := "Media_Stop"
  CSS_MNext := "Media_Next"

  CP3F12 := "P___VMt"                   ; M3+F12: Aktiviere/Deaktiviere NEO-VM

  IniRead,isVM,%ini%,Global,isVM,0
  if (isVM)
    CharProc___VM1()

}

ActivateNEOVM()

Antwort per Email an