1 poin oleh GN⁺ 3 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • Emacs bukanlah sistem operasi itu sendiri, melainkan mengorkestrasi aplikasi dan utilitas di atas kernel serta memanfaatkan sistem file, jaringan, dan program eksternal untuk menjadi klien bagi berbagai layanan
  • UI, lapisan komunikasi, dan penyimpanan data lokal yang dibutuhkan klien dapat disusun dengan pustaka bawaan seperti minibuffer, buffer, URL, TCP/UDP, JSON, dan SQLite
  • Sebagai bahasa dinamis, Emacs Lisp (Elisp) dapat menggabungkan fungsi Elisp dan perintah shell saat runtime, sehingga Emacs bisa mengorkestrasi kemampuan yang dapat diaksesnya secara fleksibel
  • Contoh perintah wttr menerima input lokasi, mengirim permintaan HTTP ke wttr.in, mengekstrak wilayah, suhu, dan cuaca dari JSON, lalu menampilkannya di minibuffer sekaligus menyimpannya ke kill ring
  • Seluruh wttr.el berukuran 67 baris menurut cloc, dan jika permintaan jaringan serta pemrosesan JSON diserahkan ke alat command-line seperti Python, kita juga bisa membuat klien Elisp yang lebih singkat dengan menjadikan perintah shell itu sendiri sebagai layanan

Emacs yang mengorkestrasi layanan di atas sistem operasi

  • Menyebut Emacs sebagai sistem operasi memang tidak sepenuhnya tepat, tetapi perbandingan ini muncul karena kemampuannya mengorkestrasi aplikasi dan utilitas di atas kernel sistem operasi
  • Karena dapat mengakses layanan sistem operasi seperti sistem file dan jaringan lewat fitur bawaan, sekaligus menjalankan program lain, Emacs memudahkan penyusunan perilaku klien secara spontan di dalam dirinya
  • Karena banyak pekerjaan komputasi dapat ditangani melalui berbagai mode klien, gagasan bahwa pengguna “hidup hanya di dalam Emacs” pun menjadi masuk akal

Model klien-server dilihat dari permintaan dan respons

  • Model klien-server adalah pola interaksi di mana layanan yang menyediakan sumber daya dan klien yang memintanya membagi pekerjaan
    • Klien mengirim permintaan
    • Server memproses permintaan lalu mengembalikan respons
  • Transaksi yang terdiri dari permintaan dan respons dapat dilakukan melalui jaringan atau secara lokal dalam satu sistem
  • Model berbasis jaringan berkembang luas dalam arsitektur perangkat lunak bergaya REST

Tiga area yang membentuk klien Emacs

  • Klien pada umumnya menangani tiga area berikut
    • UI: menangani input dan output pengguna sesuai kebutuhan
    • Client Edge: berkomunikasi dengan layanan; pada klien jaringan, subsistem jaringan menjalankan peran ini
    • Basis data lokal: merepresentasikan data yang dipertukarkan atau disinkronkan dengan server, dan cara pengelolaannya bergantung pada kebutuhan implementasi
  • Menyusun antarmuka pengguna

  • Komunikasi layanan dan transformasi data

    • Untuk client edge yang terhubung ke layanan, fitur berikut dapat dimanfaatkan
    • Untuk serialisasi dan deserialisasi, gunakan parser bawaan
  • Pengelolaan data lokal

    • Untuk representasi lokal data server, koleksi Elisp dapat digunakan
    • Jika membutuhkan penyimpanan lokal yang persisten, SQLite dapat digunakan
    • Kompleksitas klien nyata bergantung pada kebutuhannya, dan jika sudah ada utilitas command-line yang menangani pemrosesan berat, itu bisa disusun ulang sebagai layanan yang diakses lewat pemanggilan shell

Cara menggabungkan kemampuan dengan Elisp

  • Semua pustaka di atas dapat diakses dari Emacs Lisp (Elisp)
  • Elisp adalah bahasa pemrograman dinamis yang memungkinkan penyusunan improvisasional tingkat tinggi saat runtime
  • Dari fungsi Elisp hingga perintah shell, kita dapat menggabungkan perilaku yang bisa digunakan Emacs untuk mengorkestrasi alur yang kompleks

