Deutsches AutoHotkey Homepage AutoHotkey Community
Wir helfen uns gegenseitig aus der Patsche
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Programmierhilfe - wie aufwändig?

 
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Ich brauche Hilfe!
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
M'o



Anmeldedatum: 28.12.2005
Beiträge: 85
Wohnort: Leipzig

BeitragVerfasst am: Fr Sep 08, 2006 4:37 pm    Titel: Programmierhilfe - wie aufwändig? Antworten mit Zitat

Hallo zusammen,

da bei mir in der Firma das Java-Projekt gekippt wurde, kommen wir nicht in den Genuß des Autovervollständigens der Befehle, wie das zum Beispiel Eclipse kann. Nun ist meine Überlegung, das mittels Autohotkey zu realisieren.

Also folgendes Beispiel:

vt eingeben, danach sollte an genau dieser Stelle eine Liste der verfügbaren Befehle erscheinen, die mit vt beginnen. In der Liste sollte dann der Befehl per Tastatur ausgesucht und übernommen werden können.

1.) Geht das mit AHK, ohne Performanceeinbußen am Gesamtsystem?
2.) Wie ist das am besten realisierbar?

Ich müsste ja die Eingabe überwachen und dann dynamisch die Liste generieren? Vielleicht hat jemand schonmal etwas derartiges gebaut?

Danke für Eure Hilfe...

M'o
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Thalon



Anmeldedatum: 25.10.2005
Beiträge: 1896
Wohnort: Österreich

BeitragVerfasst am: Fr Sep 08, 2006 5:34 pm    Titel: Antworten mit Zitat

Ich würd das als Sache des Editors sehen Wink
Müsst ihr da einen bestimmten nehmen und es daher mit AHK lösen oder seid ihr für Vorschläge offen?

Was meinst du mit "Befehle" vervollständigen? Nur jene, die bereits vorkommen oder alle Jave-Befehle? Ersteres lässt sich sicher noch einigermaßen gut umsetzen, letzteres würde erst das aufwändige Anlegen einer Datenbank bedeuten (welche in einigen Editoren bereits integriert ist).

Thalon
_________________
Mein Motto: Hilfe zur Selbsthilfe!
Teildeutsche Hilfe (CHM)!! und Deutsche Online-Hilfe
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
M'o



Anmeldedatum: 28.12.2005
Beiträge: 85
Wohnort: Leipzig

BeitragVerfasst am: Fr Sep 08, 2006 6:02 pm    Titel: Antworten mit Zitat

Ja, das wäre schön, aber würde eine Erweiterung der Systembasis bedeuten, die derzeit von den Kollegen nicht realisiert werden kann. Der Editor ist fest, also quasi ein eigenes Tool, welches den Source in die Datenbank sichert und sofort binär übersetzt. Daher kann diese Thematik nicht mit einem externen Editor durchgeführt werden. Ich weiß nur, dass der Editor auch ein externer ist, den Namen könnte ich ggf. noch erfahren...

AHK müsste auf die Eingabe eines Buchstabens reagieren und das Menu zeigen, ein weiterer Buchstabe muß das Menu weiter einschränken.

Eingabe:
G liefert Menu mit GetStr, GetByte, GetWord

Eingabe:
GetS liefert nur noch GetStr

Im ersten Beispiel im Menu mit Up/Down den Befehl wählen und per Enter an die Stelle übernehmen, wo die Eingabe erfolgte, also auch die ursprüngliche Eingabe ersetzen.

Unser Befehlsumfang ist (mehr oder weniger) fest und liegt bereits als Textdatei vor bzw. kann dadurch einfach in eine Ini kopiert werden. Es müsste also über diese Liste geparst werden. Performance?

Achja, Programmiersprache ist Lj4, also was firmeneigenes wie die Sprache, die SAP verwendet. Sehr verwandt mit VB...

Die jeweilige Syntax kann ich ja wunderbar im Tooltip mit dem Intellisense-Skript als Beispiel realisieren, ebenso den Hilfeaufruf.

M'o
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Thalon



Anmeldedatum: 25.10.2005
Beiträge: 1896
Wohnort: Österreich

BeitragVerfasst am: Fr Sep 08, 2006 6:26 pm    Titel: Antworten mit Zitat

Wenn die Befehle bereits in einer Textdatei vorliegen würd ich diese per FileRead in den Arbeitsspeicher laden und dort sortieren und/oder parsen, welches sehr schnell sein sollte.
Welche Technik da am Schnellsten ist hängt vom Format der vorliegenden Datei ab.
Eventuell kannst ja einen kleinen Ausschnitt posten und sagen welche Gesamtgröße die Datei hat.

