Dario Arzaba

Subscribete

Atom

Atom Editor

Atom es un editor de texto open source, multiplataforma, modular y hackeable creado en HTML, CSS (Less) y JavaScript (CoffeeScript, Node.js). Diseñado por Github utilizando el Framework Electron y desarrollado sobre el Chromium Engine .

Atom, el editor de texto hackeable del siglo 21.

Mientras que Sublime y TextMate son practicos, su extensibilidad es limitada. Por otro lado Emacs y Vim son flexibles pero dificiles de aprender, Atom pretende encontrar un punto de equilibrio entre conveniencia y extensibilidad.

Instalación

Para instalar en Windows se descarga AtomSetup.exe desde el sitio principal o desde su repositorio en Github. El instalador añade los comandos atom y apm al PATH del entorno. En este caso Atom es el programa principal y Apm es el administrador de paquetes (Atom Package Manager).

Aplication Folder: %LOCALAPPDATA%\atom
Configuration Folder: %USERPROFILE%\.atom
Dev Source and Config: %USERPROFILE%/github/atom
Cache Folder: %APPDATA%\Atom
Registro: HKEY_CLASSES_ROOT\Directory\Background\shell
Registro: HKEY_CLASSES_ROOT\Directory\shell
Registro: HKEY_CLASSES_ROOT*\shell

Para usar el programa de forma portable se extraen los contenidos de atom-windows.zip en la carpeta deseada y agregando un directorio denominado .atom. La variable ATOM_HOME es la encargada de guardar la ubicación de dicho directorio, por defecto en %USERPROFILE%. Tambien se recomienda agregar el switch --portable al ejecutable.

Si se desea instalar desde el código fuente se necesita Node, Python, Visual Studio con Visual C++ y Windows SDK. Se recomienda que la variable GYP_MSVS_VERSION corresponda a la versión de Visual Studio.

cd C:\
git clone https://github.com/atom/atom.git
cd atom
script\build --create-windows-installer

El ultimo comando genera los mismos instaladores que en el sitio principal. La carpeta Bin del código fuente debe ser agregada al PATH para poder utilizar atm correctamente. Comandos del script “build”:

  • –code-sign: Firma la aplicación con el certificado de Github.
  • –compress-artifacts: Genera la version portable.
  • –install[=dir]: Instala la aplicación en ${dir}\Atom\app-dev en donde Div es por defecto %LOCALAPPDATA%.

En caso de que el firewall produsca errores de instalación SSL, utilizar el comando apm config set strict-ssl false. En el caso de que el proxy produzca errores de HTTPS, utilizar el comando apm config set https-proxy (Proxy Adress). Se puede comprobar la correcta configuración del proxy con apm config get https-proxy.

Los paquetes se pueden instalar de forma manual clonando su repositorio a la carpeta %USERPROFILE%\.atom y en algunos casos ejecutando el comando atm install. Para utilizar el buscador de simbolos en todo el proyecto se debe instalar la utilidad Ctags y configurar el archivo en la carpeta %USERPROILE%\.ctags.

Snippets

Los Snippets son una herramienta que nos permite aumentar la productividad al autocompletar lo que escribimos con la tecla Tab. Podemos definir nuestros propios Snippets dentro de snippets.cson.

Primero se define el Scope del lenguaje (Editor: Log Cursor Scope), despues su nombre, descripcion, prefijo y contenido. La posicion del cursor se puede personalizar con el uso numerado de $1 o $(1: texto ).

Si el contenido es multilinea se encierra en triples comillas mientras que los caracteres especiales se escapan con dobles diagonales. Para ver los snippets definidos en el Scope actual se ejecuta Snippets: Available.

'.source.js':
  'console.log':
    'prefix': 'log'
    'body': 'console.log(${1:"string"});$2'

Keybinding

Los Keybinds nos permiten vincular una secuencia de teclas con un selector CSS y un comando predefinido atom.commands. El modulo encargado de resolver cual es el Keybind más importante para cada circunstancia es el keybinding-resolver accesible desde Ctrl+.. Se pueden agregar Keybindings personalizados al archivo keymap.cson en la carpeta de configuraciones.

Cuando el usuario presiona una secuencia de teclas, el engine la detecta y las envia al Keymap Module en forma de un evento JS. El modulo se encarga de subir al evento por el DOM (Bubbling) comenzando por el elemento activo e intentando encontrar una coincidencia con el selector CSS. De encontrarla, termina la busqueda y se aplica el comando correspondiente al elemento. Si multiples elementos coinciden se utiliza al Keybinding Resolver para elegir al elemento con el selector más especifico.

Si se desea ejecutar dos o mas comandos aplicando un solo Keybind es necesario encapsularlos en un solo comando. Si por ejemplo quisieramos combinar los comandos de seleccionar linea y cortar en un solo Keybind escribiriamos:

