22 पॉइंट द्वारा GN⁺ 2026-05-11 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • कमांड लाइन fuzzy finder fzf ऐसा टूल है जो निवेश के मुकाबले तुरंत असर और अनोखी वैल्यू देता है, लेकिन कई डेवलपर इसे सिर्फ इंस्टॉल करके छोड़ देते हैं क्योंकि उन्हें इसका इस्तेमाल समझ नहीं आता
  • Ctrl+R history search को fuzzy matching और multiple preview से बदलकर, पहले के exact string match वाले असुविधाजनक तरीके को बेहतर बनाया जा सकता है
  • Alt+C से directory का नाम बस धुंधला-सा याद हो तब भी fuzzy cd किया जा सकता है, और vi $(fzf) के साथ ऐसा workflow बनाया जा सकता है जिससे फाइल तुरंत खोली जा सके
  • ripgrep के साथ pipe करके सभी फाइलों की सभी lines को fuzzy search करने के बाद उस फाइल को सीधे editor में खोला जा सकता है
  • यह उत्पादकता बढ़ाने वाला ऐसा टूल है कि पहले पुराने Unix tools (cat, grep, find आदि) सीखने वाली 80/20 heuristic भी इसके सामने अपवाद बन जाती है

fzf इंस्टॉल करने के बाद तुरंत मिलने वाली वैल्यू

  • software engineers अपने काम को बेहतर बनाने वाले tools आसानी से बना सकते हैं, लेकिन अगर वे कई tools के बीच आते-जाते रहें और किसी को गहराई से न सीखें, तो समय के साथ इसकी लागत बढ़ती जाती है
  • एक अच्छी 80/20 heuristic यह है कि पहले cat, ls, cd, grep, cut जैसे पुराने Unix tools सीखे जाएँ, और आधुनिक system administration roles में इसमें sed और awk भी शामिल होते हैं
  • fzf को इस heuristic का अपवाद माना जा सकता है क्योंकि इसका असर तुरंत दिखता है और इसकी वैल्यू अलग तरह की है
  • standard Ubuntu environment में fzf install script से इंस्टॉल करने के बाद तुरंत इस्तेमाल की जा सकने वाली सुविधाएँ ही इसकी असली खासियत हैं

बेसिक shortcuts का तुरंत असर

  • Ctrl+R: command history को fuzzy search में बदलना

    • ज़्यादातर Linux और Windows terminals में Ctrl+R command reverse search देता है
    • डिफ़ॉल्ट Ctrl+R में मनचाहा command ढूँढने के लिए exact match चाहिए होता है, और यह एक बार में सिर्फ एक preview दिखाता है, इसलिए एक अक्षर भी चूक जाए तो ढूँढना मुश्किल हो जाता है
    • fzf इंस्टॉल करने पर कई keyboard shortcuts बेहतर व्यवहार से override हो जाते हैं, और Ctrl+R भी पुराने तरीके से काफ़ी बेहतर हो जाता है
    • apt जैसे package manager से इंस्टॉल करने पर यह shortcut integration नहीं मिल सकता, इसलिए fzf install script इस्तेमाल करने की वजह बनती है
  • Alt+C: धुंधली याद वाली directory में तेज़ी से जाना

    • fzf Alt+C को बेहतर fuzzy cd shortcut में बदल देता है
    • जब directory का exact path याद न हो और सिर्फ उसका लगभग नाम याद हो, तब यह तेज़ी से वहाँ ले जाता है
    • खाली terminal से बहुत समय से न देखे गए repository या working directory को ढूँढने में यह काम आता है

fzf कमांड खुद और shell के साथ उसके संयोजन

  • बेसिक fzf

    • fzf कमांड को वैसे ही चलाने पर यह current directory के आधार पर relative file paths को fuzzy search करता है
    • अपने आप में इसका उपयोग बस file location चुनने तक सीमित रहता है, इसलिए इसकी उपयोगिता बहुत बड़ी नहीं लगती
  • vi $(fzf)

    • vi $(fzf) की तरह command substitution के साथ मिलाने पर, fuzzy search से चुनी गई फाइल को सीधे editor में खोला जा सकता है
    • यह तरीका सिर्फ vi के लिए खास नहीं है; इसे emacs, nano, code जैसे किसी भी editor के साथ इस्तेमाल किया जा सकता है
  • vi $(find . '/' | fzf)

    • find . '/' | fzf को editor के साथ मिलाकर ऐसी config files को fuzzy search करके खोला जा सकता है जिनकी location पता न हो
    • nginx.conf जैसी फाइल की location याद न हो, तो FHS knowledge के आधार पर अनुमान लगाने या याद रखने के बजाय find के नतीजे fzf में pipe कर देना काफी है
    • conf$ जैसा search करने पर सिर्फ conf पर खत्म होने वाली lines फ़िल्टर की जा सकती हैं
    • अगर find को बहुत सारी Permission denied errors मिलें, तो fzf कुछ देर के लिए हिलता-सा लग सकता है, लेकिन कुछ सेकंड बाद फिर सामान्य हो जाता है
    • कुछ सेकंड की यह देरी config files को बहुत सरल तरीके से ढूँढ पाने की सुविधा के साथ एक trade-off है
  • vi **<TAB>

    • sigmonsays की Hacker News comment में बताए गए फीचर के अनुसार, shortcut override और fzf को सीधे चलाने के बीच कहीं double asterisk से fuzzy tab completion भी मौजूद है
    • vi **<TAB> का इस्तेमाल vi $(fzf) की तरह फाइल चुनने के लिए किया जा सकता है
    • असली command पूरा होने के बाद Enter एक बार और दबाना पड़ता है
    • bash और zsh में यह अच्छी तरह काम करता है, लेकिन fish में कभी-कभी काम नहीं करता
    • अगर $(fzf) को स्पष्ट रूप से बुलाने वाला तरीका आपको ज़्यादा याद रखने लायक लगे, तो हो सकता है आप इस फीचर का ज़्यादा उपयोग न करें

फाइलों को move करने में भी उपयोगी fzf

  • mv $(fzf) $(fzf)

    • mv $(fzf) $(fzf) तब काम आता है जब आपको यह ठीक से याद न हो कि क्या move करना है और कहाँ move करना है, लेकिन दोनों के बारे में कुछ बहुत खास संकेत याद हों
    • इसमें दो बार fzf selection करके source और destination चुने जाते हैं
    • GitHub README में GIF जोड़ने जैसे कामों में, जहाँ फाइलों को इधर-उधर रखना पड़ता है, यह अक्सर काम आ सकता है
    • संबंधित उदाहरण के रूप में finstem का interactive mode README लिंक किया गया है

rg के साथ मिलाकर file contents तक fuzzy search

  • rg: recursive search डिफ़ॉल्ट वाला तेज़ grep

    • नीचे दिए गए संयोजन grep से भी किए जा सकते हैं, लेकिन rg या ripgrep में recursive search डिफ़ॉल्ट होने से यह इस काम के लिए ज़्यादा ताकतवर है
    • उदाहरणों के साथ चलना हो तो rg इंस्टॉल करके इस्तेमाल करना सुझाया जाता है
  • rg . | fzf

    • rg . फाइलों की हर line को search result के रूप में आउटपुट करता है, और इसे fzf में देने पर सभी फाइलों की सभी lines को fuzzy search किया जा सकता है
    • यह file name नहीं, बल्कि file के अंदर की line content को संकेत बनाकर खोजने का तरीका है
  • rg . | fzf | cut -d ":" -f 1

    • rg . | fzf से चुने गए नतीजे के बाद cut -d ":" -f 1 जोड़ने पर colon के आधार पर पहला field, यानी file location, लौटाया जा सकता है
    • यह line content को fuzzy search करने के बाद सिर्फ उस line वाली file path लेने का तरीका है
  • vim $(rg . | fzf | cut -d ":" -f 1)

    • vim $(rg . | fzf | cut -d ":" -f 1) सभी फाइलों की सभी lines को fuzzy search करने के बाद, चुनी गई line वाली file को vim में खोल देता है
    • जब file name याद न हो और सिर्फ content का कोई हिस्सा याद हो, तब यह सीधे editor तक पहुँचने देता है