Thalon
_________________
Mein Motto: Hilfe zur Selbsthilfe!
Teildeutsche Hilfe (CHM)!! und Deutsche Online-Hilfe
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
M'o



Anmeldedatum: 28.12.2005
Beiträge: 85
Wohnort: Leipzig

BeitragVerfasst am: Fr Sep 08, 2006 10:11 pm    Titel: Antworten mit Zitat

Ausschnitt aus einer Liste:

[Keywords]
False
True
ElseIf
If
While
Do
Then
Else
Sub
Function
Interface
Package
Event
Implemented
As
ByVal
Repeat
End

[Client 3]
Alias
Alt
As
Bksp
By
ByVal
Callback
Case
Const
Ctrl
Declare
Del
Delete
Dim
Do
Dom
Else
End
Enum
Except
Excluded
For
Function
If
In
Include
Ins
Insert
Is
Like
Loop
Meth
Next
Obj
Option
PgDn
PgUp
Prop
Replace

Gesamtgröße ca. 45k

Aber wie mach ich das mit dem Menu...?
M'o
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Thalon



Anmeldedatum: 25.10.2005
Beiträge: 1896
Wohnort: Österreich

BeitragVerfasst am: Sa Sep 09, 2006 12:25 am    Titel: Antworten mit Zitat

Also ich hab mal ein Schema ausgearbeitet.
Noch nicht perfekt, aber immerhin ein Anfang für dich Wink

Ich lasse in der Fensterecke einen kleinen Tooltipp anzeigen mit dem aktuell getippselten Wort (zur Überprüfung was das aktuelle Suchwort ist) und der Anzeige ob ein Treffer in den Kommandos gefunden wurde.

Ich habe die Key-Word-Datei einfach mal "Commands.txt" genannt.

Um das eigentliche Auswahlmenü aufzurufen ist {Ctrl}+{Down} zu drücken. Es erscheint ein Menü mit den Treffern, welches man nur mehr mit Rauf/Runter auswählen muss.
Gerade im Bereich "Endkeys" ist sicherlich noch einiges zu tun (weitere Keys, die zum Beenden eines Suchwortes führen oder eine spezielle Behandung mancher Tasten nach Bedarf).
Damit darfst du dich dann selbst spielen Wink

Code:
Menu, ContextMenu, Add, DummyItemToCreateMenuFirstTime, Menu_Selected  ;Das wird benötigt da unten bei jedem Aufruf das alte Context-Menü erst gelöscht wird. Wenn es nicht existiert gibts nen Fehler

FileRead, CommandFile, Commands.txt
Loop, Parse, CommandFile, `n, `r   ;Parsen der Befehlsdatei im Arbeitsspeicher (schneller als direkt die Datei)
{
   if A_LoopField contains [,]  ;Entfernen der Sektionen
    Continue
   else
    CommandList = %CommandList%`n%A_LoopField%   ;Erstellen einer neuen Liste
}
CommandFile =   ;Löschen des eingelesenen Dateiinhalts (wird nicht mehr benötigt)
Sort, CommandList, D`n U   ;Die Liste wird alphabetisch sortiert und eventuelle Doppeleintragungen eliminiert
CommandList = %CommandList%`n    ;Hinten noch einmal einen Zeilenumbruch anhängen, damit ich auch beim letzten Wort danach suchen kann

Loop   ;Ich lasse die Input-Abfrage in einer Schleife laufen. Durch den Input-Befehl ist die Prozessorlast nicht vorhanden.
{
  Input, Char, I L1 T1 V,  {Enter}{LButton}{Left}{Right}{Up}{Down}{BS}{Space}  ;Hier wird eine Liste der Tasten erstellt die das Suchwort zurücksetzen.
  if Errorlevel contains Endkey  ;Hier wird auf diese Tasten abgefragt
  {
    if Errorlevel contains Backspace  ;Nur Backspace löscht diese nicht, sondern entfernt nur das letzte Zeichen
      StringTrimRight, Word, Word, 1
    else
    {
      Word =
      Continue
    } 
  }
  if Char !=   ;Zusammenbauen des Suchwortes aus einzelnen Zeichen
    Word = %Word%%Char%
   
  Start := InStr(CommandList, "`n" . Word)   ;Suchen ob das Suchwort überhaupt vorkommt.
  ToolTip, %Word%`n%Start%, 0, 0,  ;Anzeigen des Tooltipps
  if Start != 0
  {
    Ende := InStr(CommandList, "`n" . Word, 0, 0)  ;Der letzte gefundene Eintrag wird gesucht.
    StringMid, Results, CommandList, Start + 1, % InStr(CommandList, "`n", 0, Ende + 1) - Start  ;Es wird nach dem ersten Zeilenumbruch nach dem letzten Wort gesucht. Anschließend wird die Position des ersten Items abgezogen für die Längenermittlung.
  }

}

