Exécutez-vous souvent une recherche sur des fichiers texte? Je - tous les jours depuis plus de 25 ans.
Mes tâches sont très différentes en complexité et en portée.
Tout d'abord, en tant que programmeur, bien sûr, j'ai besoin de recherches dans les codes. Ces tâches sont simples (les ensembles de dossiers et de fichiers sont petits) et rapides (les résultats apparaissent presque immédiatement).
Deuxièmement, en tant qu'opérateur, je dois rechercher des centaines (parfois des milliers) de dossiers parmi des milliers (parfois des centaines de milliers) de fichiers. Ce sont des tâches difficiles tant en termes de volume de résultats que de temps de réception. En règle générale, les résultats de ces recherches nécessitent encore un traitement manuel ou logiciel supplémentaire.
Tout le travail se fait sous Windows.
Je vais vous dire où le désir m'a amené à avoir un outil adapté à de telles tâches.
Au début était TextPad
Depuis plus de 10 ans, TextPad est mon principal outil simple .
Puis (avant et peu après 2000), il a fait un excellent travail.
La recherche de fichiers ressemblait à ceci ( TextPad , 2004)

Impressions(+) Il y a peu de paramètres dans la boîte de dialogue, donc elle n'obscurcit pas le contenu des fichiers.
(+) L'onglet contenant les résultats de la recherche a un comportement spécial - Enter / DvKlik vous permet d'ouvrir le fragment trouvé. Sinon, c'est du texte brut "en mémoire" de l'éditeur.
(+) Il existe un paramètre Le File counts only
pour rechercher non pas les fragments eux-mêmes, mais uniquement leur nombre dans les fichiers. Cela accélère considérablement la recherche préliminaire .
(-) Il y a peu de paramètres et peu de commandes dans la boîte de dialogue. La boîte de dialogue est de taille fixe.
(-) Le langage artistique des expressions régulières, par exemple, au lieu de l'accepté maintenant \w
il était nécessaire d'écrire [:word:]
.
En général, il est de haute qualité, mais modeste.
Bobines et comparaisons
Les limites de TextPad et son gel ont conduit à des essais constants d'autres éditeurs.
Vous ne vous souvenez plus de tous ceux qui ont été essayés, mais parmi eux:
- Bloc-notes ++ . Je ne me souviens pas de ce qui l'a empêché de changer.
SublimeText3 , 2013. Un outil de piratage - excellent travail, un minimum de fonds, mais il faut beaucoup de choses à garder à l'esprit .
Impressions
(+) Contrôles minimaux.
(-) Différents paramètres "où chercher" dans un seul champ. Il est nécessaire de prendre en compte leur interaction.
(-) Seul le dialogue ci- joint .
(+) Les résultats tombent immédiatement dans l'onglet texte et sont visuels.
(-) Résultats au format fixe: chemin complet et nom de fichier, puis les lignes qui s'y trouvent. De la localisation des fragments trouvés, il n'y a que des numéros de ligne.
(+) Il y a un paramètre "Context", de sorte que les lignes trouvées avec les voisins entrent dans les résultats.
Il y a un tel gars
Basé sur le principe «Pas d'outil parfait? Créer», a changé la direction des efforts.
Il a commencé à prêter attention à la réactivité des développeurs. Et en 2012, j'ai eu de la chance avec SynWrite .
Le seul développeur, Alexei Torgashin, a accepté la plupart des idées, faites rapidement et efficacement. Un temps de mise en œuvre typique est un jour ou deux. Lors du forum, je lui ai posé des questions sur l'arrivée, puis environ une de plus, puis une dizaine, et plus ... Quelque part dans la troisième douzaine, j'ai réalisé que nous avions eu une bonne réunion .
D'après ma soumission, Alexey a amené la recherche de fichiers à un tel état ( SynWrite , 2016)

