Skip to content

Buffer API

Buffer Queries

getThemeSchema

Get the theme JSON Schema for the theme editor Returns the raw JSON Schema generated by schemars for ThemeFile. The schema uses standard JSON Schema format with $ref for type references. Plugins are responsible for parsing the schema and resolving $ref references.

typescript
getThemeSchema(): unknown

getBuiltinThemes

typescript
getBuiltinThemes(): unknown

getConfig

Get the current editor configuration Returns the merged configuration (user config file + compiled-in defaults). This is the runtime config that the editor is actually using, including all default values for LSP servers, languages, keybindings, etc.

typescript
getConfig(): unknown

getUserConfig

Get the user's configuration (only explicitly set values) Returns only the configuration from the user's config file. Fields not present here are using default values. Use this with getConfig() to determine which values are defaults.

typescript
getUserConfig(): unknown

getConfigDir

Get the user configuration directory path Returns the absolute path to the directory where user config and themes are stored. e.g. ~/.config/fresh/ on Linux or ~/Library/Application Support/fresh/ on macOS.

typescript
getConfigDir(): string

getThemesDir

Get the user themes directory path Returns the absolute path to the directory where user themes are stored. e.g. ~/.config/fresh/themes/

typescript
getThemesDir(): string

getActiveBufferId

Get the buffer ID of the focused editor pane Returns 0 if no buffer is active (rare edge case). Use this ID with other buffer operations like insertText.

typescript
getActiveBufferId(): number

getCursorPosition

Get the byte offset of the primary cursor in the active buffer Returns 0 if no cursor exists. For multi-cursor scenarios, use getAllCursors to get all cursor positions with selection info. Note: This is a byte offset, not a character index (UTF-8 matters).

typescript
getCursorPosition(): number

getBufferPath

Get the absolute file path for a buffer Returns empty string for unsaved buffers or virtual buffers. The path is always absolute. Use this to determine file type, construct related paths, or display to the user.

typescript
getBufferPath(buffer_id: number): string

Parameters:

NameTypeDescription
buffer_idnumberTarget buffer ID

getBufferLength

Get the total byte length of a buffer's content Returns 0 if buffer doesn't exist.

typescript
getBufferLength(buffer_id: number): number

Parameters:

NameTypeDescription
buffer_idnumberTarget buffer ID

isBufferModified

Check if a buffer has been modified since last save Returns false if buffer doesn't exist or has never been saved. Virtual buffers are never considered modified.

typescript
isBufferModified(buffer_id: number): boolean

Parameters:

NameTypeDescription
buffer_idnumberTarget buffer ID

getCurrentLocale

Get the currently active locale

typescript
getCurrentLocale(): string

getActiveSplitId

Get the ID of the focused split pane Use with focusSplit, setSplitBuffer, or createVirtualBufferInExistingSplit to manage split layouts.

typescript
getActiveSplitId(): number

getCursorLine

Get the line number of the primary cursor (1-indexed) Line numbers start at 1. Returns 1 if no cursor exists. For byte offset use getCursorPosition instead.

typescript
getCursorLine(): number

getAllCursorPositions

Get byte offsets of all cursors (multi-cursor support) Returns array of positions; empty if no cursors. Primary cursor is typically first. For selection info use getAllCursors instead.

typescript
getAllCursorPositions(): number[]

isProcessRunning

Check if a background process is still running

typescript
isProcessRunning(process_id: number): boolean

Parameters:

NameTypeDescription
process_idnumberID returned from spawnBackgroundProcess

getHighlights

Compute syntax highlighting for a buffer range

typescript
getHighlights(buffer_id: number, start: number, end: number): Promise<TsHighlightSpan[]>

Parameters:

NameTypeDescription
buffer_idnumber-
startnumber-
endnumber-

getBufferSavedDiff

Get diff vs last saved snapshot for a buffer

typescript
getBufferSavedDiff(buffer_id: number): TsBufferSavedDiff | null

Parameters:

NameTypeDescription
buffer_idnumber-

getAllDiagnostics

Get all LSP diagnostics across all files

typescript
getAllDiagnostics(): TsDiagnostic[]

getBufferText

Get text from a buffer range Used by vi mode plugin for yank operations - reads text without deleting.

