editor

package
v0.0.0-...-4916209 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 2, 2026 License: MIT Imports: 9 Imported by: 0

Documentation

Overview

Package editor es la vista de código: lo que se ve y con lo que se interactúa cuando se edita un archivo.

Es la capa que junta el modelo de texto con el framework de interfaz. Del primero toma el rope, las transacciones y los cursores; del segundo, el ser un elemento más del árbol que mide, se sitúa, pinta en una escena y recibe eventos. No conoce el sistema operativo ni el registro de comandos: las acciones que expone se registran desde fuera, en la capa que compone el programa.

Index

Constants

View Source
const (
	// CtxFocus indica que el editor tiene el teclado.
	CtxFocus = "editorFocus"

	// CtxEditable distingue editar de mirar. Un archivo de un gigabyte se abre
	// en modo lectura, y sus atajos de edición no deben responder.
	CtxEditable = "editorEditable"

	// CtxSelection indica que hay algo seleccionado.
	CtxSelection = "editorHasSelection"

	// CtxMultiCursor indica que hay más de un cursor.
	CtxMultiCursor = "editorMultiCursor"

	// CtxDirty indica que el documento tiene cambios sin guardar.
	CtxDirty = "editorDirty"
)

Banderas de contexto que publica el editor.

Son los nombres que pueden aparecer en las condiciones de los atajos, así que forman parte de la API: cambiarlos rompe la configuración de teclado de quien los haya usado.

Variables

This section is empty.

Functions

This section is empty.

Types

type Source

type Source interface {
	LineCount() int
	Line(i int) string
	LineStart(line int) int
	LineEnd(line int) int
	LineOf(offset int) (line, start int)
	Len() int
	Slice(start, end int) string
}

Source es un documento que la vista sabe dibujar y recorrer.

Existe para que el visor de un archivo de un gigabyte proyectado en memoria y el editor de un archivo normal recorran exactamente el mismo camino de dibujo. Lo único que los distingue es si además hay un buffer editable detrás: sin él la vista navega pero no escribe, que es justo lo que hace falta para no perder la propiedad de abrir un gigabyte al instante.

type State

type State struct {
	Selections []buffer.Selection
	Vertical   float32
	Horizontal float32
}

State es lo que hay que recordar de una vista para poder volver a ella.

Existe porque un editor con varias pestañas tiene una sola vista y muchos documentos: al cambiar de pestaña hay que guardar dónde estaba el cursor y por dónde iba el desplazamiento, o volver a un archivo lo dejaría a uno mirando otra vez la primera línea. Es también lo que se guarda entre sesiones.

type View

type View struct {
	ui.Base

	// OnChange avisa de que el documento se ha modificado, para que la barra de
	// estado y la pestaña se enteren.
	OnChange func()

	// Clipboard conecta con el portapapeles del sistema. La vista no sabe
	// llegar a él —está por debajo de la capa que conoce la ventana— y lo
	// recibe como un par de funciones.
	Clipboard struct {
		Read  func() string
		Write func(string)
	}
	// contains filtered or unexported fields
}

View es la vista de código.

func New

func New(th *ui.Theme, src Source) *View

New crea una vista sobre un documento de solo lectura.

func (*View) AcceptsFocus

func (v *View) AcceptsFocus() bool

AcceptsFocus implementa ui.Focusable.

func (*View) AddCursorVertical

func (v *View) AddCursorVertical(delta int)

AddCursorVertical añade un cursor una línea por encima o por debajo del último, que es el gesto con el que se empieza a editar en columna.

func (*View) CollapseCursors

func (v *View) CollapseCursors() bool

CollapseCursors deja un único cursor, el principal.

func (*View) Context

func (v *View) Context(ctx command.Context)

Context publica el estado del editor para las condiciones de los atajos.

func (*View) Copy

func (v *View) Copy()

Copy lleva la selección al portapapeles.

Sin nada seleccionado se copia la línea entera. Es lo que hacen los editores modernos y evita el gesto de seleccionar una línea solo para duplicarla.

func (*View) Cut

func (v *View) Cut()

Cut copia y borra.

func (*View) DeleteBackward

func (v *View) DeleteBackward(byWord bool)

DeleteBackward borra hacia atrás: la selección si la hay, y si no el carácter o la palabra anterior.

