Làm thế nào bạn có thể liệt kê các trận đấu tìm kiếm của Vim?


101

Tôi muốn liệt kê các trận đấu, khi tôi nhấn:

/example

để tôi biết vị trí của tất cả các trận đấu cùng một lúc.

Câu trả lời:


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
Tôi thích rất nhiều ý tưởng F5-F8 của bạn. Sẽ rất tuyệt nếu có một số hình ảnh hóa / kết quả của các lệnh đó ở đây. F8 được thiết kế như thế nào để hoạt động? Nó chỉ tìm kiếm thư mục hiện tại? - - Việc bỏ sót đồng dir là một tục lệ - - tại sao node_modules? - - Perl regexes thay đổi chức năng mặc định của Vim như thế nào? - - Sau đây là cách tôi thiết kế tìm kiếm tệp .tex askubuntu.com/a/789769/25388 Rất vui được học hỏi từ bạn cách cải thiện nó. Nó không trực quan lắm nên bản thân tôi cũng thường quên logic.
Léo Léopold Hertz 준영

node_modules là dir chứa rất nhiều mã js từ các mô-đun npm nếu bạn muốn phát triển giao diện người dùng ... nó chỉ là một ví dụ ...
Yordan Georgiev

1
tạo một bản sao lưu của bạn .vimrc và thêm các cài đặt đó, tải chúng bằng: so% và hơn là cố chạy "help" trong các lệnh ... vim thật khó - bạn sẽ phải lặp lại những cài đặt đó hàng nghìn lần, nhưng một lần bạn nắm vững chúng bạn sẽ cười @everyone người chỉ mới gread họ UI IDE features ...
Yordan Georgiev

226
:g//p

Ở dạng dài hơn:

:global/regular-expression/print

Bạn có thể bỏ mẫu / regex và Vim sẽ sử dụng lại cụm từ tìm kiếm trước đó.

Thông tin bên lề: Công cụ grep được đặt tên theo chuỗi lệnh này.


18
:g//- vì p (rint) là hành động mặc định, bạn cũng có thể bỏ qua.
dekeguard

6
:g/thậm chí còn ngắn hơn!
Sparhawk

2
Có thể thấy ngữ cảnh ở đây, giống như trong grep --context 9không?
Vitaly Zdanevich

@VitalyZdanevich Hãy thử :%s/regular-expression//gn Nó sẽ tạo ra một cái gì đó dọc theo những dòng:X matches on Y lines
Alexej Magura

@AlexejMagura Ý tôi là - làm thế nào để xem vài dòng trước và sau của chuỗi?
Vitaly Zdanevich

50

Bạn cũng có thể thực hiện:

g/pattern/#

sẽ in ra mẫu bạn muốn và số dòng.


2
Tốt lắm. Nhưng nếu bạn đã bật số dòng thì #không bắt buộc. Nó hiển thị số dòng theo mặc định
Pavan Manjunath

44

nếu bạn muốn xem danh sách này và chuyển nhanh giữa các trận đấu, hãy cân nhắc sử dụng

:vimgrep example %

hoặc là

:grep example %

Thao tác này sẽ điền vào "danh sách lỗi" với tất cả các kết quả phù hợp để bạn có thể sử dụng :copenđể liệt kê tất cả chúng trong bộ đệm Quickfix, nhấn enter trên một dòng cụ thể để chuyển đến kết quả phù hợp đó hoặc sử dụng các lệnh như :cn:cpđể quay lại.

để được giải thích cặn kẽ, hãy xem câu trả lời của tôi cho một câu hỏi tương tự


Điều này có E499: Empty file name for '%' or '#', only works with ":p:h"trên MacVim 8.1
Lincoln Bergeson

35

