Warum beherrscht mein Hotkey nicht das ABC?

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Warum beherrscht mein Hotkey nicht das ABC?

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by wolf_II » 10 Jun 2019, 08:21

Ich meinte nicht den Zwischencode eines Schnipsels sondern den eines Skriptes, also > 100 Zeilen.
Divide and conquer: ansonsten weiß ich auch nichts besseres, sorry.

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by Rohwedder » 10 Jun 2019, 08:01

der Unterschied bestünde eben darin, wenn der Einzeilerhotkey als Label angesprungen oder von der vorhergehenden Zeile während der Ausführung erreicht werden würde der Interpreter keine Veranlassung hätte einen Return auszuführen.
Aber jetzt wirklich Schluß damit !!!

Ich meinte nicht den Zwischencode eines Schnipsels sondern den eines Skriptes, also > 100 Zeilen.
https://ahkde.github.io/docs/Language.htm#not-control-flow
Da Direktiven, Label (einschließlich Hotkeys und Hotstrings) und Deklarationen ohne Zuweisungen bereits verarbeitet werden, während das Skript aus der Datei geladen wird, unterliegen sie nicht der Ablaufsteuerung. Das heißt, dass sie bedingungslos wirksam werden, bevor das Skript überhaupt Ablaufsteuerungsanweisungen ausführt.

Schätze, bei dieser Verarbeitung entsteht der vollständige Zwischencode eines Skriptes, den ich in hinreichend lesbarer Form liebend gern hätte.

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by nnnik » 10 Jun 2019, 07:10

Das Verhalten wird nie 1 zu 1 beschrieben da sich beschriebenes Verhalten nicht ändern sollte.
Den Zwischencode könnte lexikos aber zu jeder Zeit entfernen wenn er lustig ist.

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by just me » 10 Jun 2019, 06:56

Die Aussage. "In diesem Fall wird das return automatisch angewendet"
besagt doch nur, daß der Interpreter in diesem Fall ein Return macht!!
Stimmt, und dabei ist es völlig Wurscht, ob der Interpreter dafür ein Return nach der Zeile in den Code einfügt oder sich sonstwie merkt, dass der aktuelle Codestrang nach dieser Zeile beendet wird. In jedem Fall wird darauf folgender Code nicht mehr (automatisch) ausgeführt. Worin besteht für Dich ein Unterschied?

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by wolf_II » 10 Jun 2019, 05:37

eine Möglichkeit an den vollständigen Zwischencode eines Skriptes heranzukommen?
Versuch mal das:
1. run the script
2. press 1
3. press 2
4. Doppel-klick auf's TrayIcon.

Resultat:
20190610123046.png
20190610123046.png (2.96 KiB) Viewed 621 times
Zeile 3: ein Return added vor dem 1. Hotkey
Zeile 3: ein Return added vor dem 2. Hotkey
Zeile 4: ein Return added vor dem End-of-file

Ich hoffe das hilft.

Zusatz: Ich hab dieses Script von just me benutzt:

Code: Select all

#NoEnv
B := 1
1::B *= 2
2::MsgBox, %B%
Korrektur:
Zeile 3: ein Return added vor dem 1. Hotkey (end of auto-execute)
Zeile 3: ein Return added nach dem 1. Hotkey (Einzeiler)
Zeile 4: ein Return added nach dem 2. Hotkey (Einzeiler)

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by Rohwedder » 10 Jun 2019, 05:26

Die Aussage. "In diesem Fall wird das return automatisch angewendet"
besagt doch nur, daß der Interpreter in diesem Fall ein Return macht!!
Er macht es offensichtlich, indem er einen Zwischencode mit einem Return erzeugt und dann eben diesen Zwischencode abarbeitet.
Wenn er aber, wie Ich vermutete (Präteritum!) , die 1-Zeiligkeit erkennt und deswegen ein Return ausführt, also ohne Zwischencode arbeitet, deckt sich dieses Verhalten ebenfalls mit obiger Aussage im Handbuch, oder etwa nicht?!!

