2010-12-15 1 views
2

Je veux ajouter une fonction "history" à mon programme java, comme on le sait depuis bash etc, donc appuyer sur les touches fléchées devrait montrer les commandes d'envoi précédentes.Java: "Historique" pour les commandes cli, comment rendre "éditable" la sortie?

Il n'y a aucun problème à écrire les commandes passées à la sortie par défaut, ce qui dans trois nouvelles lignes si la flèche vers le haut est frappé trois fois et en sortie non éditable. Je veux que la sortie du programme soit écrite dans le champ de saisie, donc je dois simplement appuyer sur Entrée pour renvoyer la commande.

Est-ce possible?

Cordialement

+0

Il y a des bibliothèques qui font ce genre de chose et s'occupent de l'auto-complétion et de la liste des options comme bash. Apache Felix utilise un (je pense qu'ils ont changé que l'on l'utilise) –

Répondre

1

Si vous voulez rouler votre propre solution, cela va vous aider à démarrer.

Vous souhaitez passer d'une entrée tamponnée à une entrée directe. Vous pouvez le faire en interfaçant directement avec System.in. Vous devez créer un thread pour gérer ceci, et le faire bloquer sur un appel à System.in.read() dans une boucle, en lisant un octet à la fois.

Chaque fois qu'un octet est lu, mettez à jour votre propre tampon avec la commande en cours de lecture. Chaque caractère qui est tapé, ajoutez-le au tampon. Si le caractère est \b, supprimez le dernier caractère dans le tampon. Lorsque vous détectez un \r ou un \n, exécutez la commande dans le tampon et effacez-la.

Si vous recevez une flèche vers le haut ou vers le bas, envoyez un nombre de \b s à System.out égal à la longueur du tampon. Cela effacera la copie locale de toute commande en cours saisie. Imprimez ensuite la nouvelle commande à System.out et entrez-la dans le tampon, en remplaçant tout ce qui s'y trouvait. Cela permettra à l'utilisateur de le supprimer, de l'ajouter ou simplement d'appuyer sur Entrée pour l'envoyer. Cela imite la fonctionnalité de bash.

Vous pouvez également détecter un caractère (tabulation) \t et implémenter une fonction d'achèvement de tabulation.

+0

Le troisième bloc est que je cherchais – arghs

+0

:) Whoops, Envoyer un commentaire au début ... Envoi \ b au client (actuellement telnet sous XP, si ça compte) fait que le curseur retourne un caractère mais ne supprime pas le caractère. L'écrasement de "111" par "222" finit par "222" mais l'écrasement de "11111" par "222" finit par "22211". – arghs

+0

Puis effacez-le vous-même en produisant des espaces, puis plus de \ b. –

2

Jetez un oeil à JLine, qui fournit l'historique des commandes, la complétion des tabulations et l'édition des lignes.

+0

+1 pour JLine. J'ai intégré JLine avec succès dans mon projet, et je préférerais toujours l'utiliser par rapport à ma propre solution ... –

+0

+1 ressemble à une bibliothèque solide exactement pour ce besoin. –

+0

Merci pour la suggestion, mais je préfère le faire moi-même. Si j'échoue, je regarderai de plus près;) – arghs

Questions connexes