atom.commands.add 'atom-text-editor', 'custom:cut-line', ->
  editor = atom.workspace.getActiveTextEditor()
  editor.selectLinesContainingCursors()
  editor.cutSelectedText()

Para utilziar el nuevo comando de atom.commands necesitamos agragarlo al archivo keymap.cson:

'atom-text-editor':
    'alt-cmd-z': 'custom:cut-line'

Si se agrega el keybinding unset! a una secuencia de letras, el modulo ignorara las coincidencias de dicho nivel. Si se agrega el keybinding abort! el modulo dejara de buscar en el resto del DOM. Si algun keybinding se interpone con el funcionamiento de algun paquete se puede agregar el keybind native! o la clase .native-key-bindings.

Si Atom tiene problemas con el layout de tu teclado puedes definir explicitamente las teclas que presionas y el resultado que esperas:

#Decir que Alt + Ctrl + Q signfica explicitamente Ctrl + @;
atom.keymaps.addKeystrokeResolver ({event}) ->
  if event.code is 'KeyQ' and event.altKey and event.ctrlKey and event.type isnt 'keyup'
    return 'ctrl-@'

Paquetes

Si queremos agregar comandos o funciones a Atom simplemente las escribimos dentro del Script init.coffee, este archivo se ejecuta al inicio del programa. Por ejemplo:

# Comando para convertir el texto seleccionado y un URI del clipboard en un link de Markdown.

atom.commands.add 'atom-text-editor', 'markdown:paste-as-link', ->
    return unless editor = atom.workspace.getActiveTextEditor()
    selection = editor.getLastSelection()
    clipboardText = atom.clipboard.read()
    selection.insertText("[#{selection.getText()}](#{clipboardText})")

En el caso de que se agregen multiples comandos y una interfaz grafica es recomendable agruparlos dentro de un paquete. Para crear un paquete se utiliza el comando Generate Package. El nuevo paquete se guardara dentro de %USERPROFILE%\.atom\packages y estara constituido por carpetas de keymaps, lib, menus, spec, styles y un package.json.

El archivo JSON contiene el metadata del paquete, por ejemplo:

{
  "name": "Nombre del Paquete",
  "main": "Directorio del Paquete",
  "version": "1.0.0",
  "description": "Descripcion del Paquete",
  "keywords": [
    "PrimerKeyword",
    "SegundoKeyword",
  ],
  "repository": "URI del repositorio en Github",
  "license": "Licencia como MIT",
  "engines": {
    "atom": ">=1.0.0 <2.0.0"
  },
  "dependencies": {
    "NombrePaquete": "^15.6.1",
  },
  "devDependencies": {
    "NombrePaqueteParaDev": "^3.0.1",
  }
  "consumedServices": {
    "NombreOtroPaquete": {
      "versions": {
        "^1.0.0": "ServicioAConsumir"
      }
    }
  },
  "providedServices": {
    "NombreEstePaquete": {
      "versions": {
        "1.0.0": "ServicioAProveer"
      }
    }
  },
  "activationHooks": [
    "core:loaded-shell-environment",
    "language-javascript:grammar-used"
  ],
  "activationCommands": {
    "atom-workspace": [
      "NombrePaquete:NombreComandoUno",
      "NombrePaquete:NombreComandoDos"
    ]
  },
  "configSchema": {
    "NombreDeConfiguracion": {
      "type": "JS DataType",
      "default": ValorPorDefecto,
      "title": "Titulo de la Configuracion",
      "description": "Que efecto tiene este valor en el paquete"
    }
  }
}

El modulo principal es generalmente un archivo [PackageName].coffee dentro de la carpeta lib, siendo el punto de entrada del modulo y el encargado de la logica principal. De requerir una interfaz grafica esta se divide en otro archivo denominado [PackageName]-view.coffee. El modulo principal tiene acceso a los siguientes metodos:

  • Activate(state): Ejecutado al inicio del paquete. Si implementa serialize() puede recibir el estado de la última ventana. Realiza el trabajo de inicialización como crear elementos DOM o ligar eventos con otro métodos.
  • Initialize(state): Ejecutado antes de la creación del espacio activo, es decir después de su deserialización. Garantiza la ejecución de código antes de la creación del DOM.
  • Serialize(): Ejecutado al inicio de cerrar la ventana. Genera un codigo JSON que representa el estado de la ventana y de ser activa entrega automáticamente su información a Activate o Initialize cuando la ventana vuelva a ser abierta.
  • Deactivate(): Ejecutado al cerrar la ventana. Desactiva todo enlace con recursos externos, todo lo del paquete que no dependa de información externa es desactivado automáticamente por Atom.