Impressions(+) Il existe une extraction de dossier à partir du fichier Current folder
.
(+) Vous pouvez trier les fichiers par date de modification.
(+) Il existe une liste d'ensembles prêts à l'emploi pour une recherche preset
et un accès rapide à ceux-ci ( F3
).
(-) Le dialogue est très surchargé et prend beaucoup de place.
(-) Les résultats sont présentés sous forme d' arbre de contrôle dans le panneau inférieur. Pour les obtenir sous forme de texte, vous devez appeler la commande à partir du menu local.
"De quoi avez-vous besoin, plus vieux?"
Avec SynWrite, la recherche est devenue beaucoup plus pratique. Comme vous le savez, l'appétit vient en mangeant, donc ma liste de souhaits s'est multipliée. C'est juste l'attitude du développeur, mon poisson rouge , envers eux qui était de plus en plus critique - "La mer Noire a été noircie . "
Voilà ce que je voulais obtenir
- Assurez-vous d'avoir besoin des résultats immédiatement sous forme de texte (pour un traitement ultérieur).
- Les résultats devraient être autosuffisants! Afin qu'ils puissent être sauvés, fermés, ouverts - et ils sont restés frais , c'est-à-dire prêts à travailler.
- Nous avons besoin d'une recherche dans les fichiers sur le disque et dans les fichiers ouverts (modifiés).
- Le dialogue pour résoudre des problèmes simples doit être compact. En particulier, les contrôles des «remplacements» et des paramètres rares ne doivent pas interférer avec une recherche normale.
- Nécessairement besoin d'une option pour les résultats avec les lignes adjacentes .
- Le mode "description complète d'un résultat sur une ligne" est nécessaire (pour un traitement ultérieur).
- Des informations d'aide sur la façon de remplir les champs ne sont pas nécessaires dans un fichier externe ou une page cloud, mais juste là, par exemple, dans des info-bulles.
Faites-le vous-même!
J'ai de nouveau eu de la chance. Alex a créé un nouvel éditeur CudaText et y a vissé l' API Python .
Enfin, vous pouvez tout faire à votre guise sous la forme d'un plugin en Python.
La première version est sortie en mai 2016.
L'ensemble minimal de contrôles L'ensemble maximum de contrôles
Bien sûr, ce n'est pas tout à fait la première crêpe , mais le désir "de tout fourrer dans tarte dialogue "est clairement visible.
Voici ce que je postule maintenant

Implémentation de toutes les listes de souhaits de la liste "Que voulez-vous?"
(1) Les résultats peuvent être vus soit à l'intérieur de la boîte de dialogue, soit immédiatement affichés dans un fichier (si [x] Send
).
(2) Les résultats se décrivent d'eux-mêmes. Dans le texte

suffisamment d'informations pour connaître le nom de fichier complet et l'emplacement du fragment trouvé.
1:21:6
signifie: 1 ligne, 21 colonnes, longueur de fragment 6.
Le plugin est capable d'extraire et d'utiliser ces informations.
(3) Il y a une recherche sur les documents non enregistrés. Pour ce faire, une ligne spéciale <Open Files>
est entrée dans le champ In folder
(les abréviations <Tabs>
et <t>
).
(4) Vous pouvez masquer les contrôles nécessaires pour spécifier les fichiers exclus, pour effectuer des remplacements, pour afficher les résultats et les codes source dans une boîte de dialogue.
(7) Dans les info-bulles, les signatures des champs remplis librement ont des explications
Implémenté de nombreuses autres pièces différentes.
La profondeur de départ peut être nulle ( Only
), complète ( +All
) ou de 1 ( +1 level
) à 5 ( +5 levels
).
Les options de recherche rarement utilisées apparaissent sur For search

Options de recherche avancées • ** / ** . • . • / .  • , ( ).
- Si les résultats n'apparaissent pas dans la boîte de dialogue (
[x] Send
), alors il y a des paramètres supplémentaires pour eux

Paramètres de résultat avancés • `Report to` - , , . • `Append` - . • `Tree type` - `<path><file><r:c:l><line>`, `<><><>< >` , (" "-6).  • `Align (r:c:l)` - `<r:c:l>` , `< >` . :  • `Add context` - (" "-5).
Vous pouvez vous souvenir de la place / taille de la boîte de dialogue / contrôles - faire la mise en page. Les cinq premières dispositions sont appliquées par Alt+1
(.. 5
), le reste - à partir du menu.
Presque tout dans le dialogue peut se faire sans souris . Pour cela il y a
Pour les équipes il y a
Le menuLe bouton hamburger est juste un "=" avec un soulignement, il est donc disponible par Alt+=
.

