- tmux, SSH, nvim ve güçlü arama/otomasyon betiklerini birleştirerek, uzak sunucudaki dosyaları GUI olmadan anında gezinip düzenleyip arayabildiği benzersiz bir iş akışı kuruyor
- Tek bir tuş kombinasyonuyla tmux’un birden fazla penceresinde dosya adlarını otomatik aratıp hemen açıyor, dosya geçişi ve buffer yönetimini de kısayollarla hallediyor
- VSCode’un yavaşlığı ve tuş ataması çakışmalarından rahatsız olduğu için tüm işlemleri betiklerle kendisi birleştiriyor
- regex, perl, tmux, nvim gibi Unix araçlarını bir araya getirerek dosya yolu ve satır bilgilerini otomatik tanıyıp açmayı sağlıyor
- Bunu bizzat kurma süreci oldukça karmaşık olsa da, terminalin gücünü ve genişletilebilirliğini en üst düzeye çıkarmanın mümkün olduğunu gösteriyor
Terminalimi kullanma biçimim
- Bu yazı, terminali ve çeşitli araçları birleştirerek verimli bir geliştirme ortamı kurma deneyimini paylaşıyor
- Süreç normalde video gerektirecek kadar karmaşık olduğu için metinle birlikte gerçek kullanım videosu da eklenmiş (videoyu izlemek önemli)
- Videodaki bazı anlar (0:11, 0:21, 0:41), birçok kişinin "bu gerçekten mümkün mü?" diye şaşırdığı kısımlar
Videodaki terminal iş akışının adım adım özeti
- 0:00 : Windows Terminal’i dizüstünde çalıştırma
- 0:02 : ctrl + shift + 5 kısayoluyla yeni bir terminal sekmesi açma,
sshile evdeki masaüstüne bağlanma ve hemen tmux başlatma - 0:03 : tmux içinde varsayılan kabuk zsh’i çalıştırma, prompt’u gösterme ve tüm yapılandırmayı asenkron yükleme
- 0:08 :
zoxideile yakın zamanda kullanılan dizinlerde fuzzy arama yapıp geçiş yapma - 0:09 : ripgrep komutunu yazmaya başlama, zsh’in önceki kullanım geçmişine göre otomatik tamamlama yapması ve ctrl + f ile bunu kabul etme
- 0:11 :
ctrl + kfkısayoluyla tmux scrollback’inin tamamında dosya adı arama, dosya adlarının mavi renkle vurgulanması - 0:12 :
ntuşuna art arda basarak arama sonuçlarındaki dosya listesinde istenen dosyayı gezme - 0:21 :
otuşuyla seçili dosyayı varsayılan uygulamada (nvim) açma, tmux’un bunu yeni bir pencerede çalıştırması (hâlâ uzak sunucuda çalışıyor) - 0:26 : rust-analyzer ile koddaki çeşitli referanslara gitmeyi deneme; bazı makroları tanıyamasa da 0:32’de başarıyla geçiş yapma
- 0:38 :
ctrl + khile tmux odağını soldaki pencereye geçirme - 0:39 :
ntuşuna tekrar basarak "copy-mode" durumunda önceki dosya arama sonuçlarını gezmeye devam etme - 0:41 :
otuşuyla bu kez başka bir dosyayı mevcut nvim örneğinde açma - 0:43 :
btuşuyla açık dosya buffer’larının listesini görme ve iki dosya arasında geçiş yaparak bitirme
Neden böyle bir terminal iş akışı kullanmaya başladı?
- VSCode yavaştı; özellikle vim eklentisiyle çok fazla takılıyordu
- Editör, vim eklentisi, terminal ve pencere yönetimi özellikleri arasında tuş ataması çakışmaları sık sık yaşanıyordu
- Zed editörünü de denemiş ama o dönemde henüz olgunlaşmamıştı ve tuş ataması çakışması sorunu da sürüyordu
- nvim’i (Neovim) doğrudan terminalde kullanmaya başladıktan sonra ise,
- ripgrep gibi araçlarla bulunan dosya adlarını tek tek kopyalayıp editöre yapıştırma süreci fazla zahmetli gelmiş
- Özellikle ripgrep çıktısında dosya adıyla birlikte satır numarası da geldiğinde,
- her yapıştırmada sözdizimi hatası oluşuyor
- gerçek dosyayı açmadan önce gereksiz düzenlemeler yapmak gerekiyor
- VSCode’daki ctrl-click gibi dosya yolunu doğrudan açabilen bir iş akışına ihtiyaç duyduğunu hissetmiş
- Bu yüzden tmux kullanarak istediği işlevleri kendisi kurmuş
- İnsanlar neden tmux kullandığını sorduğunda, bunu doğrudan bu otomasyon ve oturum kalıcılığı ile açıklıyor
- Terminal sanıldığından çok daha güçlü, ancak bu tür otomasyonlar varsayılan özelliklerle pek görünür olmuyor
- tmux eski, sözdizimi karmaşık ve yer yer hatalı olsa da, genişletilebilirliği ve özelleştirme imkânı nedeniyle bunu seçmiş
Başlıca uygulama yöntemleri
tmux içinde tüm scrollback boyunca dosya adı arama
- tmux copy-mode içinde karmaşık düzenli ifadelerle dosya adı desen eşleştirme
- Kendi yazdığı regex betiği (
search-regex.sh) ile dosya yolu, satır ve sütun bilgisine kadar vurgulama - Örnek tmux yapılandırması:
bind-key f copy-mode \; send-keys -X search-backward '정규표현식'
Seçili dosyayı yeni pencerede/mevcut pencerede açma
- tmux kısayollarıyla seçili dosyayı varsayılan uygulamada veya editörde (nvim vb.) açacak şekilde özelleştirme
- Göreli yol desteği ve tilde genişletmesi dâhil
bind-key -T copy-mode-vi o send-keys -X copy-pipe 'cd #{pane_current_path}; ...' bind-key -T copy-mode-vi O send-keys -X copy-pipe-and-cancel 'tmux send-keys ...'
Dosyayı zaten açık olan nvim örneğinde açma
- perl betiğiyle tmux’un belirli bir nvim panelini bulup o panele dosya/satır bilgisini doğrudan tuş girdisi olarak göndermesi
file:line:columnbiçimini vim komutuna dönüştürerek otomatik açma
Bu yaklaşımın artıları ve sınırları
- Yerel terminalin işlev sınırlarını aşma: tmux üzerinden uzak sunucudaki dosyaları serbestçe gezinme/düzenleme/arama
- Editör uzak düzenleme protokolünü desteklemese bile aynı iş akışını kullanabilme
- Tüm tuş atamalarını, aramayı, dosya geçişini ve buffer yönetimini tamamen kendi tercihlerine göre birleştirme
- VSCode eklentisi yazmaktan daha hızlı ve kolay otomasyon kurabilme
- Kendi yazdığı betikler kolay bozulabilir ve bakımı zor olduğu için başkalarına önermesi güç
Alternatif çözümler
- Genel olarak önerdiği açık kaynak/araç kombinasyonları:
fish + zoxide + fzf: fuzzy dizin, komut arama ve bazı dosya arama iş akışlarının yerini alabilir- Editörün yerleşik özellikleri (sekmeler, pencereler, fuzzy finder vb.) çoğu kullanıcı için zaten yeterli
qf: terminal çıktısından dosya seçebiliyor, ancak etkileşimli araçlarla entegre olamıyor; vi benzeri bir CLI kullanıyore:file:lineyollarını tanıyan küçük bir araç (editör türüne göre ayrı betik gerekiyor)vim --remote,code filename,emacsclientgibi araçlar da benzer etki yaratıyor, ancakfile:linetanıma desteği eksik kalabiliyor
Sonuç ve çıkarımlar
- Terminal sanılandan çok daha güçlü; doğru betiklerle birleştirildiğinde GUI araçlarında mümkün olmayan otomasyonlar kurulabiliyor
- Ancak bakım kolaylığı ve betiklerde gömülü hata riski gibi pratik sınırlamalar var
- Terminal iş akışı otomasyonuyla ilgileniyorsanız, özel tmux/nvim/fzf ortamını adım adım kurarak başlamak en gerçekçi yaklaşım
1 yorum
Hacker News yorumu
Ben de benzer bir numara kullanıyorum. tmux scrollback'ten yararlanıp tokenize edilmiş çıktıyı zsh'e pipe ediyorum; böylece tmux ekranında görünen her şey için otomatik tamamlama kullanabiliyorum. İlgili Threads gönderisi ve gist kodu burada. Gerçekten çok faydalı oldu
Bu tür workflow yaklaşımını gerçekten seviyorum; ben de yıllardır benzer bir şeyi tekrar tekrar kurup inceltiyorum. Zaman geçtikçe özel katmanları olabildiğince azaltmaya çalışıyorum, çünkü overlay sayısı arttıkça bakım maliyeti de büyüyor. Yazıda anlatılanların çoğu saf Vim ile de yapılabiliyor (ayrı bir tmux olmadan); örneğin
rg --vimgrep restore_tool | vim -c cb -ile (vim -c cb -Vim'deki en sevdiğim özelliklerden biri; neredeyse kimsenin kullanmaması şaşırtıcı). Tabii her seferinde rg aramasını yeniden çalıştırmak pahalı olabilir; ben de sonuçları terminalde inceliyorum, gerekirse tmux için özel bir komutla son komutun çıktısını kopyalayıp vim'e gönderiyorum. Bazen prompt'ta Unicode karakterleri kullanma numarasını kullanıyorum, bazen detmux saveb - | vim -c cb -ile aktarıyorumvim -c cb -'nin Vim'de en sevdiğin özellik olduğunu söylemişsin; bunun ne yaptığını açıklayabilir misin diye merak ettim.ls | vim -ilels | vim -c cb -komutlarını denedim ama aradaki farkı hemen anlayamadım)vim -q <(ripgrep --vimgrep restore_tool)ile aynı amaca hizmet edip etmediğini merak ediyorumBu kurulum; tmux, fzf, rg, zoxide ve temiz bir nvim içerdiği için güzel görünüyor. Eğer yoksa atuin, starship, bat, glow, duf, dogdns, viddy, gum/sesh, dust, btop gibi araçları da tavsiye ederim. Hepsini GitHub'daki Awesome Terminal XYZ listelerinde bulabilirsiniz. atuin gerçekten olmazsa olmaz seviyesinde; zoxide yoksa, sporcusun ama ayakkabın ayağına uymuyormuş gibi hissettiriyor. Terminal videosu çekecekseniz asciinema daha iyi bir tercih. Aslında eskiden bu tür kurulumlara "programcı" denirdi. Bugünlerde ise VSCode, Zed, Cursor gibi araçlar da şart ve hangi LLM'e neyi yaptıracağını da biliyor olman gerekiyor. Bunlar artık yeni “asgari seviye”, ama mevcut ortamın yerini almıyor. Claude Code'u, gptel'i ne kadar iyi kullanırsanız kullanın bazen ağaç yapısını yine bozabilirsiniz; magit olmadan git kullanmayı ise hayal bile edemem. Eğer biri saf Cursor'la OP'den daha hızlı olduğunu düşünüyorsa, o kişinin LLM'i gerçek işte kullanırken bir video çekmesini isterim
Bütün vim/tmux kullanıcıları büyük ihtimalle yarı hatalı ama hızlı çalışan, gayriresmî bir “taklit Emacs”ı kendi elleriyle yapmıştır
:TermçalıştırıyorumWindows'ta tmux kullandığını söylüyor ama bunu pratikte nasıl yaptığını merak ediyorum. Açıklayabilecek biri olsa iyi olurdu
Bu tür workflow paylaşımlarını gerçekten seviyorum. Hedef kitleye tam uyuyor. Videoda ses olmasını isterdim ama sonradan aksiyon listesini okumak da iyiydi. Kendi workflow'm için de işe yarar bir şeyler öğrendim. tmux'un anlaşılması zor klavye kısayollarından bahsetmişsin; burada byobu kullanan var mı? byobu, tmux için bir wrapper ve komutların çoğunu F# tuşlarına atıyor. Onunla ilk kez 10 yıl önce tanıştım ve o zamandan beri kullanıyorum. Ondan önce birkaç yıl saf tmux kullanmıştım
ctrl-kbenim prefix'im veh, varsayılan "sol paneli seç" tuşu değil. byobu'yu hiç denemedim ama anlattıklarından, varsayılan kısayolları biraz daha rahat hale getirmekten öteye geçmiyor gibi; bu yüzden üstüne fazladan bir katman eklemeyi çok istememBöyle şeyleri dev bir regex olmadan da tmux eklentileriyle, örneğin kopyalama modu özelliklerini genişleterek yapabilirsiniz. tmux-fpp, tmux-copycat, tmux-fingers, tmux-urlview gibi seçenekler var. Hız açısından yerleşik işlevlere olabildiğince yaslanmak avantajlı olabilir; aklınızda bulunsun. Ben özellikle tmux-resurrect (oturum kaydetme/geri yükleme), tmux-continuum (otomasyon özellikleri) ve Oh-My-Fish için tmux-zen'i de çok seviyorum. tmux-resurrect, tmux-continuum, tmux-zen burada. Harika bir tmux ortamı kurmanın sanıldığından çok daha kolay olduğunu özellikle vurgulamak isterim
:karakterini iyi yakalamıyor, b) copycat kendi görüntüleyici soyutlamasını kullandığı için bir aramada yalnızca tek bir eylem yapılabiliyor. Benim yöntemim tmux'un yerleşik aramasını yeniden kullanıyor; böylece vurgulanan dosyalara istediğim eylemi serbestçe bağlayabiliyorum. Çoğu eklentinin sadece kopyala/yapıştır desteklemesinin ya da kendi modunu oluşturmasının sebebi de bu; çünkü tmux, vurgu kontrolünü neredeyse sadece yerleşik arama üzerinden sunuyorBu tür bir kurulum gerçekten çok güzel. Ama terminale hâlâ düzgün bir yapay zeka typeahead gelmemiş olması gizem gibi. Cursor tab bunun için biçilmiş kaftan olurdu ama terminale uygulanması engellenmiş durumda. Geçici çözüm olarak terminal çıktısını sahte dosyalara pipe edip Cursor'a gönderen bir ürün hızlıca yapma isteği geliyor insanın içine
Makalenin başlığı aslında "How I use my terminal"