Los activationCommands y activationHooks activan el paquete y ejecutan el metodo activate() dentro del modulo principal. El primero define comandos, el segundo grammars o cuando termine de cargar el environment. Si no se define ninguno entonces activate() sera ejecutado tan pronto termine de cargar el paquete.

Algunas veces los paquetes necesitan utilizar componentes o funciones de otros paquetes. Para tomar prestadas estas funciones se recomienda que interactuen utilizando el API de servicios. El uso de servicios le permite a los paquetes cambiar su implementacion entre versiones (version semantica) pero manteniendo una interfaz consistente desde la cual otros paquetes pueden tomar prestada su funcionalidad.

Para ofrecer un servicio se agrega la siguiente logica al paquete de origen:

module.exports =
  activate: -> # ...
  provideMyServiceV1: ->
    adaptToLegacyAPI(myService)
  provideMyServiceV2: ->
    myService

Para usar un servicio se utiliza la siguiente logica en el paquete final:

{Disposable} = require 'atom'
module.exports =
  activate: -> # ...
  consumeAnotherServiceV1: (service) ->
    useService( adaptServiceFromLegacyAPI(service) )
    new Disposable -> stopUsingService(service)
  consumeAnotherServiceV2: (service) ->
    useService(service)
    new Disposable -> stopUsingService(service)

Para mayor informacion sobre la creacion de paquetes:

Specs

Los paquetes de Atom realizan sus Tests mediante el Jasmine Framework. Para ello se necesita leer la Documentacion.

describe "when the user presses the A key", ->
  it "writes the letter A in the editor", ->
    expect("A").toEqual("A")
    expect("A").not.toEqual("B")

El keyword describe toma dos argumentos, un string y una funcion. Si el String describe un comportamiento inicial comienza con when, si describe un Unit Test comienza con el nombre del metodo. Luego el keyword it tambien toma un string y una funcion. El String describe el comportamiento esperado a causa del comportamiento inicial o del metodo.

Finalmente el Matcher expect describe las pruebas concretas sobre los resultados. Otros matchers son: toBeInstanceOf, toHaveLength, toExistOnDisk, toHaveFocus y toShow; implementados por spec-helper.coffee. Todas estas pruebas se realizan de forma sincrona. Si se requiere de pruebas asincronas es recomendable el uso de promises.

Una vez que los specs fueron definidos se pueden ejecutar automaticamente con el comando Window: Run Package Specs. Tambien se recomienda ejecutar Deprecation Cop para encontrar incopatibilidad con el API más reciente.

Nuevos Archivos

Por defecto Atom crea nuevos archivos Plain Text con la extencion txt. Si queremos cambiar el tipo de archivo que crea por defecto, por ejemplo a javascript, agregamos el siguiente codigo al init.coffee:

# Al abrir un archivo capturar el objeto (editor) y obtener su gramatica.
# Si y solo si la gramatica es igual a la que tiene atom por defecto (text.plan.null).
# Entonces cambiar la gramatica del archivo por la que queramos.

atom.workspace.observeTextEditors (editor) ->
  original = editor.getGrammar()
  if original? and original is atom.grammars.grammarForScopeName('text.plain.null-grammar')
    editor.setGrammar(atom.grammars.grammarForScopeName('source.js'))

Config File

Todos los componentes de Atom, incluido el Core, guardan variables importantes que modifican su comportamiento dentro de archivos de configuracion. Los valores de Core estan declarados dentro de este archivo y modifica los dos namespaces globales admitidos: core y editor.

En el mismo nivel que los valores globales se pueden agregar scopes por lenguaje como .python.source o .html.text, seguida de las modificaciones que se quieran realizar a core y editor. Por ser más especificas estas tienen prioridad sobre las globales en *.

Los paquetes pueden definir sus propios valores de configuracion dentro de su package.json. Por ejemplo Autocomplete define sus opciones de configuracion como parte de su configSchema en este archivo. Si se quieren agregar u obtener los valores se utiliza el Config API que define las funciones atom.config.get y atom.config.set.

Estilos

Si queremos modificar los estilos de Atom simplemente los escribimos dentro del archivo styles.less, este archivo se ejecuta al inicio del programa. Por ejemplo:

atom-text-editor .syntax--link,.syntax--hyperlink {
    color: #c678dd;
    text-decoration: underline;
}

Si se agregan demaciados estilos se recomienda agruparlos dentro de un paquete. Los paquetes que modifican estilos se dividen en modificadores de UI (Para los componentes de Atom) y modificadores de Syntax (Solo para el texto).

Para generar un paquete de Syntax se utiliza el comando Generate Syntax Theme. El archivo package.json debera contener una llave theme con el valor ui o syntax. Para modificar los selectores del theme editamos el archivo base.less, mientras que la paleta de colores se encuentra en colors.less.

