Question

Je suis en train d'écrire une coquille en Ruby, et pour mettre en œuvre la touche de tabulation J'utilise la fonction WinAPI getch lire dans un caractère à la fois de l'utilisateur, la vérification des onglets.

Le problème est le backspace touche :

  1. Il déplace le curseur plus loin que l'invite (par exemple, avec hello> rapide, l'utilisateur peut reculer le curseur sur le h. Je voudrais qu'il arrête à l'espace final.
  2. Lorsque le texte de l'utilisateur à la déborde la ligne suivante de la console, backspace ne remontera à la ligne précédente.

(je sais que ces deux comportements sont par la conception.)

Mon imaginé une solution à ces problèmes impliquent le contrôle du mouvement du curseur; Je dois savoir où le curseur est, et être en mesure de le déplacer.

Sur Linux, j'utiliser ANSI séquences d'échappement, mais ceux-ci ne sont pas pris en charge par la console Windows.

Je l'ai regardé dans le WinAPI et a essayé de trouver des fonctions qui me permettrait de le faire, mais tout ce que je pourrait trouver était fonction de GetConsoleCursorInfo, qui retourne seulement la taille et la visibilité du curseur.

Les exemples seraient appréciés, comme je suis désespéré à l'aide de la classe Win32API pour autre chose que les fonctions primitives.

Merci.

Était-ce utile?

La solution

Vous êtes probablement mieux à l'aide de readline. Il est inclus dans le programme d'installation Ruby One-Click. Une configuration de base est:

require 'readline'

while line = Readline.readline('hello> ', true)
  #do something with line
  break if line == 'quit'
end

Déjà vous avez des capacités standard readline telles que les retours arrière, Alt + Backspace pour supprimer un mot, l'histoire et la touche de tabulation. Il y a une bonne documentation sur la façon de le personnaliser pour vos besoins .


Edit:

Si vous n'avez pas readline installé, vous pouvez l'obtenir et d'autres bibliothèques externes ici . Vous voulez que le readline-4.3-2-mswin32 emballage. Copiez le fichier readline.dll (situé dans le répertoire bin) dans votre répertoire ruby\bin. Cela devrait le faire.

Bien qu'il ne soit pas documenté sur la page d'accueil Ruby, il semble que vous pouvez également utiliser readline 5, disponible ici . , Vous avez besoin spécifiquement binaires distribution. Copiez readline5.dll (dans le répertoire bin) dans votre répertoire ruby\bin, et renommez-readline.dll.

En outre, comme une note de côté, ne vous inquiétez pas si retourne faux require 'readline' lors de l'utilisation RIR, car il semble pré-charger.

Autres conseils

Hmm, il est certainement possible de sauvegarder, et avec le code raisonnablement portable, comme bash (1) peut sauvegarder à la ligne précédente, même dans une boîte dos. J'imagine qu'il utilise termcap ou ncurses, et il a dans la base de données termcap un ensemble de codes de contrôle qui fonctionnent pour la zone dos.

Dans Ruby, je ne crois pas qu'il y ait des liaisons termcap, de sorte que vous utiliser ncurses, plutôt que Hardwiring dans votre programme un ensemble de codes de commande en fonction de l'appareil. (Vous ne voulez plus ncurses termcap de toute façon.)

Une fois que vous passez à ncurses je crois que vous trouverez des éléments API pour faire tout ce dont vous avez besoin, y compris la sauvegarde des lignes et non l'invite écraser. (Et certainement vous ne devriez pas sauvegarder sur tout ce que vous ne l'avez pas sortie pour commencer, peu importe ce que la bibliothèque est en cours d'utilisation.)

En fait, je aime bien la réponse de Pesto . Utilisez ncurses si readline ne fonctionne pas ou si vous avez besoin curseur d'adressage pour une autre raison.

Pour les fenêtres de l'environnement mise en œuvre de readline essayer cette readline base-ruby

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top