Atom

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-deven 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:
- Serializacion
- Ejemplo Crear Paquete Uno
- Ejemplo Crear Paquete Dos
- Ejemplo Crear Paquete Tres
- Ejemplo Crear Gramaticas
- Publicar el Paquete
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
- Abrir con
atom --safe. - Abrir con
atom --clear-window-state. - 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:
- Implementacion de Specs.
atom --test specyWindow: Run Package Specs. - Descripcion del cambio.
- Diseños alternativos.
- Porque debe de estar en este repositorio.
- Lista de beneficios y desventajas.
- Problemas conocidos con esta implementacion.
Para realizar un Issue:
- El problema se reproduce en Safe Mode.
- Se siguieron los pasos del Debugging Guide
- No se encontraron respuestas en el FAQ ni hay un paquete que resuelva dicho comportamiento.
- El Issue no ha sido reportado, si ya fue reportado agregar un comentario relevante.
- Si un Issue identico ya fue cerrado, incluirlo en la descripcion como referencia.
- Se describe el Issue y los pasos para reproducirlo a detalle.
- Se describe el comportamiento que se esperaba y el que se obtuvo.
- Se describe el porcentaje de tiempo que es reproducible y los datos de
atom -vyapm -v. - 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 conAlt + 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 --convertal 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
onDidyonWill. 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-editory.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
transparentdelBrowserWindow. - 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.
- Ventanas con Fondo Transparente. Activar
- 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
TextEditorpuede 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
transformpara cambiar la posicion vertical de los Tiles.
- Cada frame del GUI requiere de un request de informacion a
- 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+Tabcambia 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-editory los selectores de algunos paquetes. - Sin embargo genero duplicados, dificultad para utilzar
atom-text-editoren 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--.
- Esta herramienta evitaba colisiones entre los selectores de estilos pertenecientes a
- 10-01-2017: Atom 1.13. Benchmarks. Nuevos Octicons. New Keystroke Resolver API.
- 18-01-2017: Atom en Windows.
- 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 objetoatomconstruidas a partir delAtomEnviroment. - 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.