En el caso de generar un paquete UI es necesario copiar el repositorio de ejemplo y abrirlo con atom --dev. Una vez abierto podemos vincularlo al ambiente para desarrolladores atom link --dev, esto aplicara los cambios instantaneamente. Finalmente abrir el Styleguide con Styleguide: Show para observar rapidamente todos los elementos UI.

Todos los Theme de UI deben de proporcionar forzozamente dos archivos con los valores que utilizaran el resto de los paquetes para adaptarse al theme: ui-variables.less y syntax-variables.less.

Todos los paquetes deben tener acceso a los valores de estos archivos, ya que deberan utilizarlos para coincidir con el estilo del Theme:

@import "ui-variables";
@import "syntax-variables";

.miSelector {
  background-color: @base-background-color;
  padding: @component-padding;
}
.miOtroSelector {
  background-color: @syntax-background-color;
}

Nota: No se recomienda cambiar el font-family ya que este es un setting por defecto dentro de Core. Si es necesario puedes recomendar una fuente preferida en tu archivo readme.md.

Problemas con Atom

  1. Abrir con atom --safe.
  2. Abrir con atom --clear-window-state.
  3. Checar el contenido de %LOCALAPPDATA%\atom\SquirrelSetup.log

Utilizar atom --safe evita que se cargen paquetes de %LOCALAPPDATA%\atom\packages\, no carga init.coffee, ni cualquier tema personalizado.

Para ver en que gasta tiempo Atom al iniciar se puede activar la funcion Timecop mediante el comando Timecop: View. Tambien se pueden activar el inspector de elementos con Ctrl+Shift+I.

Contribuir

Para contribuir al proyecto o reportar Issues se siguen las reglas de este documento.

Para realizar un Pull Request:

  1. Implementacion de Specs. atom --test spec y Window: Run Package Specs.
  2. Descripcion del cambio.
  3. Diseños alternativos.
  4. Porque debe de estar en este repositorio.
  5. Lista de beneficios y desventajas.
  6. Problemas conocidos con esta implementacion.

Para realizar un Issue:

  1. El problema se reproduce en Safe Mode.
  2. Se siguieron los pasos del Debugging Guide
  3. No se encontraron respuestas en el FAQ ni hay un paquete que resuelva dicho comportamiento.
  4. El Issue no ha sido reportado, si ya fue reportado agregar un comentario relevante.
  5. Si un Issue identico ya fue cerrado, incluirlo en la descripcion como referencia.
  6. Se describe el Issue y los pasos para reproducirlo a detalle.
  7. Se describe el comportamiento que se esperaba y el que se obtuvo.
  8. Se describe el porcentaje de tiempo que es reproducible y los datos de atom -v y apm -v.
  9. Sistema operativo, datos de la computadora e informacion adicional.

Shortcuts

Accion Teclas Accion Teclas
Seleccionar Palabra Ctrl + d Seleccionar Sig. Palabra Ctrl + d + Ctrl + d
Palabras Iguales a la Seleccionada Alt + F3 Seleccionar Linea Ctrl + l
Seleccionar Documento Ctrl + A Seleccionar Bloque Alt + Ctrl + ,
Cerrar Tag HTML Alt + Ctrl + , Colapsar Bloque Codigo Alt + Ctrl + [
Expandir Bloque Alt + Ctrl + ] Colapsar Seleccion Alt + Ctrl + f
Ir Final o Inicio Palabra Ctrl + Flechas Derecha Izquierda Ir Inicio Linea Inicio
Ir Final Linea Fin Ir Inicio Documento Ctrl + Inicio
Ir Final Documento Ctrl + Fin Ir Linea o Caracter Ctrl + g + (Fila:Columna)
Ir a Simbolo (Metodo o Definición) Ctrl + r Siguiente llave o corchete Ctrl + m
Agregar Marcador Alt + Ctrl + F2 Siguiente Marcador F2
Marcador Anterior Shift + F2 Buscar Marcador Ctrl + F2
Buscar Buffer Archivo Ctrl + f Buscar Buffer Proyecto Ctrl + Shift + f
Abrir Archivo Ctrl + o Abrir Settings Ctrl + ,
Abrir Buscador Archivos Ctrl + t Abrir Paleta Comandos Ctrl + Shift + p
Buscar Archivos Abiertos Ctrl + b Buscar Archivos Modificados Ctrl + Shift + b
Abrir Tree View Ctrl + k + b Abrir Directorio Ctrl + Shift + a
Abrir Dev Tools Ctrl + Shift + i Abrir Styleguide Panel Ctrl + Shift + g
Abrir Hyperlink Alt + o Abrir Keybind Resolver Ctrl + .
Abrir Scope Actuales Ctrl + Alt + p Abrir Git Panel Ctrl + 9
Abrir Github Panel Ctrl + 8 Guardar Cambios Ctrl + s
Guardar Como Ctrl + Shift + s Cambiar Encoding Ctrl + Shift + u
Clonar Ventana (Direccion) Ctrl + k (soltar) Flechas Cambiar Ventana Activa Ctrl + k + Ctrl + Flechas
Cerrar Ventanas Clonadas Ctrl + w Abrir Preview Markdown Ctrl + Shift + m
Añadir Cursor Ctrl + Click Mover Linea Abajo-Arriba Ctrl + Flechas
Indentar Linea Ctrl + [ Quitar Indentado Linea Ctrl + ]
Insertar Linea Abajo Ctrl + Enter Insertar Linea Arriba Ctrl + Shift + Enter
Duplicar Linea Abajo Ctrl + Shift + d Combinar con Linea Abajo Ctrl + j
Palabra en Mayusculas Ctrl + k + u Palabra a Minusculas Ctrl + k + l
Borrar Linea Ctrl + Shift + k Borrar Hasta Inicio Palabra Ctrl + Backspace
Borrar Hasta Final Palabra Ctrl + Del Seleccionar Tipo de Archivo Ctrl + Shift + l