~^Down::
if Start = 0  ;Wurde nichts gefunden gibts eine Meldung
  Results = No Match
Menu, ContextMenu, DeleteAll  ;Löschen vorheriger Suchergebnisse
Loop, Parse, Results, `n   ;Erstellen des Menüs aus der Ergebnisliste
{
  if A_LoopField !=
    Menu, ContextMenu, Add, %A_LoopField%, Menu_Selected
}
Menu, ContextMenu, Show, % A_CaretX - 10, % A_CaretY + 10  ;Anzeigen beim Cursor
Return


Menu_Selected:   ;Wenn ein Menü ausgewählt wird werden eine Anzahl Backspaces geschickt die der Länge des Wortes entsprechen
Len := StrLen(Word)
Send {BS %Len%}
Send %A_ThisMenuItem%  ;Anschließend wird das ausgewählte Wort gesendet
Word =   ;Das Resultat wird zurückgesetzt
return

Thalon
_________________
Mein Motto: Hilfe zur Selbsthilfe!
Teildeutsche Hilfe (CHM)!! und Deutsche Online-Hilfe


Zuletzt bearbeitet von Thalon am Sa Sep 09, 2006 10:51 am, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
M'o



Anmeldedatum: 28.12.2005
Beiträge: 85
Wohnort: Leipzig

BeitragVerfasst am: Sa Sep 09, 2006 7:36 am    Titel: Antworten mit Zitat

Hi Thalon,

danke für den 'Anfang'. Aber das Aufrufen des Contextmenus per Tastenkombi ist blöd und eigentlich auch nicht so in diversen anderen Entwicklertools. Das ist ein Tastendruck mehr, der nicht nötig ist. Wenn man programmiert, schreibt man ja èn Block und möchte nicht unbedingt durch eine Tastenkombi unterbrochen werden...

Kann man mit AHK das auch automatisch nach jeder Eingabe eines Buchstabens durchführen, wenn diese Eingabe in einem bestimmten Fenster erfolgte?

Außerdem, Dein Skript ersetzt die ursprüngliche Eingabe nicht immer zuverlässig. Wäre es möglich, noch ein paar Kommentare hinzuzufügen?

Danke & Grüße
M'o
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BoBo
Gast





BeitragVerfasst am: Sa Sep 09, 2006 8:18 am    Titel: Antworten mit Zitat

@ M'o
Zitat:
Noch nicht perfekt, aber immerhin ein Anfang für dich
Damit warst, glaube ich - du gemeint.
Zitat:
Kann man mit AHK das auch automatisch nach jeder Eingabe eines Buchstabens durchführen, wenn diese Eingabe in einem bestimmten Fenster erfolgte?
Ja. Hinweise dazu in der Hilfe: #IfWinActive/Input
Zitat:
Außerdem, Dein Skript ersetzt die ursprüngliche Eingabe nicht immer zuverlässig. Wäre es möglich, noch ein paar Kommentare hinzuzufügen?
Ja. Und dein Beitrag dazu?
Nach oben
M'o



Anmeldedatum: 28.12.2005
Beiträge: 85
Wohnort: Leipzig

BeitragVerfasst am: Sa Sep 09, 2006 9:08 am    Titel: Antworten mit Zitat

@Bobo: Das das für mich gestrickt war, weiß ich. Darf ich mich trotzdem für den Anfang bedanken?

Sicher, mal sollte die Hilfe konsultieren, aber dazu muß man erstmal komplett den Code verstehen. Daher auch meine Bitte um ein paar kleine Kommentare...

Mein Beitrag? Eine kleine Board-Spende vielleicht...?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Thalon



Anmeldedatum: 25.10.2005
Beiträge: 1896
Wohnort: Österreich

BeitragVerfasst am: Sa Sep 09, 2006 10:55 am    Titel: Antworten mit Zitat

So, habs mal nachkommentiert.

Also ich kenne keinen Editor der dies ohne Tastenkürzel macht. Weder das Visual Studio von Microsoft, Eclipse, PSPad, TestComplete noch andere Editoren, die mir im Moment nicht namentlich einfallen. Das gebräuchlichte Kürzel ist {Ctrl}+{Space}.

Funktionieren wird obiger Code nicht, wenn du mit Cursor o.ä. im Wort navigierst, da man dann nicht mehr zuverlässig sagen kann wo du rumeditiert hast.

Ich bau dir den Code noch auf nen andren Ansatz um, sofern ich den hinbekomm...

Thalon
_________________
Mein Motto: Hilfe zur Selbsthilfe!
Teildeutsche Hilfe (CHM)!! und Deutsche Online-Hilfe
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Thalon



Anmeldedatum: 25.10.2005
Beiträge: 1896
Wohnort: Österreich

BeitragVerfasst am: Sa Sep 09, 2006 12:25 pm    Titel: Antworten mit Zitat

Und hier der Code des andren Ansatzes:

Code:
SendMode, Play
FileRead, CommandFile, Commands.txt
Loop, Parse, CommandFile, `n, `r   ;Parsen der Befehlsdatei im Arbeitsspeicher (schneller als direkt die Datei)
{
   if A_LoopField contains [,]  ;Entfernen der Sektionen
    Continue
   else
    CommandList = %CommandList%|%A_LoopField%   ;Erstellen einer neuen Liste
}
CommandFile =   ;Löschen des eingelesenen Dateiinhalts (wird nicht mehr benötigt)
Sort, CommandList, D| U   ;Die Liste wird alphabetisch sortiert und eventuelle Doppeleintragungen eliminiert
CommandList = %CommandList%|    ;Hinten noch einmal einen Zeilenumbruch anhängen, damit ich auch beim letzten Wort danach suchen kann

;Erstellen der Gui für das Suchfenster
Gui, Add, Edit, x0 y0 w150 vWord gWord
Gui, Add, Listbox, xp+0 y+0 w150 r5 Sort vCommandlist,
Gui, -Border
Gui, Show, Hide w150 h90, My Nameless Window
WinSet, AlwaysOnTop, On, My Nameless Window
return

Word:
GuiControlGet, Word, , Word
Start := InStr(CommandList, "|" . Word)   ;Suchen ob das Suchwort überhaupt vorkommt.
if Start != 0
{
  Ende := InStr(CommandList, "|" . Word, 0, 0)  ;Der letzte gefundene Eintrag wird gesucht.
  StringMid, Results, CommandList, Start, % InStr(CommandList, "|", 0, Ende + 1) - Start  ;Es wird nach dem ersten Zeilenumbruch nach dem letzten Wort gesucht. Anschließend wird die Position des ersten Items abgezogen für die Längenermittlung.
  GuiControl, , Commandlist, %Results%  ;Das Such-Ergebnis wird in die Listbox gesetzt
}
else
   GuiControl, , Commandlist, |
GuiControl, ChooseString, Commandlist, %Word%  ;Der beste Treffer wird in der Listbox markiert
return

#IfWinActive PSPad
~Space::
;Leeren vorheriger Ergebnisse
GuiControl, , Word
GuiControl, , Commandlist, |
;Anzeigen des Fensters
Gui, Show, x%A_CaretX% y%A_CaretY%
return

#IfWinActive My Nameless Window
Space::
GoSub, SendWord
Send, %A_Space%
GoSub, ~Space
return

Enter::
GoSub, SendWord
return

Esc::
Gui, Hide
return

;Mit Rauf + Runter kann man Einträge selektieren.
Up::
Down::
ControlSend, Listbox1, {%A_ThisHotkey%}, My Nameless Window
return

SendWord:
GuiControlGet, Word, , Word  ;Abfragen des eingegebenen Suchwortes
if InStr(CommandList, "|" . Word)  ;Falls es vorkommt wird das gewählte Suchwort übernommen, andernfalls die Eingabe
   GuiControlGet, Word, , CommandList
Gui, Hide
WinActivate, PSPad
SendRaw, %Word%
Word =
return

Thalon
_________________
Mein Motto: Hilfe zur Selbsthilfe!
Teildeutsche Hilfe (CHM)!! und Deutsche Online-Hilfe
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Boskoop



Anmeldedatum: 18.12.2005
Beiträge: 60

BeitragVerfasst am: Sa Sep 09, 2006 12:26 pm    Titel: Antworten mit Zitat

Im englischen Forum sind zwei Skripte mit ähnlicher Funktionalität gepostet worden:

Gruß
Boskoop
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Ich brauche Hilfe! Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de