Afficher la liste des mots au bas du cadre?

20

Je voudrais afficher 3 listes de mots sur des lignes distinctes horizontalement en bas (bien que le haut fonctionnerait aussi) de chaque cadre emacs que j'ai ouvert. J'ai pensé à 6 façons de le faire, et ils ont tous des problèmes:

  1. Ma première pensée a été d'ajouter une ligne à ma ligne de mode, mais AFAICT vous ne pouvez pas utiliser le caractère de nouvelle ligne dans une ligne de mode, il est simplement converti en "^ J".

  2. Ma deuxième pensée était d'avoir la ligne en haut de l'écran et d'utiliser la ligne d'en-tête, mais elle ne prend pas en charge le caractère de nouvelle ligne non plus.

  3. Je pourrais afficher une superposition sur les 3 dernières lignes de la fenêtre, mais rendre ce robuste semble difficile - le défilement devrait être déclenché lorsque le point atteint la superposition plutôt que la fin réelle de la fenêtre, et je devrais constamment repositionner la superposition, car les superpositions se trouvent dans l'espace de texte et non dans l'espace de la fenêtre.

  4. Je pourrais essayer de faire des fenêtres dédiées au bas du cadre. J'ai essayé de coder cela, mais ce n'est pas très robuste non plus, cela ne semble pas fonctionner correctement lorsqu'un cadre contient déjà des fenêtres fractionnées et j'ai dû relier Cx, 1 à une version personnalisée de delete-other-windows qui ignore mes fenêtres spéciales et je suis sûr qu'il y a d'autres cas d'angle. De plus, lorsqu'une fenêtre d'aide s'ouvre maintenant, elle s'ouvre verticalement car elle pense qu'il y a déjà une division horizontale (ce qui existe techniquement, mais c'est uniquement pour afficher une fenêtre d'une ligne).

  5. Je pourrais avoir un cadre dédié pour cela, mais ma configuration ne fonctionnera pas en mode terminal, et je devrais script mon gestionnaire de fenêtres pour gérer le garder en bas de l'écran, le rendant non sélectionnable, n'affectant pas la mise en page, etc.

  6. Je pourrais insérer le texte des 3 lignes directement dans le mini-tampon. Je l'ai fait fonctionner partiellement, je peux agrandir le mini-tampon pour accueillir les 3 lignes, et je peux les afficher. Cependant, à chaque fois qu'un message est répété, les lignes disparaissent jusqu'à ce que j'émette une autre commande à quel point elles réapparaissent. Idéalement, les 3 lignes et la zone d'écho ne se chevaucheraient pas afin que je puisse voir les deux. Ce serait moins ennuyeux si je pouvais filtrer de manière fiable les messages qui vont dans la zone d'écho - j'ai trouvé une solution sur EmacsWiki mais cela ne semble pas fonctionner pour les messages qui proviennent de la source emacs C (en particulier, j'aimerais obtenir débarrasser des fichiers de sauvegarde des messages car je sauvegarde automatiquement souvent sur une minuterie).

Pour le contexte, mon objectif est d'avoir constamment un affichage des mots les plus fréquemment utilisés dans le tampon actuel, le point le plus proche des mots dans le tampon actuel et les mots les plus récemment utilisés dans le tampon actuel. J'ai l'intention de pouvoir les insérer dans le tampon via des commandes vocales. Je pourrais donc dire "2 les plus proches" et lui faire choisir le deuxième élément de la liste des mots le plus proche et l'insérer. Je me soucie seulement que les listes de mots soient visibles pour le tampon que j'édite actuellement. Je ne veux pas utiliser les fenêtres contextuelles utilisées par les différents modes de complétion de code car j'ai besoin que les listes soient toujours visibles.

Joseph Garvin
la source
Bonne question, et bien posée. J'espère que vous obtiendrez des suggestions utiles.
Drew
Je m'interroge sur les autres parties du # 5, outre le besoin en mode terminal (qui est majeur). Vous pouvez utiliser un cadre dédié qui est positionné en bas (pas de problème). Qu'entendez-vous par non sélectionnable et pourquoi en avez-vous besoin? Si vous voulez dire en lecture seule, ce n'est pas un problème non plus. Que voulez-vous dire en n'affectant pas la mise en page ? En somme, # 5 n'est pas trop clair pour moi.
Drew
@Drew: Je veux dire que je conduis ma WM à l'aide du clavier, et il est peu probable que je veuille jamais mettre l'accent sur ce cadre, donc je voudrais que mes liaisons de fenêtre suivante / fenêtre précédente sautent dessus. De même, je voudrais que les dispositions de fenêtre agissent comme si ce cadre faisait simplement partie d'un panneau / barre des tâches. Edit: partout dans ce commentaire j'ai dit 'fenêtre' je veux dire fenêtre X, pas fenêtre emacs; p
Joseph Garvin
Une autre possibilité qui m'a été suggérée consiste simplement à utiliser le mini-tampon. Je n'ai aucune idée s'il est possible d'afficher passivement du texte là-bas sans qu'il interfère avec tout le reste en essayant de l'utiliser ...
Joseph Garvin
Ajout d'une note sur l'utilisation du mini-tampon.
Joseph Garvin

