Wie weit gehen Träume von der perfekten „Dateisuche“?

Führen Sie häufig eine Suche nach Textdateien durch? Ich - seit mehr als 25 Jahren jeden Tag.


Meine Aufgaben sind in Komplexität und Umfang sehr unterschiedlich.


Zunächst muss ich als Programmierer natürlich in den Codes suchen. Diese Aufgaben sind einfach (Ordner- und Dateisätze sind klein) und schnell (Ergebnisse werden fast sofort angezeigt).


Zweitens muss ich als Operator Hunderte (manchmal Tausende) Ordner unter Tausenden (manchmal Hunderttausenden) Dateien durchsuchen. Dies sind schwierige Aufgaben, sowohl in Bezug auf das Ergebnisvolumen als auch auf die Zeit, in der sie eingegangen sind. Typischerweise erfordern die Ergebnisse solcher Suchvorgänge noch eine weitere manuelle oder Software-Verarbeitung.


Alle Arbeiten werden unter Windows ausgeführt.


Ich werde Ihnen sagen, wohin mich der Wunsch geführt hat, ein geeignetes Werkzeug für solche Aufgaben zu haben.


Am Anfang war TextPad


Seit über 10 Jahren ist TextPad mein einfaches Hauptwerkzeug.
Dann (vor und kurz nach 2000) hat er hervorragende Arbeit geleistet.


Die Dateisuche sah so aus ( TextPad , 2004)


TextPad_fif


Impressionen

(+) Der Dialog enthält nur wenige Einstellungen, sodass der Inhalt der Dateien nicht verdeckt wird.
(+) Die Registerkarte mit den Suchergebnissen weist ein besonderes Verhalten auf. Mit Enter / DvKlik können Sie das gefundene Fragment öffnen. Andernfalls handelt es sich um einfachen Text "im Speicher" des Editors.
(+) Es gibt eine Einstellung. Die Anzahl der Dateien gilt File counts only für die Suche nicht nach Fragmenten selbst, sondern nur nach deren Anzahl in Dateien. Dies beschleunigt die vorläufige Suche erheblich.
(-) Der Dialog enthält nur wenige Einstellungen und Befehle. Das Dialogfeld hat eine feste Größe.
(-) Die künstlerische Sprache der regulären Ausdrücke zum Beispiel war es notwendig, anstelle des jetzt akzeptierten \w [:word:] zu schreiben.
Im Allgemeinen ist es von hoher Qualität, aber bescheiden.




Rollen und Vergleiche


Die Einschränkungen von TextPad und sein Einfrieren führten zu ständigen Tests mit anderen Editoren.
Jetzt können Sie sich nicht mehr an alle Erprobten erinnern, aber darunter waren:


  • MS Visual Studio . Schweres Monster.
  • Eclipse Auch ein Monster.
  • IntelliJ IDEE . Charmant. Dient und dient als Anbieter von Beispielen, wie Sie dies bequem tun können .


    Impressionen

    Diese alte Idee ist bereits verloren. Zum Vergleich die aktuelle Implementierung in PyCharm , 2017.1.3
    Pycharm_fif
    (+) Eine unvorstellbare Anzahl von Einstellungen und Modi.
    (+) Autarkie des Dialogs: Ergebnisse, Quellcodes und Suchstatistiken sind sichtbar.
    (-) Die Suchtiefe in Ordnern ist nicht eingeschränkt - entweder einer oder alle gleichzeitig.
    (-) Nein (ich kenne den Weg nicht) Suche in mehreren Ordnern.
    (-) Keine (ich kenne den Weg nicht) Ausgabe der Ergebnisse im Textformat.


    Im Allgemeinen ist es mächtig, aber nicht universell.




  • Editor ++ . Ich kann mich nicht erinnern, was ihn daran gehindert hat, zu wechseln.
  • SublimeText3 , 2013. Ein Hacker- Tool - hervorragende Arbeit, ein Minimum an Geld, aber es braucht viel , um es im Auge zu behalten .


    Impressionen

    Sublime_fif
    (+) Mindestkontrollen.
    (-) Verschiedene Einstellungen "Wo soll gesucht werden?" In einem Feld. Es ist notwendig, ihre Interaktion zu berücksichtigen.
    (-) Nur beigefügter Dialog.
    (+) Die Ergebnisse fallen sofort in die Textregisterkarte und sind visuell.
    (-) Feste Formatergebnisse: vollständiger Pfad und Dateiname, dann die darin gefundenen Zeilen. Aus der Lokalisierung der gefundenen Fragmente ergeben sich nur Zeilennummern.
    (+) Es gibt eine Einstellung "Kontext", damit die gefundenen Zeilen mit den Nachbarn in die Ergebnisse gelangen.






