All posts

undefined

Posted On Feb 23, 2023

Clipboard support

Copy/paste is a must have for any editor. To implement this, the flow would look like this:

┌────────────────────────────────────────────────────┐ 
│User Click and Drag                                 │ 
│ │                                                  │ 
│ └► Trigger SELECT event──► Highlight selected cells│ 
└────────────────────────────────────────────────────┘ 
┌────────────────────────────────────────────────────┐ 
│User Pressed <Meta>+X / <Meta>+X                    │ 
│ │                                                  │ 
│ └► Get highlighted cells──► Compute selected area  │ 
│                   ┌──────────────────┘             │ 
│                   🭭                                │ 
│             Get content in the──► Put to Clipboard │ 
│             selected area                          │ 
└────────────────────────────────────────────────────┘ 

For both select/highlight and extracting content, we have the same behavior. We defined a selected
range as a rectangle:

selected_range = Rect(start_row, start_col, end_row, end_col)
selected_width = selected_range.width
selected_height = selected_range.height

We can access the selected cells of the character grid (which is a 1D array) with the following snippet:

for row in 0..selected_height {
  for col in 0..selected_width {
    let index = (start_row + row) * grid_width + (start_col + col);
    // access character_grid[index] here
  }
}

We can toggle each cell’s highlight property on/off. And to build the content string for the selected range,
we just need to build a string where each line content the whole selected row.

You can check the commit for more details fdd2e02.

For usage:

  • In cursor mode, click and drag on the grid to select content
  • Use MetaC to copy the selected content
  • Use MetaX to cut the selected content
  • Use MetaV to paste the clipboard content into the mouse position

ascii-d-copy-paste