typescript
getBufferText(buffer_id: number, start: number, end: number): Promise<string>

Parameters:

NameTypeDescription
buffer_idnumberBuffer ID
startnumberStart byte offset
endnumberEnd byte offset

getEditorMode

Get the current global editor mode

typescript
getEditorMode(): string

Buffer Info Queries

getBufferInfo

Get full information about a buffer

typescript
getBufferInfo(buffer_id: number): BufferInfo | null

Parameters:

NameTypeDescription
buffer_idnumberBuffer ID

listBuffers

List all open buffers

typescript
listBuffers(): BufferInfo[]

getPrimaryCursor

Get primary cursor with selection info

typescript
getPrimaryCursor(): CursorInfo | null

getAllCursors

Get all cursors (for multi-cursor support)

typescript
getAllCursors(): CursorInfo[]

getViewport

Get viewport information

typescript
getViewport(): ViewportInfo | null

Prompt Operations

startPrompt

Start an interactive prompt

typescript
startPrompt(label: string, prompt_type: string): boolean

Parameters:

NameTypeDescription
labelstringLabel to display (e.g., "Git grep: ")
prompt_typestringType identifier (e.g., "git-grep")

setPromptSuggestions

Set suggestions for the current prompt

typescript
setPromptSuggestions(suggestions: PromptSuggestion[]): boolean

Parameters:

NameTypeDescription
suggestionsPromptSuggestion[]Array of suggestions to display

Buffer Mutations

applyTheme

Apply a theme by name Loads and applies the specified theme immediately. The theme can be a built-in theme name or a custom theme from the themes directory.

typescript
applyTheme(theme_name: string): void

Parameters:

NameTypeDescription
theme_namestringName of the theme to apply (e.g., "dark", "light", "my-custom-theme")

reloadConfig

Reload configuration from file After a plugin saves config changes to the config file, call this to reload the editor's in-memory configuration. This ensures the editor and plugins stay in sync with the saved config.

typescript
reloadConfig(): void

error

Log an error message from a plugin Messages appear in log file when running with RUST_LOG=error. Use for critical errors that need attention.

typescript
error(message: string): void

Parameters:

NameTypeDescription
messagestringError message

warn

Log a warning message from a plugin Messages appear in log file when running with RUST_LOG=warn. Use for warnings that don't prevent operation but indicate issues.

typescript
warn(message: string): void

Parameters:

NameTypeDescription
messagestringWarning message

info

Log an info message from a plugin Messages appear in log file when running with RUST_LOG=info. Use for important operational messages.

typescript
info(message: string): void

Parameters:

NameTypeDescription
messagestringInfo message

setClipboard

Copy text to the system clipboard Copies the provided text to both the internal and system clipboard. Uses OSC 52 and arboard for cross-platform compatibility.

typescript
setClipboard(text: string): void

Parameters:

NameTypeDescription
textstringText to copy to clipboard

insertText

Insert text at a byte position in a buffer Text is inserted before the byte at position. Position must be valid (0 to buffer length). Insertion shifts all text after position. Operation is asynchronous; returns true if command was sent successfully.

typescript
insertText(buffer_id: number, position: number, text: string): boolean

Parameters:

NameTypeDescription
buffer_idnumberTarget buffer ID
positionnumberByte offset where text will be inserted (must be at char boundary)
textstringUTF-8 text to insert

deleteRange

Delete a byte range from a buffer Deletes bytes from start (inclusive) to end (exclusive). Both positions must be at valid UTF-8 char boundaries. Operation is asynchronous; returns true if command was sent successfully.

typescript
deleteRange(buffer_id: number, start: number, end: number): boolean

Parameters:

NameTypeDescription
buffer_idnumberTarget buffer ID
startnumberStart byte offset (inclusive)
endnumberEnd byte offset (exclusive)

clearNamespace

Clear all overlays in a namespace

typescript
clearNamespace(buffer_id: number, namespace: string): boolean

Parameters:

NameTypeDescription
buffer_idnumberThe buffer ID
namespacestringThe namespace to clear

setLineNumbers

Enable/disable line numbers for a buffer

typescript
setLineNumbers(buffer_id: number, enabled: boolean): boolean

Parameters:

NameTypeDescription
buffer_idnumberThe buffer ID
enabledbooleanWhether to show line numbers