Chỉ cần học một cái mới: cái Location List!
Nhập :lvim foo %để tìm kiếm footrong tệp hiện tại và nhập tất cả các kết quả phù hợp có chứa foovào danh sách vị trí .
:lopenđể mở danh sách vị trí trong cửa sổ QuickFix, đó là đầy đủ điều hướng như bình thường.
Sử dụng :lnext/ :lpreviousđến thông qua danh sách (sử dụng ánh xạ tpope / không ghép nối để có trải nghiệm tốt nhất)


2
Mẹo hay! điều này đã khiến tôi thực hiện ánh xạ này tự động mở rộng từ dưới con trỏ và hiện ra trong một lần quét: nnoremap <leader> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Jörgen

16

Một khả năng khác là sử dụng các lệnh tìm kiếm tệp bao gồm.

[I

Điều này sẽ liệt kê tất cả các lần xuất hiện của từ dưới con trỏ. Tuy nhiên, nó có thể nhiều hơn những gì bạn cần, vì nó cũng sẽ tìm kiếm bất kỳ tệp nào có trong tệp hiện tại.

Nhưng cái hay ở lệnh này là màn hình kết quả tìm kiếm cũng hiển thị số lượng kết quả phù hợp, ngoài số dòng của mỗi trận đấu.

:help include-search

để xem nhiều biến thể.

Một lưu ý về

:g//p

Điều này có thể được giảm thêm xuống

:g//

bởi vì, như những người khác đã nói, p (rint) là hành động mặc định.


Có thể nhận được kết quả từ [Ingữ cảnh, như trên grep --context 9không?
Vitaly Zdanevich

10

bạn có thể có một quickfixcửa sổ đẹp với các kết quả phù hợp tạo thành mẫu tìm kiếm hiện tại của bạn

:vim // %
:copen

siêu tiện dụng nếu trước đây bạn đã tạo một mẫu tìm kiếm phức tạp chỉ bằng cách sử dụng /pattern

Chỉnh sửa : vừa phát hiện ra điều này cũng hoạt động cho tất cả các bộ đệm mở

:bufdo vimgrepadd // %
:copen

10

Việc sử dụng :set hlsearchsẽ đánh dấu tất cả các kết quả phù hợp bằng màu vàng cho phép bạn quét tệp dễ dàng để tìm các kết quả phù hợp. Tuy nhiên, đó có thể không phải là những gì bạn muốn, sau khi tìm kiếm,: g // p sẽ cung cấp cho bạn các kết quả phù hợp được liệt kê


2
Nên là ': set hlsearch' not ': hlsearch'.
quá nhiều php

Cũng hữu ích khi lập bản đồ :nohlđể xóa các điểm nổi bật khi bạn không cần chúng nữa.
Kos,

9

Để nói rõ hơn về điều này ... thay vì

/example
:g//p

bạn cũng có thể viết trực tiếp

:g/example/p

hoặc, vì p (rint) là hành động mặc định cho lệnh: g (lobal), điều này có thể được rút ngắn thành

:g/example

Và thay vì p (rint), các hành động khác có thể thực hiện được, ví dụ như d (elete). Xem: help: global


6
g/pattern

Nếu bạn có :set number, lệnh trên cũng hiển thị số dòng.

Nếu bạn chưa :set number, thì

g/pattern/#

sẽ hiển thị số dòng.


0

Tôi đã viết một đoạn mã cho việc này. Nó thực sự tránh được các vấn đề trong vimgrep. Nó hoạt động ngay cả với các tệp không tên. Và nó dễ sử dụng hơn.

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

Khi bạn gọi nó bằng một mẫu, nó sẽ mở cửa sổ vị trí với tất cả các kết quả phù hợp.

Đây có thể là một lệnh

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

Vì vậy, tất cả những gì bạn cần làm là nhập :Mat pattern

Tôi cũng sử dụng ánh xạ sau để lấy các kết quả phù hợp của lựa chọn hình ảnh hiện tại.

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

-1

Ctrl-f để liệt kê tất cả kết quả tìm kiếm:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.