GNU Emacs’te lsp-mode’dan Eglot’a geçiş
(utcc.utoronto.ca)- GNU Emacs’in yerleşik LSP çözümü Eglot’a, daha önce iyi çalışan lsp-mode tabanlı LSP ortamını tamamen değiştiren gerçek bir geçiş deneyiminin özeti
- Eglot, lsp-mode’a kıyasla minimal ve daha sakin bir arayüz sunuyor; Corfu, Consult, Flycheck gibi harici paketlerle ve standart Emacs Lisp API’leriyle entegre oluyor
- Geçiş çalışmasının büyük bölümü, Eglot’un kendi ayarlarından ziyade yardımcı paketleri bulma, yapılandırma ve deneme-yanılma sürecine harcandı
- pylsp, gopls gibi LSP sunucularında workspace yapılandırma yöntemleri farklılık gösteriyor; proje bazlı ayarlar için
.dir-locals.elkullanmak gerekiyor - Eglot, GNU Emacs’e yerleşik geldiği için uzun vadede Emacs kullanıcılarının geçişi değerlendirmesine değer bir seçenek
Geçiş motivasyonu ve genel izlenim
- Özel olarak güçlü bir neden olmadan, Corfu’ya geçtikten sonra Eglot’u denemelik kullanıp devam etme durumu
- lsp-mode + lsp-ui, aynı anda çok sayıda bilginin gösterildiği yoğun (busy) bir arayüz; daha sakin bir LSP deneyimi istendiği için geçiş yapıldı
- Eglot, lsp-mode’dan daha minimal, ancak tam bir deneyim için ek paketlerle güçlendirilmesi gerekiyor
- Sonuç olarak memnuniyet verici; Go ve Python modlarında 'common prefix ile otomatik tamamlama' gibi özellikler daha iyi çalışıyor
- lsp-ui ayarları ayrıca ince ayarlanabilirdi, ancak Eglot’a geçmek tüm sorunları bir anda çözdü
Yardımcı paket entegrasyonu
- Corfu, ek bir ayar olmadan mevcut yapılandırmayla otomatik tamamlama için çalıştı
- Çapraz referanslarda lsp-ui tarzı önizleme almak için consult paketini bağlamak ve
xref-show-xrefs-functiondeğeriniconsult-xrefolarak ayarlamak gerekiyor - Flycheck ile Flymake arasında düşünülüp sonunda Flycheck seçildi
- Flymake, Eglot ile daha iyi entegre oluyor ama genel olarak Flycheck tercih ediliyor
- Eglot,
flymake-modeu otomatik etkinleştirdiği için, devre dışı bırakmak amacıylaeglot-stay-out-ofiçineflymakeeklendi - flycheck-eglot’un global modu kararlı çalışmadığından, hook’ları doğrudan ayarlayan bir yöntem kullanıldı
Tuş atamaları
- Eglot, varsayılan tuş atamaları sunmadığı için bunları elle tanımlamak gerekiyor
- Şu anda kullanılan atama örnekleri:
C-c r→eglot-rename,C-c o→eglot-code-action-organize-importsC-c h→eldoc,C-c a→eglot-code-actions,C-c q→eglot-code-action-quickfixC-M-<mouse-2>→eglot-code-actions-at-mouse(flycheck-eglot’un entegrasyon sınırlamasını aşmak için kullanılan fare kısayolu)
eglot-formatbilerek atanmadı — Go’da zaten go-mode’un gofmt aracı kullanılıyoreglot-extend-to-xrefdeğerinityapmak, harici bir öğeye atladıktan sonra M-? ile projedeki diğer kullanımları aramayı mümkün kılıyor
LSP sunucusunu otomatik başlatma
- Eglot’un resmî belgeleri elle başlatmayı önerse de, yalnızca yerel dosyalar için otomatik başlatma ayarlandı
eglot-ensure-local-onlyfonksiyonu tanımlanarak,file-remote-pile uzak dosya olup olmadığı kontrol ediliyor ve ardındaneglot-ensureçağrılıyoreglot-ensurekısıtı: bir dil için birden fazla LSP sunucusu olduğunda (ör. Python’da pylsp ve ruff), yalnızca varsayılan sunucu otomatik seçiliyor; değiştirmek için mevcut sunucuyu kapatıpeglotu elle çağırmak gerekiyor- Birden fazla LSP sunucusunu aynı anda çalıştırmak için rassumfrassum gibi çoklayıcı programlar kullanılabiliyor
Code Actions erişilebilirliği
- LSP sunucularının sunduğu code action sayısı fazla, ancak Eglot içinde bunlara rahat erişmek zor (lsp-mode’da da benzer)
- LSP sunucuları code action’ları yalnızca istek üzerine sağlıyor ve bunlar belirli konumlara bağlı
- Eglot, sunucunun gönderdiği uzun code action listesini filtreleme özelliği sunmadığı için, hem Go hem Python’da liste kalabalıklaşıyor
pylsp Workspace yapılandırması
- pylsp’de (Python LSP sunucusu), stil tabanlı linter’ları sürekli tanılamadan devre dışı bırakmak için eglot-workspace-configuration kullanmak gerekiyor
- lsp-mode, tek tek tanılama araçlarını (mccabe vb.) kapatmak için kullanışlı denetimler sunarken, Eglot’ta JSON biçiminde workspace configuration doğrudan yazılmalı
- Örnek olarak mccabe, pylint, mypy, pycodestyle gibi bileşenler
:enabled :json-falseile devre dışı bırakılıyor - mypy ile ilgili anahtarların
pylsp_mypyvemypyolmak üzere iki farklı adla karışık kullanılması, pylsp’nin iç uygulama ayrıntılarından kaynaklanıyor - Mutlaka
setq-defaultkullanılmalı;setqile çalışmıyor
Proje bazlı ayarlar ve .dir-locals.el
- Proje bazında LSP sunucu parametrelerini geçici olarak ayarlamanın kolay bir yolu Eglot’ta yok
- Belirli ayarlar gerekiyorsa, bunu doğru biçimde
.dir-locals.eldosyasına yazmak en kolay yöntem - gopls (Go) ve pylsp (Python) için yapılandırma yapıları tamamen farklı; her LSP sunucusu ayrı ayrı öğrenilmeli
- Çalışma anında ayar değiştirmek için
dir-locals-set-class-variablesile yeni bir sınıf tanımlayıp, ardındandir-locals-set-directory-classveeglot-signal-didChangeConfigurationçağrılarını yapan özel bir fonksiyon yazmak gerekiyor - Eglot, tüm proje (dizin ağacı) için tek bir LSP sunucusu çalıştırdığı için, dosya/buffer düzeyinde LSP ayarı yapılamıyor; ayarlar mutlaka proje düzeyinde uygulanmalı
eglot-workspace-configurationgenel bir yöntemle ayarlanırsa buffer-local değişken haline geliyor ve pratikte işe yaramaz oluyor
Flymake ve Flycheck deneyimi
- Flymake, Eglot ile daha iyi entegre oluyor; tanılama notlarında doğrudan LSP sunucusu tabanlı düzeltme önerilerini (quickfix code action) button 2 açılır menüsünde gösteriyor
- Flycheck yalnızca hata işaretleme yapıyor; LSP code action’larını ayrıca tetiklemek gerekiyor
- İlk başta Flymake’e geçilmiş olsa da, Flycheck’in daha iyi olduğu yönler bulunduğu için iki tarafın ayarları da korundu
- flycheck-eglot geliştiricisi bu konu için bir geçici çözüm önerdiğinden Flycheck’e geri dönüldü
- Flycheck, Flymake’e göre daha geniş bir checker koleksiyonuna sahip ve checker’lar arasında geçiş daha kolay
- Flymake’in 'satır sonunda tanılama gösterimi' seçeneği eksik kalıyor
- flycheck-inline, yalnızca mevcut konumdaki uyarıları gösteriyor; kaydırırken tüm uyarıları göstermiyor
- Sideline + sideline-flycheck aynı sınırlamaya sahip ama UI deneyimi daha iyi
2 yorum
https://web.archive.org/web/20260513001754/…
Lobste.rs yorumları
Dile bağlı olarak Eglot’u otomatik başlatmayı tavsiye etmek ölümcül derecede kötü olabilir. Birçok dilin LSP sunucusu güvenilmeyen kodla güvenli şekilde kullanılamaz ve saldırganın kontrol ettiği bir Rust veya Elixir projesindeki dosyayı yalnızca açmak bile makinenin ele geçirilmesine yol açabilir
Güvenli olduğu bilinen bir LSP sunucusuna sahip bir dil değilse LSP’yi otomatik etkinleştirmekten kaçınılmalı. Dayanak: https://rust-analyzer.github.io/book/security.html
git statusbile bir saldırı yüzeyi olabilir: https://github.com/justinsteven/advisories/…Fark şu ki yukarıdaki örnekte istismarın deponun kendisinde bulunması gerekirken, LSP’de sorun bağımlılık tarafında da çıkabilir. Yine de alışkanlık gereği LSP’yi açmaya alışırsanız uyarılara karşı duyarsızlaşmayı engellemek zor görünüyor
rust-analyzersüreci ve 1GB’ı aşan birtarget/debug/dizini oluşturabilircargo buildkomutunu çalıştırdığınız anda iş işten geçmiş sayılır. Elbette LSP’nin otomatik yüklenmesi ile kullanıcının açıkça çalıştırdığı bir komut arasında büyük fark var, ama gerçek kullanımda bu fark düşünüldüğünden daha küçük olabilirlsp-modegibi etkinleştirmeden önce sorup projeyi bir izin listesine ekleyen bir yöntem daha iyi. Zaten “otomatik çalıştır” kancanız varsa, önceread-from-minibufferile “bu klasöre güveniyor musunuz?” diye sordurmak yaklaşık 10 satırda yapılabilir veprojectilegibi bir şeyle temel dizini belirleyerek güvenlik faydasının çoğunu elde edebilirsinizBenim ayarım
lsp-modeun izin listesini kullanıyor ama her oturumda siliyor; böylece Emacs’i her yeniden açtığımda proje bazında yeniden onay vermem gerekiyor. Sanırım bunu başta performans için yapmıştım;lsp-modebazen belirli bir projeyi açmadan önce birden çok süreç başlatıyordu. Güvenlik riski gerçek, ama makul bir iş akışı kurmak da çok zor değilEglot’taki en can sıkıcı şey, komutların çoğunu fonksiyon olarak sunmaması ve bunları
xrefgibi Emacs arayüzleri üzerinde tanımlaması. Clojure’da olduğu gibi hemCIDERhem declojure-lspiçinxrefarka uçları olduğunda, yüklenmiş kodun gerçek çalışma zamanı durumunu bilenCIDERtarafını tercih ediyorumclojure-lspnin statik analizi özellikle uzak REPL iş akışlarında senkron dışına çıkabiliyor.lsp-modeda tanıma git gibi özellikleri doğrudan komut olarak çağırırkenxrefi kullanmaya devam edebilirsiniz, ama Eglot’ta belirli birxrefarka ucunu devre dışı bırakmak epey zahmetli.lsp-modedaki bazı diğer komutlar da Eglot’ta yok, halbuki bunlar da aslındaxrefe benzer Emacs entegrasyon noktaları üzerinden sunulabilecek özelliklerlsp-modeu bir kez denedim ama kafa karıştırıcı açılır pencereler ve bildirimler o kadar fazlaydı ki hemen kaldırdım. Eglot çok daha sessiz bir LSP deneyimi sunuyorAçık tutup, hazır olduğunuzda özellikleri kullanıyorsunuz. ~cks’in ters yönden yaklaşarak çeşitli ipuçları ve alternatiflerden söz etmesi ilginç
lsp-modeu pek çok özelliği kapatarak oldukça sessiz bir arayüzle kullanıyorum. Eglot’a geçmeye çalıştım ama istediğim entegrasyonları sunmuyor gibi göründüğü için o zaman fazla uğraşmadımAsıl aradığım şey çok büyük depoları kaldırabilecek bir LSP sunucusu. Bu sık sık sınır olarak karşıma çıkıyor; kaynak indekslemeyi bir kerede büyük ölçüde yapıp sonra çeşitli LSP tarzı işler için yeniden kullanacak bir şey mi yazmalıyım diye düşünüyorum ama başka bir okyanusu kaynatmaya kalkmak da istemiyorum
Emacs için LSP istemcileri arasında en bilinenler Eglot ve
lsp-mode, ama lspce ve lsp-bridge gibi alternatifler de varEglot’u birkaç yıldır memnuniyetle kullanıyorum, ancak ileride daha büyük sorunlara dönüşebilecek tasarımsal bir sınırlaması var. Her arabellek için tek istemci varsayıyor; Eglot tasarlanırken bu makuldü ama artık tek bir arabellekte birden fazla LSP sunucusu çalıştırmak istemek giderek daha yaygın. Şu anki öneri, ayrı bir programı LSP çoklayıcısı gibi kullanmak
4 gün önce Python için
lsp-modedan Eglot’a geçtim ve memnunumMevcut yapılandırmamın en minimal sürümünü burada paylaştım: https://discuss.afpy.org/t/configuration-emacs-minimale-en-2026/3001
Yalnız tamamlama konusunda bazı rahatsızlıklar var. Örneğin
foo<tab><tab>bastığımda mevcut kapsamla eşleşen bir sembol olmasına rağmenbasedpyrightbazen garip bir şeyi otomatik içe aktarıyor ve yalnızca en uzun ortak dizeye kadar tamamlama yapmanın bir yolunu hâlâ bulamadım. Bunun dışında oldukça iyiİnsanların Emacs’i modern bir IDE gibi kullanabilmesini kıskanıyorum. Emacs tuş bağlarını kullanıyorum ama 6-8 saat harcasam bile Emacs’i IDE gibi çalışır hale getiremedim
Eskiden Linux ve FreeBSD geliştirme ortamlarında TypeScript yerine kullandığım FB Flow ile bunu yapmaya çalışıp vazgeçtim; geçen hafta sonu da Windows’ta tree-sitter’lı tam özellikli bir Python ortamı kurmaya çalışıp yine vazgeçtim. Ayarlanacak çok şey var ve tree-sitter ayrıştırıcıları gibi DLL’leri de ayrıca tek tek indirmek gerekiyor; düzgün bir IDE gibi yapmak için gerekenler fazla geliyor. Artık buna zaman harcamak istemiyorum ama ara sıra herhangi bir terminalde
emacs -nwyazınca tanıdık düzenleme ortamının açılması hoşuma gidiyorfido-vertical-mode,which-key-mode,global-completion-preview-mode,yasnippet,eglot-ensure,basedpyrightgibi minimal bir yapılandırmayla başlamak için yeterli olabilirbasedpyrightPATH içindeyse, tree-sitter sözdizimi olmadan da düzgün tamamlama ve sözdizimi vurgulaması elde edersiniz. Bu, tam yapılandırmamın en aza indirilmiş bir sürümü; tam yapılandırma my full config içindedoom emacsdenemeye değer. Yapılandırması çok kolay ve varsayılan haliyle de çoğu şey iyi çalışıyor.evil-modehoşunuza gitmezse Emacs tuş bağlarına da geri dönebilirsiniz