addVirtualLine

Add a virtual line above or below a source line

typescript
addVirtualLine(buffer_id: number, position: number, text: string, fg_r: number, fg_g: number, fg_b: number, bg_r: number, bg_g: number, bg_b: number, above: boolean, namespace: string, priority: number): boolean

Parameters:

NameTypeDescription
buffer_idnumberThe buffer ID
positionnumberByte position to anchor the virtual line to
textstringThe text content of the virtual line
fg_rnumberForeground red color component (0-255)
fg_gnumberForeground green color component (0-255)
fg_bnumberForeground blue color component (0-255)
bg_rnumberBackground red color component (0-255), -1 for transparent
bg_gnumberBackground green color component (0-255), -1 for transparent
bg_bnumberBackground blue color component (0-255), -1 for transparent
abovebooleanWhether to insert above (true) or below (false) the line
namespacestringNamespace for bulk removal (e.g., "git-blame")
prioritynumberPriority for ordering multiple lines at same position

setLineIndicator

Set a line indicator in the gutter's indicator column

typescript
setLineIndicator(buffer_id: number, line: number, namespace: string, symbol: string, r: number, g: number, b: number, priority: number): boolean

Parameters:

NameTypeDescription
buffer_idnumberThe buffer ID
linenumberLine number (0-indexed)
namespacestringNamespace for grouping (e.g., "git-gutter", "breakpoints")
symbolstringSymbol to display (e.g., "│", "●", "★")
rnumberRed color component (0-255)
gnumberGreen color component (0-255)
bnumberuffer_id - The buffer ID
prioritynumberPriority for display when multiple indicators exist (higher wins)

clearLineIndicators

Clear all line indicators for a specific namespace

typescript
clearLineIndicators(buffer_id: number, namespace: string): boolean

Parameters:

NameTypeDescription
buffer_idnumberThe buffer ID
namespacestringNamespace to clear (e.g., "git-gutter")

setFileExplorerDecorations

Set file explorer decorations for a namespace

typescript
setFileExplorerDecorations(namespace: string, decorations: FileExplorerDecoration[]): boolean

Parameters:

NameTypeDescription
namespacestringNamespace for grouping (e.g., "git-status")
decorationsFileExplorerDecoration[]Decoration entries

clearFileExplorerDecorations

Clear file explorer decorations for a namespace

typescript
clearFileExplorerDecorations(namespace: string): boolean

Parameters:

NameTypeDescription
namespacestringNamespace to clear (e.g., "git-status")

submitViewTransform

Submit a transformed view stream for a viewport

typescript
submitViewTransform(buffer_id: number, split_id?: number | null, start: number, end: number, tokens: ViewTokenWire[], layout_hints?: LayoutHints | null): boolean

Parameters:

NameTypeDescription
buffer_idnumberBuffer to apply the transform to
split_id`numbernull` (optional)
startnumberViewport start byte
endnumberViewport end byte
tokensViewTokenWire[]Array of tokens with source offsets
layout_hints`LayoutHintsnull` (optional)

clearViewTransform

Clear view transform for a buffer/split (returns to normal rendering)

typescript
clearViewTransform(buffer_id: number, split_id?: number | null): boolean

Parameters:

NameTypeDescription
buffer_idnumberBuffer ID
split_id`numbernull` (optional)

insertAtCursor

Insert text at the current cursor position in the active buffer

typescript
insertAtCursor(text: string): boolean

Parameters:

NameTypeDescription
textstringThe text to insert

pluginTranslate

Translate a string for a plugin using the current locale

typescript
pluginTranslate(plugin_name: string, key: string, args: Record<string, unknown>): string

Parameters:

NameTypeDescription
plugin_namestring-
keystring-
argsRecord<string, unknown>-

registerCommand

Register a custom command that can be triggered by keybindings or the command palette

typescript
registerCommand(name: string, description: string, action: string, contexts: string, source: string): boolean

Parameters:

NameTypeDescription
namestring-
descriptionstring-
actionstring-
contextsstring-
sourcestring-

unregisterCommand

Unregister a custom command by name

typescript
unregisterCommand(name: string): boolean

Parameters:

NameTypeDescription
namestringThe name of the command to unregister

setContext

