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
- type Source
- type State
- type View
- func (v *View) AcceptsFocus() bool
- func (v *View) AddCursorVertical(delta int)
- func (v *View) CollapseCursors() bool
- func (v *View) Context(ctx command.Context)
- func (v *View) Copy()
- func (v *View) Cut()
- func (v *View) DeleteBackward(byWord bool)
- func (v *View) DeleteForward(byWord bool)
- func (v *View) DeleteLine()
- func (v *View) Editable() bool
- func (v *View) Event(e ui.Event) ui.Handled
- func (v *View) ExpandSelection()
- func (v *View) Focused() bool
- func (v *View) GoTo(line, col int)
- func (v *View) GoToMatchingBracket()
- func (v *View) Indent()
- func (v *View) Insert(s string)
- func (v *View) InsertNewline()
- func (v *View) Language() string
- func (v *View) LastError() error
- func (v *View) Layout(c ui.Constraints) geom.Size
- func (v *View) MoveDocumentEnd(extend bool)
- func (v *View) MoveDocumentStart(extend bool)
- func (v *View) MoveLeft(extend, byWord bool)
- func (v *View) MoveLineEnd(extend bool)
- func (v *View) MoveLineStart(extend bool)
- func (v *View) MovePage(dir int, extend bool)
- func (v *View) MoveRight(extend, byWord bool)
- func (v *View) MoveVertical(delta int, extend bool)
- func (v *View) Outdent()
- func (v *View) PageLines() int
- func (v *View) Paint(s *ui.Scene)
- func (v *View) Paste()
- func (v *View) Place(r geom.Rect)
- func (v *View) Redo() bool
- func (v *View) Register(r *command.Registry)
- func (v *View) Restore(s State)
- func (v *View) Reveal()
- func (v *View) Save() error
- func (v *View) ScrollByLines(lines float32)
- func (v *View) SelectAll()
- func (v *View) SelectLine()
- func (v *View) SelectedText() string
- func (v *View) Selections() *buffer.Selections
- func (v *View) SetFocus(f bool)
- func (v *View) SetSource(src Source, txt *buffer.Text, path string)
- func (v *View) SetTheme(th *ui.Theme)
- func (v *View) ShrinkSelection()
- func (v *View) Source() Source
- func (v *View) State() State
- func (v *View) Text() *buffer.Text
- func (v *View) Tick(dt time.Duration) bool
- func (v *View) Undo() bool
Constants ¶
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 ¶
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 (*View) AcceptsFocus ¶
AcceptsFocus implementa ui.Focusable.
func (*View) AddCursorVertical ¶
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 ¶
CollapseCursors deja un único cursor, el principal.
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) DeleteBackward ¶
DeleteBackward borra hacia atrás: la selección si la hay, y si no el carácter o la palabra anterior.
func (*View) DeleteForward ¶
DeleteForward borra hacia delante.
func (*View) DeleteLine ¶
func (v *View) DeleteLine()
DeleteLine borra las líneas que toca cada cursor.
func (*View) Event ¶
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) GoTo ¶
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) Insert ¶
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 ¶
Language devuelve el nombre del lenguaje detectado, para la barra de estado.
func (*View) LastError ¶
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 ¶
MoveDocumentEnd lleva el cursor al final del documento.
func (*View) MoveDocumentStart ¶
MoveDocumentStart lleva el cursor al principio del documento.
func (*View) MoveLineEnd ¶
MoveLineEnd lleva el cursor al final de la línea.
func (*View) MoveLineStart ¶
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) MoveVertical ¶
MoveVertical sube o baja el número de líneas dado.
func (*View) PageLines ¶
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 ¶
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) Register ¶
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) 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) ScrollByLines ¶
ScrollByLines desplaza una cantidad de líneas, para el banco de pruebas.
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 ¶
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) SetSource ¶
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) 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.