วิธีค้นหา / grep ด้วย VIM แบบโต้ตอบ?


12

มีวิธีใดที่จะกำหนดค่า VIM ให้ค้นหาภายในไฟล์ทุกไฟล์สำหรับโครงการทั้งหมดแบบโต้ตอบหรือไม่?

โดยการโต้ตอบฉันหมายถึงการปรับปรุงการกดแป้นแต่ละครั้ง

บางอย่างเช่น Emacs ปรึกษา-Git-grepโปรดดูที่: ตัวอย่างเช่นการสาธิต


ฉันไม่ได้ใช้มันเป็นการส่วนตัวดังนั้นฉันไม่แน่ใจ 100% แต่ฉันคิดว่าctrl-pหรือปลั๊กอินที่คล้ายกันคือสิ่งที่คุณกำลังมองหา โปรดทราบว่าunite.vimควรจะสามารถทำเช่นนั้นได้ แต่ฉันจะไม่แนะนำเพราะในความคิดของฉันมันเป็นปลั๊กอินที่ค่อนข้างหนักและสร้างข้อผิดพลาด
statox

ไม่ctrl-pได้มีวิธีการโต้ตอบค้นหาเนื้อหาของแฟ้มหรือไม่? ฉันเคยใช้มันเพื่อค้นหาไฟล์แบบโต้ตอบตามชื่อของมัน
ideasman42

ฉันคิดว่ามันเป็นไปได้ แต่อย่างที่ฉันบอกว่าฉันไม่ได้ใช้มันดังนั้นบางทีฉันผิด
statox

คำตอบ:


14

ผมไม่แน่ใจว่านี่คือสิ่งที่คุณกำลังมองหา แต่บางทีคุณอาจจะลองfzfและfzf.vim

หากคุณใช้vim-plugเป็นตัวจัดการปลั๊กอินสิ่งที่คุณต้องทำเพื่อติดตั้งคือการเพิ่มบรรทัดเหล่านี้ใน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

โครงการบน github อธิบายวิธีติดตั้งบน MacOS:

brew install the_silver_searcher

:Agเป็นเสื้อคลุมรอบ ๆ$ agและช่วยให้คุณสามารถค้นหารูปแบบในไฟล์ของไดเรกทอรีปัจจุบัน (ที่แสดงเมื่อคุณพิมพ์:pwd) การแข่งขันจะมีการอัพเดททุกครั้งหลังการกดแป้น

คุณสามารถ:

  • วนไปข้างหน้าและข้างหลังผ่านการแข่งขันด้วยC-nและC-p
  • เลือกการแข่งขันปัจจุบันและย้ายไปยังการแข่งขันถัดไป / ก่อนหน้าด้วยTab/S-Tab
  • เลือกหรือยกเลิกการเลือกการแข่งขันทั้งหมดที่มีM-aหรือM-d

หากคุณเลือกการแข่งขันหนึ่งหรือหลายรายการหลังจากกด Enter พวกเขาจะเติมรายการรายการแก้ไขด่วน จากนั้นคุณจะสามารถนำทางผ่านพวกเขาด้วยคำสั่งเริ่มต้นที่เป็นกลุ่ม / แมปเช่นและ: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มา

นอกจากนี้ถ้าfzfเปิดบานหน้าต่างใน tmux และคุณต้องการที่จะใช้เวลาทั้งหน้าจอแทนคุณสามารถผนวกปังคำสั่งทั้งหมด ( :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คีย์นี้มักใช้โดย readline เพื่อเรียกใช้transpose-charsฟังก์ชัน

หากคุณไม่ต้องการสิ่งนี้ทางออกที่เป็นไปได้วิธีหนึ่งคือการคืนค่าการเชื่อมโยงคีย์ภายในของคุณ~/.bashrcหลังจากที่fzfได้กำหนดค่าที่มา ตัวอย่างเช่นหากคุณต้องการ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คำสั่งซึ่งคุณสามารถอ่านได้ในบัฟเฟอร์ Vim:

bind -P | vim -R -

ฉันไม่แน่ใจ แต่ฉันคิดว่าควรแสดงการreadlineเชื่อมโยงที่สำคัญที่สุดหรือทั้งหมด หากคุณกำลังมองหาชื่อของฟังก์ชั่นที่ ReadLine ผูกพันกับที่สำคัญในบัฟเฟอร์เป็นกลุ่มคุณจะค้นหาC-t \\C-tและหากคุณกำลังมองหาสิ่งที่ถูกผูกไว้กับM-c(คีย์เมตา / alt) คุณจะค้นหา\\ec( \eย่อมาจากคีย์หลบหนีและดูเหมือนว่าจะM-cผลิตรหัสเดียวกันescape + c)

คุณสามารถทำสิ่งเดียวกันได้zshโดยดูที่ผลลัพธ์ของbindkeyคำสั่ง แต่ในครั้งนี้^[ย่อมาจากคีย์ตัวปรับเปลี่ยนเมตา / เอลขณะที่อักขระคาเร็ต ( ^) ตัวเดียวหมายถึงปุ่มควบคุม


ปัจจุบันฉันพบการเชื่อมโยงคีย์ 4 รายการที่กำลังใช้งานฟังก์ชันที่มีfzfคำหลักอยู่ในชื่อ พวกเขาใช้คีย์ลำดับ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ปลั๊กอินแยกต่างหาก / เครื่องมือที่ตอบสนองความต้องการที่จะติดตั้ง?
ideasman42

@ ideasman42 ใช่ขอโทษด้วยฉันลืมไปว่าคำสั่ง shell agก็จำเป็นเช่นกัน ฉันอัพเดตคำตอบแล้ว
user9433424

1
น่าจะเป็นที่น่าสังเกตว่าเครื่องมือเหล่านี้ค่อนข้างน่ารำคาญแทนที่การกำหนดค่า bash และ zsh ของคุณเป็นค่าเริ่มต้น
ideasman42

@ ideasman42 คุณถูกต้องฉันอัพเดตคำตอบเพื่อพูดถึงปัญหานี้
user9433424
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.