Set or unset a custom context for command visibility Custom contexts allow plugins to control when their commands are available. For example, setting "config-editor" context makes config editor commands visible.

typescript
setContext(name: string, active: boolean): boolean

Parameters:

NameTypeDescription
namestringContext name (e.g., "config-editor")
activebooleanWhether the context is active (true = set, false = unset)

openFile

Open a file in the editor, optionally at a specific location

typescript
openFile(path: string, line: number, column: number): boolean

Parameters:

NameTypeDescription
pathstringFile path to open
linenumberLine number to jump to (0 for no jump)
columnnumberColumn number to jump to (0 for no jump)

openFileInSplit

Open a file in a specific split pane

typescript
openFileInSplit(split_id: number, path: string, line: number, column: number): boolean

Parameters:

NameTypeDescription
split_idnumberThe split ID to open the file in
pathstringFile path to open
linenumberLine number to jump to (0 for no jump)
columnnumberColumn number to jump to (0 for no jump)

spawnBackgroundProcess

Spawn a long-running background process Unlike spawnProcess which waits for completion, this starts a process in the background and returns immediately with a process ID. Use killProcess(id) to terminate the process later. Use isProcessRunning(id) to check if it's still running. const proc = await editor.spawnBackgroundProcess("asciinema", ["rec", "output.cast"]); // Later... await editor.killProcess(proc.process_id);

typescript
spawnBackgroundProcess(command: string, args: string[], cwd?: string | null): Promise<BackgroundProcessResult>

Parameters:

NameTypeDescription
commandstringProgram name (searched in PATH) or absolute path
argsstring[]Command arguments (each array element is one argument)
cwd`stringnull` (optional)

Example:

typescript
const proc = await editor.spawnBackgroundProcess("asciinema", ["rec", "output.cast"]);
// Later...
await editor.killProcess(proc.process_id);

killProcess

Kill a background or cancellable process by ID Sends SIGTERM to gracefully terminate the process. Returns true if the process was found and killed, false if not found.

typescript
killProcess(process_id: number): Promise<boolean>

Parameters:

NameTypeDescription
process_idnumberID returned from spawnBackgroundProcess or spawnProcessStart

spawnProcessWait

Wait for a cancellable process to complete and get its result

typescript
spawnProcessWait(process_id: number): Promise<SpawnResult>

Parameters:

NameTypeDescription
process_idnumberID returned from spawnProcessStart

delay

Delay execution for a specified number of milliseconds Useful for debouncing user input or adding delays between operations. await editor.delay(100); // Wait 100ms

typescript
delay(ms: number): Promise<void>

Parameters:

NameTypeDescription
msnumberNumber of milliseconds to delay

Example:

typescript
await editor.delay(100);  // Wait 100ms

findBufferByPath

Find a buffer ID by its file path

typescript
findBufferByPath(path: string): number

Parameters:

NameTypeDescription
pathstring-

startPromptWithInitial

Start a prompt with pre-filled initial value

typescript
startPromptWithInitial(label: string, prompt_type: string, initial_value: string): boolean

Parameters:

NameTypeDescription
labelstringLabel to display (e.g., "Git grep: ")
prompt_typestringType identifier (e.g., "git-grep")
initial_valuestringInitial text to pre-fill in the prompt

deleteTheme

Delete a theme file by name Only deletes files from the user's themes directory. This is a safe operation that prevents plugins from deleting arbitrary files.

typescript
deleteTheme(name: string): Promise<void>

Parameters:

NameTypeDescription
namestringTheme name (without .json extension)

createCompositeBuffer

Create a composite buffer that displays multiple source buffers Composite buffers allow displaying multiple underlying buffers in a single tab/view area with custom layouts (side-by-side, stacked, unified). This is useful for diff views, merge conflict resolution, etc.

typescript
createCompositeBuffer(options: CreateCompositeBufferOptions): Promise<number>

Parameters:

NameTypeDescription
optionsCreateCompositeBufferOptionsConfiguration for the composite buffer

updateCompositeAlignment

Update line alignment for a composite buffer

typescript
updateCompositeAlignment(buffer_id: number, hunks: TsCompositeHunk[]): boolean

Parameters:

NameTypeDescription
buffer_idnumberThe composite buffer ID
hunksTsCompositeHunk[]New diff hunks for alignment