Da ist so ein Typ


Basierend auf dem Prinzip "Kein perfektes Werkzeug? Erstellen" änderte sich die Richtung der Bemühungen.
Er begann auf die Reaktionsfähigkeit der Entwickler zu achten. Und 2012 hatte ich Glück mit SynWrite .


Der einzige Entwickler, Alexei Torgashin, akzeptierte die meisten Ideen, die schnell und effizient umgesetzt wurden. Eine typische Implementierungszeit beträgt ein oder zwei Tage. Im Forum fragte ich ihn nach dem Ziel, dann nach einem weiteren, dann nach zehn und mehr ... Irgendwann im dritten Dutzend wurde mir klar, dass wir ein gutes Treffen hatten .


Aus meiner Sicht hat Alexey die Dateisuche in einen solchen Zustand gebracht ( SynWrite , 2016)


Bild


Impressionen

(+) Es wird ein Ordner aus der aktuellen Datei extrahiert. Current folder .
(+) Sie können Dateien nach Änderungsdatum sortieren.
(+) Es gibt eine Liste vorgefertigter Sets für die preset Suche und den schnellen Zugriff darauf ( F3 ).
(-) Der Dialog ist sehr überlastet und nimmt viel Platz ein.
(-) Die Ergebnisse werden im unteren Bereich als Kontrollbaum dargestellt . Um sie in Textform zu erhalten, müssen Sie den Befehl über das lokale Menü aufrufen.




"Was brauchst du, älter?"


Mit SynWrite ist die Suche wesentlich komfortabler geworden. Wie Sie wissen, kommt der Appetit mit dem Essen, also vervielfachte sich meine Wunschliste. Das ist nur die Haltung des Entwicklers, meines Goldfisches , gegenüber ihnen wurde immer kritischer - "Das Schwarze Meer wurde geschwärzt . "


Das wollte ich bekommen


  1. Stellen Sie sicher, dass Sie die Ergebnisse sofort in Textform benötigen (zur weiteren Verarbeitung).
  2. Die Ergebnisse sollten autark sein! Damit sie gerettet, geschlossen, geöffnet werden konnten - und frisch blieben, also bereit für die Arbeit.
  3. Wir brauchen eine Suche in den Dateien auf der Festplatte und in den geöffneten (geänderten) Dateien.
  4. Der Dialog zur Lösung einfacher Probleme sollte kompakt sein. Insbesondere Steuerelemente für "Ersetzungen" und seltene Einstellungen sollten eine normale Suche nicht beeinträchtigen.
  5. Benötigen Sie unbedingt eine Option für die Ergebnisse zusammen mit benachbarten Zeilen .
  6. Der Modus "Vollständige Beschreibung eines Ergebnisses in einer Zeile" ist erforderlich (für die weitere Verarbeitung).
  7. Hilfeinformationen zum Ausfüllen der Felder werden nicht in einer externen Datei oder Cloud-Seite benötigt, sondern genau dort, beispielsweise in QuickInfos.



Mach es selbst!


Ich hatte wieder Glück. Alex hat einen neuen CudaText- Editor erstellt und die Python-API daran angeschraubt.


Schließlich können Sie in Python alles nach Belieben in Form eines Plugins ausführen.


Die erste Version wurde im Mai 2016 veröffentlicht.


Der minimale Satz von Steuerelementen

fif-dlg-min


Der maximale Satz von Steuerelementen

fif-full-dlg
Dies ist natürlich nicht ganz der erste Pfannkuchen , sondern der Wunsch, "alles hinein zu stopfen" Kuchen Dialog "ist deutlich sichtbar.


Folgendes bewerbe ich mich jetzt


cuda_fif


Implementierte alle Wunschliste aus der Liste "Was willst du?"


(1) Die Ergebnisse können entweder im Dialogfeld angezeigt oder sofort in eine Datei ausgegeben werden (wenn [x] Send ).


