VIM के साथ इंटरेक्टिवली सर्च / grep कैसे करें?


12

क्या वीआईएम को कॉन्फ़िगर करने का कोई तरीका है जो पूरी परियोजना के लिए प्रत्येक फ़ाइल के अंदर इंटरेक्टिवली खोज कर सके?

इंटरैक्टिव द्वारा , मेरा मतलब है कि प्रत्येक कीस्ट्रोक को अपडेट करना।

Emacs काउंसिल- git-grep जैसा कुछ , देखें: उदाहरण डेमो


मैं इसका व्यक्तिगत रूप से उपयोग नहीं करता हूं, इसलिए मुझे 100% यकीन नहीं है, लेकिन मुझे लगता है ctrl-pया एक समान प्लगइन वही है जो आप खोज रहे हैं। ध्यान दें कि unite.vimऐसा करने में भी सक्षम होना चाहिए, लेकिन मैं इसकी सिफारिश नहीं करूंगा क्योंकि मेरी राय में यह बहुत भारी और बग बनाने वाला प्लगइन है।
statox

क्या ctrl-pफ़ाइल सामग्री को अंतःक्रियात्मक रूप से खोजने का एक तरीका है? मैंने केवल उनके नाम के आधार पर फ़ाइलों के लिए इंटरेक्टिवली खोज करने के लिए इसका उपयोग किया है।
ideasman42 12

मुझे लगता है कि यह संभव है, लेकिन जैसा कि मैंने कहा कि मैं उसका उपयोग नहीं करते तो शायद मैं गलत हूँ
statox

जवाबों:


14

मुझे यकीन नहीं है कि यह वही है जो आप ढूंढ रहे हैं, लेकिन शायद आप fzf और fzf.vim की कोशिश कर सकते हैं ।

यदि आप एक प्लगइन प्रबंधक के रूप में विम-प्लग का उपयोग करते हैं , तो आपको उन्हें स्थापित करने के लिए बस इतना करना होगा, इन पंक्तियों को अपने में जोड़ना होगा vimrc:

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'

... कहीं लाइनों के बीच:

call plug#begin('~/.vim/plugged')

तथा:

call plug#end()

फिर अमल करें :PlugInstall


द्वारा प्रदान किए गए विभिन्न कमांड और मैपिंग के बीच fzf.vim(जिसका एकमात्र उद्देश्य fzfपूर्वनिर्धारित स्रोतों के माध्यम से अस्पष्ट खोज के लिए मैपिंग और कमांड स्थापित करना प्रतीत होता है ), कमांड है :Ag

इसका उपयोग करने में सक्षम होने के लिए, आपको शेल कमांड एजी को स्थापित करने की आवश्यकता है । डेबियन आधारित वितरण पर, यह निम्नलिखित कमांड के साथ किया जा सकता है:

apt-get install silversearcher-ag

गितुब पर परियोजना बताती है कि इसे मैकओएस पर कैसे स्थापित किया जाए:

brew install the_silver_searcher

:Agचारों ओर एक आवरण है $ ag, और आपको वर्तमान निर्देशिका की फ़ाइलों में एक पैटर्न खोज करने की अनुमति देता है (जब आप टाइप करते हैं तो प्रदर्शित होता है :pwd)। मैच प्रत्येक कीस्ट्रोक के बाद अपडेट किए जाते हैं।

आप ऐसा कर सकते हैं:

  • चक्र आगे और पीछे के साथ मैचों के माध्यम से C-nऔरC-p
  • वर्तमान मैच और साथ अगले / पिछले एक करने के लिए इस कदम का चयन Tab/S-Tab
  • का चयन करें या साथ सभी मैचों का चयन रद्द M-aयाM-d

यदि आप एक या कई मैचों का चयन करते हैं, तो एंटर मारने के बाद, वे क्विकफिक्स सूची को पॉप्युलेट करेंगे। वहाँ से आप उनके माध्यम से डिफ़ॉल्ट विम कमांड / मैपिंग के साथ नेविगेट कर पाएंगे, जैसे :cnextऔर :cprevious

