Code | Abbr | Name |
---|---|---|
CSI # A | CUU | CUrsor Up |
CSI # B | CUD | CUrsor Down |
CSI # C | CUF | CUrsor Forward |
CSI # D | CUB | CUrsor Backward |
CSI # E | CNL | CUrsor Next Line |
CSI # F | CPL | CUrsor Previous Line |
CSI # I | CHT | Cursor Horizontal forward Tabulation |
CSI # Z | CBT | Cursor Backward Tabulation |
CSI # G | CHA | Cursor Horizontal Absolute |
CSI # ; # H | CUP | CUrsor Position |
Today, we will continue from the previous article to explore how to move the cursor using CSI sequences. The types of CSI sequences for moving the cursor can be summarized as follows.
CUU, CUD, CUF, CUB
These are the abbreviations for CUrsor Up, CUrsor Down, CUrsor Forward, and CUrsor Backward; as the names suggest, they move the cursor up, down, forward, and backward. They take a single number as an argument; if the argument is omitted, it is treated as 1. Thus, 0x1b[A
is equivalent to 0x1b[1A
.
In this case, CUF and CUB move only within the same line. In other words, CUB received at the beginning of a line does not move the cursor to the previous line, and CUF received at the end of a line does not move the cursor to the next line. To achieve this behavior, you need to turn on reverse auto-wrap mode and auto-wrap mode, respectively, but support for these modes depends on the terminal implementation.
CNL, CPL
These stand for Cursor Next Line and Cursor Previous Line, respectively, and move the cursor to the next or previous line. While CUU and CUD keep the cursor's column, CNL and CPL move the cursor to the beginning of the line. In other words, CNL is a combination of CR(\r
, carriage return) and CUD; CPL is a combination of CR and CUU. They also take a single number as an argument; if the argument is not provided, the default value is treated as 1.
CHT, CBT
CHT stands for Cursor Horizontal Forward Tabulation, and CBT stands for Cursor Backward Tabulation. They move the cursor to the next, and the previous tab stops, respectively.
CHA, CUP
The above sequences move the cursor from its current position to a relative position. However, CHA and CUP move the cursor to the absolute coordinates received. The difference is that CHA takes a single number as an argument and moves the cursor to the specified column in the current line, while CUP takes two numbers, a line, and a column, and moves the cursor to the specified coordinates. If no numbers are provided, the default value is treated as 1.
People familiar with programming may wonder why the default value is not 0 but 1. This is because terminals use a coordinate system that starts at (1, 1) instead of (0, 0). The top-left coordinate in the terminal is (1, 1).
So far, we have looked at how to move the cursor using CSI sequences. Freely controlling the cursor is the minimum building block for creating a TUI. Using this, you can implement various components on the terminal, not only a simple output stream that flows downward.
Comments
Post a Comment