Le processus de recherche est divisé en trois phases consécutives:
• une collection de fichiers appropriés est générée,
• des fragments sont extraits de fichiers,
• un rapport sur les résultats est rempli.
Les informations sur chaque phase et leur modification sont affichées dans le contrôle d'état.
Esc
vous permet d'interrompre uniquement la phase en cours et de passer à la suivante avec les données accumulées.
En plus des paramètres normaux définis par l'utilisateur, il existe de nombreuses options rarement modifiées. Maintenant, il y en a 19 et pour eux un dialogue séparé
Boîte de dialogue des options
Par exemple, parmi les options, il y a:
• Utilisez le texte sélectionné pour remplir le champ Find what
lorsque vous ouvrez la boîte de dialogue.
• Interrompez toutes les phases de la recherche avec un seul ESC
.
• Fermez la boîte de dialogue lors de la recherche et de la sortie des résultats dans un fichier.
• Réduisez les résultats précédents lorsque vous en ajoutez de nouveaux au même fichier.
• Enregistrez tous les paramètres de recherche dans la première ligne de résultats. Cela vous permet de les charger ultérieurement dans la boîte de dialogue.
• Ignorez les fichiers plus grands que la taille spécifiée.
• Définissez le style des fragments trouvés. Couleur / gras / inclinaison du texte, couleur de fond, style de cadre disponibles de chaque côté. Dans les images ci-dessus, le style "cadre avec des points sous le fragment" est défini.
- Certaines commandes de plugin fonctionnent avant et après la boîte de dialogue.