यहाँ छवि विवरण दर्ज करें

यदि आप द्वारा स्थापित सभी आदेशों में एक उपसर्ग जोड़ना चाहते हैं fzf.vim, और मौजूदा आदेशों को ओवरराइड करने से बचें, तो आप इसे अपने में जोड़ सकते हैं vimrc:

let g:fzf_command_prefix = 'your_prefix'

मैं Fzfउपसर्ग के रूप में उपयोग करता हूं , इसीलिए मैंने टाइप नहीं किया :Agलेकिन :FzfAg


यदि आप git grepइसके बजाय उपयोग करना पसंद करते हैं ag, तो ऐसा लगता है कि आप अपने स्वयं के कस्टम रैपर को इसके चारों ओर स्थापित कर सकते हैं :GGrep, जैसे:

command! -bang -nargs=* GGrep
  \ call fzf#vim#grep('git grep --line-number '.shellescape(<q-args>), 0, <bang>0)

इसमें समझाया गया है :h fzf-vim-customization

इसके अलावा, अगर fzftmux में एक फलक खुलता है, और आप इसे पूरे स्क्रीन के बजाय लेता है पसंद करेंगे, आप सभी आदेशों को एक धमाके के जोड़ सकते हैं ( :Ag!, :GGrep!, ...)।


जैसा कि आपने अपनी पिछली टिप्पणी में कहा था , डिफ़ॉल्ट रूप fzfसे आपके शेल का कॉन्फ़िगरेशन बदल जाता है। उदाहरण के लिए, यदि आप उपयोग करते हैं bash, तो यह आपके में निम्न पंक्ति जोड़ देगा ~/.bashrc:

[ -f ~/.fzf.bash ] && source ~/.fzf.bash

यह फाइल को सोर्स करेगा ~/.fzf.bash। उत्तरार्द्ध में कुछ कोड शामिल हैं:

# Setup fzf
# ---------
if [[ ! "$PATH" == */home/user/.fzf/bin* ]]; then
  export PATH="$PATH:/home/user/.fzf/bin"
fi

# Auto-completion
# ---------------
[[ $- == *i* ]] && source "/home/user/.fzf/shell/completion.bash" 2> /dev/null

# Key bindings
# ------------
source "/home/user/.fzf/shell/key-bindings.bash"

इस कोड को वातावरण चर के पथ संलग्न कर देता है $PATH: /home/user/.fzf/bin; जो fzfप्रोग्राम वाला फोल्डर है ।

यह 2 अन्य फ़ाइलों को भी स्रोत:

/home/user/.fzf/shell/completion.bash
/home/user/.fzf/shell/key-bindings.bash

पहला पूरा होने वाले कार्यों को परिभाषित करता है, जबकि दूसरा प्रमुख बाइंडिंग स्थापित करता है।

दुर्भाग्य से, कुंजी बाइंडिंग डिफ़ॉल्ट readlineफ़ंक्शन को ओवरराइड कर सकती है ।
उदाहरण के लिए, fzfफ़ंक्शन fzf-file-widgetको बाइंड करता है C-t। फ़ंक्शन को निष्पादित करने के लिए यह कुंजी आमतौर पर रीडलाइन द्वारा उपयोग की जाती transpose-charsहै।

आप इस नहीं करना चाहते हैं, एक संभव समाधान अपने अंदर कुंजी बाइंडिंग बहाल करने के लिए किया जाएगा ~/.bashrc, के बाद fzfइसके विन्यास sourced किया है। उदाहरण के लिए, यदि आप C-tइसके पुराने व्यवहार को रखना चाहते हैं, जो कि कर्सर के चारों ओर 2 वर्णों को स्थानांतरित कर रहा है, और fzf-file-widgetदूसरी कुंजी से बंधे हैं , तो मान लें कि C-x C-tआप इन पंक्तियों को अंत में जोड़ सकते हैं ~/.bashrc:

