`fzf` इंस्टॉल कर लिया। अब क्या करें? (2023)
(andrew-quinn.me)- कमांड लाइन fuzzy finder
fzfऐसा टूल है जो निवेश के मुकाबले तुरंत असर और अनोखी वैल्यू देता है, लेकिन कई डेवलपर इसे सिर्फ इंस्टॉल करके छोड़ देते हैं क्योंकि उन्हें इसका इस्तेमाल समझ नहीं आता Ctrl+Rhistory 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 में
fzfinstall script से इंस्टॉल करने के बाद तुरंत इस्तेमाल की जा सकने वाली सुविधाएँ ही इसकी असली खासियत हैं
बेसिक shortcuts का तुरंत असर
-
Ctrl+R: command history को fuzzy search में बदलना- ज़्यादातर Linux और Windows terminals में
Ctrl+Rcommand reverse search देता है - डिफ़ॉल्ट
Ctrl+Rमें मनचाहा command ढूँढने के लिए exact match चाहिए होता है, और यह एक बार में सिर्फ एक preview दिखाता है, इसलिए एक अक्षर भी चूक जाए तो ढूँढना मुश्किल हो जाता है fzfइंस्टॉल करने पर कई keyboard shortcuts बेहतर व्यवहार से override हो जाते हैं, औरCtrl+Rभी पुराने तरीके से काफ़ी बेहतर हो जाता हैaptजैसे package manager से इंस्टॉल करने पर यह shortcut integration नहीं मिल सकता, इसलिएfzfinstall script इस्तेमाल करने की वजह बनती है
- ज़्यादातर Linux और Windows terminals में
-
Alt+C: धुंधली याद वाली directory में तेज़ी से जानाfzfAlt+Cको बेहतर fuzzycdshortcut में बदल देता है- जब directory का exact path याद न हो और सिर्फ उसका लगभग नाम याद हो, तब यह तेज़ी से वहाँ ले जाता है
- खाली terminal से बहुत समय से न देखे गए repository या working directory को ढूँढने में यह काम आता है
fzf कमांड खुद और shell के साथ उसके संयोजन
-
बेसिक
fzffzfकमांड को वैसे ही चलाने पर यह 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 deniederrors मिलें, तो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 करना है, लेकिन दोनों के बारे में कुछ बहुत खास संकेत याद हों- इसमें दो बार
fzfselection करके 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 . | fzfrg .फाइलों की हर line को search result के रूप में आउटपुट करता है, और इसेfzfमें देने पर सभी फाइलों की सभी lines को fuzzy search किया जा सकता है- यह file name नहीं, बल्कि file के अंदर की line content को संकेत बनाकर खोजने का तरीका है
-
rg . | fzf | cut -d ":" -f 1rg . | 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 टिप्पणियां
Lobste.rs की राय
लगता है इस लेख का target reader बिल्कुल मैं ही हूँ। fzf इंस्टॉल करने के बाद मैंने सोचा था, “कमाल है”, लेकिन फिर असल में इसे इस्तेमाल करना बार-बार भूल जाता था; अब शायद इस्तेमाल करूँ
यह अच्छा लेख हो सकता है, लेकिन अगर मकसद “अब क्या करें?” का जवाब देना है, तो fzf shell integration से शुरू करना उल्टा और सीमित पाठक-वर्ग के लिए लगता है
मैं bash में ctrl-r का आदी हूँ, और उसे बदलने को कहना अपेक्षाकृत काफी बड़ी मांग है। अच्छा होता अगर पहले यह बताया जाता कि defaults को replace किए बिना उसी व्यवहार का अभ्यास कैसे करें
ctrl-r शायद मेरा सबसे ज़्यादा इस्तेमाल होने वाला command है, और fzf बिना किसी learning curve के तुरंत फिट बैठने वाला सुधार था। क्योंकि यह ctrl-r से चलता है, इसलिए fzf इस्तेमाल करना भूलता भी नहीं हूँ। हालांकि बाद में मैं Fish shell पर चला गया, जहाँ यही व्यवहार default में मिलता है
बात समझ आ गई। मैं जल्द ही fzf के साथ shell integration जोड़ने वाला हूँ, और आज एक चीज़ सीख ली
कमांड में डालने के लिए file ढूँढते समय
ctrl-tshortcut भी इस्तेमाल कर सकते हैं। किसी खास बदलाव में शामिल files चुनते समय मैं इसे अक्सरgitके साथ इस्तेमाल करता हूँ, औरgrepoutput को 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 हैलगता है मैं कुछ मिस कर रहा हूँ। समझ नहीं आता कि जब पता ही नहीं कि क्या करना है, तो fzf को इंस्टॉल ही क्यों किया जाए
हाल की एक संबंधित पोस्ट भी है। किसी user ने jj के लिए file picker के रूप में fzf इस्तेमाल किया है
https://lobste.rs/s/exlogg/jjj