Implementasi klien cuaca wttr.in

  • wttr.in adalah layanan web prakiraan cuaca yang berpusat pada konsol dan mendukung output JSON
  • Perintah wttr untuk Emacs bekerja dalam urutan berikut
    1. Menerima input lokasi dari pengguna
    2. Membuat URL permintaan wttr.in
    3. Mengirim permintaan HTTP
    4. Memproses respons JSON
    5. Menampilkan hasil di minibuffer dan menyimpannya ke kill ring
    6. Jika terjadi galat saat pemrosesan, menampilkan pesan galat di minibuffer
  • Membuat URL permintaan

    • wttr--request-url menggunakan https://wttr.in sebagai URL dasar
    • Spasi pada lokasi input diubah menjadi +, lalu dibuat kueri berbentuk /<location>?0&format=j1
    • URL yang telah selesai kemudian diteruskan ke fungsi pengambil JSON
  • Permintaan HTTP dan parsing JSON

    • fetch-json-as-hash-table mengambil URL secara sinkron dengan url-retrieve-synchronously
    • Jika data tidak dapat diambil, fungsi ini memunculkan galat Failed to fetch data from <URL>
    • Setelah berpindah melewati header metadata HTTP di buffer respons, json-parse-buffer mengubah sisa isi menjadi hash-table Elisp
    • Setelah pemrosesan selesai, buffer jaringan hasil unduhan selalu dihapus untuk mencegah kebocoran memori
  • Menyusun pesan cuaca

    • wttr--report-message mengekstrak nilai-nilai berikut dari data JSON
      • Nama area terdekat
      • Wilayah
      • Negara
      • Suhu saat ini dalam Celsius temp_C
      • Suhu saat ini dalam Fahrenheit temp_F
      • Deskripsi cuaca weatherDesc
    • Elemen lokasi yang tidak kosong digabungkan dengan koma, lalu dibentuk hasil berformat lokasi: Celsius, Fahrenheit deskripsi cuaca
    • Implementasi lengkapnya dapat dilihat pada sumber wttr.el

Memanfaatkan alat command-line juga sebagai layanan

  • API Emacs menyediakan abstraksi tingkat tinggi, dan wttr.el yang mengimplementasikan langsung permintaan HTTP serta pemrosesan JSON pun hanya 67 baris menurut pengukuran cloc
  • Alternatif yang lebih sederhana adalah menyerahkan permintaan jaringan dan pemrosesan JSON yang sebenarnya ke skrip Python bernama weather
    • Perintah weather di Elisp meminta lokasi dari pengguna
    • Menyusun perintah shell weather dengan menambahkan lokasi sebagai argumen
    • Menjalankan perintah dengan shell-command-to-string
    • Menyimpan hasil yang dikembalikan ke kill ring dan menampilkannya di minibuffer
  • Dalam susunan ini, perintah shell menjadi layanan yang menerima permintaan dan fungsi Elisp berperan sebagai klien
  • Berkat sifat dinamis Elisp, pustaka Elisp dan utilitas command-line dapat digabungkan sesuai kebutuhan, dan kemungkinan integrasi inilah yang membuat segala sesuatu di dalam Emacs dapat diperlakukan seperti layanan