(2) Die Ergebnisse sind selbstbeschreibend. Im Text


fif_rpt_info


genug Informationen, um den vollständigen Dateinamen und den Speicherort des gefundenen Fragments herauszufinden.
1:21:6 bedeutet: 1 Zeile, 21 Spalten, Fragmentlänge 6.


Das Plugin kann diese Informationen extrahieren und verwenden.


(3) Es wird nach nicht gespeicherten Dokumenten gesucht. Dazu wird im Feld In folder eine spezielle Zeile <Open Files> eingegeben (die Abkürzungen <Tabs> und <t> ).


(4) Sie können die Steuerelemente ausblenden, die zum Angeben ausgeschlossener Dateien, zum Durchführen von Ersetzungen und zum Anzeigen von Ergebnissen und Quellcodes in einem Dialogfeld erforderlich sind.


Versteckte Steuerelemente

• Minimaler Satz fif_min
• Minimaler Satz und Ersatz fif_repl
• Mindestmenge und Einstellung von Ausnahmen für Dateien fif_excl


(7) In QuickInfos haben Signaturen für frei ausgefüllte Felder Erklärungen


Tipps

fif_incl
fif_tip_fold
Weitere Informationen sind verfügbar, wenn Alt+H aufgerufen wird Alt+H
fif_help_tips


Implementierte viele weitere verschiedene Stücke .


  • Die Abflugtiefe kann null ( Only ), voll ( +All ) oder von 1 ( +1 level ) bis 5 ( +5 levels ) sein.


  • Selten verwendete Suchoptionen werden unter For search



fif_extra_fi


