2015-07-22 5 views
7

Wenn Sie vim eingeben, wird der Bildschirm "gelöscht". Beim Beenden "restauriert" es den ursprünglichen Inhalt.Mit welchem ​​Mechanismus kann ViM die gesamte Konsole vorübergehend überschreiben?

Ich verstehe, dass man \x1b[2J verwenden kann, um die Konsole zu löschen und die Cursorposition zurückzusetzen, aber das wird den Terminalinhalt überschreiben.

Ich nehme an, Vim verwendet ncurses unter der Haube, in diesem Fall nehme ich an, die bessere Frage ist, wie Ncurses dies tut, aber wie ist es gemacht?

Antwort

7

Die meisten Terminalemulatoren können den Inhalt des Bildschirms speichern und wiederherstellen.

Die Terminalcodes dafür sind smcup, um den Vollbildmodus zu aktivieren und rmcup, um es zu verlassen. (Die älteren termcap-Codes sind ti und te.)

Wenn diese Fähigkeiten in der terminfo Datenbank aktiviert sind, jedes Programm, das ncurses nutzt die smcup Zeichenfolge auf Eintrag drucken, und die rmcup Zeichenfolge an der Ausfahrt.

auf dem System, ich bin im Augenblick verwendet wird, sind die Saiten (\E mit Escape-Zeichen repräsentiert):

smcup: \E7\E[?1;47h 
rmcup: \E[2J\E[?1;47l\E8 

Diese den vorherigen Inhalt des Bildschirms sowie die Cursorposition wieder herstellt.

Die spezifischen Bedeutungen der Sequenzen (für xterm) sind documented here:

  • smcup:
    • \E7 Speichern Cursor
    • \E[?1;47h Anwendung Cursortasten; Alternativen Fensterpuffer
  • rmcup:
    • \E[2J Erase Bildschirm
    • \E[?1;47l Anwendung Cursor-Tasten; Verwenden Sie Normal Bildschirm Buffer
    • \E8 wiederherstellen Cursor

(Dies setzt voraus, verstehe ich die Verwendung des Semikolons richtig;. Ich bin nicht 100% sicher, dass)

+0

Etwas Neues gelernt. Das erklärt viel; Danke. – Qix

+2

Das Setzen von Cursor-Tasten wird normalerweise nicht in smcup/rmcup durchgeführt - die meisten Programme nehmen an, dass dies in der Initialisierungs-Zeichenkette (is2) geschieht. Siehe zum Beispiel [putty] (http://invisible-island.net/ncurses/terminfo.src.html#tic-putty) in der ncurses-Terminal-Datenbank. Und natürlich ist der Modus 47 mit xterm schon lange überholt (seit [1998] (http://invisible-island.net/xterm/xterm.log.html#xterm_90)). –

+1

@ThomasDickey: Anscheinend sind meine termcap/terminfo Einträge veraltet (was nicht überraschend ist). Danke für die Information. Ich werde etwas recherchieren und meine Antwort Real Soon Now aktualisieren. –

8

In Bezug auf die Antwort von @Keith Thompson — nicht genau:

  • vim, die nicht auf den Bildschirm Optimierung von ncurses verwenden sendet smcup und rmcup automatisch. Es ist vielmehr ein termcap application. Es folgt eine Konvention, die von den meisten (nicht allen) Termcap-Anwendungen verwendet wird. Es gibt einige Implementierungen von vi, die zum Beispiel nicht (auf IRIX64).
  • wie für "die meisten Terminals" — tatsächlich, Xterm Look-Alikes sind ein kleiner Teil der terminal database (sogar Schwankungen zählen, weniger als 10%). Formulieren Sie, dass so etwas wie „die gängigsten Terminal-Emulatoren auf Linux.
  • das Terminal nicht speichern und wiederherstellen den Bildschirminhalt. Stattdessen schaltet zwischen zwei Bildschirmen (in xterm in der Dokumentation‚normal‘und“ alternate "). In xterm kann beispielsweise ein Schalter immer zwischen den beiden einen Menüeintrag mit. xterm FAQ Why doesn't the screen clear when running vi? Detail gibt.
  • für eine bessere Zusammenhang beachten Sie, dass smcup eine (dunkel) Abkürzung für Set -Modus-Cursor-Positionierung oder Start Cursorpositionierungsmodus. (auch Cursor-Adressierung). Die r in rmcup bedeutet "Reset" (und m bedeutet "Modus"). set/reset haben unterschiedliche Konnotationen von Speichern/Wiederherstellen; Bei letzterem wird der Benutzer dazu gebracht zu glauben, dass die Werte gestapelt werden können.