Aber jetzt Schluß damit und nochmals
Gibt es eigentlich eine Möglichkeit an den vollständigen Zwischencode eines Skriptes heranzukommen?

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by just me » 10 Jun 2019, 04:39

Im Handbuch steht ja leider nichts, zumindestens nicht für mich, hinreichendes darüber.
Hotkeys ->
Das return in der letzten Zeile beendet den Hotkey. Wenn ein Hotkey allerdings nur eine einzige Zeile ausführen muss, kann diese Zeile rechts neben dem Doppelpunkt-Paar geschrieben werden. In diesem Fall wird das return automatisch angewendet:

Code: Select all

#n::Run Notepad
Das lässt für mich wenig Raum für Zweifel.


Ich vermutete, der Interpreter erkennt irgendwie die 1-Zeiligkeit und macht deswegen ein Return.
Der Interpreter erkennt die "1-Zeiligkeit" daran, dass nach der Hotkey/Hotstring-Definition in derselben Zeile noch etwas folgt, das kein Kommentar ist. Es muss nicht einmal eine "sichtbare" Aktion sein:

Code: Select all

#NoEnv
B := 1
1::B *= 2
2::MsgBox, %B%

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by Rohwedder » 09 Jun 2019, 10:35

Hallo,
warum dieser Beitrag?
ich wußte einfach nichts vom Return im Zwischencode eines 1-zeiligen Hotkeys.
Im Handbuch steht ja leider nichts, zumindestens nicht für mich, hinreichendes darüber.
Ich vermutete, der Interpreter erkennt irgendwie die 1-Zeiligkeit und macht deswegen ein Return.
Gibt es eigentlich eine Möglichkeit an den vollständigen Zwischencode eines Skriptes heranzukommen?
Ich sehe immer nur die Brosamen die ListLines gnädigerweise fallen läßt.

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by just me » 09 Jun 2019, 05:02

Moin,

wenn Du die aktuelle AHK 1.1 Syntax klug und strikt findest, warum hast Du dann diesen Beitrag überhaupt eingestellt?

Bis auf die Tatsache, dass man sich die Eingabe von 4 Zeichen spart, kann ich keinen Grund dafür erkennen, dass man

Code: Select all

If Var = Text
anstelle von

Code: Select all

If (Var = "Text")
verwendet.
Die zweite Version sagt in aller Klarheit, dass der Inhalt einer Variablen mit einem Text verglichen wird. Außerdem erlaubt sie den OTB Stil, um einen Codeblock zu öffnen:

Code: Select all

If (Var = "Text") {
   ...
}
Ich finde es auch gut, Codeblöcke durch Einrückungen hervorzuheben. Das funktioniert mit einem "Mehrzeilenlabel" bestens:

Code: Select all

Label1:
   MsgBox, %A_ThisLabel%
Return
Gerade die 'weichen' Syntaxregeln machen es für die meisten Editoren schwer, AHK 'vernünftig' darzustellen. Letztens hat mir mal wieder jemand gesagt, dass er Blockklammern in Labelroutinen verwendet, damit sein Editor die Blöcke einfalten kann:

Code: Select all

Label1:
{
   MsgBox, %A_ThisLabel%
   ...
   ...
Return
}
Solchene für AHK sinnlose Geschichten sollten Syntaxfehler auswerfen.

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by Rohwedder » 09 Jun 2019, 04:16

Was erlauben nnnik?
Ich immer nur sehen ein If.
Ist blau und nicht schwach wie eine Flasche leer!
Ich bin müde jetzt Vater diese Ifs, eh, verteidige dieses If!
Ich habe fertig!

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by nnnik » 09 Jun 2019, 03:27

Das sind mehrere verschiedene ifs nicht 1.
Es gibt sehr viele Situationen da schlägt die Erkennung welches nun gemeint ist fehl.

Total bescheuert:

Code: Select all

if (a in 1,2,3,4,5)
if (a between 1 and 5)
if (var1 = var2) 
if var1 = var2
In AutoHotkey sind Klammern meistens optional und führen zu keiner großen Veränderung des Verhaltens.
Dieses if ist da völlig neben der Spur und bricht diese Regel welche beeinflusst was der Benutzer im Kontext von AutoHotkey meint.
Es ist daher eben genau nicht klug sondern strohdumm.
Dass du diese Fälle korrekt aktivieren kannst hat nichts mit dem if sondern mehr mit dir zu tun.

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by Rohwedder » 09 Jun 2019, 02:08