bind -x '"\C-x\C-t": fzf-file-widget'
bind '"\C-t": transpose-chars'

यही बात zshशेल पर भी लागू होती है , लेकिन कुंजी बाइंडिंग को स्थापित करने का सिंटैक्स थोड़ा अलग होता है:

bindkey '^X^T' fzf-file-widget
bindkey '^T' transpose-chars

यदि आपके द्वारा उपयोग की जाने वाली शेल कुंजी बाइंडिंग में से एक को ओवरराइड किया गया है fzf, तो आप इसे पुनर्स्थापित करना चाहते हैं, लेकिन यह नहीं जानते कि फ़ंक्शन का सटीक नाम क्या है जिसे निष्पादित किया गया था, आप निम्न चीज़ों को आज़मा सकते हैं।

सबसे पहले, आपके अंदर ~/.bashrc, अस्थायी रूप से उस लाइन पर टिप्पणी करते हैं जो fzfकॉन्फ़िगरेशन का स्रोत है। फिर, एक टर्मिनल को फिर से खोलें, और bind -Pकमांड के आउटपुट पर एक नज़र डालें , जिसे आप विम बफर में पढ़ सकते हैं:

bind -P | vim -R -

मुझे यकीन नहीं है, लेकिन मुझे लगता है कि इसे सबसे या सभी readlineप्रमुख बाइंडिंग को प्रदर्शित करना चाहिए । यदि आप C-tकुंजी बाउंड में रीडलाइन फ़ंक्शन का नाम देख रहे हैं , तो विम बफर में, आप खोज करेंगे \\C-t। और यदि आप M-c(मेटा / ऑल्ट की) के लिए बाध्य हैं , तो आप खोज करेंगे \\ec( \eभागने की कुंजी के लिए खड़ा है और ऐसा लगता M-cहै कि यह केकोड्स के समान है escape + c)।

कमांड zshके आउटपुट को देखकर आप वही काम कर सकते हैं bindkey। लेकिन इस बार, ^[मेटा / ऑल्ट संशोधक कुंजी के लिए खड़ा है, जबकि एक एकल कैरेट ( ^) वर्ण नियंत्रण कुंजी के लिए खड़ा है।


वर्तमान में, मुझे fzfउनके नाम में कीवर्ड वाले कार्यों को निष्पादित करने वाले 4 प्रमुख बाइंडिंग मिले । वे कुंजी दृश्यों C-i(उसी के रूप में Tab) C-r, C-tऔर का उपयोग करते हैं M-c। वे निम्नलिखित कार्यों के लिए बाध्य हैं:

C-i    fzf-completion
C-r    fzf-history-widget
C-t    fzf-file-widget
M-c    fzf-cd-widget

मेरे सिस्टम पर, मूल रूप से, readline( bashकमांड लाइन को संपादित करने के लिए पुस्तकालय द्वारा उपयोग किया जाता है ) इन कार्यों के लिए उन कुंजियों को बाध्य करता है:

C-i     complete
C-r     reverse-search-history
C-t     transpose-chars
M-c     capitalize-word

और zle(लाइन संपादक द्वारा उपयोग किया जाता है zsh), उन्हें बाध्य करें:

C-i     expand-or-complete
C-r     history-incremental-search-backward
C-t     transpose-chars
M-c     capitalize-word

1
है agएक अलग प्लगइन / उपकरण है जो की जरूरत है स्थापित होने के लिए?
विचार .42

@ ideasman42 हाँ, इसके बारे में क्षमा करें, मैं भूल गया कि शेल कमांड agभी आवश्यक था। मैंने जवाब अपडेट किया।
user9433424

1
संभवत: इन उपकरणों को ध्यान देने योग्य है कि यह बहुत ही घुसपैठ है, जो आपके bash और zsh कॉन्फ़िगरेशन को डिफ़ॉल्ट रूप से बदल देता है।
विचारमान 42

@ ideasman42 आप सही हैं, मैंने इस समस्या का उल्लेख करने के लिए उत्तर अपडेट किया।
user9433424
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.