fzf इंस्टॉल करते ही Ctrl+R कमांड हिस्ट्री सर्च को fuzzy search से बेहतर बना देता है
- Alt+C से सटीक path जाने बिना पुराने working directory में जल्दी जाया जा सकता है
fzf कमांड को command substitution के साथ जोड़कर चुनी हुई फ़ाइल को vi, emacs, code में सीधे खोला जा सकता है
find के नतीजों को fzf में भेजने पर nginx.conf जैसी config files ढूंढना आसान हो जाता है, भले उनकी location न पता हो
rg . | fzf फ़ाइल नाम की जगह फ़ाइल के अंदर की lines को संकेत बनाकर मनचाही फ़ाइल खोलने देता है
fzf इंस्टॉल करने के तुरंत बाद मिलने वाली उपयोगिता
- software engineers अपने काम को बेहतर बनाने वाले tools आसानी से बना सकते हैं, लेकिन अगर वे कई tools के बीच घूमते रहें और किसी को गहराई से न सीखें, तो समय के साथ उसकी लागत बढ़ती जाती है
- एक अच्छा 80/20 heuristic यह है कि पहले
cat, ls, cd, grep, cut जैसे पुराने Unix tools सीखें, और आधुनिक system administration भूमिकाओं में sed और awk भी इसमें शामिल होते हैं
fzf को इस heuristic का अपवाद माना जा सकता है, क्योंकि इसमें निवेश के मुकाबले असर तुरंत मिलता है और इसकी उपयोगिता अलग तरह की है
- standard Ubuntu environment में
fzf install script से इंस्टॉल करने के बाद तुरंत इस्तेमाल किए जा सकने वाले features यहाँ मुख्य हैं
default shortcuts का तुरंत असर
-
Ctrl+R: command history को fuzzy search में बदलना
- ज़्यादातर Linux और Windows terminals में
Ctrl+R कमांड का reverse search देता है
- default
Ctrl+R में मनचाहा command ढूंढने के लिए exact match चाहिए होता है, और यह एक बार में सिर्फ एक preview दिखाता है, इसलिए एक अक्षर भी चूक जाए तो command ढूंढना मुश्किल हो जाता है
fzf इंस्टॉल करने पर कई keyboard shortcuts बेहतर behavior से overwrite हो जाते हैं, और 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 के साथ उसका संयोजन
-
basic fzf
fzf कमांड को वैसे ही चलाने पर यह current directory के आधार पर relative file paths में fuzzy search करता है
- अकेले इस्तेमाल करने पर यह बस फ़ाइल location चुनने जैसा काम करता है, इसलिए इसकी उपयोगिता सीमित लग सकती है
-
vi $(fzf)
vi $(fzf) जैसी command substitution के साथ जोड़ने पर fuzzy search से चुनी गई फ़ाइल को editor में सीधे खोला जा सकता है
- यह तरीका केवल
vi तक सीमित नहीं है; emacs, nano, code जैसे किसी भी editor के साथ इस्तेमाल किया जा सकता है
-
vi $(find . '/' | fzf)
find . '/' | fzf को editor के साथ जोड़ने पर ऐसी config file को पूरे path candidates में fuzzy search करके खोला जा सकता है जिसकी location पता न हो
nginx.conf जैसी फ़ाइल का path याद न हो, तो FHS का ज्ञान याद करके अंदाज़ा लगाने या path रटने के बजाय find के results को fzf में pipe कर देना काफी है
conf$ जैसी search से conf पर खत्म होने वाली lines को filter किया जा सकता है
- अगर
find को बहुत सारे Permission denied errors मिलें, तो fzf थोड़ी देर के लिए अटक सकता है, लेकिन कुछ सेकंड बाद संभल जाता है
- कुछ सेकंड की यह देरी config files को बहुत सरल तरीके से ढूंढने की सुविधा के बदले का tradeoff है
-
vi **<TAB>
sigmonsays की Hacker News comment में बताई गई एक सुविधा के रूप में, shortcut overwrite और fzf को सीधे चलाने के बीच की एक चीज़ है: double asterisk से fuzzy tab completion
vi **<TAB> का उपयोग vi $(fzf) की तरह फ़ाइल चुनने के लिए किया जा सकता है
- असली command पूरी होने के बाद
Enter एक बार और दबाना पड़ता है
- यह bash और zsh में अच्छी तरह काम करता है, लेकिन
fish में कभी-कभी काम नहीं करता
- अगर
$(fzf) को साफ़-साफ़ लिखकर चलाना आपको याद रखने में आसान लगे, तो हो सकता है आप इस feature का ज़्यादा उपयोग न करें
file moving के लिए भी उपयोगी fzf
-
mv $(fzf) $(fzf)
mv $(fzf) $(fzf) तब काम आता है जब आपको न यह ठीक-ठीक याद हो कि क्या move करना है, न यह कि कहाँ move करना है, लेकिन दोनों के बारे में कुछ बहुत specific clues याद हों
- इसमें
fzf को दो बार चुनकर source और destination तय किए जाते हैं
- GitHub README में GIFs को रख-रखाव के साथ move करने जैसे कामों में यह बार-बार काम आ सकता है
- संबंधित उदाहरण के रूप में
finstem का interactive mode README जोड़ा गया है
rg के साथ मिलाकर फ़ाइल सामग्री पर भी fuzzy search
-
rg: recursive search को default मानने वाला तेज़ grep
- नीचे दिए गए संयोजन
grep से भी किए जा सकते हैं, लेकिन rg या ripgrep में recursive search default होने से यह इस उपयोग में खास तौर पर मजबूत है
- उदाहरणों का पालन करने के लिए
rg इंस्टॉल करके इस्तेमाल करना सुझाया जाता है
-
rg . | fzf
rg . फ़ाइलों की हर line को search result के रूप में निकालता है, और इसे fzf में भेजने पर सभी फ़ाइलों की सभी lines पर fuzzy search की जा सकती है
- यह फ़ाइल नाम नहीं, बल्कि फ़ाइल के अंदर की line content को संकेत के रूप में इस्तेमाल करता है
-
rg . | fzf | cut -d ":" -f 1
rg . | fzf से चुने गए result के बाद cut -d ":" -f 1 जोड़ने पर colon के आधार पर पहला field, यानी फ़ाइल path, वापस मिल जाता है
- यह line content पर fuzzy search करने के बाद केवल उस line वाली फ़ाइल का path लेने का संयोजन है
-
vim $(rg . | fzf | cut -d ":" -f 1)
vim $(rg . | fzf | cut -d ":" -f 1) सभी फ़ाइलों की सभी lines पर fuzzy search करने के बाद चुनी गई line वाली फ़ाइल को vim में खोलता है
- जब फ़ाइल नाम याद न हो और केवल 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