Depuis le menu principal de CudaText • `Find in *` - . • `Navigate to *` - , , . • `Jump to *` - / , , . • `Configure *` - , 
CudaText et Python
Quelques mots sur la plateforme sur laquelle mon plug-in s'est développé.
Alexey Torgashin a fait SynWrite chez Delphi. La moitié des codes de cet éditeur ont été concédés sous licence par un autre développeur, ce qui a empêché la mise en œuvre de nouvelles idées. Et Delphi est payé. Pour cette raison, Alex est passé à Free Pascal et IDE Lazarus , a implémenté les parties manquantes par lui-même et a créé CudaText en 2015, et SynWrite a gelé. L'occasion de repartir de zéro a été utilisée de façon judicieuse - il a apporté plusieurs améliorations de conception fortes.
- Les paramètres ont commencé à être superposés en couches: par défaut , général , lex , fichier actuel . Ils ont commencé à être stockés dans
json
, mais pas dans ini
. La modification des paramètres est devenue l'édition de texte habituelle au format json
. - Le noyau s'est débarrassé d'un grand nombre de services non critiques. En particulier, à partir de recherches de fichiers, de macros, d'appels d'utilitaires externes, du configurateur de menus, d'extraits, de tris, de favoris, etc.
- Pour créer de tels services, le noyau fournit l'API Python, qui inclut la bibliothèque GUI. Maintenant, les plugins ont implémenté tous les services précédents et en ont ajouté beaucoup de nouveaux.
- De plus, le noyau lui-même est devenu multi-module. Il existe des composants de marqueurs, de signets, d'attributs pour les crochets, etc.
L'influence de Sublime Text est clairement visible ici. Pour autant que je sache, Alexey ne cache pas qu'il prend en compte les idées de Sublime et de ses plugins. Il jette également un œil à Atom et Brackets.
Cela s'est bien passé en soi, mais compte tenu de la productivité et de la réactivité élevées d'Alexey, c'était excellent. Pour expliquer de quel type de productivité et de réactivité nous parlons, je vais donner quelques faits:
- Alexei a créé: lexers - 201, linter - 34, snippet-sets - 12, plug-ins - 93.
- Depuis octobre 2015, il y a eu plus de 1200 souhaits (aucune réclamation) chez GitHub , dont plus de 90% sont satisfaits.
CudaText est gratuit, open source, il existe des assemblages pour Win / Linux / Mac / BSD. Je n'utilise moi-même que la version Win, mais je vois les souhaits et les plaintes des utilisateurs de Linux et Mac. Sur le même Lazare, d'ailleurs, Total Commander est écrit.
Il est intéressant de comparer les API Python pour Sublime et CudaText . Ils sont complètement différents.
• Sublime a un style d'objet de type DOM.
• CudaText a un style procédural tel que API OS, par exemple, WIN32.
Apparemment, cette différence vient des langages d'implémentation. Si l'éditeur lui-même est implémenté en Python, le style DOM de l'API lui est naturel - vous pouvez stocker des liens vers des objets. Et si l'éditeur est en Pascal, il ne peut être stocké que par des gestionnaires.
• L'API Sublime n'a pas d'interface graphique. Le plugin peut apparemment utiliser l'interface graphique Python (Tk? WxPython? Qt?), Mais le style contrastera avec Sublime.
• CudaText fournit des plugins GUI dans le style général de l'application. Premièrement, il existe un riche arsenal de contrôles de base: checklistbox
, listview
, checklistview
, treeview
et, bien sûr, des boutons ordinaires, des vérifications, des éditeurs monolignes et multilignes, des zones de liste déroulante, etc. Deuxièmement, il est possible d'incorporer des composants CudaText dans l'interface graphique. Dans les images ci-dessus, il s'agit d'un contrôle d'état, d'un menu local et de contrôles d'édition avec les résultats / source. Une telle complémentation avec une interface graphique Python pure n'est pas du tout possible.
Et vivre sans interface graphiqueComme j'ai déjà créé une douzaine de plugins pour CudaText, et que la plupart d'entre eux communiquaient avec l'utilisateur via des boîtes de dialogue, il m'est maintenant extrêmement difficile d'imaginer comment des plugins peuvent être créés sans cette richesse . Bien sûr, si le plugin n'a qu'une seule boîte de dialogue qui vous permet de spécifier les paramètres, l'édition de json
donne un remplacement adéquat. Mais une telle édition est effectuée «avant le lancement» du plugin, cela ne peut pas aider si une réaction de l'utilisateur en temps réel est nécessaire.
Y a-t-il une limite?
Environ une fois tous les deux à trois mois, et cela dure, je me souviens, déjà deux ans et demi, il me semble que "c'est la finale" - le dialogue est léché, les résultats sont affichés de toutes les manières, il y a toutes les commandes utiles. Mais comme cet outil est constamment utilisé, puisque presque toutes ses fonctionnalités sont utilisées, tandis que les mains cliquent sur la prochaine recherche ou étudient les prochains résultats, la tête recherche de nouvelles améliorations. Et trouve!
Avoir de nouvelles idéesPar exemple, lors de la rédaction de ce post, sont nés:
• Vous pouvez sélectionner du texte dans les contrôles Résultats ou Source et donner une commande pour le rechercher.
• Vous pouvez intercepter les événements "fichier ouvert" avec les résultats et restaurer le style des fragments trouvés.
De plus, je suis intéressé à comprendre si l'esprit collectif peut suggérer de nouveaux mouvements dans ce jeu . Par conséquent, je termine par une question pour les autres programmeurs:
Quoi d'autre peut être ajouté à la «recherche de fichiers» dans l'éditeur de texte?
Détails techniques de l'implémentation du plugin pour CudaText• Langue: Python 3.5
• Bibliothèque GUI: API CudaText
• Développeurs: Andrey Kvichansky
• Taille du code:> 300 Ko
• Nombre de ToDo pour plugin:> 250
• Numéro de bogue / souhait pour l'API CudaText:> 150
• Forum sur les plugins: problèmes avec GitHub
Comment essayer• Téléchargez l'assemblage CudaText pour votre système d'exploitation, décompressez ou installez.
• Lancez CudaText et appelez la commande de menu Plugins/Addons Manager/Install...
• Entrez "find" pour que le filtre ne laisse que FindInFile
à installer (il peut être nécessaire de rappeler CudaText, ce n'est pas nécessaire sur Win).
• Appelez la commande de menu Plugins/Find in Files/Find in files...