Blog

  • 26-02-2014: Introduciendo Atom. Closed Beta. 80 Paquetes.
  • 26-02-2014: El Núcleo de Atom. De Ace a Web App. Chromium Engine y Node.js.
  • 03-03-2014: Estilizar Links. Clase LESS .markup.underline.link.hyperlink. Abrir con Alt + o.
  • 04-03-2014: Nuevos Paquetes. JShint, Prettify, Block Travel. Asteroids.
  • 10-03-2014: Más Paquetes. Alrededor de 500. Vim, Test Status, Color Picker, Atom Runner, Gist it.
  • 13-03-2014: Integracion con Git. Comandos y paquetes para funcionalidad Git.
  • 26-03-2014: Highlights.
    • Para el Syntax Highlighting de Atom usabamos Node.js con el tokenisador Oniguruma y el Grammar Format de TextMate. Lo llamamos Node-Oniguruma.
    • Despues creamos nuestro propio CoffeeScript Tokenizer incorporando el mismo Grammar Format de TextMate y lo llamamos First-Mate.
    • Luego se agrego el comando apm init --convert al shell, esto nos permitio convertir todos los lenguajes desde TextMate Bundles a paquetes individuales de Atom.
    • Finalmente creamos nuestro propio Syntax Highlighter basado en Oniguruma. Lo denominamos Highlights, el cual es un modulo independiente en Node.js que transforma el codigo fuente en HTML con un CSS que depende del lenguaje detectado.
  • 31-03-2014: Paquete Keymap. Multiples commandos vinculados a un mismo keybind.
  • 25-04-2014: Continuous Integration. Alerta del Atom Package Building integrada con Travis CI.
  • 05-05-2014: Lanzamiento del Open Beta Publico. Full Open Source. MIT License.
  • 09-06-2014: Estrellas. Uso de estrellas para votar por los mejores Paquetes y Temas del repositorio.
  • 23-06-2014: Nuevos Paquetes. Alrededor de 850. Bezier Curve, File Icons, Regex Diagram.
  • 02-07-2014: React.
    • Pasamos el framework a React.
    • Optimizamos la logica del JavaScript.
    • Minimizamos dependencias de jQuery o similares.
    • Intentamos disminuir el Reflow.
    • Minimizamos DOM Reads y DOM Updates.
    • Pasamos trabajo del CPU al GPU para obtener transiciones suaves.
  • 09-07-2014: Hola Windows. Compatibilidad Windows 7 y 8 unicamente mediante Chocolatey.
  • 22-07-2014: Atom completamente React. Desde la version 0.116.0 es completamente React.
  • 24-07-2014: Decoraciones. Nuevo API de React que resalta texto con colores o iconos.
  • 28-07-2014: Continuous Integration (Win). Instrucciones para alertas integradas con AppVeyor.
  • 08-08-2014: Nuevos Paquetes. Panel Split, Ask Stack, Git Blame, Jumpy, Easy Motion.
  • 13-08-2014: Chrome 36 y Node 0.11.13. Mejora el rendimiento de funciones path.join y fs.stat.
  • 16-09-2014: Suscripciones en JS. Antes requerian metodos on y off. Ahora usan sufijos onDid y onWill. Para quitar la suscripcion utilizamos el metododispose.
  • 17-09-2014: Nuevos Paquetes. Git Log, Keybind Peek, Git History, Stacktrace, Pen, Live Archive.
  • 2-10-2014: Mejoras del API. Cambio del objeto de configuracion (configDefaults) al JSON Schema.
  • 23-10-2014: Creacion de un Roadmap. (Cerrado poco despues).
  • 31-10-2014: Configuracion por Lenguaje. Cada lenguaje tiene su propio scope en el Archivo JSON.
  • 05-11-2014: Atom Linux. Atom y sus paquetes ahora son parte de los repositorios RPM y Debian.
  • 18-11-2014: Shadow DOM.
    • El Shadow DOM es una herramienta que genera una rama independiente del DOM, permitiendo que el archivo de estilos no se aplique a una serie de elementos.
    • En este caso la rama del DOM que escondimos fueron todos los elementos que pertenecientes a atom-text-editor. Para modificar los estilos de estos elementos es necesario hacerlo de forma explicita con ::shadow.
  • 10-12-2014: Atom Windows. Windows tiene su propio instalador.
  • 05-01-2015: Shadow DOM. Implementado en todos los elementos de atom-text-editor y .editor.
  • 07-01-2015: Mejor Settings View. Más facil encontrar, configurar y actualizar paquetes.
  • 15-01-2015: Atom API 1.0. Usamos Semantic Versioning. Paquetes no deben realizar cambios directos al DOM, solo a travez de la API.
  • 21-01-2015: Atom Shell 0.20 y Chrome 39.
    • Ventanas con Fondo Transparente. Activar transparent del BrowserWindow.
    • Cargar contenido HTTP en servidor HTTPS con webFrame.registerUrlSchemeAsSecure.
    • Desactivar cache HTTP pasando disable-http-cache.
    • Activar spellcheck en cuadros de texto con webFrame.setSpellCheckProvider.
    • Enviar mensajes directamente del Webview al Host con ipc.sendToHost.
    • LocalStorage sin limite de espacio.
  • 04-02-2015: Soporte para 6to5 en v0.177.
    • Uso de ECMA6 mediante libreria 6to5 (Babel) que convierte de ECMA6 a ECMA5.
    • Para activar Babel simplemente poner "use babel"; al inicio de tu script.
  • 18-02-2015: Nuevos Temas. Creacion de temas oficiales One Themes.
  • 23-02-2015: Más Paquetes. AtomPair, Symbols Tree, Cursor, Color Finder, Git GUI, Hide Text.
  • 11-03-2015: Creacion del Atom Flight Manual y API Docs.
  • 25-03-2015: Nuevo Services API. Resuelve las dependencias entre distintos API’s.
  • 30-03-2015: Keywords. Uso de Keywords tipo Hashtag para organizar mejor Paquetes y Temas.
  • 07-04-2015: Prioridades de Atom 1.0: Archivos Grandes, Autocomplete Plus y Startup Speed.
  • 15-04-2015: Mutiples Proyectos. Atom ahora puede abrir multiples proyectos Ctrl+Shift+O.
  • 21-04-2015: Panel Resizing. Atom guarda el estado de la ventana y mejora el Startup Speed.
  • 29-04-2015: CodeConf 2015. Evento Open Source tipo TED Talk patrocinado por Github.
  • 01-05-2015: Eliminando Paquetes. En preparacion de Atom 1.0 se eliminaran paquetes depreciados.
  • 06-05-2015: ¡Primer Aniversario de Atom!
    • 300,000 usuarios activos mensuales.
    • 750,000 descargas.
    • 2000 desarrolladores.
    • 1861 paquetes.
    • 596 temas.
    • 102 versiones.
  • 15-05-2015: Autocomplete-plus. El primer paquete de la comunidad que se incorpora al Core.
  • 19-05-2015: Atom Store. Venta de Playeras y Coasters en el Github Shop.
  • 21-05-2015: Nuevos Paquetes. Side Bar, Tree View Search, Git Grep Search, Audio Player.
  • 04-06-2015: Eliminando Paquetes 2. Se han eliminado definitivamente los paquetes depreciados.
  • 16-06-2015: Optimizando Marcadores.
    • Primitivos logicos de Atom que rastrean la posicion de una porcion de texto en el buffer.
    • Estan detras del funcionamiento de varios paquetes como Search, Tab Stops, Spell Check.
    • Cuando habia un cambio iterabamos todos los Markers y actualizabamos su rango.
    • Los rangos se guardaban en una estructura lineal para la busqueda individual de Markers.
    • Ahora dividimos al texto en regiones sin sus rangos solo con su tamaño individual.
    • La estructura se mantiene constante y solo se modifica el rango de lo que se este editando.
    • Para encontrar este unico rango a modificar se utiliza un arbol de busqueda B+Tree.
  • 24-06-2015: Optimizar Lineas de texto como Tiles.
    • Cada frame del GUI requiere de un request de informacion a TextEditorPresenter.
    • Usando esta informacion TextEditor puede generar el siguiente frame.
    • Antes se calculaba cada linea de texto como una entidad unica. Ahora se agrupan en Tiles.
    • Esto reduce el tiempo de Cleanup y Rendering al asignar un GPU Layer por cada Tile.
    • Se simula el Scrolling usando transform para cambiar la posicion vertical de los Tiles.
  • 25-06-2015: Lanzamiento de Atom 1.0. Despues de 155 versiones.
  • 20-07-2015: Adopta el Open Code of Conduct. Hoy en dia (2017) utiliza el Contributor Covenant.
  • 06-08-2015: Nuevos Paquetes. File Overview, T0DO List, MultiWrap, List Tools, Quick CSS Editor.
  • 16-10-2015: Contribuye a Atom. Encuentra un paquete y su Issue. Sigue el Contributor Guide.
  • 21-10-2015: Atom Beta. Te invitamos a probar lo ultimo de Atom y reportar el ocacional bug.
  • 29-10-2015: Atom 1.1.
    • Usabamos Pixel Position y la cantidad de caracteres, tomando en cuenta el tamaño de la fuente para medir las distancias en el editor.
    • El uso de ligaduras, emojis, variable width fonts y subpixel rendering nos obligo a realizar las mediciones directamente en el DOM.
    • Obligados a generar Reflow logramos optimizar el proceso generando snapshots periodicos de las distancias que permanecen constantes en el editor.
  • 03-11-2015: Nueva API Workbench Package. Este paquete utiliza RAML para crear RESTful APIs.
  • 12-11-2015: Atom 1.2. CJK Wrap. Chrome 45. Portable. Alternativa a Jasmine para generar Specs.
  • 16-11-2015: Contributor Patches. Para celebrar el lanzamiento de Atom 1.0 estamos enviando una parche de tela conmemorativo a todos los que contribuyeron al proyecto.
  • 11-12-2015: Atom 1.3. Mejoras al performance (Markers). Remplazamos B+Tree index por Treap.
  • 03-02-2016: Block Decorations API (Lineas con tamaño arbitrario). Optimizadas con el Treap tree.
  • 17-03-2016: Atom 1.6. File Preview. Comandos Multipanel. Block Decorations. Tool-Bar API.
  • 24-03-2016: Nuevo Flight Manual. Originalmente escrito en AsciiDoc con Atlas. Ahora en Nanoc.
  • 28-03-2016: Un Millon de Usuarios. Orgullosos de que Atom se utilice en proyectos como Nuclide.
  • 12-04-2016: Atom 1.7. Ctrl+Tab cambia pestañas correctamente. Keyup Event. Crash Recovery.
  • 06-05-2016: ¡Segundo Aniversario de Atom!
    • 1,100,000 usuarios activos mensuales.
    • 15,900,000 descargas.
    • 3500 desarrolladores.
    • 4155 paquetes.
    • 1239 temas.
    • 300 versiones.
  • 06-06-2016: Atom 1.8. Mejor CL. Move text left and right. Emoji rendering. Block decoration fix.
  • 01-08-2016: Atom 1.9. Mejor guardado automatico, ligature rendering, drag and drop y softwrap.
  • 31-08-2016: Atom 1.10. Atom Package Manager ahora en Node 4.4.5 y NPM 3.10.5.
  • 11-10-2016: Atom 1.11. Permiso de telemetría. Rendering de Imagenes. Large file warning threshold.
  • 17-10-2016: Internacionalizacion de los teclados.
    • Fuera de USA otros teclados tenian que instalar el paquete KeyboardLocalization para que su Layout fuera compatible con Atom. El principal problema fue con algunos Keybindings evitaban que el teclado de otro Locale escribiera correctamente.
    • Con Electron 1.3 recibimos un API para teclados internacionales pero no fue suficiente. Terminamos recurriendo a las funciones C++ de los sistemas operativos, aunque no toma en cuenta teclados fuera del Latin Character Set. Una decision etnocentrica pero por lo menos no [sin precedentes](https://en.wikipedia.org/wiki/Western_Latin_character_sets_(computing%29).
  • 09-11-2016: Atom 1.12. Soporte para teclados internacionales. Chrome 52. Electron 1.3.
  • 14-11-2016: Quitando el Shadow DOM.
    • Esta herramienta evitaba colisiones entre los selectores de estilos pertenecientes a atom-text-editor y los selectores de algunos paquetes.
    • Sin embargo genero duplicados, dificultad para utilzar atom-text-editor en otros paquetes y un aumento en la complejidad del codigo con el uso de pseudoselectores ::shadow /deep/.
    • Decidimos quitar esta herramienta y simplemente regresar a selectores con un scope mas especifico mediante el uso de un sufijo. En este caso .syntax--.
  • 10-01-2017: Atom 1.13. Benchmarks. Nuevos Octicons. New Keystroke Resolver API.
  • 18-01-2017: Atom en Windows.
    • Arquitectura 32 bit (ia32-x86) y 64 bit (amd64-x64). Permite instrucciones nativas de Node v8. Instalacion ahora con Sha256 Signing, Timestamp y Certificados. Fix para errores de Pins y Shortcuts generados por Squirrel.
  • 08-02-2017: Atom 1.14. Large Files. Instalacion 64-bit. Most Recently Used Tab Fix Ctrl+Tab.
  • 09-03-2017: Atom 1.15. Mejora al duplicar lineas. Archivos siguen abiertos aunque sean eliminados.
  • 12-04-2017: Atom 1.16. Eliminando jQuery. Opciones en macOS para la barra de titulo.
  • 18-04-2017: Mejoras en el Tiempo de Inicio.
    • Eliminamos la gran mayoria de las Dependencias en jQuery y utilizamos V8 Snapshots para crear electron-link que ayudó en multiples optimizaciones.
    • Con los snapshots muchos modulos fueron optimizados en su resolucion cuando son llamados por require . Tambien nos permitieron guardar el estado varias instancias del objeto atom construidas a partir del AtomEnviroment.
    • Finalmente fueron usados para guardar la ultima configuracion de estilos en un solo archivo, evitando el leer y calcular independientemente todos los doumentos de estilos.
  • 16-05-2017: Atom 1.7. Docks para abrir y cerrar rapidamente paneles. V8 Snapshots. Adios JQuery.
  • 16-05-2017: Integracion con Git y Github. Se crea el Paquete Github.
  • 23-05-2017: Docks de Nuclide. Este nuevo API permite anclar paneles a las orillas del editor.
  • 13-06-2017: Atom 1.18. Git y GitHub. Mejoras en la tokenización usando Oniguruma caching.
  • 22-06-2017: Mejoras en el renderizado de texto dentro del editor.
    • La manipulacion de nodos en el DOM genera mucho [overhead](https://en.wikipedia.org/wiki/Overhead_(computing%29) si no se realiza con cuidado. Para minimizar el recalculo de estilos procuramos renderizar unicamente las lineas visibles del frame, utilizando elementos absolutos para cursores, selecciones y overlays.
    • Para realizar estas medidas directamente en los elementos del DOM cada frame requiere de una Pre y Post actualizacion de medidas. Debido a esto hemos desarrollado librerias para la manipulacion del DOM en estas fases, denominadas ETCH. Estas librerias ofrecen una abstraccion REACT del DOM (DOM Virtual), basandoce en un Tree Diffing. Tambien soporta JSX aunque en principio no requiere de un Transpiler.
    • Tambien se implementaron las declaraciones CSS Containment. Estas nos permiten encapsular una serie de estilos unicamente a los elementos relevantes de la pantalla, por ejemplo los de los elementos que estan siendo modificados. Todas estas limitaciones entre la interaccion del DOM y CSS nos han planteado la posibilidad de utilizar en un futuro el Canvas API para pintar directamente los elementos en la pantalla.
  • 08-08-2017: Atom 1.19. Reestructura en C++ del rendering del editor mediante Electron 1.6.9.
  • 12-09-2017: Atom IDE. Instalar Atom-Ide-Ui y el paquete IDE del lenguaje deseado.
  • 12-09-2017: Atom 1.20. Mejoras en modulos Github (Diff Views), find and replace y language-PHP.
  • 03-10-2017: Atom 1.21. Soporte para LSP y se unifica el Filesystem Watcher por Este PR.
  • 12-10-2017: Nuevo Buffer con Concurrencia.
    • JavaScript solo puede realizar operaciones de texto intensivas sobre un buffer abierto. Anteriormente este tipo de buffer solo podia existir dentro del main thread de Atom. Ahora utilizamos una estructura de datos para texto en C++ que es compatible con las operaciones de JavaScript y ademas permite trabajar con multiples buffers en paralelo.
    • Dividimos el antiguo buffer en dos partes: La estructura principal y la de edicion. En la de edicion se van guardando en forma incremental todos los cambios del texto; los cuales se aplican a la estructura principal hasta que se haya resolvido el tiempo de CPU necesario.
    • Para aplicar las ediciones a la estructura principal se jerarquiza su importancia utilizando un Splay Tree, el cual se adapta conforme la estructura de ediciones cambie. Tambien se pudo optimizar el guardado y el autocomplete al ser realizadas de forma incremental y en el background.
  • 07-11-2017: Atom 1.22. Buffers de texto concurrentes.
  • 15-11-2017: Teletype Beta. Programacion remota usando CRDTs y WebRTC. P2P Channels.
  • 12-12-2017: Atom 1.23. Esconder comandos de la paleta de comandos y mejoras en Teletype.