1 pontos por GN⁺ 3 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • 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 wttr recebe 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.el completo tem 67 linhas segundo o cloc, 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

  • 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 wttr para Emacs funciona na seguinte ordem
    1. Recebe do usuário uma localização
    2. Gera a URL de requisição para o wttr.in
    3. Envia a requisição HTTP
    4. Processa a resposta JSON
    5. Exibe o resultado no minibuffer e o salva no kill ring
    6. Se ocorrer um erro durante o processamento, mostra uma mensagem de erro no minibuffer
  • Montando a URL de requisição

    • wttr--request-url usa https://wttr.in como 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-table busca a URL de forma síncrona com url-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-table de Elisp com json-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-message extrai 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 do cloc
  • 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 weather em Elisp recebe do usuário uma localização
    • Monta o comando de shell weather com 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
  • 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

 
GN⁺ 3 시간 전
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

    • Um sistema operacional é uma máquina virtual feita para ser compartilhada por vários programas. Normalmente ele expõe a maior parte da arquitetura do conjunto de instruções (ISA) sobre a qual roda, embora existam exceções como Inferno, Taos e AS/400
    • Mesmo que as máquinas LISP tivessem dado certo, o editor que roda nelas não viraria o sistema operacional. Se você confundir plataforma com sistema operacional, dá para chamar até navegador web ou mesmo Roblox de sistema operacional
  • Se você definir client, server e request de 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 vez
    Dá 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

    • O Emacs é um refugiado de LISP que foi parar no mundo Unix. Ele segue a filosofia LISP, não a filosofia Unix, mas se integra bem com Unix
    • Antigamente era comum a maioria das IDEs ter seu próprio motor de análise semântica. Pelo que lembro, o primeiro language server de Java também foi extraído do motor de análise semântica de Java do Eclipse
  • 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

    • Conforme a empresa cresceu, começou a controlar o software instalado, e aparentemente usa Microsoft Intune para permitir ou bloquear instalações. Estou até adiando atualizar ou trocar o notebook com medo de não conseguir mais usar Emacs
      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
    • Você acharia razoável obrigar todo o time a usar telnet e proibir ssh? O importante é não pedir permissão para usar Emacs, e simplesmente usar
      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
    • É a mesma lógica de dizer que, como lidar com personalidades diferentes é ineficiente e exige tratar cada pessoa de forma distinta, então fizeram lobotomia frontal em todo o time
    • Se outras ferramentas tivessem o mesmo nível de liberdade e possibilidade de modificação do Emacs, os usuários de Emacs não tentariam enfiar todo tipo de trabalho dentro dele. Não é tanto que o Emacs seja inerentemente superior; é que as outras ferramentas são mais limitadas e menos autoexplicativas
    • Fico me perguntando por que seria válido dizer que todos do time precisam usar as mesmas ferramentas
  • 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

    • Eu já tinha sistema operacional e já sabia programar, então fico em dúvida se o Emacs realmente trouxe uma capacidade nova. Emacs é um editor de texto, não uma IDE nem um ambiente geral de execução para automação; então é difícil entender a lógica de que adicionar Lisp ao MSPaint o transformaria de repente numa ferramenta extraordinária
  • Comecei a usar Emacs alguns anos atrás para testar o org mode, e continuei por causa da flexibilidade absurdamente alta

    • Usei Spacemacs por um tempo, mas agora consegui um Keychron G6 Pro em que posso reprogramar o Caps Lock, então vou montar meu init.el de verdade
  • O 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

    • Se você vê shell como um meio de usar outras ferramentas, então vi está até mais próximo de um shell. Muitas funções dele dependem de :.! para delegar a outros programas padrão do Unix
      Já 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

    • Fiquei realmente curioso sobre o init.el do Anon Emoose
  • O próprio Emacs pode ser executado como cliente e servidor. Você inicia o servidor com emacs --daemon e depois se conecta com emacsclient; assim, todas as instâncias no terminal e na GUI usam o mesmo servidor e compartilham os arquivos e buffers abertos
    Infelizmente 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

    • Pensando agora, o nome emacsclient nã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 servidor
      Aqui, 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
    • O encaminhamento de socket não funciona, mas se você usa X11 pode abrir um frame do Emacs remoto no seu servidor X local com ssh -X. Só tome cuidado porque, em builds GTK sem PGTK, fechar um frame novo pode derrubar o Emacs remoto
    • Fiquei curioso se você chegou a descobrir por que o encaminhamento de socket falhou