1 टिप्पणियां

 
GN⁺ 2026-05-11
Lobste.rs की राय
  • लगता है इस लेख का target reader बिल्कुल मैं ही हूँ। fzf इंस्टॉल करने के बाद मैंने सोचा था, “कमाल है”, लेकिन फिर असल में इसे इस्तेमाल करना बार-बार भूल जाता था; अब शायद इस्तेमाल करूँ

    • असली बात इसे अपनी मौजूदा shell config, निजी scripts, और aliases में integrate करने की है। मैं fzf हमेशा इस्तेमाल करता हूँ, लेकिन इसे सीधे चलाने के मामले बहुत कम होते हैं
  • यह अच्छा लेख हो सकता है, लेकिन अगर मकसद “अब क्या करें?” का जवाब देना है, तो fzf shell integration से शुरू करना उल्टा और सीमित पाठक-वर्ग के लिए लगता है
    मैं bash में ctrl-r का आदी हूँ, और उसे बदलने को कहना अपेक्षाकृत काफी बड़ी मांग है। अच्छा होता अगर पहले यह बताया जाता कि defaults को replace किए बिना उसी व्यवहार का अभ्यास कैसे करें

    • असल में यह enhanced default के ज्यादा करीब है। ctrl-r को replace करने देना ही सही है, और इसकी आधी सबसे बड़ी खूबी यही है कि हाथ के परिचित व्यवहार को बरकरार रखते हुए लगभग उसी flow में ज्यादा समृद्ध अनुभव मिलता है
      ctrl-r शायद मेरा सबसे ज़्यादा इस्तेमाल होने वाला command है, और fzf बिना किसी learning curve के तुरंत फिट बैठने वाला सुधार था। क्योंकि यह ctrl-r से चलता है, इसलिए fzf इस्तेमाल करना भूलता भी नहीं हूँ। हालांकि बाद में मैं Fish shell पर चला गया, जहाँ यही व्यवहार default में मिलता है
  • बात समझ आ गई। मैं जल्द ही fzf के साथ shell integration जोड़ने वाला हूँ, और आज एक चीज़ सीख ली

  • कमांड में डालने के लिए file ढूँढते समय ctrl-t shortcut भी इस्तेमाल कर सकते हैं। किसी खास बदलाव में शामिल files चुनते समय मैं इसे अक्सर git के साथ इस्तेमाल करता हूँ, और grep output को filter करके खोज का दायरा घटाने में भी इस्तेमाल किया है

  • shell history search को बेहतर बनाने के अलावा, मैं fzf को इन दो aliases के साथ भी इस्तेमाल करता रहा हूँ
    alias gbd='git -c color.ui=never branch | fzf | xargs -I {} git branch -D {}'
    इसे ज़्यादातर pull request merge करने के बाद हटाई जाने वाली local branches की सूची चुनने के लिए इस्तेमाल करता हूँ। शायद इससे बेहतर तरीका हो, लेकिन अब तक यह कभी फेल नहीं हुआ
    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 में मौजूद values के आधार पर AWS_PROFILE को जल्दी बदलने देता है। अब सोच रहा हूँ कि Kubernetes namespace बदलने के लिए भी ऐसा ही alias बनाऊँ

  • fzf.vim plugin इस्तेमाल करने पर vim के अंदर fzf इस्तेमाल किया जा सकता है। सिर्फ files खोलने के लिए नहीं, बल्कि buffers, command history, file contents वगैरह को भी fuzzy search किया जा सकता है

  • fzf का मेरा मुख्य इस्तेमाल रैखिक Git commit history को खंगालना और खोजना है, ताकि समझ सकूँ कि हाल में क्या बदला है
    मेरी default Git config में git fzf इस तरह define है

    [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})' #"  
    
  • लगता है मैं कुछ मिस कर रहा हूँ। समझ नहीं आता कि जब पता ही नहीं कि क्या करना है, तो fzf को इंस्टॉल ही क्यों किया जाए

  • हाल की एक संबंधित पोस्ट भी है। किसी user ने jj के लिए file picker के रूप में fzf इस्तेमाल किया है
    https://lobste.rs/s/exlogg/jjj