Klugheit ist die Fähigkeit zu angemessenem Handeln im konkreten Einzelfall unter Berücksichtigung aller für die Situation relevanten Faktoren, Handlungsziele und Einsichten, die der Handelnde kennen kann.
Das If von Ahk1 ist klug weil es dies alles kapiert:

Code: Select all

If Farbe = Weiß
If (Farbe = "Weiß") 
If Var between 1 and 5
If Toggle := !Toggle
If Var in 1,2,3,5,7,11
If ++Var ~= "4" > 2 

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by nnnik » 08 Jun 2019, 18:31

Was du mit "klugen code" meinst ist sehr subjektiv und für mich nicht nachvollziehbar.
If var = text ist code der eine variable mit einem Text vergleicht. Klar spart man in dem Fall, dass man eine variable mit einem Text vergleicht 2-3 Zeichen.
Allerdings ist so ein if vollkommen ungeeignet um alle anderen Sachen miteinander zu vergleichen.
So müssten wir um das Ergebnis von 4+4 ausrechnen zu können erst das Ergebnis in eine Variable schreiben und dann in das if packen.
Schlimmer wird es wenn wir eine variable mit dem Ergebnis einer Berechnung vergleichen wollen.
Total versagt dieses if wenn wir mit Datentypen arbeiten wollen die keine String Variante haben. Da geht's dann einfach nicht.

Das if funktioniert nicht für die meisten Anwendungsgebiete von ifs.
Lässt uns die ganze Zeit Ergebnisse in Variablen speichern und wofür? Damit man im besten Fall 4 Zeichen weniger tippen muss.

Für mich ist dieses if das extrem Beispiel für das Gegenteil von klugen code.

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by Rohwedder » 08 Jun 2019, 17:46

Quatsch!
Mit "Ich liebe nun mal kurzen Kode und schreibe deswegen oft traditionell ..."
Meine ich z.B.:

Code: Select all

If Farbe = Weiß
statt

Code: Select all

If (Farbe = "Weiß")
Ich liebe strikte kluge Syntax! ich warte darauf, daß 7.Bit Ascii endlich überwunden wird und wenigstens,
wie bei Regex, Groß- und Kleinschreibung eine Rolle spielt.
Von Fettschrift, Farben und griechischen Buchstaben mal ganz zu schweigen.
Welchen Vorteil bietet das 'Sparen eines Returns', das man genau einmal schreibt?
Die Ersparnis des Schreibens ist es nicht. Für das Return tippe ich nur r# .
Es ist das Ergebnis das stört. Der Kode dehnt sich oft zu sehr in die Länge!
Ich würde lieber Blöcke rein durch Einrückungen strukturieren.
Besonders nervig finde ich aber das Fehlen von Labeleinzeilern mit impliziten Return, d.h.:

Code: Select all

Label1:
MsgBox %A_ThisLabel%
Return
statt:

Code: Select all

Label1: MsgBox %A_ThisLabel%

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by just me » 08 Jun 2019, 15:45

Ja, immer wieder "... hätte mir viele Returns sparen können." Welchen Vorteil bietet das 'Sparen eines Returns', das man genau einmal schreibt? Gäbe es dieses Konstrukt nicht, hättest Du diesen Beitrag mit seinen vielen Worten nicht schreiben müssen. Ich glaube, er allein reicht als Ausgleich für viele Returns in vielen Skripten.
Ich liebe nun mal kurzen Kode und schreibe deswegen oft traditionell ...
Ich denke, das ist eine Aussage, die von vielen Nichtprogrammierern kommt. Ich bevorzuge strikte Syntaxregeln, auch wenn das ein paar Tastenanschläge kostet.

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by Rohwedder » 08 Jun 2019, 13:59

