1package ansi
2
3import (
4 "strconv"
5)
6
7// SaveCursor (DECSC) is an escape sequence that saves the current cursor
8// position.
9//
10// ESC 7
11//
12// See: https://vt100.net/docs/vt510-rm/DECSC.html
13const (
14 SaveCursor = "\x1b7"
15 DECSC = SaveCursor
16)
17
18// RestoreCursor (DECRC) is an escape sequence that restores the cursor
19// position.
20//
21// ESC 8
22//
23// See: https://vt100.net/docs/vt510-rm/DECRC.html
24const (
25 RestoreCursor = "\x1b8"
26 DECRC = RestoreCursor
27)
28
29// RequestCursorPosition is an escape sequence that requests the current cursor
30// position.
31//
32// CSI 6 n
33//
34// The terminal will report the cursor position as a CSI sequence in the
35// following format:
36//
37// CSI Pl ; Pc R
38//
39// Where Pl is the line number and Pc is the column number.
40// See: https://vt100.net/docs/vt510-rm/CPR.html
41//
42// Deprecated: use [RequestCursorPositionReport] instead.
43const RequestCursorPosition = "\x1b[6n"
44
45// RequestExtendedCursorPosition (DECXCPR) is a sequence for requesting the
46// cursor position report including the current page number.
47//
48// CSI ? 6 n
49//
50// The terminal will report the cursor position as a CSI sequence in the
51// following format:
52//
53// CSI ? Pl ; Pc ; Pp R
54//
55// Where Pl is the line number, Pc is the column number, and Pp is the page
56// number.
57// See: https://vt100.net/docs/vt510-rm/DECXCPR.html
58//
59// Deprecated: use [RequestExtendedCursorPositionReport] instead.
60const RequestExtendedCursorPosition = "\x1b[?6n"
61
62// CursorUp (CUU) returns a sequence for moving the cursor up n cells.
63//
64// CSI n A
65//
66// See: https://vt100.net/docs/vt510-rm/CUU.html
67func CursorUp(n int) string {
68 var s string
69 if n > 1 {
70 s = strconv.Itoa(n)
71 }
72 return "\x1b[" + s + "A"
73}
74
75// CUU is an alias for [CursorUp].
76func CUU(n int) string {
77 return CursorUp(n)
78}
79
80// CUU1 is a sequence for moving the cursor up one cell.
81const CUU1 = "\x1b[A"
82
83// CursorUp1 is a sequence for moving the cursor up one cell.
84//
85// This is equivalent to CursorUp(1).
86//
87// Deprecated: use [CUU1] instead.
88const CursorUp1 = "\x1b[A"
89
90// CursorDown (CUD) returns a sequence for moving the cursor down n cells.
91//
92// CSI n B
93//
94// See: https://vt100.net/docs/vt510-rm/CUD.html
95func CursorDown(n int) string {
96 var s string
97 if n > 1 {
98 s = strconv.Itoa(n)
99 }
100 return "\x1b[" + s + "B"
101}
102
103// CUD is an alias for [CursorDown].
104func CUD(n int) string {
105 return CursorDown(n)
106}
107
108// CUD1 is a sequence for moving the cursor down one cell.
109const CUD1 = "\x1b[B"
110
111// CursorDown1 is a sequence for moving the cursor down one cell.
112//
113// This is equivalent to CursorDown(1).
114//
115// Deprecated: use [CUD1] instead.
116const CursorDown1 = "\x1b[B"
117
118// CursorForward (CUF) returns a sequence for moving the cursor right n cells.
119//
120// # CSI n C
121//
122// See: https://vt100.net/docs/vt510-rm/CUF.html
123func CursorForward(n int) string {
124 var s string
125 if n > 1 {
126 s = strconv.Itoa(n)
127 }
128 return "\x1b[" + s + "C"
129}
130
131// CUF is an alias for [CursorForward].
132func CUF(n int) string {
133 return CursorForward(n)
134}
135
136// CUF1 is a sequence for moving the cursor right one cell.
137const CUF1 = "\x1b[C"
138
139// CursorRight (CUF) returns a sequence for moving the cursor right n cells.
140//
141// CSI n C
142//
143// See: https://vt100.net/docs/vt510-rm/CUF.html
144//
145// Deprecated: use [CursorForward] instead.
146func CursorRight(n int) string {
147 return CursorForward(n)
148}
149
150// CursorRight1 is a sequence for moving the cursor right one cell.
151//
152// This is equivalent to CursorRight(1).
153//
154// Deprecated: use [CUF1] instead.
155const CursorRight1 = CUF1
156
157// CursorBackward (CUB) returns a sequence for moving the cursor left n cells.
158//
159// # CSI n D
160//
161// See: https://vt100.net/docs/vt510-rm/CUB.html
162func CursorBackward(n int) string {
163 var s string
164 if n > 1 {
165 s = strconv.Itoa(n)
166 }
167 return "\x1b[" + s + "D"
168}
169
170// CUB is an alias for [CursorBackward].
171func CUB(n int) string {
172 return CursorBackward(n)
173}
174
175// CUB1 is a sequence for moving the cursor left one cell.
176const CUB1 = "\x1b[D"
177
178// CursorLeft (CUB) returns a sequence for moving the cursor left n cells.
179//
180// CSI n D
181//
182// See: https://vt100.net/docs/vt510-rm/CUB.html
183//
184// Deprecated: use [CursorBackward] instead.
185func CursorLeft(n int) string {
186 return CursorBackward(n)
187}
188
189// CursorLeft1 is a sequence for moving the cursor left one cell.
190//
191// This is equivalent to CursorLeft(1).
192//
193// Deprecated: use [CUB1] instead.
194const CursorLeft1 = CUB1
195
196// CursorNextLine (CNL) returns a sequence for moving the cursor to the
197// beginning of the next line n times.
198//
199// CSI n E
200//
201// See: https://vt100.net/docs/vt510-rm/CNL.html
202func CursorNextLine(n int) string {
203 var s string
204 if n > 1 {
205 s = strconv.Itoa(n)
206 }
207 return "\x1b[" + s + "E"
208}
209
210// CNL is an alias for [CursorNextLine].
211func CNL(n int) string {
212 return CursorNextLine(n)
213}
214
215// CursorPreviousLine (CPL) returns a sequence for moving the cursor to the
216// beginning of the previous line n times.
217//
218// CSI n F
219//
220// See: https://vt100.net/docs/vt510-rm/CPL.html
221func CursorPreviousLine(n int) string {
222 var s string
223 if n > 1 {
224 s = strconv.Itoa(n)
225 }
226 return "\x1b[" + s + "F"
227}
228
229// CPL is an alias for [CursorPreviousLine].
230func CPL(n int) string {
231 return CursorPreviousLine(n)
232}
233
234// CursorHorizontalAbsolute (CHA) returns a sequence for moving the cursor to
235// the given column.
236//
237// Default is 1.
238//
239// CSI n G
240//
241// See: https://vt100.net/docs/vt510-rm/CHA.html
242func CursorHorizontalAbsolute(col int) string {
243 var s string
244 if col > 0 {
245 s = strconv.Itoa(col)
246 }
247 return "\x1b[" + s + "G"
248}
249
250// CHA is an alias for [CursorHorizontalAbsolute].
251func CHA(col int) string {
252 return CursorHorizontalAbsolute(col)
253}
254
255// CursorPosition (CUP) returns a sequence for setting the cursor to the
256// given row and column.
257//
258// Default is 1,1.
259//
260// CSI n ; m H
261//
262// See: https://vt100.net/docs/vt510-rm/CUP.html
263func CursorPosition(col, row int) string {
264 if row <= 0 && col <= 0 {
265 return CursorHomePosition
266 }
267
268 var r, c string
269 if row > 0 {
270 r = strconv.Itoa(row)
271 }
272 if col > 0 {
273 c = strconv.Itoa(col)
274 }
275 return "\x1b[" + r + ";" + c + "H"
276}
277
278// CUP is an alias for [CursorPosition].
279func CUP(col, row int) string {
280 return CursorPosition(col, row)
281}
282
283// CursorHomePosition is a sequence for moving the cursor to the upper left
284// corner of the scrolling region. This is equivalent to `CursorPosition(1, 1)`.
285const CursorHomePosition = "\x1b[H"
286
287// SetCursorPosition (CUP) returns a sequence for setting the cursor to the
288// given row and column.
289//
290// CSI n ; m H
291//
292// See: https://vt100.net/docs/vt510-rm/CUP.html
293//
294// Deprecated: use [CursorPosition] instead.
295func SetCursorPosition(col, row int) string {
296 if row <= 0 && col <= 0 {
297 return HomeCursorPosition
298 }
299
300 var r, c string
301 if row > 0 {
302 r = strconv.Itoa(row)
303 }
304 if col > 0 {
305 c = strconv.Itoa(col)
306 }
307 return "\x1b[" + r + ";" + c + "H"
308}
309
310// HomeCursorPosition is a sequence for moving the cursor to the upper left
311// corner of the scrolling region. This is equivalent to `SetCursorPosition(1, 1)`.
312//
313// Deprecated: use [CursorHomePosition] instead.
314const HomeCursorPosition = CursorHomePosition
315
316// MoveCursor (CUP) returns a sequence for setting the cursor to the
317// given row and column.
318//
319// CSI n ; m H
320//
321// See: https://vt100.net/docs/vt510-rm/CUP.html
322//
323// Deprecated: use [CursorPosition] instead.
324func MoveCursor(col, row int) string {
325 return SetCursorPosition(col, row)
326}
327
328// CursorOrigin is a sequence for moving the cursor to the upper left corner of
329// the display. This is equivalent to `SetCursorPosition(1, 1)`.
330//
331// Deprecated: use [CursorHomePosition] instead.
332const CursorOrigin = "\x1b[1;1H"
333
334// MoveCursorOrigin is a sequence for moving the cursor to the upper left
335// corner of the display. This is equivalent to `SetCursorPosition(1, 1)`.
336//
337// Deprecated: use [CursorHomePosition] instead.
338const MoveCursorOrigin = CursorOrigin
339
340// CursorHorizontalForwardTab (CHT) returns a sequence for moving the cursor to
341// the next tab stop n times.
342//
343// Default is 1.
344//
345// CSI n I
346//
347// See: https://vt100.net/docs/vt510-rm/CHT.html
348func CursorHorizontalForwardTab(n int) string {
349 var s string
350 if n > 1 {
351 s = strconv.Itoa(n)
352 }
353 return "\x1b[" + s + "I"
354}
355
356// CHT is an alias for [CursorHorizontalForwardTab].
357func CHT(n int) string {
358 return CursorHorizontalForwardTab(n)
359}
360
361// EraseCharacter (ECH) returns a sequence for erasing n characters from the
362// screen. This doesn't affect other cell attributes.
363//
364// Default is 1.
365//
366// CSI n X
367//
368// See: https://vt100.net/docs/vt510-rm/ECH.html
369func EraseCharacter(n int) string {
370 var s string
371 if n > 1 {
372 s = strconv.Itoa(n)
373 }
374 return "\x1b[" + s + "X"
375}
376
377// ECH is an alias for [EraseCharacter].
378func ECH(n int) string {
379 return EraseCharacter(n)
380}
381
382// CursorBackwardTab (CBT) returns a sequence for moving the cursor to the
383// previous tab stop n times.
384//
385// Default is 1.
386//
387// CSI n Z
388//
389// See: https://vt100.net/docs/vt510-rm/CBT.html
390func CursorBackwardTab(n int) string {
391 var s string
392 if n > 1 {
393 s = strconv.Itoa(n)
394 }
395 return "\x1b[" + s + "Z"
396}
397
398// CBT is an alias for [CursorBackwardTab].
399func CBT(n int) string {
400 return CursorBackwardTab(n)
401}
402
403// VerticalPositionAbsolute (VPA) returns a sequence for moving the cursor to
404// the given row.
405//
406// Default is 1.
407//
408// CSI n d
409//
410// See: https://vt100.net/docs/vt510-rm/VPA.html
411func VerticalPositionAbsolute(row int) string {
412 var s string
413 if row > 0 {
414 s = strconv.Itoa(row)
415 }
416 return "\x1b[" + s + "d"
417}
418
419// VPA is an alias for [VerticalPositionAbsolute].
420func VPA(row int) string {
421 return VerticalPositionAbsolute(row)
422}
423
424// VerticalPositionRelative (VPR) returns a sequence for moving the cursor down
425// n rows relative to the current position.
426//
427// Default is 1.
428//
429// CSI n e
430//
431// See: https://vt100.net/docs/vt510-rm/VPR.html
432func VerticalPositionRelative(n int) string {
433 var s string
434 if n > 1 {
435 s = strconv.Itoa(n)
436 }
437 return "\x1b[" + s + "e"
438}
439
440// VPR is an alias for [VerticalPositionRelative].
441func VPR(n int) string {
442 return VerticalPositionRelative(n)
443}
444
445// HorizontalVerticalPosition (HVP) returns a sequence for moving the cursor to
446// the given row and column.
447//
448// Default is 1,1.
449//
450// CSI n ; m f
451//
452// This has the same effect as [CursorPosition].
453//
454// See: https://vt100.net/docs/vt510-rm/HVP.html
455func HorizontalVerticalPosition(col, row int) string {
456 var r, c string
457 if row > 0 {
458 r = strconv.Itoa(row)
459 }
460 if col > 0 {
461 c = strconv.Itoa(col)
462 }
463 return "\x1b[" + r + ";" + c + "f"
464}
465
466// HVP is an alias for [HorizontalVerticalPosition].
467func HVP(col, row int) string {
468 return HorizontalVerticalPosition(col, row)
469}
470
471// HorizontalVerticalHomePosition is a sequence for moving the cursor to the
472// upper left corner of the scrolling region. This is equivalent to
473// `HorizontalVerticalPosition(1, 1)`.
474const HorizontalVerticalHomePosition = "\x1b[f"
475
476// SaveCurrentCursorPosition (SCOSC) is a sequence for saving the current cursor
477// position for SCO console mode.
478//
479// CSI s
480//
481// This acts like [DECSC], except the page number where the cursor is located
482// is not saved.
483//
484// See: https://vt100.net/docs/vt510-rm/SCOSC.html
485const (
486 SaveCurrentCursorPosition = "\x1b[s"
487 SCOSC = SaveCurrentCursorPosition
488)
489
490// SaveCursorPosition (SCP or SCOSC) is a sequence for saving the cursor
491// position.
492//
493// CSI s
494//
495// This acts like Save, except the page number where the cursor is located is
496// not saved.
497//
498// See: https://vt100.net/docs/vt510-rm/SCOSC.html
499//
500// Deprecated: use [SaveCurrentCursorPosition] instead.
501const SaveCursorPosition = "\x1b[s"
502
503// RestoreCurrentCursorPosition (SCORC) is a sequence for restoring the current
504// cursor position for SCO console mode.
505//
506// CSI u
507//
508// This acts like [DECRC], except the page number where the cursor was saved is
509// not restored.
510//
511// See: https://vt100.net/docs/vt510-rm/SCORC.html
512const (
513 RestoreCurrentCursorPosition = "\x1b[u"
514 SCORC = RestoreCurrentCursorPosition
515)
516
517// RestoreCursorPosition (RCP or SCORC) is a sequence for restoring the cursor
518// position.
519//
520// CSI u
521//
522// This acts like Restore, except the cursor stays on the same page where the
523// cursor was saved.
524//
525// See: https://vt100.net/docs/vt510-rm/SCORC.html
526//
527// Deprecated: use [RestoreCurrentCursorPosition] instead.
528const RestoreCursorPosition = "\x1b[u"
529
530// SetCursorStyle (DECSCUSR) returns a sequence for changing the cursor style.
531//
532// Default is 1.
533//
534// CSI Ps SP q
535//
536// Where Ps is the cursor style:
537//
538// 0: Blinking block
539// 1: Blinking block (default)
540// 2: Steady block
541// 3: Blinking underline
542// 4: Steady underline
543// 5: Blinking bar (xterm)
544// 6: Steady bar (xterm)
545//
546// See: https://vt100.net/docs/vt510-rm/DECSCUSR.html
547// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81
548func SetCursorStyle(style int) string {
549 if style < 0 {
550 style = 0
551 }
552 return "\x1b[" + strconv.Itoa(style) + " q"
553}
554
555// DECSCUSR is an alias for [SetCursorStyle].
556func DECSCUSR(style int) string {
557 return SetCursorStyle(style)
558}
559
560// SetPointerShape returns a sequence for changing the mouse pointer cursor
561// shape. Use "default" for the default pointer shape.
562//
563// OSC 22 ; Pt ST
564// OSC 22 ; Pt BEL
565//
566// Where Pt is the pointer shape name. The name can be anything that the
567// operating system can understand. Some common names are:
568//
569// - copy
570// - crosshair
571// - default
572// - ew-resize
573// - n-resize
574// - text
575// - wait
576//
577// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Commands
578func SetPointerShape(shape string) string {
579 return "\x1b]22;" + shape + "\x07"
580}
581
582// ReverseIndex (RI) is an escape sequence for moving the cursor up one line in
583// the same column. If the cursor is at the top margin, the screen scrolls
584// down.
585//
586// This has the same effect as [RI].
587const ReverseIndex = "\x1bM"
588
589// HorizontalPositionAbsolute (HPA) returns a sequence for moving the cursor to
590// the given column. This has the same effect as [CUP].
591//
592// Default is 1.
593//
594// CSI n `
595//
596// See: https://vt100.net/docs/vt510-rm/HPA.html
597func HorizontalPositionAbsolute(col int) string {
598 var s string
599 if col > 0 {
600 s = strconv.Itoa(col)
601 }
602 return "\x1b[" + s + "`"
603}
604
605// HPA is an alias for [HorizontalPositionAbsolute].
606func HPA(col int) string {
607 return HorizontalPositionAbsolute(col)
608}
609
610// HorizontalPositionRelative (HPR) returns a sequence for moving the cursor
611// right n columns relative to the current position. This has the same effect
612// as [CUP].
613//
614// Default is 1.
615//
616// CSI n a
617//
618// See: https://vt100.net/docs/vt510-rm/HPR.html
619func HorizontalPositionRelative(n int) string {
620 var s string
621 if n > 0 {
622 s = strconv.Itoa(n)
623 }
624 return "\x1b[" + s + "a"
625}
626
627// HPR is an alias for [HorizontalPositionRelative].
628func HPR(n int) string {
629 return HorizontalPositionRelative(n)
630}
631
632// Index (IND) is an escape sequence for moving the cursor down one line in the
633// same column. If the cursor is at the bottom margin, the screen scrolls up.
634// This has the same effect as [IND].
635const Index = "\x1bD"