| 1 | //! A terminal cursor related ANSI escape sequences. |
| 2 | |
| 3 | sequence!( |
| 4 | /// Saves the cursor position. |
| 5 | /// |
| 6 | /// Use the [`RestoreCursorPosition`](struct.RestoreCursorPosition.html) sequence to |
| 7 | /// restore the cursor position. |
| 8 | /// |
| 9 | /// # Examples |
| 10 | /// |
| 11 | /// ```no_run |
| 12 | /// use std::io::{stdout, Write}; |
| 13 | /// use anes::{SaveCursorPosition, RestoreCursorPosition}; |
| 14 | /// |
| 15 | /// let mut stdout = stdout(); |
| 16 | /// // Save cursor position |
| 17 | /// write!(stdout, "{}", SaveCursorPosition); |
| 18 | /// |
| 19 | /// // Your app |
| 20 | /// |
| 21 | /// // Restore cursor position |
| 22 | /// write!(stdout, "{}", RestoreCursorPosition); |
| 23 | /// ``` |
| 24 | struct SaveCursorPosition => esc!("7" ) |
| 25 | ); |
| 26 | |
| 27 | sequence!( |
| 28 | /// Restores the cursor position. |
| 29 | /// |
| 30 | /// Use the [`SaveCursorPosition`](struct.SaveCursorPosition.html) sequence to |
| 31 | /// save the cursor position. |
| 32 | /// |
| 33 | /// # Examples |
| 34 | /// |
| 35 | /// ```no_run |
| 36 | /// use std::io::{stdout, Write}; |
| 37 | /// use anes::{SaveCursorPosition, RestoreCursorPosition}; |
| 38 | /// |
| 39 | /// let mut stdout = stdout(); |
| 40 | /// // Save cursor position |
| 41 | /// write!(stdout, "{}", SaveCursorPosition); |
| 42 | /// |
| 43 | /// // Your app |
| 44 | /// |
| 45 | /// // Restore cursor position |
| 46 | /// write!(stdout, "{}", RestoreCursorPosition); |
| 47 | /// ``` |
| 48 | struct RestoreCursorPosition => esc!("8" ) |
| 49 | ); |
| 50 | |
| 51 | sequence!( |
| 52 | /// Hides the cursor. |
| 53 | /// |
| 54 | /// Use the [`ShowCursor`](struct.ShowCursor.html) sequence to show the cursor. |
| 55 | /// |
| 56 | /// # Examples |
| 57 | /// |
| 58 | /// ```no_run |
| 59 | /// use std::io::{stdout, Write}; |
| 60 | /// use anes::HideCursor; |
| 61 | /// |
| 62 | /// let mut stdout = stdout(); |
| 63 | /// // Hide cursor |
| 64 | /// write!(stdout, "{}", HideCursor); |
| 65 | /// ``` |
| 66 | struct HideCursor => csi!("?25l" ) |
| 67 | ); |
| 68 | |
| 69 | sequence!( |
| 70 | /// Shows the cursor. |
| 71 | /// |
| 72 | /// Use the [`HideCursor`](struct.HideCursor.html) sequence to hide the cursor. |
| 73 | /// |
| 74 | /// # Examples |
| 75 | /// |
| 76 | /// ```no_run |
| 77 | /// use std::io::{stdout, Write}; |
| 78 | /// use anes::ShowCursor; |
| 79 | /// |
| 80 | /// let mut stdout = stdout(); |
| 81 | /// // Show cursor |
| 82 | /// write!(stdout, "{}", ShowCursor); |
| 83 | /// ``` |
| 84 | struct ShowCursor => csi!("?25h" ) |
| 85 | ); |
| 86 | |
| 87 | sequence!( |
| 88 | /// Enables the cursor blinking. |
| 89 | /// |
| 90 | /// Use the [`DisableCursorBlinking`](struct.DisableCursorBlinking.html) sequence to disable |
| 91 | /// cursor blinking. |
| 92 | /// |
| 93 | /// # Examples |
| 94 | /// |
| 95 | /// ```no_run |
| 96 | /// use std::io::{stdout, Write}; |
| 97 | /// use anes::EnableCursorBlinking; |
| 98 | /// |
| 99 | /// let mut stdout = stdout(); |
| 100 | /// // Enable cursor blinking |
| 101 | /// write!(stdout, "{}", EnableCursorBlinking); |
| 102 | /// ``` |
| 103 | struct EnableCursorBlinking => csi!("?12h" ) |
| 104 | ); |
| 105 | |
| 106 | sequence!( |
| 107 | /// Disables the cursor blinking. |
| 108 | /// |
| 109 | /// Use the [`EnableCursorBlinking`](struct.EnableCursorBlinking.html) sequence to enable |
| 110 | /// cursor blinking. |
| 111 | /// |
| 112 | /// # Examples |
| 113 | /// |
| 114 | /// ```no_run |
| 115 | /// use std::io::{stdout, Write}; |
| 116 | /// use anes::DisableCursorBlinking; |
| 117 | /// |
| 118 | /// let mut stdout = stdout(); |
| 119 | /// // Disable cursor blinking |
| 120 | /// write!(stdout, "{}", DisableCursorBlinking); |
| 121 | /// ``` |
| 122 | struct DisableCursorBlinking => csi!("?12l" ) |
| 123 | ); |
| 124 | |
| 125 | sequence!( |
| 126 | /// Moves the cursor to the given location (column, row). |
| 127 | /// |
| 128 | /// # Notes |
| 129 | /// |
| 130 | /// Top/left cell is represented as `1, 1` (`column, row`). |
| 131 | /// |
| 132 | /// # Examples |
| 133 | /// |
| 134 | /// ```no_run |
| 135 | /// use std::io::{stdout, Write}; |
| 136 | /// use anes::MoveCursorTo; |
| 137 | /// |
| 138 | /// let mut stdout = stdout(); |
| 139 | /// // Move cursor to top left cell |
| 140 | /// write!(stdout, "{}", MoveCursorTo(1, 1)); |
| 141 | /// ``` |
| 142 | struct MoveCursorTo(u16, u16) => |
| 143 | |this, f| write!(f, csi!("{};{}H" ), this.1, this.0) |
| 144 | ); |
| 145 | |
| 146 | sequence!( |
| 147 | /// Moves the cursor up by the given number of rows. |
| 148 | /// |
| 149 | /// # Examples |
| 150 | /// |
| 151 | /// ```no_run |
| 152 | /// use std::io::{stdout, Write}; |
| 153 | /// use anes::MoveCursorUp; |
| 154 | /// |
| 155 | /// let mut stdout = stdout(); |
| 156 | /// // Move cursor up by 5 rows |
| 157 | /// write!(stdout, "{}", MoveCursorUp(5)); |
| 158 | /// ``` |
| 159 | struct MoveCursorUp(u16) => |
| 160 | |this, f| write!(f, csi!("{}A" ), this.0) |
| 161 | ); |
| 162 | |
| 163 | sequence!( |
| 164 | /// Moves the cursor down by the given number of rows. |
| 165 | /// |
| 166 | /// # Examples |
| 167 | /// |
| 168 | /// ```no_run |
| 169 | /// use std::io::{stdout, Write}; |
| 170 | /// use anes::MoveCursorDown; |
| 171 | /// |
| 172 | /// let mut stdout = stdout(); |
| 173 | /// // Move cursor down by 5 rows |
| 174 | /// write!(stdout, "{}", MoveCursorDown(5)); |
| 175 | /// ``` |
| 176 | struct MoveCursorDown(u16) => |
| 177 | |this, f| write!(f, csi!("{}B" ), this.0) |
| 178 | ); |
| 179 | |
| 180 | sequence!( |
| 181 | /// Moves the cursor right by the given number of columns. |
| 182 | /// |
| 183 | /// # Examples |
| 184 | /// |
| 185 | /// ```no_run |
| 186 | /// use std::io::{stdout, Write}; |
| 187 | /// use anes::MoveCursorRight; |
| 188 | /// |
| 189 | /// let mut stdout = stdout(); |
| 190 | /// // Move cursor right by 5 columns |
| 191 | /// write!(stdout, "{}", MoveCursorRight(5)); |
| 192 | /// ``` |
| 193 | struct MoveCursorRight(u16) => |
| 194 | |this, f| write!(f, csi!("{}C" ), this.0) |
| 195 | ); |
| 196 | |
| 197 | sequence!( |
| 198 | /// Moves the cursor left by the given number of columns. |
| 199 | /// |
| 200 | /// # Examples |
| 201 | /// |
| 202 | /// ```no_run |
| 203 | /// use std::io::{stdout, Write}; |
| 204 | /// use anes::MoveCursorLeft; |
| 205 | /// |
| 206 | /// let mut stdout = stdout(); |
| 207 | /// // Move cursor left by 5 columns |
| 208 | /// write!(stdout, "{}", MoveCursorLeft(5)); |
| 209 | /// ``` |
| 210 | struct MoveCursorLeft(u16) => |
| 211 | |this, f| write!(f, csi!("{}D" ), this.0) |
| 212 | ); |
| 213 | |
| 214 | sequence!( |
| 215 | /// Moves the cursor to beginning of line the given number of lines down. |
| 216 | /// |
| 217 | /// # Examples |
| 218 | /// |
| 219 | /// ```no_run |
| 220 | /// use std::io::{stdout, Write}; |
| 221 | /// use anes::MoveCursorToNextLine; |
| 222 | /// |
| 223 | /// let mut stdout = stdout(); |
| 224 | /// // Move cursor down by 2 rows and the move it to the first column |
| 225 | /// write!(stdout, "{}", MoveCursorToNextLine(2)); |
| 226 | /// ``` |
| 227 | /// |
| 228 | /// The previous example does the same thing as the following one: |
| 229 | /// |
| 230 | /// ```no_run |
| 231 | /// use std::io::{stdout, Write}; |
| 232 | /// use anes::{MoveCursorDown, MoveCursorToColumn}; |
| 233 | /// |
| 234 | /// let mut stdout = stdout(); |
| 235 | /// write!(stdout, "{}{}", MoveCursorDown(2), MoveCursorToColumn(1)); |
| 236 | /// ``` |
| 237 | struct MoveCursorToNextLine(u16) => |
| 238 | |this, f| write!(f, csi!("{}E" ), this.0) |
| 239 | ); |
| 240 | |
| 241 | sequence!( |
| 242 | /// Moves the cursor to beginning of line the given number of lines up. |
| 243 | /// |
| 244 | /// # Examples |
| 245 | /// |
| 246 | /// ```no_run |
| 247 | /// use std::io::{stdout, Write}; |
| 248 | /// use anes::MoveCursorToPreviousLine; |
| 249 | /// |
| 250 | /// let mut stdout = stdout(); |
| 251 | /// // Move cursor up by 2 rows and the move it to the first column |
| 252 | /// write!(stdout, "{}", MoveCursorToPreviousLine(2)); |
| 253 | /// ``` |
| 254 | /// |
| 255 | /// The previous example does the same thing as the following one: |
| 256 | /// |
| 257 | /// ```no_run |
| 258 | /// use std::io::{stdout, Write}; |
| 259 | /// use anes::{MoveCursorUp, MoveCursorToColumn}; |
| 260 | /// |
| 261 | /// let mut stdout = stdout(); |
| 262 | /// write!(stdout, "{}{}", MoveCursorUp(2), MoveCursorToColumn(1)); |
| 263 | /// ``` |
| 264 | struct MoveCursorToPreviousLine(u16) => |
| 265 | |this, f| write!(f, csi!("{}F" ), this.0) |
| 266 | ); |
| 267 | |
| 268 | sequence!( |
| 269 | /// Moves the cursor to the given column. |
| 270 | /// |
| 271 | /// # Notes |
| 272 | /// |
| 273 | /// Beginning of the line (left cell) is represented as `1`. |
| 274 | /// |
| 275 | /// # Examples |
| 276 | /// |
| 277 | /// ```no_run |
| 278 | /// use std::io::{stdout, Write}; |
| 279 | /// use anes::MoveCursorToColumn; |
| 280 | /// |
| 281 | /// let mut stdout = stdout(); |
| 282 | /// // Move cursor to the 10th column (same row) |
| 283 | /// write!(stdout, "{}", MoveCursorToColumn(10)); |
| 284 | /// ``` |
| 285 | struct MoveCursorToColumn(u16) => |
| 286 | |this, f| write!(f, csi!("{}G" ), this.0) |
| 287 | ); |
| 288 | |
| 289 | // TODO Enhance example with Parser to show how to retrieve it |
| 290 | sequence!( |
| 291 | /// Asks for the current cursor position. |
| 292 | /// |
| 293 | /// # Examples |
| 294 | /// |
| 295 | /// ```no_run |
| 296 | /// use std::io::{stdout, Write}; |
| 297 | /// use anes::ReportCursorPosition; |
| 298 | /// |
| 299 | /// let mut stdout = stdout(); |
| 300 | /// write!(stdout, "{}", ReportCursorPosition); |
| 301 | /// ``` |
| 302 | struct ReportCursorPosition => csi!("6n" ) |
| 303 | ); |
| 304 | |
| 305 | #[cfg (test)] |
| 306 | test_sequences!( |
| 307 | save_cursor_position( |
| 308 | SaveCursorPosition => " \x1B7" , |
| 309 | ), |
| 310 | restore_cursor_position( |
| 311 | RestoreCursorPosition => " \x1B8" , |
| 312 | ), |
| 313 | hide_cursor( |
| 314 | HideCursor => " \x1B[?25l" , |
| 315 | ), |
| 316 | show_cursor( |
| 317 | ShowCursor => " \x1B[?25h" , |
| 318 | ), |
| 319 | disable_cursor_blinking( |
| 320 | DisableCursorBlinking => " \x1B[?12l" , |
| 321 | ), |
| 322 | enable_cursor_blinking( |
| 323 | EnableCursorBlinking => " \x1B[?12h" , |
| 324 | ), |
| 325 | move_cursor_up( |
| 326 | MoveCursorUp(10) => " \x1B[10A" , |
| 327 | ), |
| 328 | move_cursor_down( |
| 329 | MoveCursorDown(10) => " \x1B[10B" , |
| 330 | ), |
| 331 | move_cursor_right( |
| 332 | MoveCursorRight(10) => " \x1B[10C" , |
| 333 | ), |
| 334 | move_cursor_left( |
| 335 | MoveCursorLeft(10) => " \x1B[10D" , |
| 336 | ), |
| 337 | move_cursor_to( |
| 338 | MoveCursorTo(5, 10) => " \x1B[10;5H" , |
| 339 | ), |
| 340 | move_cursor_to_next_line( |
| 341 | MoveCursorToNextLine(5) => " \x1B[5E" , |
| 342 | ), |
| 343 | move_cursor_to_previous_line( |
| 344 | MoveCursorToPreviousLine(5) => " \x1B[5F" , |
| 345 | ), |
| 346 | move_cursor_to_column( |
| 347 | MoveCursorToColumn(1) => " \x1B[1G" , |
| 348 | ), |
| 349 | report_cursor_position( |
| 350 | ReportCursorPosition => " \x1B[6n" , |
| 351 | ) |
| 352 | ); |
| 353 | |