1 puan yazan GN⁺ 4 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • fzf, kurulur kurulmaz Ctrl+R ile komut geçmişi aramayı bulanık aramayla iyileştirir
  • Alt+C ile tam yolu bilmeden eski çalışma dizinlerine hızla geçilebilir
  • fzf komutu, komut ikamesi ile birleştirilerek seçilen dosyayı doğrudan vi, emacs, code ile açabilir
  • find çıktısı fzf’ye verilirse, nginx.conf gibi konumu bilinmeyen yapılandırma dosyalarını bulmak kolaylaşır
  • rg . | fzf, dosya adı yerine dosya içeriğindeki satırları ipucu olarak kullanıp istenen dosyayı açmayı sağlar

fzf’yi kurduktan hemen sonra elde edilen değer

  • Yazılım mühendisleri kendi işlerini iyileştiren araçları kolayca yapabilir; ancak birçok araç arasında gidip gelip onları derinlemesine öğrenmezlerse, zamanla bunun maliyeti büyür
  • İyi bir 80/20 sezgisi, önce cat, ls, cd, grep, cut gibi eski Unix araçlarını öğrenmektir; modern sistem yönetimi rollerinde buna sed ve awk da dahildir
  • fzf, harcanan emeğe karşılık etkisini hemen gösterdiği ve sunduğu değer benzersiz olduğu için bu sezginin bir istisnası sayılabilir
  • Asıl odak, standart bir Ubuntu ortamında fzf kurulum betiği ile kurduktan sonra hemen kullanılabilen özelliklerdir

Varsayılan kısayolların sağladığı anlık etki

  • Ctrl+R: komut geçmişini bulanık aramaya dönüştürür

    • Çoğu Linux ve Windows terminalinde Ctrl+R, komutlar için geri yönde arama sağlar
    • Varsayılan Ctrl+R, istenen komutu bulmak için tam eşleşme gerektirir ve aynı anda yalnızca tek bir önizleme gösterdiği için tek bir harf bile farklıysa bulmak zorlaşır
    • fzf kurulduğunda çeşitli klavye kısayolları daha iyi davranışlarla geçersiz kılınır; Ctrl+R da buna dahil olup mevcut yöntemi büyük ölçüde iyileştirir
    • apt gibi bir paket yöneticisiyle kurulduğunda bu kısayol entegrasyonu gelmeyebilir; bu da fzf kurulum betiğinin neden tercih edildiğini açıklar
  • Alt+C: tam hatırlanmayan bir dizine hızlı geçiş

    • fzf, Alt+C kısayolunu geliştirilmiş bulanık bir cd kısayoluna dönüştürür
    • Dizinlerin tam yolunu hatırlamadığınız, yalnızca kabaca adını anımsadığınız durumlarda hızlıca geçiş yapabilirsiniz
    • Boş bir terminalde, uzun süredir uğranmamış bir depo ya da çalışma dizinini bulurken işe yarar

