die Spalten per Maus verändere ändert sich plötzlich die Schriftgröße in der kompletten Spalte
Stimmt, das ist normal. ![]()
Edit: Hab gerade mal getestet - ich kann das nicht reproduzieren. Bei mir bleiben alle gesetzten Informationen erhalten.
die Spalten per Maus verändere ändert sich plötzlich die Schriftgröße in der kompletten Spalte
Stimmt, das ist normal. ![]()
Edit: Hab gerade mal getestet - ich kann das nicht reproduzieren. Bei mir bleiben alle gesetzten Informationen erhalten.
Ich habe eine Möglichkeit gefunden, wie man automatisches Einrücken lösen kann ohne Preference-Datei (die habe ich nämlich nicht ans Laufen bekommen und im Sublime-Forum hat auch keiner eine Ahnung davon).
Ich habe jetzt das Indent an die Entertaste gekoppelt. Das bedeutet dann aber auch, dass man für Autovervollständigung IMMER die Tab-Taste nehmen muss. Ist aber nur Gewöhnungssache.
Edit 28.08.2014: Damit nach einzeiligem If-Then nicht eingerückt wird, muss "then$" im Pattern stehen.
In <Preferences> <Key Bindings - User> bitte folgendes einfügen:
[
...,
{ "keys": ["enter"], "command": "insert", "args": {"characters": "\n\t"}, "context":
[
{ "key": "setting.auto_indent", "operator": "equal", "operand": true },
{ "key": "preceding_text", "operator": "regex_contains", "operand": "(?i:case|do|for|func|then$|else|elseif|while|select|switch|with)", "match_all": true },
{ "key": "selector", "operator": "equal", "operand": "source.autoit" }
]
},
...
wenn das Leerzeichen erst nach den 30 Zeichen kommt
Das ist dann mal echt doof ![]()
Da machen wir dann einen Zwangsumbruch bei 30 ![]()
$a = StringRegExp($s, '(\b.{1,30}\b|.{0,30})', 3)
[/autoit]Einfach mit Word-Boundary splitten.
[autoit]$s = "hallo das ist ein test. hier geht es noch weiter und das ist noch lange nicht alles."
[/autoit][autoit][/autoit][autoit]$a = StringRegExp($s, '(\b.{1,30}\b|.)', 3)
For $x In $a
ConsoleWrite($x & @LF)
Next
Edit: Um abschließende Satzzeichen zu erkennen (die gelten nicht als zum Wort gehörend, muss "oder jedes Zeichen einmal ("|.") mit abgefragt werden.
Klick einfach mal auf den folgenden Befehl
[autoit]_PathSplit
[/autoit]Ich habe jetzt auch eine Lösung zum Auslesen von
- GUIControlStyles und
- WindowMessageCodes
gefunden.
Weiterhin entkoppele ich jetzt alle Funktionen von irgendwelchen Abfragen auf SciTE oder SciTE.properties. Denn wer ST nutzt, möchte ja nicht unbedingt auch SciTE installieren bzw. aktuell halten.
Die nächste Paket-Version meines Wrappers wird ausschliesslich auf der AutoIt-Installation aufsetzen.
Der nächste Punkt auf meiner ToDo-List ist dann: ManageIncludes für ST - vergleichbar mit OrganizeIncludes aber mangels grafischer Oberfläche über Menü, Hotkey und Input-Panel gesteuert. Im jetzigen AutoItscript-Package ist ein Include-Helper enthalten. Ich nehme an, der soll ähnlich wie OI arbeiten - nun bei mir tut das Teil nichts(vllt. habe ich meine Version auch schon zu sehr "verpimpt"), insofern baue ich mir dann selber etwas, was so läuft, wie ich es will. ![]()
Wenn noch weitere Wünsche bestehen: Einfach posten.
(Solche Dinge wie: Debug2MsgBox, Debug2Console etc. werden auch nach und nach eingebunden)
AutoIndent bzw. AutoCompletion
Diese Tools sind in der AutoItTools.lua enthalten, die bei SciTE4AutoIt installiert wird. Brauchst du auch nicht extra aktivieren, läuft standardmäßig. Beide werden dabei über die propertie-Datei geregelt.
autocomplete.au3.ignorecase=1
autocomplete.au3.start.characters=$(chars.alpha)$(chars.numeric)$_@#
word.characters.$(au3)=$(chars.alpha)$(chars.numeric)$(chars.accented).$_@#
# Auto indent stuff
#~ indent.size.$(au3)=4
statement.indent.$(au3)=
statement.end.$(au3)=
statement.lookback.$(au3)=
block.start.$(au3)=5 case if do for func else elseif while select switch with\
Case If Do For Func Else ElseIf While Select Switch With\
CASE IF DO FOR FUNC ELSE ELSEIF WHILE SELECT SWITCH WITH
block.end.$(au3)=5 case else endif elseif endfunc endselect endswitch next until wend endwith\
Case Else EndIf ElseIf EndFunc EndSelect EndSwitch Next Until Wend WEnd EndWith\
CASE ELSE ENDIF ELSEIF ENDFUNC ENDSELECT ENDSWITCH NEXT UNTIL WEND ENDWITH
Alles anzeigen
Was macht Tidy:
• Einzüge korrekt ausrichten -- das macht AutoIndent
• Funktionsnamen, Keywords etc. in Propercase wandeln, falls klein geschrieben -- das macht AutoCompletion
• Standardisierte Schreibweise für Variablen wie in erstmaliger Deklaration -- ebenfalls AutoCompletion
• Leerzeichen Hinzufügen/Entfernen bei Funktionsaufrufen/Parametern -- sowas wird sauber per Hand codiert
• Leere Zeilen entfernen -- um Himmels Willen, bloss nicht! Danach sieht das Skript aus, wie ein Spaghetti-Topf
• Folgende Leerzeichen entfernen -- ist eine Standardoption von SciTE beim Speichern
• Funktionsnamen anfügen an das Ende der Deklaration -- das ist in meinen PlugIns eh dabei
• Code-Check auf z.B. fehlende EndIf/WEnd oder Funktionsdeklarationen innerhalb einer Schleife. -- dafür gibt es Au3Check
• Sortieren aller Funktionsdeklarationen in alphabetischer Reihenfolge -- nee, nee, die Reihenfolge lege immer noch ich fest!
So, was soll jetzt mich dazu veranlassen, dieses Tool zu nutzen? - Genau: Nichts! ![]()
ich will für meinen bruder was vereinfachen ihm einen exe geben was von TeamViewerPortable ID und Kenwort ausliest und mir per mail verschickt damit ich ihm helfen kann.
Nimm die einfache Variante: Er soll TV als Server installieren. Dann wird ein festes Kennwort bei der Installation vergeben und damit kannst du dich jederzeit einklinken.
BugFix, es geht auch leichter/kürzer:
Einfach kann jeder... ![]()
Es geht, aber die MsgBox kannst du nicht direkt ausgeben, da die Auswertung von WindowsMessages nicht unterbrochen werden darf. Deshalb brauchst du Globale Hilfsvariablen:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $currentInput, $lastInput
[/autoit] [autoit][/autoit] [autoit]GUICreate("Test")
$cInput1 = GUICtrlCreateInput("", 10, 30, 150)
$cInput2 = GUICtrlCreateInput("", 10, 60, 150)
$hInput1 = GUICtrlGetHandle($cInput1)
$hInput2 = GUICtrlGetHandle($cInput2)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
Do
If $currentInput <> $lastInput Then
$lastInput = $currentInput
MsgBox(0, 'Input', 'aktuell: ' & $currentInput)
EndIf
Until GUIGetMsg() = -3
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Switch $hWndFrom
Case $hInput1, $hInput2
Local $sID = 'Input1'
If $iIDFrom = $cInput2 Then $sID = 'Input2'
Switch $iCode
Case $EN_ALIGN_LTR_EC ; Sent when the user has changed the edit control direction to left-to-right
Case $EN_ALIGN_RTL_EC ; Sent when the user has changed the edit control direction to right-to-left
[/autoit] [autoit][/autoit] [autoit]Case $EN_CHANGE ; Sent when the user has taken an action that may have altered text in an edit control
ConsoleWrite('Inhalt geändert: ' & $sID & @LF)
Case $EN_ERRSPACE ; Sent when an edit control cannot allocate enough memory to meet a specific request
Case $EN_HSCROLL ; Sent when the user clicks an edit control's horizontal scroll bar
[/autoit] [autoit][/autoit] [autoit]Case $EN_KILLFOCUS ; Sent when an edit control loses the keyboard focus
ConsoleWrite('Focus verloren: ' & $sID & @LF)
Case $EN_MAXTEXT ; Sent when the current text insertion has exceeded the specified number of characters for the edit control
; This message is also sent when an edit control does not have the $ES_AUTOHSCROLL style and the number of characters to be
; inserted would exceed the width of the edit control.
; This message is also sent when an edit control does not have the $ES_AUTOVSCROLL style and the total number of lines resulting
; from a text insertion would exceed the height of the edit control
Case $EN_SETFOCUS ; Sent when an edit control receives the keyboard focus
ConsoleWrite('Focus erhalten: ' & $sID & @LF)
$currentInput = $sID
Case $EN_UPDATE ; Sent when an edit control is about to redraw itself
Case $EN_VSCROLL ; Sent when the user clicks an edit control's vertical scroll bar or when the user scrolls the mouse wheel over the edit control
[/autoit] [autoit][/autoit] [autoit]EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
So,
jetzt habe ich die Erstellung der Autovervollständigungsdateien (re_build_completion_files) komplett neu gestaltet. Damit ist auch das Problem des CamelCase gelöst.
Ich lese die ".\SciTE\api\au3.api" aus und schreibe die Keywords, Makros und Direktiven in die "NoFuncs.sublime-completions".
Die Funktionen werden mit Sprungmarken für den Cursor an allen Parametern versehen und in die "Au3api.sublime-completions" geschrieben. (Anspringen geht nach dem Einfügen immer mit TAB)
Aus dem AutoIt-Include-Pfad werden alle Includes ausgelesen und in die "Includes.sublime-completions" geschrieben. Dasselbe passiert mit den User-Includes, sofern ein entsprechender Pfad in den Settings angegeben wurde. Von diesen User-Includes werden ausserdem alle darin erstellten Funktionen ausgelesen und wiederum mit Sprungmarken an den Parametern versehen in die "UserUdfs.sublime-completions" geschrieben.
Im AutoItScript-Package sind noch folgende *.sublime-completions zu finden:
- CompilerDirectives.sublime-completions --- die ist wenig nützlich, die Parameter sind für den AutoItWrapper von SciTE
Die beiden folgenden Dateien beibehalten. Ich suche noch nach einer Möglichkeit, wie ich diese mit in die Erstellung einbeziehe.
- GUIControlStyles.sublime-completions
- WindowMessageCodes.sublime-completions
Was für ein Schrott.
Aber wozu sind wir "AutoIt'ler" ![]()
einfach ein Löschskript an den Tidycall anhängen und es nervt nicht mehr. ![]()
Oder Tidy gar nicht nutzen - wozu braucht man das: SciTE hat AutoIndent, d.h. wenn man nicht die normale Struktur löscht, ist doch bereits alles im Lot. ![]()
Das Problem ist hier, dass Tidy sowohl über die properties als auch über eine INI und zusätzlich mit Startparametern gesteuert werden kann.
Und um es auf die Spitze zu treiben sind überall unterschiedliche Parameter... :wacko:
Wenn man Tidy nutzt, hat man dieses "unartige" Verhalten an der Backe ![]()
Im Tidy-Ordner gibt es eine Muster-INI. Dort sind die Parameter aufgelistet. Von Interesse ist hier:
* * * Keep x Version of the File before the Tidy run and optionally store them in SubDirectory "\Backup"
KeepNVersions=5
Also eine Tidy.INI erstellen und dort die Versionszahl auf "0" setzen. Die anderen Parameter würde ich mal alle mit übernehmen, da ich Tidy nicht nutze kann ich es nicht testen. So wie ich das verstehe, sollte es aber ein Backup unterbinden.
Habe das jetzt fertig, die neuen commands sind:
syntax_check_au3
run_with_parameter
re_build_completion_files
An die Hotkeys eurer Wahl koppeln und fertig ![]()
Meine Keymap mal als Muster:
[
{ "keys": ["ctrl+,"], "command": "show_panel", "args": {"panel": "console", "toggle": true} },
{ "keys": ["f1"], "command": "goto_documentation" },
{ "keys": ["f5"], "command": "autoitbuild"},
{ "keys": ["ctrl+f5"], "command": "syntax_check_au3" },
{ "keys": ["shift+f5"], "command": "run_with_parameter" },
{ "keys": ["f7"], "command": "compile_au3" },
{ "keys": ["f12"], "command": "wrapper_directives" },
{ "keys": ["ctrl+f12"], "command": "re_build_completion_files" },
{ "keys": ["ctrl+q"], "command": "toggle_comment", "args": { "block": false } },
{ "keys": ["ctrl+shift+q"], "command": "toggle_comment", "args": { "block": true } }
]
Alles anzeigen
Edit: So langsam komme ich in Fahrt ![]()
Jetzt implementiert: Autocomplete von Variablen
Dazu erforderlich, das Dollarzeichen aus der Liste der Worttrenner entfernen! Und damit auch Includes, Makros etc. erkannt werden auch @, # und < entfernen.
<Preferences> <Settings - User> einfügen:
Edit 24.08.2014:
Es fehlten noch 2 Fehlerabfragen und das Pattern für Variablenerkennung war nicht korrekt - gefixed.
Ausserdem ist mir aufgefallen, dass die Autovervollständigung für Keywords nicht im AutoItScript-Package enthalten war. Habe ich nachgeholt. Die Datei Keywords.zip dazu in den Package-Ordner AutoItScript entpacken. (oder gleich einmal alles neu erstellen)
Jetzt weiß ich auch, warum im AutoItScript-Package Tidy enthalten ist: Weil sich noch niemand an die Erstellung der Preference für AutoIndent gewagt hat.
Das scheint auch nicht ganz einfach zu sein. Meine bisherigen Versuche waren (noch) erfolglos. Aber ich bleibe dran. ![]()
Jetzt habe ich noch hinzugefügt, dass die Dateien für Autovervollständigung automatisch generiert werden. Einfach nach Installation einer neuen AutoItversion ausführen - die alten Dateien werden als *.bak gesichert und neue erstellt. (command=re_build_completion_files)
Aber bitte vorher mal in den Package-Ordner von AutoItscript schauen, welche "*.sublime-completions dort existieren. Diese sind zum Teil nicht identisch mit den Keyword-Namen in den properties. Am Besten nach dem Neu Erstellen alle comletion-Dateien, die nicht das aktuelle Datum haben, löschen.
Dazu sind zwei weitere Schlüssel in den AutoIt.sublime-settings erforderlich:
...,
"completion_path": "I:\\SublimeText\\Data\\Packages\\AutoItScript",
"user_include_path": "C:\\Program Files (x86)\\AutoIt3_MyInclude",
...
Einen kleinen Schönheitsfehler haben die automatisch generierten Dateien: CamelCase ist automatisch natürlich nicht möglich. Nur am Wortanfang bzw. nach Unterstrich wird groß geschrieben.
NEUE Version in Post #50!
Frage1: Wäre es möglich noch die Funktion Au3Check (Syntax Check), die es im ISN Studio gibt, mit einzubauen?
Frage2: Gibt es die Möglichkeit ein Script mit Startparameter zu testen?
Zu beiden Punkten: Ja.
Hat mich auch gewundert, dass im AutoIt-Package das (aus meiner Sicht völlig überflüssige) Tidy implementiert wurde, aber kein SyntaxCheck. Tidy habe ich in meinen ganzen 8 AutoIt-Jahren bestimmt nicht öfter als 6-8 mal benutzt. Und das auch nur ganz am Anfang. ![]()
Mit der Definition der Startparameter kann man das genauso lösen, wie beim Wrapper - durch das Inputpanel.
Ich lass mir das alles mal durch den Kopf gehen.
Ich habe mal etwas gespielt.
Die neue Syntax erlaubt uns ja Funktionsaufrufe an eine Variable zu binden und diese dann als Parameter in Funktionen zu nutzen.
Im Bsp. habe ich Generatoren für numerische (ganzzahlig) und A-Z (groß/klein) -Iteratoren erstellt.
Bei jedem Aufruf des Iterators wird der nächste Wert aus dem generierten Zahlenbereich bzw. beim A-Z der Folgebuchstabe zurückgegeben. A-Z kann auch endlos ausgegeben werden, d.h. nach dem Z geht es wieder mit A los.
In erster Linie wird man wohl numerische Iteratoren anwenden. Selbstverständlich kann man mit einer Schleife um einen Funktionsaufruf einen Iterator ersparen. Aber wenn man mehrere Schleifen schachteln muss, kann man sich auf diese Weise evtl. die eine oder andere sparen. Das trägt wiederum durchaus zu etwas mehr Übersicht im Skript bei.
Das einzig störende an dieser Lösung: Ich kann nur eine Instanz eines Iterators generieren. Oder hat da jemand eine Idee, wie man die neuen Syntaxmöglichkeiten dafür verbiegen kann?
Func _IteratorNum($_start=Null, $_end=Null, $_create=0)
Local Static $a[1], $index
If $_create Then
$index = -1
Local $n = 0
ReDim $a[$_end +1 -($_start)]
For $i = $_start To $_end
$a[$n] = $i
$n += 1
Next
Return _IteratorNum
Else
$index += 1
Return $index < UBound($a) ? $a[$index] : False
EndIf
EndFunc
$iter = _IteratorNum(-10,5,1)
For $i = 1 To 16
ConsoleWrite($iter() & ' ')
Next
ConsoleWrite(@LF)
Func _IteratorABC($_lower=Null, $_endless=Null, $_create=0)
Local Static $a[26], $index, $continue = False
If $_create Then
$index = -1
Local $n = 0, $x = $_lower ? 97 : 65
For $i = $x To $x +25
$a[$n] = Chr($i)
$n += 1
Next
If $_endless Then $continue = True
Return _IteratorABC
Else
If $continue Then
$index = $index +1 < 26 ? $index +1 : 0
Else
$index += 1
EndIf
Return $index < 26 ? $a[$index] : False
EndIf
EndFunc
$iterUpper = _IteratorABC(0,0,1)
For $i = 1 To 27
ConsoleWrite($iterUpper() & ' ')
Next
ConsoleWrite(@LF)
$iterLower = _IteratorABC(1,0,1)
For $i = 1 To 27
ConsoleWrite($iterUpper() & ' ')
Next
ConsoleWrite(@LF)
$iterUpperEndless = _IteratorABC(0,1,1)
For $i = 1 To 40
ConsoleWrite($iterUpper() & ' ')
Next
ConsoleWrite(@LF)