Як можна перелічити збіги пошуку Віма?


Відповіді:


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
Мені дуже подобаються ваші ідеї F5-F8. Було б непогано мати тут деякі візуалізації / виходи цих команд. Як розроблений F8 для роботи? Він шукає лише поточний каталог? - - Опущення режиму - звичай - - чому node_modules? - - Як регекси perl змінюють функціонування за замовчуванням Vim? - - Нижче описано, як я розробив пошук файлів .tex askubuntu.com/a/789769/25388 Було б непогано дізнатися від вас, як його вдосконалити. Це не так інтуїтивно, тому я і сам часто забував логіку.
Лео Леопольд Герц 준영

node_modules - це dir, що містить багато js-коду від npm-модулів, якщо ви розробляєте лицьові сторони ... це лише приклад ...
Йордан Георгієв,

1
зробіть резервну копію з вас .vimrc і додайте ці налаштування, завантажте їх: так% і, ніж спробувати запустити команду "help" в командах ... vim важко - вам доведеться повторити ці тисячі разів, але як тільки ви освоюйте їх, ви будете сміятися @everyone, хто вказує на свою жадібність нові функції IDE інтерфейсу користувача ...
Йордан Георгієв,

226
:g//p

У більш тривалому вигляді:

:global/regular-expression/print

Ви можете залишити шаблон / регекс, і Vim повторно використовувати попередній пошуковий термін.

Загальна інформація : Grep інструмент був названий в честь цієї команди послідовності.


18
:g//- оскільки p (rint) є дією за замовчуванням, ви також можете її залишити.
dekeguard

6
:g/ще коротше!
Sparhawk

2
Чи можна тут бачити контекст, як у grep --context 9?
Віталій Зданевич

@VitalyZdanevich Спробуйте :%s/regular-expression//gn це створить щось у цьому напрямку:X matches on Y lines
Олексій Магура

@AlexejMagura Я маю на увазі - як бачити кілька рядків до і після рядка?
Віталій Зданевич

50

Ви також можете зробити:

g/pattern/#

який надрукує потрібний візерунок та номер рядка.


2
Хороший. Але якщо у вас вже включені номери рядків, #це не потрібно. Він показує номери рядків за замовчуванням
Pavan Manjunath,

44

якщо ви хочете переглянути цей список і швидко перейти між матчами, подумайте про використання

:vimgrep example %

або

:grep example %

Це заповнить "список помилок" усіма збігами, щоб ви могли :copenперелічити їх у буфері швидкого виправлення, натисніть клавішу Enter на певному рядку, щоб перейти до цього матчу, або використовувати команди типу " :cnта", :cpщоб повертатися назад і назад.

для детального пояснення дивіться мою відповідь на подібне запитання


Це дає E499: Empty file name for '%' or '#', only works with ":p:h"на MacVim 8.1
Лінкольн Бергесон

35

Щойно навчився нового: the Location List!
Введіть :lvim foo %для пошуку fooу поточному файлі та введіть усі збіги, що містяться fooу списку місцеположень .
Введіть, :lopenщоб відкрити список місцеположень у вікні швидкого виправлення, яке повністю перебуває як звичайно.
Використовуйте :lnext/ :lpreviousдо списку ( для найкращого досвіду використовуйте відображення tpope / unmareired mappings )


2
Гарна порада! це змусило мене зробити це відображення, яке автоматично розгортає слово під курсором і замикається одним промінням: nnoremap <leader> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Йорген

16

Інша можливість полягає у використанні команд пошуку файлів включення.

[I

Тут буде перераховано всі зустрічі слова під курсором. Це може бути більше, ніж вам потрібно, тому що він також буде шукати будь-які файли, що входять до поточного файлу.

Але приємно в цій команді те, що на дисплеї результатів пошуку також відображається кількість збігів, крім номера рядків кожного збігу.

:help include-search

щоб побачити безліч варіантів.

Записка о

:g//p

Це можна зменшити до

:g//

тому що, як уже говорили інші, p (rint) - це дія за замовчуванням.


Чи можна отримати результат [Iз контексту, як на grep --context 9?
Віталій Зданевич

10

ви можете отримати гарне quickfixвікно з відповідниками вашої поточної моделі пошуку

:vim // %
:copen

супер зручно, якщо ви раніше створили складний шаблон пошуку за допомогою просто /pattern

Редагувати : щойно з’ясувалося, це також працює для всіх відкритих буферів

:bufdo vimgrepadd // %
:copen

10

Використання :set hlsearchвиділить всі збіги жовтим кольором, що дозволяє легко сканувати файл на відповідність. Це може бути не те, що ви хочете, хоча після пошуку: g // p дасть вам перелічені збіги


2
Повинен бути ": встановити hlsearch" не ": hlsearch".
занадто багато php

Корисно також скласти карту, :nohlщоб очистити основні моменти, коли вони вам більше не потрібні.
Кос

9

Детальніше про це ... замість цього

/example
:g//p

ви також можете писати безпосередньо

:g/example/p

або, оскільки p (rint) є типовою дією для команди: g (lobal), це можна скоротити до

:g/example

І замість p (rint) можливі інші дії, наприклад, d (elete). Див .: довідка: глобальна


6
g/pattern

Якщо у вас є :set number, вищевказана команда відображає і номери рядків.

Якщо у вас немає :set number, то

g/pattern/#

відображатиме номери рядків


0

Я написав для цього фрагмент коду. Це фактично уникає проблем у vimgrep. Він працює навіть з файлами без назви. І простіше у використанні.

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

Коли ви називаєте це з малюнком, він відкриває вікна розташування з усіма відповідниками.

Це може бути команда

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

Тому все, що вам потрібно зробити - це набрати :Mat pattern

Я також використовую наступне відображення, щоб отримати збіги поточного візуального вибору.

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

-1

Ctrl-f для переліку всіх результатів пошуку:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.