fzf komutunun kendisi ve kabukla birleşimi

  • Temel fzf

    • fzf komutunu tek başına çalıştırmak, geçerli dizine göre göreli dosya yollarında bulanık arama yapar
    • Tek başına kullanıldığında sadece dosya konumu seçmeye yaradığı için kullanım değeri sınırlıdır
  • vi $(fzf)

    • vi $(fzf) gibi komut ikamesiyle birleştirildiğinde, bulanık aramayla seçilen dosya düzenleyicide doğrudan açılabilir
    • Bu yöntem vi’ye özel değildir; emacs, nano, code ve istediğiniz başka düzenleyicilerle de kullanılabilir
  • vi $(find . '/' | fzf)

    • find . '/' | fzf ifadesi bir düzenleyiciyle birleştirildiğinde, yeri bilinmeyen yapılandırma dosyaları tam yol adayları arasından bulanık aramayla bulunup açılabilir
    • nginx.conf gibi yerini hatırlamadığınız bir dosya için FHS bilginizi zorlayıp tahmin yürütmek veya ezber yapmak yerine, find çıktısını fzf’ye pipe etmeniz yeterlidir
    • conf$ gibi ararsanız, yalnızca conf ile biten satırları filtreleyebilirsiniz
    • find çok sayıda Permission denied hatasıyla karşılaşırsa fzf kısa süreliğine takılıyormuş gibi görünebilir, ancak birkaç saniye sonra toparlanır
    • Bu birkaç saniyelik gecikme, yapılandırma dosyalarını son derece basit bir yolla bulmanın sağladığı faydayla yapılan bir değiş tokuştur
  • vi **<TAB>

    • sigmonsays’in Hacker News yorumunda geçen bir özellik olarak, kısayol geçersiz kılmalarıyla fzf’yi doğrudan çalıştırma arasında bir yerde duran çift yıldızla bulanık sekme tamamlama vardır
    • vi **<TAB>, vi $(fzf) ile benzer biçimde dosya seçmek için kullanılabilir
    • Asıl komut tamamlandıktan sonra bir kez daha Enter tuşuna basmanız gerekir
    • bash ve zsh üzerinde iyi çalışır; ancak fish içinde bazen çalışmayabilir
    • Eğer $(fzf) çağrısını açıkça yazmak size daha kolay geliyorsa, bu özelliği sık kullanmayabilirsiniz

Dosya taşımada da fzf

  • mv $(fzf) $(fzf)

    • mv $(fzf) $(fzf), neyi taşıyacağınızı ve nereye taşıyacağınızı tam hatırlamadığınız ama her ikisi için de çok belirgin ipuçlarını hatırladığınız durumlarda kullanılabilir
    • Yöntem, iki ayrı fzf seçimiyle taşınacak öğeyi ve hedefi belirlemeye dayanır
    • Özellikle GitHub README’sine GIF yerleştirmek gibi dosyaları taşıyıp düzenleme işlerinde sık işe yarayabilir
    • İlgili bir örnek olarak finstem’in interactive mode README’si bağlantılanmıştır

rg ile birleştirip dosya içeriğinde de bulanık arama

  • rg: özyinelemeli aramayı varsayılan yapan hızlı bir grep

    • Aşağıdaki birleşim grep ile de yapılabilir; ancak rg ya da ripgrep, özyinelemeli aramayı varsayılan yaptığı için bu kullanımda özellikle güçlüdür
    • Örnekleri takip etmek istiyorsanız rg kurmanız önerilir
  • rg . | fzf

    • rg ., dosyaların her satırını arama sonucu olarak üretir; bunu fzf’ye verdiğinizde tüm dosyaların tüm satırlarında bulanık arama yapabilirsiniz
    • Böylece dosya adları yerine dosya içeriğindeki satırlar ipucu olarak kullanılabilir
  • rg . | fzf | cut -d ":" -f 1

    • rg . | fzf ile seçilen sonuca cut -d ":" -f 1 eklerseniz, iki nokta üst üste karakterine göre ilk alanı, yani dosya konumunu döndürebilirsiniz
    • Bu birleşim, satır içeriğinde bulanık arama yaptıktan sonra yalnızca o satırı içeren dosyanın yolunu alır
  • vim $(rg . | fzf | cut -d ":" -f 1)

    • vim $(rg . | fzf | cut -d ":" -f 1), tüm dosyaların tüm satırlarında bulanık arama yaptıktan sonra, seçilen satırı içeren dosyayı vim ile açar
    • Dosya adını hatırlamadığınız ama içeriğin bir kısmını anımsadığınız durumlarda doğrudan düzenleyiciye geçebilirsiniz

