1package ansi
2
3import (
4 "strconv"
5 "strings"
6)
7
8// EraseDisplay (ED) clears the display or parts of the display. A screen is
9// the shown part of the terminal display excluding the scrollback buffer.
10// Possible values:
11//
12// Default is 0.
13//
14// 0: Clear from cursor to end of screen.
15// 1: Clear from cursor to beginning of the screen.
16// 2: Clear entire screen (and moves cursor to upper left on DOS).
17// 3: Clear entire display which delete all lines saved in the scrollback buffer (xterm).
18//
19// CSI <n> J
20//
21// See: https://vt100.net/docs/vt510-rm/ED.html
22func EraseDisplay(n int) string {
23 var s string
24 if n > 0 {
25 s = strconv.Itoa(n)
26 }
27 return "\x1b[" + s + "J"
28}
29
30// ED is an alias for [EraseDisplay].
31func ED(n int) string {
32 return EraseDisplay(n)
33}
34
35// EraseDisplay constants.
36// These are the possible values for the EraseDisplay function.
37const (
38 EraseScreenBelow = "\x1b[J"
39 EraseScreenAbove = "\x1b[1J"
40 EraseEntireScreen = "\x1b[2J"
41 EraseEntireDisplay = "\x1b[3J"
42)
43
44// EraseLine (EL) clears the current line or parts of the line. Possible values:
45//
46// 0: Clear from cursor to end of line.
47// 1: Clear from cursor to beginning of the line.
48// 2: Clear entire line.
49//
50// The cursor position is not affected.
51//
52// CSI <n> K
53//
54// See: https://vt100.net/docs/vt510-rm/EL.html
55func EraseLine(n int) string {
56 var s string
57 if n > 0 {
58 s = strconv.Itoa(n)
59 }
60 return "\x1b[" + s + "K"
61}
62
63// EL is an alias for [EraseLine].
64func EL(n int) string {
65 return EraseLine(n)
66}
67
68// EraseLine constants.
69// These are the possible values for the EraseLine function.
70const (
71 EraseLineRight = "\x1b[K"
72 EraseLineLeft = "\x1b[1K"
73 EraseEntireLine = "\x1b[2K"
74)
75
76// ScrollUp (SU) scrolls the screen up n lines. New lines are added at the
77// bottom of the screen.
78//
79// CSI Pn S
80//
81// See: https://vt100.net/docs/vt510-rm/SU.html
82func ScrollUp(n int) string {
83 var s string
84 if n > 1 {
85 s = strconv.Itoa(n)
86 }
87 return "\x1b[" + s + "S"
88}
89
90// PanDown is an alias for [ScrollUp].
91func PanDown(n int) string {
92 return ScrollUp(n)
93}
94
95// SU is an alias for [ScrollUp].
96func SU(n int) string {
97 return ScrollUp(n)
98}
99
100// ScrollDown (SD) scrolls the screen down n lines. New lines are added at the
101// top of the screen.
102//
103// CSI Pn T
104//
105// See: https://vt100.net/docs/vt510-rm/SD.html
106func ScrollDown(n int) string {
107 var s string
108 if n > 1 {
109 s = strconv.Itoa(n)
110 }
111 return "\x1b[" + s + "T"
112}
113
114// PanUp is an alias for [ScrollDown].
115func PanUp(n int) string {
116 return ScrollDown(n)
117}
118
119// SD is an alias for [ScrollDown].
120func SD(n int) string {
121 return ScrollDown(n)
122}
123
124// InsertLine (IL) inserts n blank lines at the current cursor position.
125// Existing lines are moved down.
126//
127// CSI Pn L
128//
129// See: https://vt100.net/docs/vt510-rm/IL.html
130func InsertLine(n int) string {
131 var s string
132 if n > 1 {
133 s = strconv.Itoa(n)
134 }
135 return "\x1b[" + s + "L"
136}
137
138// IL is an alias for [InsertLine].
139func IL(n int) string {
140 return InsertLine(n)
141}
142
143// DeleteLine (DL) deletes n lines at the current cursor position. Existing
144// lines are moved up.
145//
146// CSI Pn M
147//
148// See: https://vt100.net/docs/vt510-rm/DL.html
149func DeleteLine(n int) string {
150 var s string
151 if n > 1 {
152 s = strconv.Itoa(n)
153 }
154 return "\x1b[" + s + "M"
155}
156
157// DL is an alias for [DeleteLine].
158func DL(n int) string {
159 return DeleteLine(n)
160}
161
162// SetTopBottomMargins (DECSTBM) sets the top and bottom margins for the scrolling
163// region. The default is the entire screen.
164//
165// Default is 1 and the bottom of the screen.
166//
167// CSI Pt ; Pb r
168//
169// See: https://vt100.net/docs/vt510-rm/DECSTBM.html
170func SetTopBottomMargins(top, bot int) string {
171 var t, b string
172 if top > 0 {
173 t = strconv.Itoa(top)
174 }
175 if bot > 0 {
176 b = strconv.Itoa(bot)
177 }
178 return "\x1b[" + t + ";" + b + "r"
179}
180
181// DECSTBM is an alias for [SetTopBottomMargins].
182func DECSTBM(top, bot int) string {
183 return SetTopBottomMargins(top, bot)
184}
185
186// SetLeftRightMargins (DECSLRM) sets the left and right margins for the scrolling
187// region.
188//
189// Default is 1 and the right of the screen.
190//
191// CSI Pl ; Pr s
192//
193// See: https://vt100.net/docs/vt510-rm/DECSLRM.html
194func SetLeftRightMargins(left, right int) string {
195 var l, r string
196 if left > 0 {
197 l = strconv.Itoa(left)
198 }
199 if right > 0 {
200 r = strconv.Itoa(right)
201 }
202 return "\x1b[" + l + ";" + r + "s"
203}
204
205// DECSLRM is an alias for [SetLeftRightMargins].
206func DECSLRM(left, right int) string {
207 return SetLeftRightMargins(left, right)
208}
209
210// SetScrollingRegion (DECSTBM) sets the top and bottom margins for the scrolling
211// region. The default is the entire screen.
212//
213// CSI <top> ; <bottom> r
214//
215// See: https://vt100.net/docs/vt510-rm/DECSTBM.html
216//
217// Deprecated: use [SetTopBottomMargins] instead.
218func SetScrollingRegion(t, b int) string {
219 if t < 0 {
220 t = 0
221 }
222 if b < 0 {
223 b = 0
224 }
225 return "\x1b[" + strconv.Itoa(t) + ";" + strconv.Itoa(b) + "r"
226}
227
228// InsertCharacter (ICH) inserts n blank characters at the current cursor
229// position. Existing characters move to the right. Characters moved past the
230// right margin are lost. ICH has no effect outside the scrolling margins.
231//
232// Default is 1.
233//
234// CSI Pn @
235//
236// See: https://vt100.net/docs/vt510-rm/ICH.html
237func InsertCharacter(n int) string {
238 var s string
239 if n > 1 {
240 s = strconv.Itoa(n)
241 }
242 return "\x1b[" + s + "@"
243}
244
245// ICH is an alias for [InsertCharacter].
246func ICH(n int) string {
247 return InsertCharacter(n)
248}
249
250// DeleteCharacter (DCH) deletes n characters at the current cursor position.
251// As the characters are deleted, the remaining characters move to the left and
252// the cursor remains at the same position.
253//
254// Default is 1.
255//
256// CSI Pn P
257//
258// See: https://vt100.net/docs/vt510-rm/DCH.html
259func DeleteCharacter(n int) string {
260 var s string
261 if n > 1 {
262 s = strconv.Itoa(n)
263 }
264 return "\x1b[" + s + "P"
265}
266
267// DCH is an alias for [DeleteCharacter].
268func DCH(n int) string {
269 return DeleteCharacter(n)
270}
271
272// SetTabEvery8Columns (DECST8C) sets the tab stops at every 8 columns.
273//
274// CSI ? 5 W
275//
276// See: https://vt100.net/docs/vt510-rm/DECST8C.html
277const (
278 SetTabEvery8Columns = "\x1b[?5W"
279 DECST8C = SetTabEvery8Columns
280)
281
282// HorizontalTabSet (HTS) sets a horizontal tab stop at the current cursor
283// column.
284//
285// This is equivalent to [HTS].
286//
287// ESC H
288//
289// See: https://vt100.net/docs/vt510-rm/HTS.html
290const HorizontalTabSet = "\x1bH"
291
292// TabClear (TBC) clears tab stops.
293//
294// Default is 0.
295//
296// Possible values:
297// 0: Clear tab stop at the current column. (default)
298// 3: Clear all tab stops.
299//
300// CSI Pn g
301//
302// See: https://vt100.net/docs/vt510-rm/TBC.html
303func TabClear(n int) string {
304 var s string
305 if n > 0 {
306 s = strconv.Itoa(n)
307 }
308 return "\x1b[" + s + "g"
309}
310
311// TBC is an alias for [TabClear].
312func TBC(n int) string {
313 return TabClear(n)
314}
315
316// RequestPresentationStateReport (DECRQPSR) requests the terminal to send a
317// report of the presentation state. This includes the cursor information [DECCIR],
318// and tab stop [DECTABSR] reports.
319//
320// Default is 0.
321//
322// Possible values:
323// 0: Error, request ignored.
324// 1: Cursor information report [DECCIR].
325// 2: Tab stop report [DECTABSR].
326//
327// CSI Ps $ w
328//
329// See: https://vt100.net/docs/vt510-rm/DECRQPSR.html
330func RequestPresentationStateReport(n int) string {
331 var s string
332 if n > 0 {
333 s = strconv.Itoa(n)
334 }
335 return "\x1b[" + s + "$w"
336}
337
338// DECRQPSR is an alias for [RequestPresentationStateReport].
339func DECRQPSR(n int) string {
340 return RequestPresentationStateReport(n)
341}
342
343// TabStopReport (DECTABSR) is the response to a tab stop report request.
344// It reports the tab stops set in the terminal.
345//
346// The response is a list of tab stops separated by a slash (/) character.
347//
348// DCS 2 $ u D ... D ST
349//
350// Where D is a decimal number representing a tab stop.
351//
352// See: https://vt100.net/docs/vt510-rm/DECTABSR.html
353func TabStopReport(stops ...int) string {
354 var s []string
355 for _, v := range stops {
356 s = append(s, strconv.Itoa(v))
357 }
358 return "\x1bP2$u" + strings.Join(s, "/") + "\x1b\\"
359}
360
361// DECTABSR is an alias for [TabStopReport].
362func DECTABSR(stops ...int) string {
363 return TabStopReport(stops...)
364}
365
366// CursorInformationReport (DECCIR) is the response to a cursor information
367// report request. It reports the cursor position, visual attributes, and
368// character protection attributes. It also reports the status of origin mode
369// [DECOM] and the current active character set.
370//
371// The response is a list of values separated by a semicolon (;) character.
372//
373// DCS 1 $ u D ... D ST
374//
375// Where D is a decimal number representing a value.
376//
377// See: https://vt100.net/docs/vt510-rm/DECCIR.html
378func CursorInformationReport(values ...int) string {
379 var s []string
380 for _, v := range values {
381 s = append(s, strconv.Itoa(v))
382 }
383 return "\x1bP1$u" + strings.Join(s, ";") + "\x1b\\"
384}
385
386// DECCIR is an alias for [CursorInformationReport].
387func DECCIR(values ...int) string {
388 return CursorInformationReport(values...)
389}
390
391// RepeatPreviousCharacter (REP) repeats the previous character n times.
392// This is identical to typing the same character n times.
393//
394// Default is 1.
395//
396// CSI Pn b
397//
398// See: ECMA-48 ยง 8.3.103
399func RepeatPreviousCharacter(n int) string {
400 var s string
401 if n > 1 {
402 s = strconv.Itoa(n)
403 }
404 return "\x1b[" + s + "b"
405}
406
407// REP is an alias for [RepeatPreviousCharacter].
408func REP(n int) string {
409 return RepeatPreviousCharacter(n)
410}