Bagaimana Anda bisa membuat daftar kecocokan dari pencarian Vim?


101

Saya ingin membuat daftar pertandingan, ketika saya menekan:

/example

sehingga saya melihat di mana semua pertandingan sekaligus.

Jawaban:


3
    " put in your ~/.vimrc file
    " START search related configs and helps
    "
    " ignore case when searching
    set ignorecase

    " search as characters are entered, as you type in more characters, the search is refined
    set incsearch

    " highlight matches, in normal mode try typing * or even g* when cursor on string
    set hlsearch

    " yank those cheat commands, in normal mode type q: than p to paste in the opened cmdline
    " how-to search for a string recursively
    " :grep! "\<doLogErrorMsg\>" . -r
    "
    " how-to search recursively , omit log and git files
    " :vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`
    " :vimgrep /srch/ `find . -type f -name '*.pm' -o -name '*.pl'`
    "
    " how-to search for the "srch" from the current dir recursively in the shell
    " vim -c ':vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`'
    "
    " how-to highlight the after the search the searchable string
    " in normmal mode press g* when the cursor is on a matched string

    " how-to jump between the search matches - open the quick fix window by
    " :copen 22

    " how-to to close the quick fix window
    " :ccl

    " F5 will find the next occurrence after vimgrep
    map <F5> :cp!<CR>

    " F6 will find the previous occurrence after vimgrep
    map <F6> :cn!<CR>

    " F8 search for word under the cursor recursively , :copen , to close -> :ccl
    nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

    " omit a dir from all searches to perform globally
    set wildignore+=**/node_modules/**

    " use perl regexes - src: http://andrewradev.com/2011/05/08/vim-regexes/
    noremap / /\v
    "
    " STOP  search related configs and helps

1
Saya sangat menyukai ide F5-F8 Anda. Akan menyenangkan untuk memiliki beberapa visualisasi / keluaran dari perintah tersebut di sini. Bagaimana F8 dirancang untuk bekerja? Ini hanya mencari direktori saat ini? - - Penghilangan dir adalah kebiasaan - - mengapa node_modules? - - Bagaimana regex perl mengubah fungsi default Vim? - - Berikut ini adalah bagaimana saya merancang pencarian saya terhadap file .tex askubuntu.com/a/789769/25388 Alangkah baiknya belajar dari Anda bagaimana memperbaikinya. Itu tidak begitu intuitif jadi saya sendiri sering lupa logikanya.
Léo Léopold Hertz 준영

node_modules adalah dir yang berisi banyak kode js dari modul npm jika Anda akan mengembangkan front-end ... ini hanya sebuah contoh ...
Yordan Georgiev

1
membuat cadangan Anda .vimrc dan menambahkan pengaturan itu, memuatnya dengan: jadi% dan daripada mencoba menjalankan "membantu" dalam perintah ... vim itu sulit - Anda harus mengulang ribuan kali, tetapi setelah Anda kuasai mereka, Anda akan tertawa @ semua orang yang menunjukkan fitur UI IDE baru mereka ...
Yordan Georgiev

226
:g//p

Dalam bentuk yang lebih panjang:

:global/regular-expression/print

Anda dapat meninggalkan pola / regex dan Vim akan menggunakan kembali istilah pencarian sebelumnya.

Trivia: Alat grep dinamai sesuai urutan perintah ini.


18
:g//- karena p (rint) adalah tindakan default, Anda juga dapat membiarkannya.
dekeguard

6
:g/bahkan lebih pendek!
Sparhawk

2
Apakah mungkin untuk melihat konteks di sini, seperti di grep --context 9?
Vitaly Zdanevich

@VitalyZdanevich Coba :%s/regular-expression//gn Ini akan menghasilkan sesuatu seperti ini:X matches on Y lines
Alexej Magura

@AlexejMagura Maksud saya - bagaimana melihat beberapa baris sebelum dan sesudah string?
Vitaly Zdanevich

50

Anda juga bisa melakukan:

g/pattern/#

yang akan mencetak pola yang Anda inginkan dan jumlah baris.


2
Bagus. Tetapi jika Anda telah mengaktifkan nomor baris, maka #tidak diperlukan. Ini menunjukkan nomor baris secara default
Pavan Manjunath

44

jika Anda ingin melihat daftar ini dan beralih cepat di antara pertandingan, pertimbangkan untuk menggunakan

:vimgrep example %

atau

:grep example %

Ini akan mengisi "daftar kesalahan" dengan semua kecocokan sehingga Anda dapat menggunakan :copendaftar semuanya di buffer quickfix, tekan enter pada baris tertentu untuk melompat ke kecocokan itu, atau gunakan perintah seperti :cndan :cpuntuk bolak-balik.

untuk penjelasan lengkap, lihat jawaban saya untuk pertanyaan serupa


Ini memberi E499: Empty file name for '%' or '#', only works with ":p:h"pada MacVim 8.1
Lincoln Bergeson

35

Baru saja mempelajari yang baru: the Location List!
Ketik :lvim foo %untuk mencari foodi file saat ini dan masukkan semua kecocokan yang berisi fooke dalam daftar lokasi .
Ketik :lopenuntuk membuka daftar lokasi di jendela quickfix, yang dapat dinavigasi sepenuhnya seperti biasa.
Gunakan :lnext/ :lpreviousuntuk melalui daftar (gunakan tpope / pemetaan tanpa gangguan untuk pengalaman terbaik)


2
Tip yang bagus! ini mengarahkan saya untuk membuat pemetaan ini yang secara otomatis memperluas kata di bawah kursor dan tidak terbuka dalam satu sapuan: nnoremap <leader> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Jörgen

16

Kemungkinan lain adalah dengan menggunakan perintah pencarian file yang disertakan.

[I

Ini akan mencantumkan semua kemunculan kata di bawah kursor. Ini mungkin lebih dari yang Anda butuhkan, karena itu juga akan mencari file apa pun yang disertakan dalam file saat ini.

Tetapi hal yang menyenangkan tentang perintah ini adalah bahwa tampilan hasil pencarian juga menunjukkan hitungan jumlah pertandingan, selain nomor baris dari setiap pertandingan.

:help include-search

untuk melihat banyak varian.

Catatan tentang

:g//p

Ini dapat dikurangi lebih lanjut menjadi

:g//

karena, seperti yang dikatakan orang lain, c (rint) adalah tindakan default.


Apakah mungkin mendapatkan hasil [Idengan konteks, seperti pada grep --context 9?
Vitaly Zdanevich

10

Anda bisa mendapatkan quickfixjendela yang bagus dengan kecocokan dari pola pencarian Anda saat ini

:vim // %
:copen

sangat berguna jika sebelumnya Anda membuat pola pencarian yang kompleks menggunakan just /pattern

Sunting : baru tahu ini juga berfungsi untuk semua buffer terbuka

:bufdo vimgrepadd // %
:copen

10

Menggunakan :set hlsearchakan menyorot semua kecocokan dengan warna kuning memungkinkan Anda untuk memindai file dengan mudah untuk kecocokan. Itu mungkin bukan yang Anda inginkan, setelah mencari,: g // p akan memberi Anda kecocokan yang terdaftar


2
Seharusnya ': set hlsearch' not ': hlsearch'.
terlalu banyak php

Ini berguna juga untuk memetakan :nohluntuk menghapus sorotan saat Anda tidak membutuhkannya lagi.
Kos

9

Untuk menguraikan ini ... daripada

/example
:g//p

Anda juga bisa menulis langsung

:g/example/p

atau, karena p (rint) adalah aksi default untuk perintah: g (lobal), ini dapat disingkat menjadi

:g/example

Dan alih-alih p (rint), tindakan lain dimungkinkan, misalnya d (elete). Lihat: bantuan: global


6
g/pattern

Jika sudah :set number, perintah di atas juga menampilkan nomor baris.

Jika belum :set number, maka

g/pattern/#

akan menampilkan nomor baris.


0

Saya telah menulis sepotong kode untuk ini. Ini sebenarnya menghindari masalah di vimgrep. Ia bekerja bahkan dengan file tanpa nama. Dan lebih mudah digunakan.

function! Matches(pat)
    let buffer=bufnr("") "current buffer number
    let b:lines=[]
    execute ":%g/" . a:pat . "/let b:lines+=[{'bufnr':" . 'buffer' . ", 'lnum':" . "line('.')" . ", 'text': escape(getline('.'),'\"')}]"
    call setloclist(0, [], ' ', {'items': b:lines}) 
    lopen
endfunction

Ketika Anda menyebutnya dengan pola, itu membuka jendela lokasi dengan semua kecocokan.

Ini bisa menjadi perintah

command! -nargs=1 Mat call Matches(<f-args>)

Jadi yang perlu Anda lakukan hanyalah mengetik :Mat pattern

Saya juga menggunakan pemetaan berikut untuk mendapatkan kecocokan dari pemilihan visual saat ini.

vnoremap Y "xy:call Matches(@x)<CR>

-1

Ctrl-f untuk menampilkan semua hasil pencarian:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.