Réponses:

8

Avec beaucoup d'expérimentation hacky, j'ai réussi à mettre le n ° 6 (en utilisant le texte du mini-tampon) à un état de fonctionnement `` assez bon ''. Voici une capture d'écran:

Capture d'écran de ceinture en action

Il existe plusieurs éléments clés pour que cela fonctionne:

  • L'insertion de texte dans le mini-tampon fait étonnamment presque la bonne chose hors de la boîte. Le texte inséré apparaîtra en fait.
  • En faisant du texte la chaîne postérieure d'une superposition au lieu du texte normal, vous le rendez non sélectionnable et vous n'avez pas à vous soucier que le curseur y pénètre accidentellement.
  • Pour que les commandes d'invite du mini-tampon fonctionnent correctement, vous devez empêcher l'insertion du texte / de la superposition lorsque la fenêtre du mini-tampon est active.
  • Si vous essayez de redimensionner le mini-tampon avec des fonctions de redimensionnement de fenêtre normales, vous obtiendrez des erreurs sur les fenêtres trop petites, si vous utilisez la fonction md-resize-minibuf non documentée, vous pouvez redimensionner au nombre exact de lignes que vous voulez, tant que vous ont défini resize-mini-windows sur nil en premier.
  • Pour résoudre la disparition des listes chaque fois qu'il y a un message, vous devez conseiller à la fonction de message d'intercepter les messages. Ensuite, vous les insérez vous-même dans le mini-tampon. Vous devez également regarder la variable current-message, qui stocke tout ce qui s'est affiché en dernier dans la zone d'écho (étonnamment, la zone d'écho et le mini-tampon sont techniquement distincts et certaines fonctions de code source C s'impriment directement dans la zone d'écho sans passer par le message une fonction). Le code que je fournis ci-dessous est imparfait, les messages persistent plus longtemps qu'ils ne le feraient normalement, ce que je dois encore étudier (vérifier la dernière entrée dans * Messages * peut être plus simple et plus robuste), mais c'est `` assez bon '' pour l'instant.

Voici un lien vers mon implémentation avec un exemple de ceinture affichant le kill ring. Finalement, cela fera partie d'un projet approprié: https://gist.github.com/jgarvin/ce37d08654978fd7e4c9

C'est la première fois que j'écris une quantité importante d'elisp, donc la qualité est probablement inférieure, mais cela fonctionne.

Joseph Garvin
la source
1

Malheureusement, ni la ligne de mode ni la ligne d'en-tête ne peuvent être de plusieurs lignes. J'ai déjà posé des questions à ce sujet et il n'y a (du moins pas) d'option cachée pour que cela fonctionne. Donc 1 et 2 sont sortis. J'ai aussi l'impression que 3 et 6 sont des hacks qui ne vous rendront pas heureux à long terme. 3 et 4 semblent être de bonnes approches, mais les faire fonctionner de manière fiable sera tout un investissement.

Je vous recommande donc d'abord de mettre cela sur emacs-devel . D'après mon expérience, les choses finissent par être mises en œuvre si vous prenez la peine d'expliquer soigneusement ce que vous voulez et pourquoi c'est une bonne chose. Cela peut prendre un certain temps, au moins jusqu'à la prochaine version, mais si vous êtes bien en attente un peu ou en utilisant la version de développement, vous pouvez éventuellement obtenir exactement ce que vous voulez, avec beaucoup moins d'efforts.

tarse
la source
Merci pour la suggestion de contacter emacs-devel. Même si j'ai trouvé une solution, c'était assez hacky et ce serait bien d'avoir une vraie API pour dessiner directement sur les coordonnées de l'écran, donc quand j'aurai le temps, je vais probablement tirer un email à leur manière.
Joseph Garvin