closeCompositeBuffer

Close a composite buffer

typescript
closeCompositeBuffer(buffer_id: number): boolean

Parameters:

NameTypeDescription
buffer_idnumberThe composite buffer ID to close

sendLspRequest

Send an arbitrary LSP request and receive the raw JSON response

typescript
sendLspRequest(language: string, method: string, params?: unknown | null): Promise<unknown>

Parameters:

NameTypeDescription
languagestringLanguage ID (e.g., "cpp")
methodstringFull LSP method (e.g., "textDocument/switchSourceHeader")
params`unknownnull` (optional)

setSplitScroll

Set the scroll position of a specific split

typescript
setSplitScroll(split_id: number, top_byte: number): boolean

Parameters:

NameTypeDescription
split_idnumberThe split ID
top_bytenumberThe byte offset of the top visible line

setSplitRatio

Set the ratio of a split container

typescript
setSplitRatio(split_id: number, ratio: number): boolean

Parameters:

NameTypeDescription
split_idnumberID of the split
rationumberRatio between 0.0 and 1.0 (0.5 = equal split)

distributeSplitsEvenly

Distribute all visible splits evenly This adjusts the ratios of all container splits so each leaf split gets equal space

typescript
distributeSplitsEvenly(): boolean

setBufferCursor

Set cursor position in a buffer (also scrolls viewport to show cursor)

typescript
setBufferCursor(buffer_id: number, position: number): boolean

Parameters:

NameTypeDescription
buffer_idnumberID of the buffer
positionnumberByte offset position for the cursor

executeAction

Execute a built-in editor action by name This is used by vi mode plugin to run motions and then check cursor position. For example, to implement "dw" (delete word), the plugin:

  1. Saves current cursor position
  2. Calls executeAction("move_word_right") - cursor moves
  3. Gets new cursor position
  4. Deletes from old to new position
typescript
executeAction(action_name: string): boolean

Parameters:

NameTypeDescription
action_namestringAction name (e.g., "move_word_right", "move_line_end")

executeActions

Execute multiple actions in sequence, each with an optional repeat count Used by vi mode for count prefix (e.g., "3dw" = delete 3 words). All actions execute atomically with no plugin roundtrips between them.

typescript
executeActions(actions: ActionSpecJs[]): boolean

Parameters:

NameTypeDescription
actionsActionSpecJs[]Array of {action: string, count?: number} objects

setEditorMode

Set the global editor mode (for modal editing like vi mode) When a mode is set, its keybindings take precedence over normal key handling. Pass null/undefined to clear the mode and return to normal editing.

typescript
setEditorMode(mode?: string | null): boolean

Parameters:

NameTypeDescription
mode`stringnull` (optional)

showActionPopup

Show an action popup with buttons for user interaction When the user selects an action, the ActionPopupResult hook is fired.

typescript
showActionPopup(options: TsActionPopupOptions): boolean

Parameters:

NameTypeDescription
optionsTsActionPopupOptionsPopup configuration with id, title, message, and actions

disableLspForLanguage

Disable LSP for a specific language and persist to config This is used by LSP helper plugins to let users disable LSP for languages where the server is not available or not working.

typescript
disableLspForLanguage(language: string): boolean

Parameters:

NameTypeDescription
languagestringThe language to disable LSP for (e.g., "python", "rust")

createScrollSyncGroup

Create a scroll sync group for anchor-based synchronized scrolling Used for side-by-side diff views where two panes need to scroll together. The plugin provides the group ID (must be unique per plugin).

typescript
createScrollSyncGroup(group_id: number, left_split: number, right_split: number): boolean

Parameters:

NameTypeDescription
group_idnumber-
left_splitnumber-
right_splitnumber-

setScrollSyncAnchors

Set sync anchors for a scroll sync group Anchors map corresponding line numbers between left and right buffers. Each anchor is a tuple of (left_line, right_line).

typescript
setScrollSyncAnchors(group_id: number, anchors: [number, number][]): boolean

Parameters:

NameTypeDescription
group_idnumber-
anchors[number, number][]-

removeScrollSyncGroup

Remove a scroll sync group

typescript
removeScrollSyncGroup(group_id: number): boolean

Parameters:

NameTypeDescription
group_idnumber-

Released under the Apache 2.0 License