Icono de EEditor

EEditor

Un editor nativo y rápido para plataformas Apple — con vista previa de Markdown, resaltado de sintaxis multilenguaje y un REPL Lisp integrado con gestión de información personal inspirada en Lotus Agenda.

macOS 14+ iOS 17+ iPadOS 17+ 100% Swift REPL integrado Código abierto
Descargar para macOS Código fuente en GitHub

v1.1 · Requiere macOS Sonoma o posterior, iOS 17 o posterior

Todo lo que necesitas para escribir

Un editor, organizador y motor de datos completo — en una sola aplicación nativa.

✍️

Resaltado de sintaxis

Coloración en tiempo real para más de 24 lenguajes. Encabezados Markdown, negrita, bloques de código y más — todo resaltado mientras escribes.

👁️

Vista previa en vivo

Renderiza Markdown como HTML con estilo y modo oscuro/claro. Actívalo con un atajo o un toque de botón.

📄

Exportación a PDF

Exporta cualquier documento como PDF A4 listo para imprimir. Diálogo de guardado en macOS, hoja para compartir en iOS.

📅

Notas diarias

Crea la nota de hoy con un solo atajo. Archivos nombrados YYYY-MM-DD.md y abiertos al instante.

📋

Planificador semanal

Genera planificadores semanales estructurados con encabezados de lunes a domingo y bloques horarios de Mañana/Tarde/Noche.

🗓️

Vista de calendario

Explora archivos por fecha de modificación en una cuadrícula mensual. Puntos dobles muestran actividad de archivos (azul) y elementos de agenda (naranja). Haz clic en un día para ver archivos y elementos programados.

🔍

Búsqueda de texto completo

Busca en todos los archivos con fragmentos de contexto, números de línea y conteo de coincidencias. Opción de distinguir mayúsculas.

Apertura rápida

Buscador difuso de archivos con navegación por teclado. Encuentra y abre cualquier archivo en milisegundos.

📋

Pestañas y archivos fijados

Abre múltiples archivos como pestañas. Fija tus favoritos para que persistan entre sesiones. Cierra todas las no fijadas de una vez.

💾

Guardado automático

Los cambios se guardan automáticamente con un retardo de 1 segundo. Tu trabajo nunca se pierde.

💻

REPL EELisp

Intérprete Lisp integrado con base de datos SQLite. Define tablas, consulta datos y navega registros en formularios interactivos estilo dBASE — directamente en el editor. Se abre como panel lateral derecho que permanece abierto mientras cambias entre archivos. El historial de comandos persiste entre sesiones.

📋

Agenda e Introducción inteligente

Gestor de información personal inspirado en Lotus Agenda. Añade elementos con lenguaje natural, categoriza automáticamente con reglas, define vistas, elementos recurrentes, plantillas, múltiples agendas con exportación/importación. El panel lateral de agenda muestra Atrasados/Hoy/Próximos de un vistazo.

▶️

Bloques de código ejecutables

Inserta bloques de código ```eelisp en Markdown. Pulsa ⌘⇧Return para ejecutarlos y ver un bloque ```result justo después de la cerca de cierre. Los formularios y tablas se abren en un panel lateral.

📁

Scripting de archivos y editor

Lee y escribe archivos, accede al portapapeles, manipula el cursor, inserta texto y consulta el búfer del editor — todo desde EELisp. Tus notas se vuelven programables.

📝

Formularios inteligentes

Construye formularios interactivos con campos calculados, selectores desplegables y respaldo opcional de base de datos. Formularios de cálculo, entrada de datos y CRUD — todo definido en una sola expresión. Ejecútalos desde el editor para abrir como panel lateral, o en el REPL para visualización en línea.

🏭

Multiplataforma

SwiftUI para macOS, iOS e iPadOS. Barra de acciones rápidas táctil en dispositivos móviles.

Más de 24 lenguajes soportados

Resaltado de sintaxis en tiempo real con reglas para palabras clave, tipos, cadenas, números, comentarios y preprocesador.

Markdown Swift Python JavaScript TypeScript HTML CSS JSON YAML TOML XML Go Rust Java Kotlin Scala C C++ Objective-C C# Ruby PHP Shell SQL Lua Perl R Dart Elixir Haskell Lisp

REPL EELisp integrado

Un intérprete Lisp para la gestión de datos personales — inspirado en dBASE III y Lotus Agenda. Con un motor completo de base de datos SQLite y seguimiento de elementos estilo agenda.