1 komentar

 
GN⁺ 3 jam lalu
Opini Hacker News
  • Emacs hanya terlihat seperti sistem operasi karena keluarga Lisp Machine tidak pernah menjadi arus utama
    “Demo Symbolics Lisp Machine”
    https://www.youtube.com/watch?v=o4-YnLpLgtk
    “Emacs and Lisp”
    https://funcall.blogspot.com/2025/04/emacs-and-lisp.html
    Lucid pernah mem-fork Emacs menjadi XEmacs untuk mencoba mewujudkan salah satu gagasan awal LSP, dan sebagian besar fiturnya kini sudah digabungkan kembali ke Emacs
    https://dreamsongs.com/Cadillac.html
    “Demo Lucid Energize”
    https://www.youtube.com/watch?v=pQQTScuApWk

    • Sistem operasi adalah mesin virtual yang dibuat agar bisa dipakai bersama oleh banyak program. Biasanya ia mengekspos sebagian besar instruction set architecture (ISA) tempat ia berjalan, meski ada pengecualian seperti Inferno, Taos, dan AS/400
    • Bahkan jika mesin LISP berhasil, editor yang berjalan di atasnya tetap tidak otomatis menjadi sistem operasi. Jika platform dan sistem operasi disamakan, maka browser web atau bahkan Roblox pun bisa disebut sistem operasi
  • Jika client, server, dan request didefinisikan cukup longgar, apa pun bisa dipaksa masuk ke dalam arsitektur klien/server. Mirip seperti upaya keras mengklaim bahwa Emacs mengikuti filosofi Unix hanya karena fungsi LISP melakukan satu hal dengan baik
    Kebanyakan orang bisa setuju bahwa Emacs mengikuti gagasan mesin LISP, dan di atasnya praktis bisa dibangun hampir apa saja. Emacs juga terintegrasi sangat baik dengan alat CLI, tetapi tidak jelas apa yang didapat dengan menyebutnya klien/server
    Selama puluhan tahun ia menyerap berbagai tren dan fitur, dan di dalamnya masih ada mesin analisis semantik CEDET yang sekarang hampir tidak dipakai. Lalu LSP muncul, dan sekarang kita masuk era agen, tetapi Emacs juga cukup bagus sebagai frontend untuk agen

    • Emacs adalah pengungsi LISP yang berlindung di dunia Unix. Ia mengikuti filosofi LISP, bukan filosofi Unix, tetapi tetap terintegrasi baik dengan Unix
    • Dulu, cukup umum bagi IDE untuk memiliki mesin analisis semantik sendiri. Kalau tidak salah, server bahasa Java pertama juga dipisahkan dari mesin analisis semantik Java milik Eclipse
  • Saya sudah memakai Emacs lebih dari 25 tahun, tetapi di perusahaan baru tahun lalu saya bahkan tidak boleh memakainya untuk pekerjaan yang sebenarnya sangat cocok dengan Emacs. Alasannya, semua anggota tim harus memakai alat yang sama, dan saya gagal membujuk orang lain beralih ke Emacs
    Sekarang saya malah memakai alat tujuan tunggal yang terpisah untuk tiap tugas dengan cara yang jauh lebih tidak efisien, sambil terus belajar UI dan pemetaan tombol baru

    • Saat perusahaan membesar, mereka mulai mengendalikan perangkat lunak yang boleh dipasang, dan tampaknya Microsoft Intune dipakai untuk mengatur izin dan blokir instalasi. Saya bahkan menunda pembaruan atau penggantian laptop karena takut tak bisa lagi memakai Emacs
      Admin pasti akan bilang semua orang harus memakai Visual Studio Code untuk proyek baru, padahal model konsumsi yang kami pakai juga tidak didukung VSCode. Selama Git dan prosedur deployment sesuai, mestinya editor bisa dipilih masing-masing sesuai yang paling dikuasai, tetapi saya rasa jawabannya akan tetap bahwa ini berisiko karena open source yang tidak didukung Microsoft dan perangkat lunak yang belum divalidasi perusahaan
      Emacs adalah alat inti yang saya pakai setiap hari, jadi kalau dilarang saya berniat resign. Admin bukan sedang mencoba memahami atau menilai secara logis, mereka hanya mengikuti instruksi dari departemen TI lain
    • Kalau semua anggota tim dipaksa memakai telnet dan dilarang ssh, apakah itu juga dianggap masuk akal? Yang penting adalah jangan minta izin untuk memakai Emacs, langsung pakai saja
      Jika perusahaan sudah menetapkan editor teks serbaguna, mungkin patut dicek apakah menjalankan Notepad juga jadi masalah, atau apakah mereka sampai menetapkan alat manajemen tugas pribadi. Cari kategori penggunaan yang bisa dilakukan Emacs tetapi belum ditentukan alatnya oleh perusahaan, lalu pasang Emacs untuk tujuan itu
    • Logikanya sama seperti melakukan lobotomi frontal pada semua anggota tim karena mengelola kepribadian yang berbeda dianggap tidak efisien dan orang harus diperlakukan berbeda-beda
    • Kalau alat lain punya kebebasan dan kemampuan modifikasi setara Emacs, mungkin pengguna Emacs juga tidak akan berusaha memaksakan semua pekerjaan masuk ke sana. Bukan berarti Emacs selalu superior, melainkan alat lain lebih terbatas dan kurang terdokumentasi secara mandiri
    • Saya mempertanyakan mengapa klaim bahwa semua anggota tim harus memakai alat yang sama dianggap masuk akal
  • Emacs adalah platform, dan sistem operasi juga hanyalah salah satu dari sekian platform. Platform adalah lapisan perangkat lunak yang dirancang agar hal baru bisa dibangun di atasnya, jadi pertanyaannya adalah apakah platform X cocok untuk membuat Y yang diinginkan
    Bagi saya, X sering kali Emacs, tetapi bisa juga Racket atau Rust. Jika ada alat yang sekaligus merupakan aplikasi dan platform yang baik, alat itu layak mendapat investasi belajar lebih besar daripada aplikasi biasa

  • Setelah cukup lama memakai Emacs hingga bisa memahami ungkapan “Emacs adalah sistem operasi” bukan sebagai lelucon melainkan sebagai konsep yang sungguh bisa dipercaya, itu menjadi titik balik penting dalam karier saya

    • Sistem operasi sudah ada, kemampuan pemrograman juga sudah ada, jadi masih dipertanyakan apakah Emacs benar-benar memberi kemampuan baru. Emacs itu editor teks, bukan IDE atau lingkungan eksekusi otomasi serbaguna, jadi sulit memahami logika bahwa menambahkan Lisp ke MSPaint tiba-tiba akan membuatnya menjadi alat luar biasa
  • Saya mulai memakai Emacs beberapa tahun lalu karena ingin mencoba org mode, dan tetap memakainya karena fleksibilitasnya yang sangat ekstrem

    • Saya sempat memakai Spacemacs untuk beberapa waktu, tetapi sekarang sudah punya Keychron G6 Pro yang memungkinkan Caps Lock diprogram ulang, jadi saya ingin serius menyusun init.el sendiri
  • Emacs lebih dekat ke lingkungan pemrograman yang dibekali editor teks. Jika dianggap mirip dengan beberapa image Smalltalk, ini menjadi alat yang cukup menarik

  • Emacs bukan sistem operasi melainkan lebih dekat ke shell, tetapi konsep shell sendiri juga tidak dipahami luas

    • Jika shell dipandang sebagai sarana memakai alat lain, maka vi justru lebih mirip shell. Banyak fungsinya harus diserahkan ke program Unix standar lain lewat :.!
      Sebaliknya, Emacs seperti sistem operasi karena memasukkan segala macam fungsi ke dalam satu distribusi besar
  • Baru-baru ini saya menemukan video pengantar singkat yang bagus untuk ditunjukkan kepada orang yang tidak memakai Emacs
    https://www.youtube.com/watch?v=mJZDmO5yOxE

    • Saya jadi sangat penasaran dengan init.el milik Anon Emoose
  • Emacs sendiri bisa dijalankan sebagai klien dan server. Jalankan server dengan emacs --daemon, lalu hubungkan lewat emacsclient; semua instance terminal dan GUI akan memakai server yang sama serta berbagi file dan buffer yang terbuka
    Sayangnya ini hanya bekerja secara lokal, dan saya pernah mencoba meneruskan soket server Emacs lewat ssh agar bisa terhubung dari klien jarak jauh, tetapi gagal

    • Kalau dipikir-pikir lagi, nama emacsclient kurang bagus. Orang yang pertama kali mengenal Emacs pada 2026 mungkin mudah mengira bahwa seperti klien REST, ia menyinkronkan status eksekusi klien dan server lewat jaringan
      Di sini klien dan server maksudnya adalah struktur Unix local domain, yaitu klien mengirim perintah kontrol sederhana melalui soket sistem berkas. Belakangan soket jaringan juga didukung, tetapi yang dikirim klien tetap hanya perintah kontrol sederhana
    • Meneruskan soket memang tidak berhasil, tetapi jika memakai X11, Anda bisa menggunakan ssh -X untuk menampilkan frame Emacs jarak jauh di server X lokal. Namun hati-hati, pada build GTK non-PGTK, Emacs jarak jauh bisa crash saat frame baru ditutup
    • Saya penasaran apakah penyebab kegagalan penerusan soket itu pernah diperiksa