Leider muss an dieser Stelle mitgeteilt werden, dass Wolfgang Reszel seine Arbeit an ac'tivAid beendet hat. Eine Entwicklerversion von ac'tivAid gibt es auf meiner Webseite. Gruß, Michael
Der Bugtracker wurde aus Sicherheitsgründen abgeschaltet, diese Website dient nur noch als statisches Archiv. |
||
Willkommen beim Bugtracker zu ac'tivAid. Ac'tivAid ist ein AutoHotkey-Skript, welches zuletzt in c't 12/08 ausführlich vorgestellt wurde. Wenn Sie in der stabilen Version einen Fehler finden, testen Sie bitte erst die aktuelle Beta-Version, bevor Sie den Fehler melden! Um evtl. schon hier behandelte und geschlossenen Themen mit der Suche zu finden, muss in der erweiterten Suche bei Status "Alle offenen Aufgaben" auf "Alle Status" umgestellt werden. |
Letzte stabile Version bei Heise.de: 1.3.1 Letzte beta Version 1.3.2 beta1 : activaid_beta.exe | portable_activaid_beta.exe Entwicklerversion von Michael Änderungen, Liesmich/Hilfe, FAQ und Themen-Special (bei www.heise.de) Digital Upgrade haben ein Video zu ac'tivAid 1.1.8.1 gedreht, wo ein paar Funktionen kurz angesprochen werden. |
FS#284 - Emacs Style Keybindings
|
BeschreibungHallo, Glückwunsch zum Release der neuen Version von ac’tivAid, da hat sich ja wieder viel getan. Ich hätte hier mal einen Wunsch / eine Idee, bei der ich nicht weiß ob und wie leicht diese in ac’tiveAid einzufügen ist. Möglicherweise geht das ja auch über UserHotkeys? Ich arbeite sowohl unter Windows, als auch unter Unix und dort viel auf der Kommandozeile (mit tcsh, bei bash ists aber ähnlich) und Emacs. Die Emacs Style Keybindings gehen einem dann irgendwie leicht über die Finger, und unter Windows ertappt man sich dann immer wieder dabei, z.B. mit Ctrl-A alles zu markieren anstatt an den Zeilenanfang zu springen. Gibt es denn eine einfache Möglichkeit die Emacs Style Keybindings in ac’tiveaid zu integrieren, am besten nur für bestimmte WindowsClasses. Ich denke da vorrangig an Cursor-Motion/Edit shortcuts (C^a: Zeilenanfang, C^e: Zeilenende, C^b: Cursor zurück, Alt^b: Wort zurück, Alt^Backspace: letztes Wort löschen, C^k: bis zum Zeilenende löschen, und so weiter und so fort...). Man könnte natürlich später auch daran denken, andere der Shortcuts mit einzufügen (C^x C^f: open file, ...). Momentan verwende ich dafür das Programm XKeymacs <http://www.cam.hi-ho.ne.jp/oishi/indexen.html>, und das funktioniert auch halbwegs gut. Aber irgendwie bekomme ich das nicht dazu meine deutsche Tastatur zu erkennen, und dann werden Shortcuts mit Sonderzeichen etwas schwierig... Und alle diese Sachen unter der ac’tiveAid Haube zu haben, wäre natürlich auch etwas eleganter. Viele Grüße Michael |
Ich denke für so einen speziellen Fall wäre es am besten eine eigene Erweiterung zu machen. Sind Emacs-Keys denn immer gleich? Dann könnte man diese einfach fest vergeben und in der Konfiguration nur noch bestimmen, wo diese alle gelten sollen.
Okay, dann habe ich eine solche Funktion also zumindest nicht einfach im bestehenden ac’tivAid übersehen
Die Emacs Keys sind eigentlich immer die gleichen, und gelten unabhängig von irgendeinem Modus. Also werden sie nicht wie bei ‘vi’ aktiviert durch Esc oder ähnliches. Es gibt noch die doppelten Keystrokes, aber das sollte wahrscheinlich kein größeres Problem sein (z.B. Ctrl-x h: alles markieren). Und sonst kann man auch ohne diese leben.
Dann werde ich mich wenn ich Zeit habe mal durch die Dokumentation zur Erstellung von Erweiterungen wühlen.
Prinzipiell geht das auch mit UserHotkeys, doch da kann man es nur auf Programme einschränken und wenn man dann ein Programm hinzufügen will, muss man das für alle Kürzel machen.
Also für die Zwischenzeit könnten man also z.B. Strg+k mit <Send>+{End}{Delete} belegen,
Ah ja, so geht’s mit UserHotkeys, gut. Aber die Konfiguration jedes einzelnen Programms für jeden einzelnen Shortcut wird zusammengenommen wohl etwas ermüdend. Eine eigene kleine Erweiterung ist dann wohl schon die bessere Lösung.
Und sehe ich es richtig, dass ich auf diese Weise nur Sachen umsetzen kann, für die es auch in Windows Shortcuts gibt? Wie würde ich dann zum Beispiel die Emacs ‘Ctrl-Space’ Funktion umsetzen, die eine Markierung an der momentanen Position setzt, um dann alles zwischen dieser und der danach aktuellen Cursorposition zu markieren - also praktisch wie unter Windows bis zum nächsten ‘nicht-cursor-bewegungs-tastendruck’ ständig Space gedrückt zu halten?
Klar, es geht nur was man mit Windows hinbekommt. Ich verstehe Ihre beschreibung leider nicht, meinen Sie sowas?
<send>{Ctrl Down}{Right}{Left}{Shift Down}{Right}{Ctrl Up}{Left}{Shift Up}
Nicht ganz, sorry für die konfuse Beschreibung...
Was ich meinte war: in einem Text an der momentanen Cursor-Position eine (virtuelle) Markierung setzen sich dann irgendwie (interaktiv mit dem Keyboard) im Text bewegen (also zum Beispiel mit den Pfeiltasten zwei Zeilen Hoch und drei Zeichen nach rechts) jetzt soll alles was sich zwischen der ursprünglichen Markierung und der neuen Cursorposition befindet markiert sein. Dann kann ich irgendeine weitere Aktion mit dieser Markierung machen (also zum Beispiel mit Ctrl-W (in Emacs) ausschneiden) Das Ausführen dieser letzten Aktion macht gleichzeitig die Markierung ungültig - ansonsten drückt man (in Emacs) Ctrl-G um die Markierung aufzuheben.
In Windows müsste also praktisch an der Stelle der ursprünglichen Markierung {Shift Down} gesendet werden, man sollte sich dann im Text interaktiv bewegen können (wie mit gedrückten Shift, nur dass das jetz AutoHotkey macht und nicht der User selbst). Beim Drücken einer alphanumerischen Taste (oder auch Sonderzeichen oder ‘Del’, ‘Backspace, ‘Space’, oder dem Äquivalent für Ausschneiden (Strg-X in Windows, Ctrl-w in Emacs), oder Kopieren...) muss dann nach Ausführen der Reaktion auf die Taste die virtuelle Markierung gelöscht werden (also {Shift Up} gesendet werden).
Geht das wirklich in UserHotkeys? Vor allem für das letzte {Shift Up} weiß ich nicht, wie.
Markierung aufheben: {Right}{Left} Das andere müssen Sie mal ausprobieren. Windows hat da aber auch seine eigene Belegung. Startpunkt markieren und mit Shift auf den Zielpunkt klicken, oder beim Startpunkt Shift gedruckt halten und bis zum Zielpunkt wandern.
OK, aber welche Möglichkeit gibt es mit UserHotkeys einen Befehl abzusetzen (also {Shift Down}), dann abzuwarten was der User macht, und nur beim Erkennen von bestimmten vom User betätigten Tasten eine weitere Aktion auszuführen (also hier {Shift Up}{Right}{Left})?
Das ist mit UserHotkeys nicht möglich und man braucht eine eigene Erweiterung. Wenn Sie mir eine Liste aller Kürzel mit genauer Beschreibung derer Umsetzung schicken und dann noch sagen, wo die Kürzel gelten sollen wäre das wahrscheinlich schnell in eine neue Erweiterung umgesetzt. Das geht allerdings nur auf die Schnelle, wenn ich alles vorgekaut bekommen, Sie mir also die Kürzel in der Form {Taste1 Down}{Taste2}{Taste Up} schicken. Ansonsten würde das einiges Dauern. Ob alles umsetztbar ist kann ich auch nicht versprechen, hängt auch von den Programmen ab. Denn die meisten Kürzel die sie genannt haben (z.B. Strg+W) sind in allen Programmen schon anders belegt, was ich für problematisch halte.
Oh, so viel Service hätte ich gar nicht erwartet
Und dieser Post ist jetzt etwas länger geworden als geplant, sorry...
Das mit der Vorbelegung der meisten Tastaturkürzel ist natürlich ein größeres Problem, und tritt mit fast allen Kürzeln auf - zumindest wenn man die Emacs-Shortcuts systemweit haben will. Aber wenn ac’tivAid die Kürzel vor den Programmen abfängt, kann ja jeder User selbst bestimmen welche er somit überschrieben habe will und welche nicht. Ich könnte mir z.B. vorstellen dass die Hemmschwelle vieler User hoch ist, u.a. wenn es darum geht die Windows Standards Strl-c, Ctrl-x oder Ctrl-v, aber auch Ctrl-a anders zu belegen.
Sie könnten ja versuchen, eine etwas universellere Erweiterung zur Markierung und Bewegung in Text zu erstellen, in der dann jeder User seine eigenen bevorzugten Kürzel bestimmen kann. Die Kürzel für Emacs kann ich Ihnen gerne erstellen.
Klasse wäre, wenn man die ganze Erweiterung generell für gewisse Programme abschalten könnte, und aber zusätzlich dazu noch die einzelnen Shortcuts für andere Programme abschalten könnte. Also im konkreten Beispiel: Ctrl-t ist in emacs ‘transpose characters’ (also: aus “Bi|espiel” mach “Bei|spiel”, wobei das Pipezeichen hier den Cursor andeuten soll). Generell hätte ich dieses Kürzel gerne standardmäßig an, aber in Firefox bin ich gewohnt Ctrl-t für einen neuen Tab drücken. Demnach sollte es möglich sein Ctrl-t nur für Firefox zu deaktivieren.
Man könnte natürlich auch darüber nachdenke, diese potentielle Erweiterung (und einzelne Shortcuts davon) nur für bestimmte Programme freizugeben, also praktisch der umgekehrte Weg. Mir persönlich wäre der erstere lieber, aber das mag Ansichtssache sein...
Hier wären mal ein paar Shortcuts für Emacs für den Anfang - allerdings nur für die Bewegung und kleine Edits im Text. Die ganzen anderen Emacs Funktionen (File öffnen, speichern, usw.) sollten wir hier wahrscheinlich außen vor lassen, sonst wird’s kompliziert. In Emacs gibt es außerdem viele Shortcuts die auf zwei aufeinander folgende Tastenfolgen reagieren (Z.B. Ctrl-x h: mark whole buffer, also äquivalent zur Ctrl-a Standardbelegung in Windows. Diese lasse ich jetzt auch mal außen vor, da Ctrl-X zu sehr mit Ausschneiden unter Windows kollidiert. Da müsste man sich noch was einfallen lassen. Für den Moment kann man ja immer noch ‘Num’ drücken um ac’tivAid kurzfristig auszuschalten und dann die originale Windows Einstellung zu nehmen falls man sich diese überschrieben hat. Ist aber natürlich nur eine suboptimale Übergangslösung...
Bewegung: Ctrl-b: <send>{Left} Ctrl-f: <send>{Right} Alt-b: <send>^{Left} Alt-f: <send>^{Right} Ctrl-p: <send>{UP} Ctrl-n: <send>{DOWN} Ctrl-a: <send>{HOME} Ctrl-e: <send>{END} Alt-<: <send>^{HOME} Alt→: <send>^{END} Alt-v: <send>{PGUP} Ctrl-v: <send>{PGDN}
Löschen und Ausschneiden: (’killen’ in Emacs bedeutet immer: hier löschen, aber kopiere das gelöschte in den obersten Eintrag des Killrings. Der Killring ist sowas wie MultiClipboard, mit Alt-y kann man nach einem ‘Yank’ (=Einfügen, Ctrl-y) durch die Einträge im Killring durchwechseln und das gerade Eingefügte mit früheren Eintragen im Killring überschreiben. Wäre wahrscheinlich auch nicht so sehr einfach umzusetzen, oder doch? Ich habe hier jetzt für killen einfach mal den Windows Standard Ctrl-c bzw. Ctrl-x genommen, und einfügen Ctrl-v.)
Ctrl-d: <send>{DEL} Ctrl-w: <send>^x Alt-w: <send>^c Ctrl-k: <send>+{END}^c{DEL} Ctrl-y: <send>^v Ctrl-t: <send>+{Right}^x{Left}^v{Right} Alt-t: <send>{CtrlDown}{Left}{Right}+{Right}x{Left}v{Right}{CtrlUp} Alt-DEL: <send>{CtrlDown}+{Left}x{CtrlUp} Alt-d: <send>{CtrlDown}+{Right}x{CtrlUp}{SPACE}{left} # forward-delete-word: Hier gibt es das Problem, dass ich nicht an den Ende des Wortes springen kann, nur den Anfang des nächsten. Deshalb der Space, was aber nicht ideal ist.
Sonstiges: Ctrl-m: {ENTER} Ctrl-Space: besagtes Markierungs-Kommando von oben im Thread
Danke für die Auflistung. Alles wird auf den ersten Blick nicht möglich sein. Sind die Kürzel in Emacs unter Windows eigentlich gleich belegt? Warum arbeiten Sie eigentlich nicht nur mit Emacs? Ich sehe nämlich noch weitere Probleme, dass nicht jedes Programm die Standardkürzel anders interpretiert. Machmal geht Strg+Rechts an den Anfang eines Wortes und manchmal auch zum nächsten nichtalphanumerischen Zeichen in einem Wort (Klammern etc.). Somit wäre das Verhalten so einer Erweiterung kaum vorhersehbar.
Emacs in Windows hat standardmäßig die gleiche Belegung, ja.
Aber es geht mir in erster Linie gar nicht nur um Emacs oder irgendeinen anderen Texteditor. Dort (oder egentlich von der Unix-Shell) kommen nur die Shortcuts her die ich ohne nachzudenken ständig nutze, vor allem diejenigen zum Bewegen des Cursors in irgendeinem Textfeld, ohne ständig nach rechts auf den Edit Block der Tastatur zu wechseln (der zudem bei Notebooks auch noch völlig unstandardisiert irgendwie auf die rechte Seite gequetscht ist)....
Das kann dann auch der Text in einem Browserfeld sein wie hier im Bugtracker das Kommentarfeld, oder oben die Adressleiste im Browser, oder Dialoge zur Benennung von Dateien, oder Emailprogramme, usw.
Man kann zwar emacs als eierlegende Wollmilchsau fast schon so einstellen, dass er einem auch noch den Kaffee neben die Tastatur stellt (zumindest in Liunx, wenn man das unbedingt so möchte - in Windows hab ich das nicht probiert), aber man wird trotzdem nicht umhin kommen hin und wieder mal ausserhalb von emacs zu tippen. Und dann wäre es eben schön, wenn man nicht plötzlich total umdenken müsste. Ich muss aber zugeben, dass dies auch unter Linux nicht reibungslos mit allen Programmen funktioniert... – Das Problem mit der Verwendung von Strg+Pfeiltasten und ähnlichem ist mir bewusst, man macht sich natürlich dadurch abhängig von den gesetzten Shortcuts im jeweiligen Host-Programm. Ich hatte anfangs gehofft, ac’tiveAid könne das irgendwie unabhängiger lösen oder hätte solche Befehle zur Bewegung in Text schon implementiert? Wie gesagt, das Programm XKeymacs (geschrieben in C++, Link siehe oben) schafft das glaube ich mit eigenen Routinen. Leider ist dieses Programm etwas unhandlich und vor allem sehr auf das Standard US Keyboard Layout ausgerichtet, so dass es mit deutschem Keyboard nur begrenzt nützlich ist.
Ich sehe das nicht sauber umzusetzen. Ein Alternative wäre ein EMacs-Modus, der entweder EMacs mit dem Inhalt eines Textfeldes aufruft und nachgetaner Arbeit wieder zurückkopiert, eine spezielle Eingabebox mit Emacs-Verhalten welche dann auch schneller geladen wird oder ein temporärer EMacs-Modus, der alles Eingaben selbst verwaltet also genau aufzeichnet was der Benutzer macht und entsprechend Zeichen und Bewegungen sendet. Erst durch so eine Aufzeichnung weiß AutoHotkey genau wo der Cursor steht. Ein Mausklick wurde dann diesen Modus verlassen, da ac’tivAid dann sonst nicht mehr weiß wo der Cursor nun steht. Letzters ist aber aufwändiger. Ein Erweiterung, Texteingaben in seinem Lieblingseditor zu machen ist aber angedacht.
Ein Modus der einen beliebigen Editor mit dem gerade aktiven Text aufruft und nach getaner Arbeit zurückschickt wäre natürlich sehr ein nettes Feature und hochwillkommen. Am besten natürlich, ohne dabei den Editor immer wieder neu öfffnen und hinterher wieder schließen zu müssen, sondern ihn aus dem Hintergrund zu holen und ihn dort auch wieder hinschicken.
Das geht aber natürlich in eine etwas andere Richtung als ich mir das dachte... Aber das ist schon ok, man kann ja nicht alles haben
Danke für die Mühen.