Erweiterte Suchoptionen
 ** / ** . •      . •         / . ![fif_first](https://user-images.githubusercontent.com/7419630/42456464-b0448f20-839d-11e8-8876-435fdfead1ad.png) •   ,        (  ). 

  • Wenn die Ergebnisse nicht im Dialogfeld angezeigt werden ( [x] Send ), gibt es zusätzliche Parameter für sie

fif_extra_rp


Erweiterte Ergebnisparameter
 • `Report to` -    ,    ,        . • `Append` -   . • `Tree type` -      `<path><file><r:c:l><line>`,   `<><><><  >`  ,    (" "-6).      ![fif_help_tree](https://user-images.githubusercontent.com/7419630/42456892-a7d867c0-839e-11e8-87f2-2b9ce6b5c530.png) • `Align (r:c:l)` -     `<r:c:l>` ,   `<  >`    . : ![fif_align](https://user-images.githubusercontent.com/7419630/42616450-036e3ae6-85b7-11e8-861a-cf27a3a07c7a.png) • `Add context` -     (" "-5). 

  • Sie können sich Suchparameter merken - Voreinstellungen vornehmen. Die ersten fünf Voreinstellungen werden mit Ctrl+1 (.. 5 ) angewendet, der Rest - über das Menü oder den Dialog Presets


    Dialogvoreinstellungen

    fif_pset




  • Sie können sich an die Stelle / Größe des Dialogfelds / der Steuerelemente erinnern - Layout ausführen. Die ersten fünf Layouts werden mit Alt+1 (.. 5 ) angewendet, der Rest - aus dem Menü.


  • Fast alles im Dialog kann ohne Maus gemacht werden . Dafür gibt es


    Hotkeys

    fif_help_keys




  • Für Teams gibt es


    Menü

    Die Hamburger- Taste ist nur ein "=" mit einer Unterstreichung, daher ist sie mit Alt+= verfügbar.
    fif_menu_find




  • Der Suchvorgang ist in drei aufeinanderfolgende Phasen unterteilt:
    • eine Sammlung geeigneter Dateien wird generiert,
    • Fragmente werden aus Dateien extrahiert,
    • Ein Bericht über die Ergebnisse wird ausgefüllt.
    Informationen zu jeder Phase und ihrer Änderung werden in der Statussteuerung angezeigt.
    Esc können Sie nur die aktuelle Phase unterbrechen und mit den gesammelten Daten zur nächsten übergehen.


  • Zusätzlich zu benutzerdefinierten normalen Parametern gibt es viele selten geänderte Optionen. Jetzt gibt es 19 von ihnen und für sie einen separaten Dialog


    Optionsdialog

    fif_opts
    Zu den Optionen gehören beispielsweise:
    • Verwenden Sie den ausgewählten Text, um beim Öffnen des Dialogfelds Find what Feld Find what nach auszufüllen.
    • Unterbrechen Sie alle Phasen der Suche mit einem ESC .
    • Schließen Sie den Dialog, wenn Sie Ergebnisse suchen und in eine Datei ausgeben.
    • Reduzieren Sie frühere Ergebnisse, wenn Sie derselben Datei neue hinzufügen.
    • Speichern Sie alle Suchparameter in der ersten Ergebniszeile. Auf diese Weise können Sie sie später in den Dialog laden.
    • Überspringen Sie Dateien, die größer als die angegebene Größe sind.
    • Legen Sie den Stil für die gefundenen Fragmente fest. Verfügbare Farbe / Kühnheit / Neigung des Textes, Hintergrundfarbe, Rahmenstil auf jeder Seite. In den obigen Bildern ist der Stil "Rahmen mit Punkten unter dem Fragment" festgelegt.




  • Einige Plugin-Befehle funktionieren vor und nach dem Dialog.

cuda_menu


Aus dem CudaText-Hauptmenü
 • `Find in *` -        . • `Navigate to *` -     ,    ,   . • `Jump to *` -   /    ,     ,     . • `Configure *` -        ,       ![fif_dclk](https://user-images.githubusercontent.com/7419630/42460070-aa1c5f26-83a5-11e8-9103-11f676dcf08a.png) 



CudaText und Python


Ein paar Worte zu der Plattform, auf der mein Plug-In gewachsen ist.


Alexey Torgashin hat SynWrite bei Delphi gemacht. Die Hälfte der Codes dieses Editors wurde von einem anderen Entwickler lizenziert, was die Umsetzung neuer Ideen verhinderte. Und Delphi wird bezahlt. Aus diesem Grund wechselte Alex zu Free Pascal und IDE Lazarus , implementierte die fehlenden Teile selbst und erstellte 2015 CudaText, und SynWrite erstarrte. Die Gelegenheit, bei Null anzufangen, wurde sinnvoll genutzt - er nahm mehrere starke Designverbesserungen vor.


  1. Die Einstellungen wurden in Ebenen überlagert: Standard , Allgemein , Lex , aktuelle Datei . Sie wurden in json gelagert, aber nicht ini . Das Ändern der Einstellungen ist zur üblichen Textbearbeitung im json Format geworden.
  2. Der Kernel hat eine große Anzahl unkritischer Dienste entfernt. Insbesondere von Dateisuchen, Makros, Aufrufen externer Dienstprogramme, dem Menükonfigurator, Snippets, Sortierungen, Favoriten usw.
  3. Um solche Dienste zu erstellen, stellt der Kernel die Python-API bereit, die die GUI-Bibliothek enthält. Jetzt haben Plugins alle vorherigen Dienste implementiert und viele neue hinzugefügt.
  4. Darüber hinaus ist der Kern selbst zu einem Multimodul geworden. Es gibt Komponenten von Markierungen, Lesezeichen, Attributen für Klammern usw.

Der Einfluss von Sublime Text ist hier deutlich sichtbar. Soweit ich weiß, verbirgt Alexey nicht, dass er die Ideen von Sublime und seinen Plugins berücksichtigt. Er wirft auch einen Blick auf Atom und Brackets.


Es hat sich als gut herausgestellt, aber angesichts der hohen Produktivität und Reaktionsfähigkeit von Alexey war es ausgezeichnet. Um zu erklären, um welche Art von Produktivität und Reaktionsfähigkeit es sich handelt, möchte ich einige Fakten nennen:


  • Alexei erstellt: Lexer - 201, Linter - 34, Snippet-Sets - 12, Plug-Ins - 93.
  • Seit Oktober 2015 gab es bei GitHub mehr als 1.200 Wünsche (keine Beschwerden), von denen mehr als 90% erfüllt sind.

CudaText ist kostenlos, Open Source, es gibt Assemblys für Win / Linux / Mac / BSD. Ich selbst benutze nur die Win-Version, aber ich sehe die Wünsche und Beschwerden von Benutzern mit Linux und Mac. Auf demselben Lazarus steht übrigens Total Commander .


Es ist interessant, die Python-APIs für Sublime und CudaText zu vergleichen. Sie sind völlig anders.


• Sublime hat einen Objektstil vom Typ DOM.


• CudaText hat einen prozeduralen Stil wie das API-Betriebssystem, z. B. WIN32.


Anscheinend liegt dieser Unterschied in den Implementierungssprachen. Wenn der Editor selbst in Python implementiert ist, ist der DOM-Stil der API für ihn selbstverständlich - Sie können Links zu Objekten speichern. Wenn sich der Editor in Pascal befindet, kann er nur von Handlern gespeichert werden.


• Die Sublime-API verfügt nicht über eine GUI. Das Plugin kann anscheinend die Python-GUI (Tk? WxPython? Qt?) Verwenden, aber der Stil wird sich von Sublime abheben.


• CudaText bietet GUI-Plugins im Gesamtstil der Anwendung. Erstens gibt es ein reichhaltiges Arsenal an grundlegenden Steuerelementen: checklistbox , listview , checklistbox , listview und natürlich normale Schaltflächen, Überprüfungen, ein- und mehrzeilige Editoren, Kombinationsfelder usw. Zweitens gibt es die Möglichkeit, CudaText-Komponenten in die GUI einzubetten. In den obigen Bildern handelt es sich um eine Statussteuerung, ein lokales Menü und eine Editorsteuerung mit den Ergebnissen / der Quelle. Eine solche Ergänzung mit einer reinen Python-GUI ist überhaupt nicht möglich.


Und ohne GUI leben

Da ich bereits ein Dutzend Plugins für CudaText erstellt habe und die meisten über Dialogfelder mit dem Benutzer kommuniziert haben, ist es für mich jetzt äußerst schwierig, mir vorzustellen, wie Plugins ohne diesen Reichtum erstellt werden können. Wenn das Plugin nur einen Dialog hat, in dem Sie Einstellungen festlegen können, bietet die Bearbeitung von json natürlich einen angemessenen Ersatz. Eine solche Bearbeitung wird jedoch "vor dem Start" des Plugins durchgeführt. Es kann nicht helfen, wenn eine Live- Laufzeit- Benutzerreaktion erforderlich ist.




Gibt es eine Grenze?


Ungefähr alle zwei bis drei Monate, und das dauert, wie ich mich erinnere, bereits zweieinhalb Jahre, scheint es mir, dass "dies das Finale ist" - der Dialog wird geleckt, die Ergebnisse werden auf alle Arten gezeigt, es gibt alle nützlichen Befehle. Da dieses Tool jedoch ständig verwendet wird und fast alle Funktionen verwendet werden, während die Hände die nächste Suche drücken oder die nächsten Ergebnisse studieren, sucht der Kopf nach neuen Verbesserungen. Und findet!


Habe neue Ideen

Zum Beispiel wurden beim Schreiben dieses Beitrags die folgenden geboren:
• Sie können Text in den Steuerelementen Ergebnisse oder Quelle auswählen und einen Befehl zum Suchen eingeben.
• Sie können die Ereignisse "Datei öffnen" mit den Ergebnissen abfangen und den Stil der gefundenen Fragmente wiederherstellen.


Außerdem bin ich daran interessiert zu verstehen, ob der kollektive Verstand neue Züge in diesem Spiel vorschlagen kann. Daher schließe ich mit einer Frage an andere Programmierer:
Was kann der „Dateisuche“ im Texteditor noch hinzugefügt werden?




Technische Details zur Implementierung des Plugins für CudaText

• Sprache: Python 3.5
• GUI-Bibliothek: CudaText-API
• Entwickler: Andrey Kvichansky
• Codegröße:> 300 Kb
• Anzahl der Aufgaben für das Plugin:> 250
• Fehler- / Wunschnummer für die CudaText-API:> 150
• Plugin-Forum: GitHub-Probleme


Wie man es versucht

• Laden Sie die CudaText-Assembly für Ihr Betriebssystem herunter, entpacken oder installieren Sie sie.
• Starten Sie CudaText und rufen Sie den Menübefehl Plugins/Addons Manager/Install...
• Geben Sie "find" ein, damit der Filter nur FindInFile zur Installation FindInFile (möglicherweise muss CudaText erneut aufgerufen werden, unter Win ist dies nicht erforderlich).
• Rufen Sie den Menübefehl Plugins/Find in Files/Find in files...

Source: https://habr.com/ru/post/de417367/


All Articles