No Emacs, tudo parece um serviço
(yummymelon.com)- O Emacs, em vez de ser um sistema operacional em si, orquestra aplicativos e utilitários sobre o kernel, usando sistema de arquivos, rede e programas externos para atuar como cliente de diversos serviços
- Os elementos necessários para um cliente — UI, camada de comunicação e armazenamento local de dados — podem ser montados com bibliotecas embutidas como minibuffer, buffers, URL, TCP/UDP, JSON e SQLite
- Como linguagem dinâmica, o Emacs Lisp (Elisp) permite combinar em tempo de execução funções Elisp e comandos de shell, orquestrando com flexibilidade os recursos aos quais o Emacs pode acessar
- O comando de exemplo
wttrrecebe uma localização, envia uma requisição HTTP para wttr.in, extrai do JSON a região, temperatura e clima, mostra isso no minibuffer e também salva no kill ring - O
wttr.elcompleto tem 67 linhas segundo ocloc, e, se as requisições de rede e o processamento de JSON forem delegados a ferramentas de linha de comando como Python, também é possível criar um cliente Elisp ainda menor usando o próprio comando de shell como serviço
Emacs orquestrando serviços sobre o sistema operacional
- Chamar o Emacs de sistema operacional não é exatamente correto, mas essa comparação surge por sua capacidade de orquestrar aplicativos e utilitários sobre o kernel do sistema operacional
- Como consegue acessar serviços do sistema operacional, como sistema de arquivos e rede, com recursos embutidos, além de executar outros programas, fica fácil montar na hora o comportamento de um cliente dentro do Emacs
- Como muitos trabalhos computacionais podem ser feitos por diferentes modos cliente, a ideia de o usuário “viver apenas dentro do Emacs” também faz sentido
O modelo cliente-servidor visto por requisição e resposta
- O modelo cliente-servidor é um padrão de interação em que um serviço que fornece recursos e um cliente que os solicita dividem o trabalho
- O cliente envia uma requisição
- O servidor processa a requisição e depois retorna uma resposta
- As transações formadas por requisição e resposta podem acontecer pela rede ou localmente dentro de um mesmo sistema
- O modelo baseado em rede se desenvolveu amplamente na arquitetura de software no estilo REST
As três áreas que compõem um cliente no Emacs
- Um cliente típico cuida das três áreas a seguir
- UI: processa entrada e saída do usuário conforme necessário
- Client Edge: comunica-se com o serviço; em clientes de rede, o subsistema de rede assume esse papel
- Banco de dados local: representa os dados trocados ou sincronizados com o servidor, e a forma de gerenciamento varia conforme os requisitos da implementação
-
Composição da interface do usuário
- O Emacs oferece vários recursos embutidos para criar a UI de um cliente
- Minibuffers
- Buffers
- Completion
- Tabulated List Mode
- Variable Pitch Table(vtable)
- Transient
-
Comunicação com o serviço e transformação de dados
- Na borda do cliente que se conecta ao serviço, é possível usar os recursos abaixo
- Para serialização e desserialização, usam-se parsers embutidos
-
Gerenciamento de dados locais
- Para a representação local dos dados do servidor, podem ser usadas coleções de Elisp
- Se for necessário armazenamento local persistente, pode-se usar SQLite
- A complexidade do cliente real varia conforme os requisitos, e, se já houver utilitários de linha de comando para lidar com o processamento pesado, eles podem ser reorganizados como serviços acessados por chamadas de shell
Como combinar funcionalidades com Elisp
- Todas as bibliotecas mencionadas acima podem ser acessadas a partir de Emacs Lisp (Elisp)
- Elisp é uma linguagem de programação dinâmica que permite um alto grau de composição improvisada em tempo de execução
- É possível orquestrar fluxos complexos combinando comportamentos que o Emacs consegue usar, desde funções Elisp até comandos de shell
Implementando um cliente de clima com wttr.in
- wttr.in é um serviço web de previsão do tempo voltado ao console e oferece saída em JSON
- O comando
wttrpara Emacs funciona na seguinte ordem- Recebe do usuário uma localização
- Gera a URL de requisição para o wttr.in
- Envia a requisição HTTP
- Processa a resposta JSON
- Exibe o resultado no minibuffer e o salva no kill ring
- Se ocorrer um erro durante o processamento, mostra uma mensagem de erro no minibuffer
-
Montando a URL de requisição
wttr--request-urlusahttps://wttr.incomo URL base- Substitui os espaços da localização informada por
+e gera uma query no formato/<location>?0&format=j1 - A URL final é então passada para a função de obtenção de JSON
-
Requisição HTTP e parsing de JSON
fetch-json-as-hash-tablebusca a URL de forma síncrona comurl-retrieve-synchronously- Se não conseguir receber os dados, gera o erro
Failed to fetch data from <URL> - Depois de avançar no buffer de resposta para além dos cabeçalhos de metadados HTTP, converte o restante do conteúdo em uma
hash-tablede Elisp comjson-parse-buffer - Quando o processamento termina, sempre remove o buffer de rede baixado para evitar vazamentos de memória
-
Montando a mensagem do clima
wttr--report-messageextrai os valores abaixo dos dados JSON- nome da área mais próxima
- região
- país
- temperatura atual em Celsius
temp_C - temperatura atual em Fahrenheit
temp_F - descrição do clima
weatherDesc
- Junta os elementos de localização não vazios com vírgulas e cria um resultado no formato
localização: Celsius, Fahrenheit descrição do clima - A implementação completa pode ser vista no fonte de wttr.el
Ferramentas de linha de comando também podem virar serviços
- A API do Emacs oferece abstrações de alto nível, e mesmo
wttr.el, que implementa diretamente a requisição HTTP e o processamento de JSON, tem apenas 67 linhas segundo a medição docloc - Uma alternativa ainda mais simples é delegar a requisição de rede real e o processamento de JSON a um script Python chamado
weather- O comando
weatherem Elisp recebe do usuário uma localização - Monta o comando de shell
weathercom a localização como argumento - Executa o comando com
shell-command-to-string - Salva o resultado retornado no kill ring e o exibe no minibuffer
- O comando
- Nessa configuração, o comando de shell se torna o serviço que recebe a requisição, e a função Elisp assume o papel de cliente
- Graças à natureza dinâmica do Elisp, bibliotecas Elisp e utilitários de linha de comando podem ser combinados conforme a necessidade, e essa capacidade de integração faz com que, dentro do Emacs, tudo possa ser tratado como um serviço
1 comentários
Comentários do Hacker News
O Emacs só parece um sistema operacional porque a linha das Lisp Machines não virou dominante
“Symbolics Lisp Machine demo”
https://www.youtube.com/watch?v=o4-YnLpLgtk
“Emacs and Lisp”
https://funcall.blogspot.com/2025/04/emacs-and-lisp.html
A Lucid fez um fork do Emacs para criar o XEmacs ao tentar implementar uma das ideias iniciais de LSP, e a maior parte dos recursos da época hoje já foi reincorporada ao Emacs
https://dreamsongs.com/Cadillac.html
“Lucid Energize Demo”
https://www.youtube.com/watch?v=pQQTScuApWk
Se você definir
client,servererequestde forma ampla o bastante, dá para encaixar qualquer coisa numa arquitetura cliente/servidor. É parecido com quando tentavam insistir que o Emacs seguia a filosofia Unix só porque funções LISP fazem bem uma tarefa de cada vezDá para concordar em grande parte que o Emacs segue a ideia de uma máquina LISP, e em cima dele dá para implementar praticamente qualquer coisa. Ele se integra muito bem com ferramentas de CLI, mas não está claro o que se ganha ao definir isso como cliente/servidor
Ao longo de décadas ele foi absorvendo funções de várias modas, e por dentro ainda tem o motor de análise semântica do CEDET, que hoje quase não é usado. Depois veio o LSP, e agora estamos na era dos agentes, mas o Emacs também serve muito bem como frontend para agentes
Uso Emacs há mais de 25 anos, mas na empresa para a qual fui no ano passado não me deixam usá-lo nem em tarefas em que ele se encaixa especialmente bem. Disseram que todos do time precisam usar as mesmas ferramentas, e não consegui convencer os outros a migrar para Emacs
Agora estou usando de forma bem mais ineficiente uma série de ferramentas de propósito único separadas para cada tarefa, além de ter que aprender continuamente novas UIs e mapeamentos de teclas
Os gestores vão dizer que, em projetos novos, todo mundo deve usar Visual Studio Code, mas o modelo de consumo que usamos nem é suportado pelo VSCode. Desde que Git e os processos de deploy estejam alinhados, cada um poderia escolher o editor com que trabalha melhor, mas imagino que a resposta seria que, por ser open source sem suporte da Microsoft, é arriscado, e que a empresa não validou esse software
Emacs é minha ferramenta central do dia a dia; se ele for proibido, penso em pedir demissão. Os gestores não estão tentando entender nem julgar de forma lógica, só seguir ordens de outro departamento de TI
Se a empresa definiu um editor de texto de uso geral, talvez valha verificar se até abrir o Notepad seria um problema, ou se ela também definiu uma ferramenta pessoal de tarefas. Basta encontrar uma categoria em que o Emacs se encaixe e para a qual a empresa ainda não tenha definido uma ferramenta, e instalá-lo com esse propósito
O Emacs é uma plataforma, e sistema operacional também é só uma entre várias plataformas. Plataforma é uma camada de software pensada para permitir construir coisas novas em cima dela, então a pergunta deveria ser se uma plataforma X é adequada para construir o Y que você quer
Para mim, muitas vezes esse X é Emacs, mas também pode ser Racket ou Rust. Se uma ferramenta, além de aplicação, também é uma boa plataforma, vale mais a pena investir em aprendê-la do que numa aplicação simples
Um ponto importante da minha carreira foi quando usei Emacs o suficiente para entender “Emacs é um sistema operacional” não como piada, mas como uma ideia que de fato fazia sentido
Comecei a usar Emacs alguns anos atrás para testar o org mode, e continuei por causa da flexibilidade absurdamente alta
init.elde verdadeO Emacs está mais para um ambiente de programação com editor de texto embutido. Se você pensar nele como algo parecido com algumas imagens Smalltalk, ele vira uma ferramenta bem interessante
Emacs não é um sistema operacional, está mais para um shell, mas a própria ideia de shell não é tão amplamente compreendida
viestá até mais próximo de um shell. Muitas funções dele dependem de:.!para delegar a outros programas padrão do UnixJá o Emacs, como um sistema operacional, inclui todo tipo de função numa única grande distribuição
Encontrei recentemente um vídeo curto de introdução que é bom para mostrar a quem não usa Emacs
https://www.youtube.com/watch?v=mJZDmO5yOxE
init.eldo Anon EmooseO próprio Emacs pode ser executado como cliente e servidor. Você inicia o servidor com
emacs --daemone depois se conecta comemacsclient; assim, todas as instâncias no terminal e na GUI usam o mesmo servidor e compartilham os arquivos e buffers abertosInfelizmente isso só funcionava localmente, e tentei encaminhar o socket do servidor do Emacs por ssh para conectar a partir de um cliente remoto, mas não consegui
emacsclientnão foi uma boa escolha. Em 2026, alguém conhecendo Emacs pela primeira vez pode facilmente esperar algo parecido com um cliente REST, sincronizando pela rede o estado de execução entre cliente e servidorAqui, cliente e servidor significam uma estrutura em que o cliente envia comandos simples de controle por um domínio local Unix, isto é, um socket do sistema de arquivos. Depois também passou a haver suporte a sockets de rede, mas o que o cliente envia continua sendo apenas comandos simples de controle
ssh -X. Só tome cuidado porque, em builds GTK sem PGTK, fechar um frame novo pode derrubar o Emacs remoto