Waarom doet de terminal tonen “^[[A” “^[[B” “^[[C” “^[[D” bij het indrukken van de pijltoetsen in Ubuntu?

Ik heb een klein programma in Ansi-C in Windows eerste, en ik stelde het op Ubuntu met de ingebouwde GCC nu.

Het programma is eenvoudig:

  • lees de lijn van de console met scanf().
  • Het analyseren van de string en berekenen.

Maar iets raars gebeurt. Wanneer ik probeer om de cursor te verplaatsen, drukt vier tekens:

  • op Omhoog afdrukken “^[[A
  • op Dn afdrukken “^[[B
  • op Rt afdrukken “^[[C
  • op Lt afdrukken “^[[D

Waarom doet de terminal tonen

  • Hoe kan dit vermeden worden?
  • Waarom doet het afdrukken van deze 4 tekens in plaats van het verplaatsen van de cursor?
  • Speciale tekens als ^U en Backspace zal werken omdat het stuurprogramma voor het toetsenbord verwerkt deze. Maar de sleutel van de pijl gedrag dat je gewend bent is geprogrammeerd in de shell. Wanneer u het schrijven van uw eigen programma, moet u omgaan met het zelf, of je kon installeren rlwrap en uitvoeren van het programma als rlwrap my_prog en het zal doen wat je verwacht. De tekens die u ziet zijn de escape-reeksen gegenereerd door deze toets drukt.
  • Dat zijn de traditionele ANSI escape-reeksen, die een afspiegeling van die van de cursor toetsen. Zie stackoverflow.com/questions/4130048/…
InformationsquelleAutor Kevin Dong | 2014-01-27

 

2 Replies
  1. 25

    Want dat is wat het toetsenbord daadwerkelijk stuurt op de PC (meer precies, wat de terminal prints voor wat het daadwerkelijk ontvangt van het toetsenbord). bash bijvoorbeeld krijgt die waarden, ontcijfert hen en begrijpt dat u wilt verplaatsen, zodat het verplaatsen van de cursor (in het geval van een links/rechts) of de geschiedenis te halen van de vorige commando ‘ s (up/down). Dus je kunt niet verwachten dat uw programma op magische wijze te ondersteunen pijltjestoetsen.

    Echter, het lezen van standaard invoer van de terminal al ondersteunt de pijltoetsen links/rechts (geloof ik, maar ik ben niet in Linux nu om te testen en te controleren). Dus ik denk dat er een ander probleem bemoeien. Een mogelijke oorzaak zou kunnen zijn dat een van uw aangepaste toetsen vast? Misschien ALT, CTRL of SUPER?

    • Wanneer ik druk op de pijltoetsen in de terminal, zal het verplaatsen van de cursor, maar bij het lezen van ingang van de buffer met scanf(), het niet kan.
    • het kan zijn dat bash detecteert de modifier en negeert ze. Helaas, ik zit nu in Windows, dus ik kan niet echt zeggen. Gewoon om zeker te zijn, kunt u met behulp van de normale gnome-terminal en niet gewijzigde instellingen, hetzij van de terminal of van het toetsenbord (in Ubuntu instellingen)?
    • Ja, ik heb het getest in een normale gnome-terminal zonder de instellingen te wijzigen. Ik gebruikte Ubuntu op de tweede dag. 😉
    • Wat is uw toetsenbord lay-out? Probeer het wijzigen van de lay-out van “Engelse (VS)” en kijk of het probleem blijft bestaan.
    • Er is niets veranderd bij het gebruik van “English (US)” toetsenbord lay-out. En ik heb geprobeerd om het uit te voeren in tty1~tty6, is dit probleem nog steeds gebeurd.
    • Dit is echt raar, wat is uw toetsenbord-merk/model? Gebeurt dit in de terminal van Windows als u er een hebt? Wat als het koppelen van dit toetsenbord op de computer van iemand anders met Ubuntu? Heb je nog steeds hetzelfde gedrag zien?
    • Ik gebruik de laptop, dus het toetsenbord is gebouwd. Toen ik het gebruikte USB-toetsenbord (engels (US) Lay-out), maar het probleem blijft bestaan. Laatste, ik heb het getest in andere Ubuntu afgeleide, Kubuntu, en dit probleem niet oplossen.
    • Deze zeer waarschijnlijk een onverenigbaarheid tussen iets in je laptop en Ubuntu (u bedanken voor Microsoft ‘ s monopolie voor dat). Probeer te vragen op askubuntu.com misschien dat iemand er heeft ervaren zoiets als dat. Zorg ervoor dat de laptop merk en model
    • Eigenlijk is het probleem lijkt te worden met de modus van de terminal: De terminal heeft verschillende modes, zoals het rechtstreeks verzenden van ieder personage in het proces, of het aggregeren van een lijn totdat de gebruiker op enter drukt, of het weergeven van dingen met een geschiedenis ga-terug-in tegenstelling tot vim stijl modus volledig scherm. Er is een heleboel dingen die er gaande is, en ik heb niet de tijd nu te kijken op de details (dat is waarom ik weet het niet plaatsen van een antwoord mezelf). Hoe dan ook, als je ziet ^[[A verschijnen op het scherm, dat is de escape-reeks verzonden te vertegenwoordigen op de pijl omhoog, en niets geïnterpreteerd als zodanig.

  2. 13

    Voor degenen die afkomstig zijn uit de osx (mac) proberen om de schelpen te bash

    Terminal -> Preferences -> Shells open with -> [select] Command (complete path)

    plak

    /bin/bash

    • Ik probeerde te exec in een docker exemplaar op OSX (met behulp van Kitematic). Dit werkte een traktatie, dank je. De Kitematic voorkeuren kunt u de shell te bash.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *