Emacs - Arquitetura E Design Com Foco No Desenv De Plugins
1. UNIVERSIDADE FEDERAL DE CAMPINA GRANDE – UFCG
CENTRO DE ENGENHARIA ELÉTRICA E INFORMÁTICA – CEEI
DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO – DSC
EMBEDDED SYSTEMS AND PERVASIVE COMPUTING LAB - EMBEDDED
Relatório Técnico:
Emacs: Arquitetura e Design com Foco
no Desenvolvimento de Plugins.
José Martins da Nobrega Filho
martins.ufcg@gmail.com
Campina Grande, agosto de 2009.
1
2. Sumário
Sumário ............................................................................................................................. 2
1 Introdução................................................................................................................... 3
2 Arquitetura da Ferramenta .......................................................................................... 3
3 Design da ferramenta .................................................................................................. 4
3.1 Conceitos Estruturais ........................................................................................... 5
3.2 Conceitos Visuais ................................................................................................. 6
3.3 Módulos de edição ............................................................................................... 7
3.4 Interface com o Sistema Operacional ................................................................... 8
4 Conclusões ................................................................................................................. 8
5 Referências ................................................................................................................. 8
2
3. 1 Introdução
Com origem no laboratório de Inteligência Artificial do MIT como uma extensão do
TECO, o Emacs ganhou com o tempo várias implementações sendo hoje um ambiente de
trabalho totalmente customizado e utilizado principalmente por programadores. Suas
principais implementações são o GnuEmacs e o XEmacs que são tidos como dois editores
separados por uma língua comum.
Nesse relatório será informada uma descrição geral da arquitetura dessa ferramenta
com foco no GnuEmacs e um pouco da linguagem utilizada para desenvolvimento de
extensões e customização da ferramenta.
2 Arquitetura da Ferramenta
A primeira implementação do Emacs surgiu em 1976 tendo o objetivo de organizar
os macros (plugins) criados pelos usuários do TECO e adicionar facilidades para
implementação de novos comandos. Mas foi em 1978 que o Emacs ganhou a primeira
implementação cuja linguagem de extensão era baseada num dialeto do Lisp.
Com o advento dessa linguagem que hoje é conhecida como EmacsLisp, a
ferramenta passou a funcionar como um interpretador Lisp que utiliza uma API para
utilização dos conceitos inerentes ao seu design.
Na figura seguinte é possível visualizar o modelo da arquitetura utilizada pelo
Emacs. Nesse modelo a ferramenta é customizada através de um arquivo de boot, escrito
em lisp, que é carregado durante a execução do sistema, esse arquivo contém informações
sobre os plugins que serão utilizados e os parâmetros de configuração de cada um deles.
Cada plugin referenciado é então carregado pelo interpretador que disponibiliza
todas as funções e/ou variáveis do mesmo para o sistema. Com esse modelo as estruturas de
dados e funções passam a ser compartilhadas por todos os plugins existentes permitindo
uma ampla utilização dos recursos do ambiente montado.
3
4. Figura 1: Visão arquitetural do emacs. (1) leitura do arquivo .emacs durante a execução do sistema; (2)
referência aos plugins que devem ser carregados; (3) leitura dos plugins referenciados; (4) disponibilização
das funções carregadas para o sistema.
A disponibilização das estruturas montadas pelo sistema permite uma grande
possibilidade de reuso e extensão, mas também permite uma má utilização das estruturas de
dados, sendo necessário um conjunto de convenções que são utilizadas pela comunidade.
3 Design da ferramenta
Como visto no tópico anterior, a arquitetura do Emacs está totalmente centralizada
num interpretador que funciona como uma interface entre os componentes visuais e a
lógica implementada em suas extensões. Essa associação torna-se possível devido à
definição de conceitos que serão utilizados pelos plugins na forma de uma API que
acompanha a ferramenta.
Os conceitos existentes no design da ferramenta podem ser classificados em quatro
grupos como visto na figura seguinte. O primeiro grupo contém os conceitos estruturais que
definem como os arquivos são tratados no sistema e como é feita a associação desse
4
5. arquivo a funcionalidades como syntax highlighting, autocomplete, spell-checking e outros.
O segundo grupo determina os conceitos relacionados aos itens visuais da aplicação
e, portanto, define como manipular vários arquivos numa única janela, como interagir com
o usuário, definir quais os menus serão visíveis, entre outras funcionalidades.
O terceiro e o quarto grupos estão relacionados, respectivamente, à edição de
arquivos e à manipulação do sistema operacional, sendo utilizados para recursos como
autocomplete e remote editon file através de programas como openssh.
Figura 2: Classificação dos conceitos utilizados pelo Emacs.
3.1 Conceitos Estruturais
O primeiro conceito abordado nesse tópico será o Buffer. Essa estrutura é utilizada
como um pacote com metadados associados e cujo conteúdo pode ser o texto de um
arquivo ou uma string resultante de algum processamento no Emacs.
Com essa estrutura é possível identificar de forma única um conteúdo e obter
informações sobre o arquivo, como permissões de edição (ex: read only) e informações
sobre o Major Mode e os Minor Modes associados a esse buffer.
Os Modes de um buffer são responsáveis pela definição de um conjunto de
comportamentos que serão aplicados ao conteúdo do buffer como, por exemplo, o syntax
highlighting.
Em um buffer existe sempre um Major Mode que contém informações referentes a
comportamentos mais básicos (ex: comando para apagar uma linha) e um ou mais Minor
Modes que definem comportamentos especialistas (ex: highlighting de códigos C/C++).
5
6. Entre as estruturas utilizadas nos modos de operação, o Keymap e a Syntax Table
merecem destaque. A primeira estrutura consiste num mapa que relaciona uma combinação
de teclas a uma função, permitindo a implementação de teclas de atalho.
A segunda estrutura consiste numa tabela que relaciona um caractere a um
significado na construção sintática do conteúdo como, por exemplo, o caractere “;” que em
Lisp indica um comentário e em linguagens como C/C++ tem outro significado. Essa
definição permite a utilização de funções que realizam um parsing no código e verificam,
por exemplo, se a parentetização está correta.
A figura seguinte demonstra o relacionamento entre essas estruturas para uma
implementação de highlighting e autocomplete para códigos em C++.
Figura 3: Instância do relacionamento entre os conceitos estruturais.
3.2 Conceitos Visuais
O principal critério de usabilidade adotado pela ferramenta é a produtividade na
edição de arquivos, esse requisito provavelmente influenciou a utilização de um ambiente
gráfico dividido em janelas internas.
Para permitir a manipulação desse ambiente por plugins externos, o Emacs definiu
três conceitos que permitem trabalhar com cada item contido na interface da ferramenta.
6
7. O primeiro conceito é o Frame que identifica cada janela gráfica do sistema
operacional associada ao Emacs.
O outro conceito adotado, chamado Window, identifica as janelas internas a um
frame que estão sempre associadas a um buffer. Dessa forma o usuário pode trabalhar com
vários arquivos em uma ou mais janelas internas.
Com a definição desses conceitos, o desenvolvedor pode interagir com essas janelas
para exibir informações de forma temporária (uma window temporária), informações
estáticas como a árvore de diretórios do sistema (uma window fixa), informações sobre os
projetos abertos (um frame separado), etc.
Também foi adotado um conceito chamado Minibuffer que permite a entrada de
dados como senhas, comandos e parâmetros para funções. Essa estrutura está sempre
associada a uma window fixa que está localizada no rodapé do frame principal.
3.3 Módulos de edição
Como dito anteriormente, os buffers são estruturas que encapsulam o conteúdo, as
funções e as estruturas associados ao documento. No caso da edição do conteúdo desse
buffer, são definidos os conceitos Text, Positions e Markers.
Um Text representa o conteúdo de um buffer entre dois pontos (Positions/Markers)
e as propriedades desse conteúdo. É através dessa estrutura que é possível realizar
operações como inserir, deletar, formatar, comparar partes, definir margens, visibilidade e
outras mais.
Os Positions e Markers, por sua vez, definem pontos no conteúdo do buffer que são
utilizados para delimitar a área do texto onde será realizada uma dada operação. No
primeiro caso a definição do ponto é realizada através de um inteiro representando o índice
do caractere e, portanto, a área delimitada é alterada durante inserções ou deleções no texto.
Já os Markers usam como referencial os caracteres antes e depois do ponto. Dessa
forma as operações realizadas no texto não interferem na área delimitada.
7
8. 3.4 Interface com o Sistema Operacional
Para interagir com o sistema operacional ou programas externos, o Emacs
disponibiliza o conceito de processos e um conjunto de funções para interagir com o SO.
Os processos disponibilizados pelo Emacs podem ser vistos como objetos que são
identificados por um nome e executados de forma síncrona ou assíncrona. Além desse
conceito, a ferramenta disponibiliza uma API para envio de sinais e/ou strings, obtenção de
informações sobre o status do processo, aplicação de filtros nas saídas padrões, etc.
Para comunicação com o sistema operacional o Emacs disponibiliza um conjunto de
funções onde é possível obter informações sobe a data, setar variáveis de ambiente, tocar
som, entre outros. Observe que do ponto de vista arquitetural essas funções para interface
com o SO são apenas utilitários que fazem parte da linguagem.
4 Conclusões
Com mais de trinta anos no mercado, o Emacs continua sendo uma ferramenta de
alta produtividade para diversas atividades, mostrando com isso a eficiência de sua
arquitetura.
A escolha do Lisp como linguagem de extensão foi fundamental por ser interpretada
e por ter características do paradigma funcional e orientado a objetos, mas foi a definição
dos conceitos utilizados que permitiu a grande diversificação de plugins existentes.
5 Referências
B. Lewis, D. LaLiberte, and the GNU Manual Group. The GNU Emacs Lisp Reference Manual,
version 23.1, revision 3.0, July 2009.
Emacs. Acedido em: 23, agosto, 2009, em: http://pt.wikipedia.org/wiki/Emacs.
Emacs Lisp. Acedido em: 23, agosto, 2009, em: http://pt.wikipedia.org/wiki/Emacs_Lisp.
Ferrari, B. (2007). An Introduction to all these Emacs articles. Acedido em: 23, agosto, 2009, em:
http://blog.bookworm.at/2007/03/introduction-to-all-these-emacs.html
GNU Operating System - GNU Emacs. Acedido em: 23, agosto, 2009, em: http://www.gnu.org/
software/emacs/.
8
9. História do Emacs. Acedido em: 23, agosto, 2009, em: http://www.emacswiki.org/emacs-
pt/Hist%C3%B3riaDoEmacs.
Text Editor and Corrector. Acedido em: 23, agosto, 2009, em: http://en.wikipedia.org/wiki/
Text_Editor_and_Corrector.
XEmacs. Acedido em: 23, agosto, 2009, em: http://www.xemacs.org/.
9