Packages

Multi-surface application runtime for Elixir. One TEA module renders to terminal, browser (LiveView), SSH, and MCP (agents). 30+ widgets, flexbox + CSS grid, AI agent runtime, distributed swarm with CRDTs, time-travel debugging, session recording, sandboxed REPL, and agentic commerce.

Current section

Files

Jump to
raxol lib raxol terminal commands editor.ex
Raw

lib/raxol/terminal/commands/editor.ex

defmodule Raxol.Terminal.Commands.Editor do
@moduledoc """
Handles editor-related terminal commands.
"""
alias Raxol.Terminal.Buffer.{CharEditor, Eraser, LineEditor}
alias Raxol.Terminal.Emulator
def insert_lines(buffer, row, count, default_style) do
LineEditor.insert_lines(buffer, row, count, default_style)
end
def delete_lines(buffer, row, count, default_style) do
LineEditor.delete_lines(buffer, row, count, default_style)
end
def insert_chars(buffer, row, col, count, default_style) do
CharEditor.insert_characters(buffer, row, col, count, default_style)
end
def delete_chars(buffer, row, col, count, default_style) do
CharEditor.delete_characters(buffer, row, col, count, default_style)
end
def erase_chars(buffer, row, col, count, default_style) do
# Erase 'count' characters starting at {col, row} by replacing them with spaces.
# Ensure coordinates and count are within bounds.
_end_col = col + count - 1
# Use Eraser.clear_region to replace the specified character cells with blanks.
# Note: Eraser.clear_region handles clamping of coordinates internally.
Eraser.clear_region(buffer, col, row, count, 1, default_style)
end
def clear_screen(emulator, mode, cursor_pos, default_style) do
buffer = Emulator.get_screen_buffer(emulator)
{cursor_x, cursor_y} = cursor_pos
case mode do
# Clear from cursor to end of screen
0 ->
new_buffer =
Eraser.clear_screen_from(buffer, cursor_y, cursor_x, default_style)
Emulator.update_active_buffer(emulator, new_buffer)
# Clear from beginning of screen to cursor
1 ->
new_buffer =
Eraser.clear_screen_to(buffer, cursor_y, cursor_x, default_style)
Emulator.update_active_buffer(emulator, new_buffer)
# Clear entire screen
2 ->
new_buffer = Eraser.clear_screen(buffer, default_style)
Emulator.update_active_buffer(emulator, new_buffer)
# Clear entire screen and scrollback
3 ->
new_buffer = Eraser.clear_screen(buffer, default_style)
# Clear scrollback as well
emulator = Emulator.clear_scrollback(emulator)
Emulator.update_active_buffer(emulator, new_buffer)
# Unknown mode, do nothing
_ ->
emulator
end
end
def clear_line(emulator, mode, cursor_pos, default_style) do
buffer = Emulator.get_screen_buffer(emulator)
{cursor_x, cursor_y} = cursor_pos
new_buffer =
case mode do
# Clear from cursor to end of line
0 -> Eraser.clear_line_from(buffer, cursor_y, cursor_x, default_style)
# Clear from beginning of line to cursor
1 -> Eraser.clear_line_to(buffer, cursor_y, cursor_x, default_style)
# Clear entire line
2 -> Eraser.clear_line(buffer, cursor_y, default_style)
# Unknown mode, do nothing
_ -> buffer
end
Emulator.update_active_buffer(emulator, new_buffer)
end
end