Hallo,
.. mehrzeilige Aufbau mit abschließendem expliziten Return soll Pflicht sein?
"Wenn's der Klarheit dient soll es so sein!" … heftig!
Das Wissen, ein 1-Zeiler-Hotkey einem 3-Zeiler entspricht, hätte mir viele Returns sparen können. Ich liebe nun mal kurzen Kode und schreibe deswegen oft traditionell (mir graut vor Ahk2). Wenn Klarheit ausführliches Manual bedeutet, OK! Ansonsten, nein.

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by just me » 08 Jun 2019, 09:49

Moin,

auch das ist ein klassisches Beispiel dafür, wie gutgemeinte bzw. der Bequemlichkeit der Anwender zuträgliche Ausnahmen, wie explizites/implizites Return auch erfahrene Anwender verwirren können.

Meinetwegen könnte man das imlizite Return auf reine Remappings beschränken, z.B. a::b oder ::btw::by the way.

Sobald innerhalb einer Hotkey/Hotstringroutine eine AHK Anweisung/Funktion ausgeführt/aufgerufen wird, sollte der mehrzeilige Aufbau mit abschließendem expliziten Return Pflicht sein.

Doch ich vernehme schon den Sturm der Entrüsteten: "Oh nein, so viel unnütze Tipperei?" Und ich denke dennoch: "Wenn's der Klarheit dient soll es so sein!"

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by Rohwedder » 08 Jun 2019, 09:37

Akzeptiert!
ListLines zeigt dieses implizite Return.
Das Handbuch beschreibt zwar explizit: Ein 1-Zeiler-Remapping entspricht einem 8-Zeiler
nicht jedoch ein 1-Zeiler-Hotkey entspricht einem 3-Zeiler.
Aus:

Code: Select all

2::Send, B
wird

Code: Select all

2::
Send, B
Return
Dies behebt für mich auch eine weitere Unstimmigkeit.
Denn ein Label wie 2:: darf nicht in derselben Zeile ausführbaren Kode haben.

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by gregster » 08 Jun 2019, 08:12

Send C gehört nicht zum Code von 2:: und ist grundsätzlich unerreichbar.
Wie swagfag zitiert, bei einzeiligen Hotkey-definitionen gilt:
Wenn ein Hotkey allerdings nur eine einzige Zeile ausführen muss, kann diese Zeile rechts neben dem Doppelpunkt-Paar geschrieben werden. In diesem Fall wird das return automatisch angewendet
Die Ausführung des Codes von 1:: läuft automatisch in den Code von 2::, da 1:: kein return hat und das Label 2:: ignoriert wird. Beim Hotkey-Einzeiler ist return jedoch immer implizit. Und returns haben immer Wirkung, im Gegensatz zu Labels. Jede Hotkey-Defintion endet beim nächsten return, egal ob explizit oder implizit, da ein Einzeiler äquivalent ist zu einem Mehrzeiler mit nur einer Codezeile und return (siehe oben) - ich nehme an, das wird im Interpreter entsprechend übersetzt:
Der Einzeiler soll eben nur Schreibarbeit sparen und die Syntax verienfachen, sich aber ansonsten nicht anders verhalten als sein mehrzeiliges Äquivalent. Sonst müsste man in solchen Fällen unter Einzeiler doch noch ein zusätzliches Return setzen, um zu verhindern, dass die Codeausführung noch weiter durchläuft... :shifty:

Ich fänd's jedenfalls syntaktisch ungünstig, wenn ohnehin schon implizite returns nochmal zusätzlich kontextabhängig wären.

Also tu doch das:

Code: Select all

1::
Send, A
2::
Send, B
Send, C
Return
Oder (wenn 2 nur B senden soll ;) ) :

Code: Select all

1::
Send, A
2::
Send, B
if (A_thishotkey !="2")
	Send, C
Return

;oder:
1::
Send, A
2::Send, % (A_thishotkey !="2") ? "BC" : "B"

Re: Warum beherrscht mein Hotkey nicht das ABC?

Post by Rohwedder » 08 Jun 2019, 08:11

Deswegen sendet der Einzeiler-Hotkey 2:: nur B.
Sagt jedoch nichts über den Mehrzeiler-Hotkey 1:: aus.

Top