Lenguaje

;; Definir funciones
(defn greet (name)
  (str "Hello, " name "!"))

(greet "world")
; → "Hello, world!"

;; Funciones de orden superior
(map inc (range 1 6))
; → (2 3 4 5 6)

(filter even? (range 1 11))
; → (2 4 6 8 10)

(reduce + 0 '(1 2 3 4 5))
; → 15

Base de datos

;; Crear una tabla
(deftable contacts
  (name:string email:string age:number))

;; Insertar registros
(insert contacts
  {:name "Alice" :age 30})
(insert contacts
  {:name "Bob"   :age 25})

;; Consultar con filtros
(query contacts
  :where "age > ?"
  :params (list 28)
  :order "name")

Vistas interactivas

;; Vista de tabla (cuadrícula navegable)
(browse contacts)

;; Formulario CRUD (editar/guardar/eliminar)
(edit contacts
  :where "age > ?"
  :params (list 25))

;; Calculadora con campos calculados
(defform interest
  (principal:number rate:number
   years:number)
  :computed
  ((total (* principal
    (pow (+ 1 (/ rate 100))
         years)))
   (gain (- total principal))))

Agenda (Reglas y autocategorización)

;; Reglas de autocategorización
(defrule urgent-flag
  :when (str-contains text "URGENT")
  :assign "priority/high")

(defrule errand-detect
  :when (str-contains text "buy ")
  :assign "personal/errands")

;; Aplicar reglas automáticamente al insertar
(auto-categorize true)

;; ¡Los elementos se categorizan automáticamente!
(add-item "URGENT: Deploy hotfix")
;; → priority/high asignado

(add-item "Buy groceries")
;; → personal/errands asignado

Vistas (Perspectivas dinámicas)

;; Definir vistas guardadas
(defview work-board
  :source items
  :filter (has-category "work")
  :group-by category
  :sort-by when)

(defview urgent
  :source items
  :filter (= priority "1"))

(defview overdue
  :source items
  :filter (overdue?))

;; Mostrar una vista
(show work-board)
;; → ▸ work/meetings (2)
;;       Team standup
;;       Call with client
;;   ▸ work/projects (3)
;;       Deploy v2.1
;;       Finish report

Entrada inteligente y HTTP

;; Creación de elementos con lenguaje natural
(add "Meet Alice tomorrow !!")
;; → fecha, prioridad, persona extraídas

(add "Call Bob next Monday")
;; → :when = next Monday, :who Bob

;; Previsualizar extracción
(smart-parse "URGENT deploy end of month")
;; → {:text "deploy" :when "..."
;;    :priority 1}

;; Funciones integradas de JSON y HTTP
(json-parse "{\"a\": 1}")
;; → {:a 1}

(http-get "https://api.example.com/data")
;; → {:status 200 :body "..."}

Bloques de código ejecutables

;; Insertar en Markdown, ejecutar con ⌘⇧Return
```eelisp
(add-item (smart-parse
  "tomorrow review report !!"))
```
```result
Added item #42
```

;; Cálculos en línea en tus notas
```eelisp
(* 24 365)
```
```result
8760
```

Scripting de archivos y editor

;; Leer/escribir archivos en tu espacio de trabajo
(write-file "todo.txt"
  (str "Generated: " (today)))
(read-file "notes.md")

;; Interactuar con el editor
(insert-at (cursor-pos)
  (str "Updated: " (today)))
(def sel (selection))

;; Acceso al portapapeles
(clipboard-set "copied!")
(clipboard-get)

Formularios inteligentes y desplegables

;; Campos de selección (selectores desplegables)
(defform new-task
  (title:string
   (priority:choice
     "low" "medium" "high")
   (status:choice
     "todo" "in-progress" "done")
   notes:memo))

;; Formulario respaldado por tabla con CRUD
(defform project-editor
  (name:string
   (status:choice "active" "done")
   budget:number)
  :source projects)

Atajos de teclado

Cada acción está a un atajo de distancia. Todos los atajos también se muestran en la ayuda integrada de la aplicación.

Archivos

Guardar⌘S
Nuevo archivo⌘N
Abrir carpeta⌘O
Nota diaria⌘D
Planificador semanal⌘⇧W
Actualizar árbol de archivos⌘⇧R

Navegación

Apertura rápida⌘P
Buscar en archivos⌘⇧F
Enfocar editor⌘\

Pestañas

Cerrar pestaña⌘W
Siguiente pestaña⌘⌥→
Pestaña anterior⌘⌥←
Fijar / Desfijar⌘⇧K
Cerrar todas las no fijadas⌘⌥W

Edición

Buscar y reemplazar⌘F
Insertar marca de tiempo⌘I
Deshacer⌘Z
Rehacer⌘⇧Z

Vista y exportación

Vista previa⌘⇧P
Exportar PDF⌘⇧E
Ayuda de atajos⌘?

REPL y EELisp

Alternar panel REPL⌘⇧L
Enviar al REPL⌘R
Ejecutar bloque EELisp⌘⇧Return
Insertar bloque EELisp⌘⇧C
Ejecutar (en el REPL)⌘Return

Manual de usuario

Todo lo que necesitas saber para sacar el máximo partido a EEditor.

1. Primeros pasos

Cuando inicies EEditor por primera vez, verás un editor vacío con una barra lateral. Para empezar a trabajar:

  1. Abre una carpeta — pulsa ⌘O o toca el icono de carpeta en la barra lateral para elegir un directorio. EEditor lo escaneará y mostrará todos los archivos en el árbol de la barra lateral.
  2. Selecciona un archivo — haz clic en cualquier archivo de la barra lateral para abrirlo en el editor. El archivo se abre en una nueva pestaña.
  3. Comienza a escribir — las ediciones se guardan automáticamente tras 1 segundo de inactividad. También puedes pulsar ⌘S para guardar inmediatamente.
Consejo: EEditor recuerda tu última carpeta abierta. La próxima vez que lo inicies, la restaurará automáticamente.

2. El editor

EEditor proporciona un entorno de escritura sin distracciones con resaltado de sintaxis en tiempo real.

  • Resaltado de sintaxis — encabezados, negrita, cursiva, bloques de código, enlaces y más se colorean en tiempo real para Markdown. Para archivos de código, las palabras clave, tipos, cadenas, números y comentarios se resaltan en más de 24 lenguajes.
  • Buscar y reemplazar — pulsa ⌘F para abrir la barra de búsqueda. Escribe para buscar, usa el campo de reemplazo para sustituir coincidencias.
  • Insertar marca de tiempo — pulsa ⌘I para insertar la fecha y hora actual (YYYY-MM-DD HH:mm) en la posición del cursor.
  • Deshacer / Rehacer⌘Z para deshacer, ⌘⇧Z para rehacer.
  • Indicador de lenguaje — el lenguaje detectado se muestra en la esquina inferior derecha del editor.

3. Barra lateral y árbol de archivos

La barra lateral muestra una vista jerárquica de tu carpeta. Los directorios se ordenan primero, luego los archivos alfabéticamente.

  • Expandir/contraer carpetas haciendo clic en el triángulo de apertura.
  • Crear un nuevo archivo — pulsa ⌘N o usa el botón +. Puedes escribir una ruta como subcarpeta/archivo.md para crear archivos anidados.
  • Crear una nueva carpeta — usa el botón + de carpeta en la barra de herramientas de la barra lateral.
  • Eliminar — haz clic derecho (o mantén pulsado en iOS) y selecciona Eliminar. En macOS, los archivos se mueven a la Papelera.
  • Renombrar — usa el menú contextual para renombrar archivos o carpetas.
  • Actualizar — pulsa ⌘⇧R para reescanear el directorio.
  • Indicador de cambios — aparece un pequeño punto junto a los archivos con cambios sin guardar.

La barra lateral tiene tres modos accesibles mediante el control segmentado en la parte superior: Archivos (árbol de archivos), Calendario (ver sección 8) y Agenda (ver sección 8b).

4. Pestañas y archivos fijados

Cada archivo que abres aparece como una pestaña en la parte superior del área del editor.

  • Cambiar de pestaña — haz clic en una pestaña, o usa ⌘⌥→ (siguiente) y ⌘⌥← (anterior). La navegación es circular.
  • Cerrar una pestaña — haz clic en el botón × de la pestaña o pulsa ⌘W. Los cambios sin guardar se guardan automáticamente antes de cerrar.
  • Cerrar todas las no fijadas — pulsa ⌘⌥W para cerrar todas las pestañas excepto las fijadas.
  • Fijar una pestaña — pulsa ⌘⇧K o haz clic derecho en la pestaña y selecciona Fijar. Las pestañas fijadas muestran un icono de chincheta y no se pueden cerrar (desfija primero). Las pestañas fijadas se restauran al reiniciar la aplicación.

Búsqueda de texto completo (⌘⇧F) busca en todos los archivos de tu espacio de trabajo:

  • Los resultados muestran nombre de archivo, número de línea, conteo de coincidencias y contexto (las líneas alrededor de cada coincidencia).
  • Activa el modo distinguir mayúsculas con el botón Aa.
  • Haz clic en cualquier resultado para abrir el archivo en esa ubicación.

Apertura rápida (⌘P) es un buscador difuso de archivos:

  • Comienza a escribir un nombre de archivo — los resultados se actualizan al instante.
  • Usa las teclas de flecha para navegar, Enter para abrir, Escape para cancelar.
  • Las coincidencias de prefijo se clasifican más alto. Los nombres más cortos aparecen primero entre empates.
  • Prerrellenado de selección: si tienes texto seleccionado en el editor, al pulsar ⌘P se prerrellena la búsqueda con tu selección.

Wiki-links (⌘O): coloca el cursor sobre un enlace [[nombre_archivo]] y pulsa ⌘O para abrir ese archivo directamente. Si no se detecta un wiki-link, aparece el diálogo estándar de Abrir carpeta.

6. Vista previa y exportación a PDF

Vista previa de Markdown (⌘⇧P) renderiza tu documento como HTML con estilo:

  • Soporta encabezados, listas, bloques de código, enlaces, imágenes, citas y tablas.
  • Se adapta al modo oscuro o claro de tu sistema.
  • En macOS, la vista previa se abre en un marco. En iOS, aparece como una hoja.

Exportación a PDF (⌘⇧E) genera un documento listo para imprimir:

  • Tamaño de página A4 (595 × 842 puntos) con tipografía limpia.
  • En macOS, aparece un diálogo de guardado con un nombre de archivo sugerido.
  • En iOS/iPadOS, el PDF se presenta a través de la hoja del sistema para compartir.

7. Notas diarias y planificador semanal

Nota diaria (⌘D):

  • Crea un archivo llamado YYYY-MM-DD.md (p. ej., 2026-02-19.md) en tu carpeta raíz.
  • Prerrellenado con un encabezado: # 2026-02-19.
  • Si el archivo ya existe, simplemente lo abre.

Planificador semanal (⌘⇧W):

  • Crea un archivo llamado YYYY-WEEK-WW.md (p. ej., 2026-WEEK-08.md) usando la numeración de semanas ISO 8601.
  • Prerrellenado con una plantilla estructurada:
    # Week 08 — 2026
    
    ## Monday
    ### Morning
    -
    ### Afternoon
    -
    ### Evening
    -
    
    ## Tuesday
    ...through Sunday
  • Si el archivo ya existe, simplemente lo abre.

8. Vista de calendario

Cambia la barra lateral al modo Calendario usando el control segmentado (iconos de carpeta / calendario / agenda) en la parte superior de la barra lateral.

  • Una cuadrícula mensual muestra el mes actual con el lunes como primer día de la semana (ISO 8601).
  • Indicadores de doble punto aparecen en cada día: un punto azul para actividad de archivos y un punto naranja para elementos de agenda programados en esa fecha.
  • Usa los botones < y > para navegar entre meses. El botón Hoy vuelve al mes actual.
  • Haz clic en un día para ver los archivos modificados ese día y los elementos de agenda programados para esa fecha, organizados en secciones separadas.
  • Haz clic en un archivo en la lista del día para abrirlo en el editor.

8b. Barra lateral de agenda

Cambia la barra lateral al modo Agenda usando el icono de portapapeles en el control segmentado. El panel de agenda proporciona una vista general de tu programación:

  • Atrasados — elementos con una fecha :when anterior a hoy, mostrados con un encabezado de sección rojo.
  • Hoy — elementos programados para hoy.
  • Próximos 7 días — elementos próximos dentro de la siguiente semana.
  • Cada elemento muestra su punto de prioridad (rojo = urgente, naranja = alta, amarillo = media, gris = normal), texto, categorías y fecha formateada.
  • Usa el botón de actualizar para recargar datos después de añadir elementos en el REPL.
Consejo: La barra lateral de agenda lee datos de tu base de datos EELisp evaluando consultas (items), (items-on) e (items-between) internamente. Añade elementos en el REPL, luego cambia a la pestaña Agenda para verlos organizados por tiempo.

9. REPL EELisp

EEditor incluye un intérprete Lisp integrado llamado EELisp — diseñado para la gestión de datos personales.

Abrir el REPL:

  • Pulsa ⌘⇧L para alternar la barra lateral del REPL, o toca el icono de terminal en la barra de herramientas.
  • Si tienes texto seleccionado en el editor, ⌘⇧L lo envía al campo de entrada del REPL automáticamente.
  • El REPL se abre como un panel lateral derecho que permanece abierto mientras cambias entre archivos y pestañas.

Usar el REPL:

  • Escribe una expresión en el prompt > y pulsa ⌘Return para evaluarla.
  • Entrada multilínea — si tu expresión tiene paréntesis desbalanceados, el prompt cambia a .. y espera más entrada. Una barra de indicación muestra ⌘↩ para ejecutar · ⎋ para cancelar.
  • Historial — pulsa flecha arriba/abajo para navegar por comandos anteriores. El historial se conserva entre sesiones (hasta 100 entradas).
  • Seleccionar texto — haz clic y arrastra sobre cualquier entrada de salida para seleccionar y copiar texto.

Comportamiento de la barra lateral:

  • La barra lateral del REPL permanece abierta mientras cambias entre archivos, abres nuevas pestañas y navegas — no se cierra.
  • El estado de la barra lateral se conserva entre sesiones. Si cierras y reabres la aplicación, la barra lateral del REPL reaparece si estaba abierta.
  • Pulsa ⌘⇧L o haz clic en el botón × en la cabecera del REPL para cerrarlo.

Comandos de base de datos:

EELisp incluye comandos integrados para la gestión de bases de datos:

  • (tables) — listar todas las tablas en la base de datos actual
  • (describe tablename) — mostrar el esquema de una tabla
  • (drop-table tablename) — eliminar una tabla
  • :db — mostrar la ruta de la base de datos actual
  • :db <path> — cambiar a un archivo de base de datos diferente
  • :db new <name> — crear un nuevo archivo de base de datos en la carpeta actual
  • :db memory — cambiar a una base de datos en memoria

Ejecutar bloques EELisp en el editor:

  • Inserta bloques de código ```eelisp en cualquier archivo Markdown.
  • Coloca el cursor dentro del bloque y pulsa ⌘⇧Return para ejecutarlo.
  • El resultado se inserta como texto plano en la siguiente línea después de la cerca de cierre, auto-seleccionado para facilitar la copia.
  • Si el resultado es un formulario (edit, defform) o tabla (browse), se abre como un panel lateral interactivo junto al editor.

10. Comandos de base de datos

El REPL incluye un motor de base de datos SQLite. Por defecto usa una base de datos en memoria. Cuando abres una carpeta que contiene un archivo eelisp.db, el REPL se conecta automáticamente para almacenamiento persistente (ver Gestión de base de datos). Los nombres de tablas y definiciones de campos se escriben como símbolos sin comillas.

Definir una tabla:

(deftable tasks (title:string priority:number done:bool due:date))

Tipos de campo: string, number, bool, date, memo.

Insertar registros:

(insert tasks {:title "Write docs" :priority 1 :done false})

Consultar registros:

;; Todos los registros
(query tasks)

;; Con filtros
(query tasks :where "priority <= ?" :params (list 2))

;; Ordenados, limitados
(query tasks :order "priority" :limit 5)

;; Seleccionar columnas específicas
(query tasks :select "title, done")

Los resultados de consulta se muestran como tablas ASCII formateadas.

Formularios interactivos (browse):

;; Abrir un formulario para navegar, editar y gestionar registros
(browse tasks)

;; Navegar con filtros y ordenación
(browse tasks :where "done = ?" :params (list false) :order "priority")

El formulario muestra un registro a la vez con navegación Anterior/Siguiente, edición en línea, y botones Guardar, Nuevo y Eliminar.

Actualizar y eliminar:

;; Actualizar registro por ID
(update tasks 1 {:done true})

;; Eliminación suave (estilo dBASE)
(delete tasks 1)

;; Purgar registros eliminados
(pack tasks)

Otros comandos:

ComandoDescripción
(tables)Listar todos los nombres de tablas
(describe tasks)Mostrar esquema de la tabla
(count-records tasks)Contar registros (con :where opcional)
(drop-table tasks)Eliminar una tabla
(field-get record :name)Obtener un campo de un registro
(record-id record)Obtener el ID del registro
(records result-set)Extraer lista de registros de los resultados de consulta
(browse table)Abrir una vista de tabla/cuadrícula navegable
(edit table)Abrir un formulario CRUD interactivo
(defform name (fields) :computed ...)Crear un formulario calculadora con campos calculados

11. Gestión de base de datos

EELisp soporta tanto bases de datos SQLite en memoria como persistentes.

Conexión automática:

  • Cuando abres una carpeta, si existe un archivo eelisp.db en la raíz, el REPL se conecta automáticamente.
  • Los datos que crees con deftable e insert se persisten en disco.
  • Si no existe archivo de base de datos, el REPL usa una base de datos en memoria (los datos se pierden al cerrar la aplicación).

Comandos de base de datos del REPL:

ComandoDescripción
:dbMostrar la ruta de la base de datos actual
:db <path>Cambiar a un archivo de base de datos diferente
:db new <name>Crear un nuevo archivo de base de datos en la carpeta actual
:db memoryCambiar a una base de datos en memoria
Consejo: Las rutas de base de datos son relativas a la carpeta abierta actualmente. Usa :db mydata.db en lugar de escribir la ruta completa.

12. Agenda: Elementos, categorías, reglas y vistas

EELisp incluye un gestor de información personal inspirado en Lotus Agenda. Añade elementos de texto libre, categoriza automáticamente con reglas, define vistas dinámicas, organiza con categorías jerárquicas y consulta con filtros — todo almacenado en SQLite.

Añadir elementos:

;; Texto primero — simplemente escribe lo que tienes en mente
(add-item "Finish quarterly report for Sarah")

;; Con metadatos
(add-item "Call dentist" :when "2026-03-01" :priority 2)
(add-item "Buy groceries" :category "personal" :notes "milk, eggs, bread")

Consultar elementos:

;; Navegar todos los elementos (tabla interactiva)
(items)

;; Filtrar por categoría, texto, prioridad o fecha
(items :category "work")
(items :search "quarterly")
(items :priority 1)
(items :when-before "2026-03-01")

Gestionar elementos:

ComandoDescripción
(add-item text :when :priority :category :notes)Crear un nuevo elemento
(items :category :search :priority :when-before :when-after)Consultar elementos con filtros (vista de tabla)
(item-get id)Obtener un solo elemento por ID
(item-edit id)Abrir elemento en vista de formulario para editar
(item-set id :field val ...)Actualizar propiedades del elemento
(item-done id)Marcar elemento como completado (eliminación suave)
(item-count :category cat)Contar elementos con filtro opcional

Categorías:

Las categorías son jerárquicas (usan separadores /) y pueden ser mutuamente excluyentes:

;; Categorías jerárquicas
(defcategory work)
(defcategory work/projects)
(defcategory work/meetings)
(defcategory personal)
(defcategory personal/errands)

;; Categorías exclusivas (un elemento solo puede estar en un hijo)
(defcategory priority :exclusive true
  :children (high medium low))

;; Asignar / desasignar
(assign 1 "work/projects")
(assign 1 "priority/high")
(unassign 1 "personal")

;; Ver el árbol de categorías
(categories)
Consejo: Cuando una categoría padre está marcada como :exclusive true, asignar un hijo (p. ej., priority/low) elimina automáticamente los hermanos (p. ej., priority/high). Esto es ideal para estado, prioridad o cualquier agrupación de selección única.

Reglas de autocategorización:

Define reglas que categorizan automáticamente los elementos según su contenido — la magia de Lotus Agenda:

;; Reglas de coincidencia de texto
(defrule urgent-flag
  :when (str-contains text "URGENT")
  :assign "priority/high")

(defrule meeting-detect
  :when (or (str-contains text "meeting")
            (str-contains text "call with"))
  :assign "work/meetings")

;; Extracción de fecha por regex
(defrule date-extract
  :when (str-matches text "\\b(\\d{4}-\\d{2}-\\d{2})\\b")
  :action (item-set id :when (match 1)))

;; Aplicar reglas
(apply-rules)            ;; aplicar en lote a todos los elementos
(apply-rules 42)         ;; aplicar al elemento #42
(auto-categorize true)   ;; aplicar automáticamente en cada add-item

Gestión de reglas:

ComandoDescripción
(defrule name :when cond :assign cat)Definir una regla de categorización
(defrule name :when cond :action expr)Definir una regla con acción personalizada
(apply-rules)Aplicar todas las reglas a todos los elementos
(apply-rules id)Aplicar todas las reglas a un elemento específico
(auto-categorize true/false)Alternar aplicación automática al insertar
(rules)Listar todas las reglas definidas
(drop-rule name)Eliminar una regla
Consejo: Las condiciones de regla son expresiones Lisp completas. Usa str-contains para coincidencia simple de texto, str-matches para patrones regex, has-category para verificar categorías existentes y (get :property) para probar propiedades del elemento. Combina con and/or/not para lógica compleja.

Vistas — Perspectivas dinámicas:

Define consultas guardadas que filtran, ordenan y agrupan elementos. Muestra una vista en cualquier momento para ver los últimos elementos coincidentes:

;; Definir vistas con expresiones de filtro
(defview work-board
  :source items
  :filter (has-category "work")
  :group-by category
  :sort-by when)

(defview urgent
  :source items
  :filter (= priority "1")
  :sort-by when)

(defview inbox
  :source items
  :filter (= (length categories) 0))

;; Mostrar una vista
(show work-board)
;; → agrupada por categoría con conteo de elementos

(show urgent)
;; → elementos filtrados y ordenados

Gestión de vistas:

ComandoDescripción
(defview name :source :filter :group-by :sort-by)Definir una vista guardada con expresión de filtro
(show view-name)Mostrar los elementos coincidentes de una vista
(views)Listar todas las vistas definidas
(drop-view name)Eliminar una vista

Funciones auxiliares de fecha:

ComandoDescripción
(today)Devuelve la fecha de hoy como cadena ISO (p. ej., "2026-02-21")
(date-add date n :days/:weeks/:months)Añadir días, semanas o meses a una fecha
(date-diff date1 date2)Diferencia en días entre dos fechas
Consejo: Los filtros de vista usan el mismo contexto que las reglas — text, notes, categories, todas las propiedades, más las funciones auxiliares has-category y overdue?. Los elementos con propiedades faltantes se excluyen silenciosamente, no generan errores.

Integración con calendario:

Visualiza elementos por fecha y añade rápidamente elementos para hoy:

;; Ver elementos para una fecha específica
(items-on "2026-02-24")

;; Ver elementos en un rango de fechas
(items-between "2026-02-24" "2026-02-28")

;; Añadir rápidamente con la fecha de hoy auto-rellenada
(add-item-today "Review pull requests" :priority 1)
(add-item-today "Quick grocery run" :notes "milk, bread")

;; Combinar con funciones auxiliares de fecha
(items-on (today))
(items-between (today) (date-add (today) 7 :days))
ComandoDescripción
(items-on "date")Mostrar elementos programados para una fecha específica
(items-between "start" "end")Mostrar elementos en un rango de fechas (inclusivo)
(add-item-today text :priority :category :notes)Añadir elemento con la fecha de hoy auto-rellenada

Entrada inteligente:

El comando add analiza lenguaje natural para extraer fechas, prioridades y personas automáticamente:

;; Creación de elementos con lenguaje natural
(add "Meet Alice tomorrow for coffee !!")
;; → Elemento con :when = tomorrow, :priority 2, :who "Alice"

(add "Call Bob next Monday about the project")
;; → Elemento con :when = next Monday, :who "Bob"

(add "URGENT fix server crash")
;; → Elemento con :priority 1

;; Previsualizar sin crear un elemento
(smart-parse "email Sarah March 15 about renewal !!")
;; → {:text "email Sarah about renewal" :when "2026-03-15" :priority 2 :who ("Sarah")}
ComandoDescripción
(add "text")Añadir inteligente: analizar lenguaje natural, extraer metadatos, crear elemento
(smart-parse "text")Previsualizar extracción sin crear un elemento
Patrones reconocidos: Fechas ISO, tomorrow/today/yesterday, next Monday, this weekend, in 3 days, end of week/month, March 15. Prioridad: URGENT/ASAP, !!!/!!/!, high/low priority. Personas: @name, with/for/from Name, call/email/meet Name.

HTTP y JSON:

Cliente HTTP genérico y funciones integradas de JSON para integración con APIs:

ComandoDescripción
(http-get url)Petición GET, devuelve {:status N :body "..."}
(http-post url body :content-type "...")Petición POST con cuerpo
(json-parse string)Analizar cadena JSON a dict/lista de EELisp
(json-stringify value)Convertir valor de EELisp a cadena JSON

Elementos recurrentes y plantillas:

Los elementos con patrones de recurrencia crean automáticamente la siguiente ocurrencia al marcarlos como completados. Las plantillas definen modelos de elementos reutilizables:

ComandoDescripción
(add-item text :recur :weekly)Crear un elemento recurrente (:daily, :weekly, :monthly)
(every N :unit)Intervalo personalizado, p. ej. (every 3 :months)
(item-done id)Marcar como completado; crea el siguiente automáticamente si es recurrente
(deftemplate name :text "..." :category "..." :priority N)Definir una plantilla de elemento reutilizable
(from-template name :when "..." ...)Crear elemento desde plantilla con modificaciones
(templates)Listar todas las plantillas definidas
(drop-template name)Eliminar una plantilla

Múltiples agendas:

Abre, cambia entre y gestiona múltiples bases de datos de agenda. Exporta e importa para copia de seguridad o migración:

ComandoDescripción
(open-agenda "path/to/file.db")Abrir una nueva base de datos de agenda y cambiar a ella
(use-agenda name)Cambiar a una agenda ya abierta
(agendas)Listar todas las agendas abiertas con marcador activo
(close-agenda name)Cerrar y eliminar una agenda del registro
(export-agenda name :format :json :path "file.json")Exportar todas las tablas de agenda a JSON
(import-agenda "file.json")Importar registros desde una exportación JSON

13. Referencia rápida de EELisp

Variables y funciones:

(def x 42)
(defn square (x) (* x x))
(square 5)   ; → 25

;; Funciones anónimas
(map (fn (x) (* x x)) '(1 2 3))   ; → (1 4 9)

;; Parámetros rest
(defn sum (first . rest)
  (reduce + first rest))

Condicionales y bucles:

(if (> x 0) "positive" "non-positive")

(cond
  (< x 0)  "negative"
  (= x 0)  "zero"
  else      "positive")

(let ((x 1) (y 2)) (+ x y))   ; → 3

;; Bucle con estilo named-let
(loop ((i 0) (acc 0))
  (> i 10)
  (recur (+ i 1) (+ acc i)))   ; → 55

Cadenas:

(str "hello" ", " "world")          ; → "hello, world"
(str-split "a,b,c" ",")            ; → ("a" "b" "c")
(str-join '("a" "b" "c") "-")      ; → "a-b-c"
(str-upper "hello")                 ; → "HELLO"

Listas:

(list 1 2 3)                        ; → (1 2 3)
(cons 0 '(1 2))                     ; → (0 1 2)
(map inc (range 1 6))               ; → (2 3 4 5 6)
(filter even? (range 1 11))         ; → (2 4 6 8 10)
(reduce + 0 '(1 2 3 4 5))          ; → 15
(sort-by id '(3 1 4 1 5))          ; → (1 1 3 4 5)

Diccionarios:

(def d {:name "Alice" :age 30})
(dict-get d :name)                  ; → "Alice"
(dict-set d :age 31)                ; → {:name "Alice" :age 31}
(dict-keys d)                       ; → (:name :age)

Funciones del preludio:

FunciónDescripción
inc / decIncrementar / decrementar en 1
even? / odd?Comprobaciones de paridad
zero? / pos? / neg?Comprobaciones de signo
first / second / third / lastAcceso a listas
take / dropTomar/descartar los primeros n elementos
some? / every?Alguno/todos coinciden con el predicado
pipeMacro de encadenamiento: (pipe 5 inc inc square)
composeComposición de funciones
partialAplicación parcial

14. Consejos para iOS e iPadOS

  • Barra de acciones rápidas — una barra de herramientas horizontal aparece sobre el editor con botones para Marca de tiempo, Buscar, Diario, Semanal, Búsqueda, Abrir, Vista previa, PDF, REPL y Atajos. Toca cualquier botón para acceso instantáneo.
  • Barra de herramientas del REPL — cuando el REPL está activo, una barra de herramientas aparece sobre el teclado con navegación de historial (arriba/abajo), fragmentos rápidos (query, deftable, defn) y un botón de limpiar.
  • Teclado externo — todos los atajos de teclado funcionan cuando conectas un teclado físico a tu iPad.
  • Menús contextuales — mantén pulsado sobre archivos en la barra lateral o pestañas para acceder a renombrar, eliminar, fijar y otras acciones.
  • Split View — EEditor funciona en los modos Split View y Slide Over de iPadOS.

Requisitos del sistema

macOS
Sonoma 14.0 o posterior
iOS
17.0 o posterior
iPadOS
17.0 o posterior