func (*View) DeleteForward

func (v *View) DeleteForward(byWord bool)

DeleteForward borra hacia delante.

func (*View) DeleteLine

func (v *View) DeleteLine()

DeleteLine borra las líneas que toca cada cursor.

func (*View) Editable

func (v *View) Editable() bool

Editable indica si el documento admite cambios.

func (*View) Event

func (v *View) Event(e ui.Event) ui.Handled

Event atiende al ratón y a la rueda. El teclado llega por comandos, no por aquí: las teclas las reparte el registro de atajos, que es quien sabe qué significa cada una según dónde esté el foco.

func (*View) ExpandSelection

func (v *View) ExpandSelection()

ExpandSelection amplía la selección al siguiente nivel sintáctico.

Sin árbol sintáctico, «el siguiente nivel» se resuelve con lo que sí se puede saber de un vistazo: de nada a la palabra, de la palabra a lo que hay dentro del paréntesis que la envuelve, de ahí a incluir los propios delimitadores, y cuando ya no queda ninguno, a la línea y al documento. En código real coincide casi siempre con lo que haría un árbol, y cuando no coincide se queda corto en vez de largo, que es el error que no molesta.

func (*View) Focused

func (v *View) Focused() bool

Focused indica si la vista tiene el teclado.

func (*View) GoTo

func (v *View) GoTo(line, col int)

GoTo lleva el cursor a una línea y columna, y la deja centrada si venía de fuera de la pantalla.

Es lo que necesitan la búsqueda en proyecto y el salto a un error: llegar a un sitio del que no se sabía nada hace un segundo. Aquí sí se centra, al revés que al mover el cursor: no hay contexto previo que conservar.

func (*View) GoToMatchingBracket

func (v *View) GoToMatchingBracket()

GoToMatchingBracket lleva el cursor a la pareja del delimitador que tenga al lado.

func (*View) Indent

func (v *View) Indent()

Indent mete un nivel a todas las líneas tocadas.

func (*View) Insert

func (v *View) Insert(s string)

Insert sustituye cada selección por el texto dado.

Es la operación de la que salen casi todas las demás: escribir un carácter, pegar, y borrar —que es insertar la cadena vacía sobre un rango—. Tenerlas todas en una sola forma es lo que hace que multi-cursor no necesite un camino aparte: son varias ediciones en una transacción, y ya está.

func (*View) InsertNewline

func (v *View) InsertNewline()

InsertNewline abre una línea conservando la indentación de la actual.

Copiar los espacios de la línea anterior es la indentación automática que se puede hacer sin entender el código. La de verdad —la que sabe que después de abrir una llave hay que meter un nivel más— necesita el árbol sintáctico y llega en el Hito 4.

func (*View) Language

func (v *View) Language() string

Language devuelve el nombre del lenguaje detectado, para la barra de estado.

func (*View) LastError

func (v *View) LastError() error

LastError devuelve y limpia el último fallo, para que quien componga el programa decida cómo enseñarlo.

func (*View) Layout

func (v *View) Layout(c ui.Constraints) geom.Size

Layout ocupa todo el hueco que le den: el editor es lo que sobra después del chasis, no algo que pida un tamaño.

func (*View) MoveDocumentEnd

func (v *View) MoveDocumentEnd(extend bool)

MoveDocumentEnd lleva el cursor al final del documento.

func (*View) MoveDocumentStart

func (v *View) MoveDocumentStart(extend bool)

MoveDocumentStart lleva el cursor al principio del documento.

func (*View) MoveLeft

func (v *View) MoveLeft(extend, byWord bool)

MoveLeft mueve el cursor un carácter —o una palabra— hacia atrás.

func (*View) MoveLineEnd

func (v *View) MoveLineEnd(extend bool)

MoveLineEnd lleva el cursor al final de la línea.

func (*View) MoveLineStart

func (v *View) MoveLineStart(extend bool)

MoveLineStart lleva el cursor al principio de la línea.

Alterna entre el primer carácter con contenido y el margen: en código indentado, lo que casi siempre se quiere es lo primero, pero pulsando dos veces se llega igualmente a la columna cero.

func (*View) MovePage

func (v *View) MovePage(dir int, extend bool)

MovePage sube o baja una pantalla.

