Packages
Terminal emulation and driver infrastructure for Raxol. ANSI parsing, screen buffers, command processing, cursor management, input handling, session management, and termbox2 NIF integration.
Current section
Files
Jump to
Current section
Files
lib/raxol/terminal/buffer/paste.ex
defmodule Raxol.Terminal.Buffer.Paste do
@moduledoc """
Handles text pasting operations for terminal buffers.
"""
alias Raxol.Terminal.ScreenBuffer
@doc """
Pastes text into the buffer at the current cursor position.
"""
@spec paste(ScreenBuffer.t(), String.t()) :: ScreenBuffer.t()
def paste(buffer, text) when is_binary(text) do
# Split text into lines for multi-line pasting
lines = String.split(text, ~r/\r?\n/)
case lines do
[] -> buffer
[single_line] -> paste_single_line(buffer, single_line)
multiple_lines -> paste_multiple_lines(buffer, multiple_lines)
end
end
def paste(buffer, _), do: buffer
# Private helper functions
defp paste_single_line(buffer, line) do
# Insert text at cursor position character by character
String.graphemes(line)
|> Enum.reduce(buffer, fn char, acc ->
{x, y} = acc.cursor_position
ScreenBuffer.write_char(acc, x, y, char)
end)
end
defp paste_multiple_lines(buffer, [first_line | rest]) do
# Paste first line at current position
buffer_after_first = paste_single_line(buffer, first_line)
# Add remaining lines as new lines
Enum.reduce(rest, buffer_after_first, fn line, acc ->
{x, y} = acc.cursor_position
acc
# Move to new line
|> ScreenBuffer.write_char(x, y, "\n")
|> paste_single_line(line)
end)
end
end