1 yorum

 
GN⁺ 4 시간 전
Lobste.rs görüşleri
  • Bu yazının hedef kitlesi tam benmişim gibi. fzf kurup “dahice” diye düşünmüş, ama sonra gerçekten kullanmayı sürekli unutmuştum; şimdi belki kullanırım

    • Asıl mesele bunu mevcut shell yapılandırmasına, kişisel script’lere ve alias’lara entegre etmek. fzfyi sürekli kullanıyorum ama doğrudan çalıştırdığım neredeyse hiç olmuyor
  • İyi bir yazı olabilir ama amaç “Şimdi ne yapacağım?” sorusuna cevap vermekse, fzf shell entegrasyonu ile başlamak sanki daha dar bir okur kitlesine hitap ediyor
    Bash'te ctrl-r kullanmaya alışkınım; bunu değiştirmemi istemek çıtayı fazla yükseltiyor. Varsayılanı değiştirmeden aynı davranışı pratik etmenin bir yolunu önce göstermesini isterdim

    • Aslında bu daha çok güçlendirilmiş bir varsayılan gibi. ctrl-r'ın yerini almasına izin vermek mantıklı ve asıl cazibesinin yarısı, eldeki alışkanlığı korurken mevcut akışa neredeyse aynı ama daha zengin bir deneyim eklemesinde
      ctrl-r muhtemelen en sık kullandığım komut ve fzf, öğrenme eğrisi olmadan anında yerine oturan bir iyileştirmeydi. ctrl-r ile çalıştığı için fzf kullanmayı unutmak da mümkün olmuyor. Gerçi daha sonra Fish shell'e geçtim ve orada aynı davranış zaten varsayılan olarak geliyor
  • İkna oldum. Yakında fzf ve shell entegrasyonunu ekleyeceğim; bugün bir şey öğrenmiş oldum

  • Komuta eklenecek dosyaları bulurken ctrl-t kısayolunu da kullanabilirsiniz. Belirli bir değişikliğe dahil edilecek dosyaları seçerken bunu git ile sık kullanıyorum; grep çıktısını filtreleyip aranacak kapsamı daraltmak için de kullandım

  • Shell geçmişi aramayı iyileştirmenin dışında, fzfyi şu iki alias ile de kullanıyorum
    alias gbd='git -c color.ui=never branch | fzf | xargs -I {} git branch -D {}'
    Bunu çoğunlukla pull request merge edildikten sonra silinecek yerel branch'lerin listesini seçmek için kullanıyorum. Daha iyi bir yol olabilir ama şimdiye kadar hiç sorun çıkarmadı
    alias awp='export AWS_PROFILE="$(grep -e "\[\(.*\)\]" ~/.aws/config | sed -e "s/\[//g" | sed -e "s/\]//g" | cut -d " " -f 2 | sort -u | fzf)"'
    ~/.aws/config içindeki değerlere göre AWS_PROFILE'ı hızlıca değiştirmemi sağlıyor. Şimdi Kubernetes namespace değiştirmek için de benzer bir alias yapmayı düşünüyorum

  • fzf.vim eklentisini kullanırsanız vim içinde fzf kullanabilirsiniz. Sadece dosya açmak için değil, buffer'lar, komut geçmişi, dosya içerikleri gibi şeylerde de fuzzy search yapabilirsiniz

  • fzfnin ana kullanım alanı, doğrusal Git commit geçmişini gezip arayarak son zamanlarda nelerin değiştiğini anlamak
    Varsayılan Git yapılandırmamda git fzf şöyle tanımlı

    [alias]  
      # Browse commit history with fzf  
      # Inspired by: https://chrismanbrown.gitlab.io/67.html  
      fzf = "!git log --oneline --color=always --decorate=short $@ | \  
          fzf --ansi --reverse --no-sort \  
            --preview 'git show --color=always {1}' \  
            --preview-window '<50(down)' \  
            --bind 'enter:become(git show {1})' #"  
    
  • Galiba bir şeyi kaçırıyorum. Ne yapacağını bilmeyen biri neden fzf kursun, bunu merak ediyorum

  • Yakın zamanda bununla ilgili başka bir yazı da vardı. Bir kullanıcı jj için dosya seçici olarak fzf kullanıyor
    https://lobste.rs/s/exlogg/jjj