func (*View) MoveRight

func (v *View) MoveRight(extend, byWord bool)

MoveRight mueve el cursor un carácter —o una palabra— hacia delante.

func (*View) MoveVertical

func (v *View) MoveVertical(delta int, extend bool)

MoveVertical sube o baja el número de líneas dado.

func (*View) Outdent

func (v *View) Outdent()

Outdent saca un nivel a todas las líneas tocadas.

func (*View) PageLines

func (v *View) PageLines() int

PageLines es cuántas líneas cubre una pantalla, que es lo que debe avanzar AvPág. Una constante se quedaría corta o se pasaría según el tamaño de la ventana.

func (*View) Paint

func (v *View) Paint(s *ui.Scene)

Paint dibuja únicamente las líneas visibles.

El coste del fotograma depende de la altura de la ventana, nunca del tamaño del documento. Es la propiedad que hace que abrir un archivo enorme sea instantáneo, y la que mide el banco de pruebas.

func (*View) Paste

func (v *View) Paste()

Paste inserta el portapapeles en cada cursor.

func (*View) Place

func (v *View) Place(r geom.Rect)

Place actualiza los límites de desplazamiento para el nuevo tamaño.

func (*View) Redo

func (v *View) Redo() bool

Redo rehace la última operación deshecha.

func (*View) Register

func (v *View) Register(r *command.Registry)

Register da de alta los comandos del editor y sus atajos por omisión.

Los atajos viven junto al comando y no en una tabla aparte porque así se ven las dos cosas a la vez al leerlos, que es cuando importa que cuadren. La configuración del usuario se cargará después y, como gana el último atajo registrado, tapará estos sin tener que borrarlos.

func (*View) Restore

func (v *View) Restore(s State)

Restore devuelve la vista a una posición guardada.

func (*View) Reveal

func (v *View) Reveal()

Reveal desplaza lo justo para que el cursor principal quede a la vista.

Se mueve el mínimo necesario a propósito: recentrar la vista en cada pulsación de flecha desorienta.

func (*View) Save

func (v *View) Save() error

Save escribe el documento en el disco.

func (*View) ScrollByLines

func (v *View) ScrollByLines(lines float32)

ScrollByLines desplaza una cantidad de líneas, para el banco de pruebas.

func (*View) SelectAll

func (v *View) SelectAll()

SelectAll abarca el documento entero.

func (*View) SelectLine

func (v *View) SelectLine()

SelectLine selecciona la línea del cursor, o la extiende a la siguiente si ya estaba entera.

func (*View) SelectedText

func (v *View) SelectedText() string

SelectedText devuelve lo seleccionado. Con varios cursores, las partes van separadas por saltos de línea, que es como se pegan después.

func (*View) Selections

func (v *View) Selections() *buffer.Selections

Selections da acceso a los cursores.

func (*View) SetFocus

func (v *View) SetFocus(f bool)

SetFocus implementa ui.Focusable.

func (*View) SetSource

func (v *View) SetSource(src Source, txt *buffer.Text, path string)

SetSource cambia el documento. text puede ser nil, en cuyo caso la vista navega pero no edita; path decide el lenguaje con el que se resalta.

func (*View) SetTheme

func (v *View) SetTheme(th *ui.Theme)

SetTheme rehace las referencias al tema tras un cambio de densidad.

func (*View) ShrinkSelection

func (v *View) ShrinkSelection()

ShrinkSelection deshace la última expansión.

Se guarda la pila de lo que había antes en lugar de calcular el paso hacia dentro: contraer no es la operación inversa de expandir —desde una línea entera hay muchos «un nivel menos» posibles— y devolver exactamente lo que el usuario tenía es lo único que no sorprende.

func (*View) Source

func (v *View) Source() Source

Source devuelve el documento que se está mostrando.

func (*View) State

func (v *View) State() State

State captura la posición actual de la vista.

func (*View) Text

func (v *View) Text() *buffer.Text

Text devuelve el documento editable, o nil si es de solo lectura.

func (*View) Tick

func (v *View) Tick(dt time.Duration) bool

Tick implementa ui.Animator: mantiene viva la inercia del desplazamiento.

func (*View) Undo

func (v *View) Undo() bool

Undo deshace la última operación.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL