Hat sich erledigt habe selber eine Lösung gefunden
Schön... schöner wäre allerdings, wenn du deine Lösung dann auch mit anderen teilst!
Hat sich erledigt habe selber eine Lösung gefunden
Schön... schöner wäre allerdings, wenn du deine Lösung dann auch mit anderen teilst!
sieh mal hier:
Vielen Dank für den Link... durch diesen habe ich nun einen wirklich sehr ätzenden Fehler identifizieren können, der mich vor etwa 18 Monaten fast in den Wahnsinn getrieben hat. Wäre nie drauf gekommen, das es am ToolTip liegen könnte.
ToolTip(" Macht er nur korrekt, wenn vorher der mittige NICHT aufgerufen wurde ", 4, @DesktopHeight - 60, _
" Dieser Tooltip soll unten links erscheinen ",2,Default)
Im Anhang mal vier Bilder, die zeigen, wie der Tip bei mir mit zwei Monitoren angezeigt wird.
Aber man kann nicht abfragen, welchen Style au3 oder lua für comment.box verwenden
Jetzt habe ich es verstanden... das ist ja mal echt blöd.
AutoIt und Lua sind definitiv die wichtigsten... aber zumindest für Python bräuchte ich es auch... obwohl es da ja keinen echten Multi-Line-Kommentar gibt... da mache ich es mit Multi-Line-String (Style = 7).
"""
This is a block comment.
It spans multiple lines.
Nice, eh?
"""
Was meinst du?
Ja, ok, so wichtig ist das nun auch nicht... habe dazu was getippt, um an den Style zu kommen, sollte eigentlich funktionieren, aber da ist irgendwie der Wurm drin!
Etwas an Denkprozessen darf man ruhig auf den Anwender übertragen.
Habe ich mir gedacht, das du das sagst. Ja, ok, muss auch nicht sein.
Also ist zumindest eine weitere Property erforderlich
Auch ok... wobei ich das sicher nie brauchen werde.
Ja... so gefällt mir das!
Hier noch ein paar Anregungen:
Bsp.:
function getIndentStr(ext)
local tabsize, indentsize, usetabs = props['tab.size.$('..ext..')'], props['indent.size.$('..ext..')'], props['use.tabs.$('..ext..')']
if tabsize == '' then tabsize = props['tabsize'] end
if indentsize == '' then indentsize = props['indent.size'] end
if usetabs == '' then usetabs = props['use.tabs'] end
tabsize = tonumber(tabsize)
indentsize = tonumber(indentsize)
usetabs = tonumber(usetabs)
local indent
if indentsize > 0 then
if usetabs then
if indentsize > tabsize then indent = string.rep('\t', (indentsize - (indentsize % tabsize)) / tabsize) end
indent = indent .. string.rep(' ', (indentsize % tabsize))
else
indent = string.rep(' ', indentsize)
end
end
print('! tabsize = ', tabsize)
print('! indentsize = ', indentsize)
print('! usetabs = ', usetabs)
print('! indent = "'..indent..'"')
return indent
end
local ext = 'lua'
local indentsizeext = props['indent.size.$('..ext..')']
props['indent.size.$('..ext..')'] = 5
local commentboxmiddle = props['comment.box.middle.$('..ext..')']
props['comment.box.middle.$('..ext..')'] = '~'
--~ props['use.tabs.$('..ext..')'] = ''
--~ props['use.tabs'] = 1
local indentstr = getIndentStr(''..ext..'')
print('! indentstr = "'..indentstr..'"')
print('! commentboxmiddle = "'..commentboxmiddle..'"')
editor:AddText(props['comment.box.start.'..ext]..'\n')
editor:AddText(indentstr..props['comment.box.middle.'..ext]..'middle #1\n')
editor:AddText(indentstr..props['comment.box.middle.'..ext]..'middle #2\n')
editor:AddText(indentstr..props['comment.box.middle.'..ext]..'middle #3\n')
editor:AddText(props['comment.box.end.'..ext]..'\r')
props['indent.size.$('..ext..')'] = indentsizeext
props['comment.box.middle.$('..ext..')'] = commentboxmiddle
Alles anzeigen
Das stimmt so aber immer noch nicht...
comment.box.end.au3=#CE
comment.box.middle.au3=@Tab
comment.box.tab.alternation=@Tab ; <== Für diese Variable erkenne ich auch bei aller Anstrengung keinen Mehrwert!
comment.box.ignore.empty.before=1
comment.box.ignore.empty.after=1
comment.box.output=0
Im oberen Ausschnitt habe ich bis vor Exit markiert... das Caret steht in Zeile 17.
...und das passiert dann damit... das Exit hinter #CE ist zu viel und das Exit darüber dürfte nicht mit im Kommentarblock sein!
Gehe ich mit dem Caret nur bis ans Ende von Zeile 16, funktioniert es.
Wir hatten vor einigen Wochen einen User, der das zuletzt aktive Window ermitteln wollte, weil sein Send() oder so sonst nicht da ankommt, wo er es will... dann habe ich gebastelt und es war irgendwas mit Hook oder Register, um die Nachrichten abzufangen, wenn sich im System etwas an einem Window ändert... neu erstellt, vernichtet, Z-Order geändert... aber ich finde es einfach nicht mehr. Grrr...
Jetzt habe ich es wieder gefunden...
;-- TIME_STAMP 2020-10-10 23:02:30 v 1.0
#include <APISysConstants.au3>
#include <WinAPIMisc.au3>
#include <WinAPISys.au3>
OnAutoItExitRegister('OnAutoItExit')
If Not HotKeySet('{ESC}', _Exit) Then Exit -1
Global $g_hPrev = WinGetHandle('[ACTIVE]') ; (Zuvor) aktives Window
Global $g_hEventProc = DllCallbackRegister('_EventProc', 'none', 'ptr;dword;hwnd;long;long;dword;dword')
Global $g_hEventHook = _WinAPI_SetWinEventHook($HSHELL_ACTIVATESHELLWINDOW, $HSHELL_ACTIVATESHELLWINDOW, DllCallbackGetPtr($g_hEventProc))
While 1
Sleep(250)
WEnd
Func _EventProc($g_hEventHook, $iEvent, $hWnd, $iObjectID, $iChildID, $iThreadId, $iEventTime)
Local Static $sText
#forceref $g_hEventHook, $iObjectID, $iChildID, $iThreadId, $iEventTime
Switch $iEvent
Case $HSHELL_ACTIVATESHELLWINDOW
If IsHWnd($g_hPrev) Then
ConsoleWrite('- $g_hPrev: ' & _WinGetTitleClass($g_hPrev))
EndIf
ConsoleWrite('> $hWnd : ' & _WinGetTitleClass($hWnd))
$g_hPrev = $hWnd
EndSwitch
EndFunc ;==>_EventProc
Func _WinGetTitleClass($hWnd)
Local Static $FO = '%s, $sClassName: %-26s, $sTitle: "%s"\n'
Return StringFormat($FO, $hWnd, _WinAPI_GetClassName($hWnd), WinGetTitle($hWnd))
EndFunc ;==>_WinGetTitleClass
Func OnAutoItExit()
HotKeySet('{ESC}')
_WinAPI_UnhookWinEvent($g_hEventHook)
DllCallbackFree($g_hEventProc)
EndFunc ;==>OnAutoItExit
Func _Exit()
Exit
EndFunc ;==>_Exit
Alles anzeigen
_WinAPI_GetAsyncKeyState
Rückgabewert
Erfolg: | Wenn die Funktion erfolgreich ist, gibt der Rückgabewert (SHORT) an, ob die Taste seit dem letzten Aufruf von GetAsyncKeyState gedrückt wurde und ob die Taste derzeit auf oder ab ist. Wenn das höchstwertige Bit gesetzt ist (KeyState < 0), ist die Taste gedrückt, und wenn das niedrigstwertige Bit gesetzt ist (Mod(KeyState, 2) = 1), wurde die Taste nach dem vorherigen Aufruf von GetAsyncKeyState gedrückt. Sie sollten sich jedoch nicht auf dieses letzte Verhalten verlassen. Weitere Informationen finden Sie in den Bemerkungen. |
Fehler: | Der Rückgabewert ist 0 wenn die Taste nicht gedrückt ist oder in den folgenden Fällen: - Der aktuelle Desktop ist nicht der aktive Desktop - Der Vordergrund-Thread gehört zu einem anderen Prozess und der Desktop erlaubt den Hook oder die Journal-Aufnahme nicht. |
Bemerkungen
Die für $iKey zu verwendenden Konstanten finden Sie in WinAPIvkeysConstants.au3
Die GetAsyncKeyState-Funktion funktioniert mit Maustasten. Es wird jedoch der Status der physischen Maustasten überprüft, nicht die logischen Maustasten, denen die physischen Tasten zugeordnet sind. Beispielsweise gibt der Aufruf _WinAPI_GetAsyncKeyState ($VK_LBUTTON) immer den Status der linken physischen Maustaste zurück, unabhängig davon, ob sie der linken oder rechten logischen Maustaste zugeordnet ist. Sie können die aktuelle Zuordnung der physischen Maustasten zu logischen Maustasten durch das System ermitteln, indem Sie _WinAPI_GetSystemMetrics($SM_SWAPBUTTON) aufrufen, das TRUE zurückgibt, wenn die Maustasten ausgetauscht wurden.
Obwohl das niedrigstwertige Bit des Rückgabewerts angibt, ob die Taste seit der letzten Abfrage gedrückt wurde, kann eine andere Anwendung aufgrund des vorbeugenden Multitasking-Charakters von Windows GetAsyncKeyState aufrufen und anstelle Ihrer Anwendung das Bit "Zuletzt gedrückt" empfangen. Das Verhalten des niedrigstwertigen Bits des Rückgabewerts wird aus Gründen der Kompatibilität mit 16-Bit-Windows-Anwendungen (die nicht präemptiv sind) streng beibehalten und sollte nicht verwendet werden.
Sie können die Codekonstanten für virtuelle Schlüssel $VK_SHIFT, $VK_CONTROL und $VK_MENU als Werte für den Parameter vKey verwenden. Dies gibt den Status der UMSCHALT-, STRG- oder ALT-Tasten an, ohne zwischen links und rechts zu unterscheiden.
Related
_WinAPI_GetKeyState, _WinAPI_GetKeyboardState
Kannst du bitte noch mal rein schauen...
Markiere ich z.B. zwei Zeilen und lassen das Caret am Ende der zweiten Zeile stehen, funktioniert es, wie erwartet. Setzte ich das Caret aber an den Anfang der zweiten Zeile, dann wurde ja eigentlich nur eine Zeile markiert... werden aber trotzdem zwei Zeilen auskommentiert und es fehlt dann auch ein Zeilenumbruch, damit der Text hinter dem Caret in einer neuen Zeile beginnt.
Wird nur ein Teil einer Zeile markiert, wird der markierte Teil einfach unterschlagen und der Text hinter dem Caret mit in die selbe Zeile geschrieben, sollte aber eine Zeile tiefer... das sollte auch abgefangen werden.
Wurde bei self.lineStart und/oder bei self.lineEnd eine leere Zeile markiert, sollten diese nicht berücksichtigt werden. Ist dazwischen nur eine Zeile mit Text, dann bitte nur die in den Block setzen.
Wofür ist denn "OHK = {}" am Anfang der OHKfuncs.lua?
Creating tables
Tables are created using table constructors, which are defined using curly brackets, e.g. { } . To define an empty table we can do the following.
> t = {} -- construct an empty table and assign it to variable "t"
> print(t)
table: 0035AE18
Notice when the value of a table is displayed only the type and unique id of the object are displayed. To print out the contents of a table we must do so explicitly. We'll learn how to do this later.
Dein Link hat ein bisschen http... zuviel.
Jeep... habe es korrigiert... so kann das ja auch nicht funktionieren:
Wie kann man Shift+F1 und Alt+F1 benutzen, um andere Lua Hilfen aufzurufen?
Schau dir dazu mal Ownhotkeys von BugFix an...
Nicht ganz!
Die Levenshtein-Distanz unterscheidet sich etwas vom Hamming-Abstand.
Ja, schon klar... das bedeutet aber doch nicht, dass es nicht zum Thema passt... wenn es denn - so wie du selbst zitiert hast - als Erweiterung des Hamming-Abstands angesehen werden kann...
Du musst das so aufrufen: nim c -d:release --app:lib FuzzySearch.nim
Das solltest du in deinem ersten Post und auch in dem Nim-Script vermerken.
Passend zu diesem Thema ist evtl. auch dies hier: https://de.wikipedia.org/wiki/Hamming-Abstand
Muss man für shell.exec noch etwas in der SciTEUser.properties einfügen, um die Bibliothek einzubinden?
Wäre ich gehässig, würde ich jetzt einfach nein sagen... doch du hast unverdienterweise unverschämtes Glück.
Einfügen muss man was, aber wie in aller Welt kommst du dabei auf SciTEUser.properties?
Tatsächlich muss dies entweder lokal in dem Lua-Script, welches Funktionen der shell.dll benötigt, oder aber global in der SciTEStartup.lua geschehen, womit dann alle Scripts darauf zugreifen können.
-- load library - Info --> shell.html
require "shell"
--~ if shell then table.foreach(shell, print) end
Das funktioniert allerdings nur bis SciTE-Version 3.7.5.0, denn in den neueren ist der Einsprungpunkt luaL_register nicht mehr enthalten, weil veraltet.
Liest du hier: RE: Erkennen wenn User eine öffnende runde Klammer schreibt, unabhängig vom Keyboard Layout
Folgende positiven Dinge sind hervorzuheben:
Zu 1.) os.execute() lässt das Windows CMD Fenster nur kurz aufblitzen und versteckt es dann wieder - es wird nicht geschlossen und läuft im Hintergrund weiter, bis SciTE beendet wird.
Zu 2.) Die Hilfe kann auch ohne props["CurrentWord"] aufgerufen werden... wenn kein Text markiert wurde, ist dies allerdings eine gute Alternative, um den Text, der unter dem Caret steht, zu verwendet, oder halt nichts, wenn das Caret nicht vor/in/hinter einem Word oder in einer leeren Zeile steht.
Zu 3.) Mit props["CurrentWord"] und auch mit props["CurrentSelection"] wird nichts markiert. props liefern lediglich die Werte der angefragten Eigenschaften, welche von SciTE bereitgestellt werden.
Wer auch das Markieren von Suchworten, die mit Punkt verbunden sind, automatisch haben will, kann folgendes in die SciTEUser.properties hinzufügen.
Keine schlechte Idee... sollte aber gut überlegt sein... denn andere Scripte gehen evtl. davon aus, das diese Properties auf Default stehen.
Ich mache das beim Debuggen auch gerne so:
print('shell.exec = ', shell.exec('"'..firefox..'" "'..manual..'"'))
shell.exec = true Der Vorgang wurde erfolgreich beendet
Eine Zeile geändert, um einen Fehler zu provozieren:
local firefox = "C:/Program Files/Mozillas Firefox/firefox.exe" \
shell.exec = false Das System kann die angegebene Datei nicht finden
Evtl. liegt es daran, dass os noch unbekannt ist... das kannst du so testen:
command.help.$(file.patterns.lua)=dostring \
if type(os) ~= 'table' then print('require "os"!!!', 'type(os) = ', type(os)) return end \
...
Für os.execute musst du die Zeile etwas ändern... hier beide Zeilen zum Vergleich:
shell.exec('"'..firefox..'" "'..manual..'"')
os.execute('""'..firefox..'" "'..manual..'""')
"sel" scheint immer leer zu sein, wie kann ich das denn überprüfen?
Indem du das print einfach noch dem Block für dostring hinzufügst...
command.help.$(file.patterns.lua)=dostring \
local waterfox = "C:/Program Files/Waterfox/waterfox.exe" \
local manual = "file:///C:/CODE/Lua/doc/lua5.3/manual.html#pdf-" \
local sel = props["CurrentSelection"] \
if sel == "" then manual = "file:///C:/CODE/Lua/doc/lua5.3/manual.html" end \
os.execute('start "" "'..manual..sel..'"') \
print("CurrentSelection = " .. props["CurrentSelection"])
command.help.subsystem.$(file.patterns.lua)=3
CurrentSelection ist natürlich nur dann ~= "", wenn du einen Text markierst, bevor du F1 drückst!
So sieht das bei mir aus:
command.help.$(file.patterns.lua)=dostring \
local firefox = "C:/Program Files/Mozilla Firefox/firefox.exe" \
local manual = "file:///f:/Meine%20Webseiten/lua5.3/manual.html" \
local sel = props["CurrentSelection"] \
if sel ~= "" then manual = manual.."#pdf-"..sel else sel = props["CurrentWord"] if sel ~= "" then manual = manual.."#pdf-"..sel else sel = '' end end \
shell.exec('"'..firefox..'" "'..manual..'"') \
if sel ~= "" then editor:SetSel(editor.SelectionStart, editor.SelectionStart) end
command.help.subsystem.$(file.patterns.lua)=3
Ach so, der "\" ist in Lua das Zeilefortsetzungszeichen.
Von Lua hatte ich nichts gesagt...
Die Syntax für dostring ist:
dostring(s) -- executes s as a Lua string, like Lua 4's dostring
In den Properties werden mehrere Zeilen lediglich der besseren Lesbarkeit wegen umgebrochen... doch bevor sie an dostring übergeben werden, müssen sie wieder zu einer Zeile zusammengefügt werden.
Und ja... mit Lua kannst du dein ganzes Script in nur einer Zeile haben... ist Lua egal.
Das # kommentiert doch in den properties files die Zeile aus, also wieso interessiert es Lua, was in der auskommentierte Zeile steht?
Das ist hier ähnlich wie mit AutoIt... wenn eine Befehlszeile auf mehrere Zeilen umgebrochen wird. Bei AutoIt ist es der _, in SciTE bzw. den Properties der \, mit dem signalisiert wird, dass die nächste Zeile noch dazu gehört. Dies gilt auch für Kommentarzeilen!
Bsp.:
#include <Array.au3>
; So funktioniert es!
Local $aArray = _
[[1], _
[2], _
[3]]
_ArrayDisplay($aArray, '$aArray')
; So funktioniert es jedoch nicht!
Local $aArray = _
[[1], _
;~ [2], _
[3]]
_ArrayDisplay($aArray, '$aArray')
Alles anzeigen
In den Properties also besser keine Kommentarzeilen zwischen umgebrochenen Zeilen einfügen und auch keine direkt davor oder direkt dahinter, wenn sie mit \ endet!!!