Найдите шаблон и сложите совпадающие строки в gvim


Hi ,

Я хочу сложить набор строк после поиска следующим образом:

Мышь также можно использовать для открытия и закрытия складок, выполнив следующие действия:

  • Нажмите «+», чтобы открыть закрытую складку в этом ряду.

  • Нажмите на любой другой непустой символ, чтобы закрыть открытую складку в этой строке.

Я хочу выполнить поиск click и свернуть все совпадающие строки.

Мышь также можно использовать для открытия и закрытия складок, выполнив следующие действия:

+--

Существует способ свернуть не совпадающие шаблоны в vim, после поиска шаблона мы можем свернуть не совпадающие шаблоны с помощью клавиши \z.

nnoremap \z :setlocal foldexpr=(getline(v:lnum)=~@/)?0:(getline(v:lnum-1)=~@/)\\|\\|(getline(v:lnum+1)=~@/)?1:2 foldmethod=expr foldlevel=0 foldcolumn=2<CR> Есть ли возможность сделать наоборот? Просто найти закономерность и рухнуть?


person Eashwar Gadanchi    schedule 23.07.2018    source источник


Ответы (2)


Я использую приведенную ниже конфигурацию с neovim, я думаю, что она должна работать и с обычным vim:

nnoremap \Z :setlocal foldexpr=(getline(v:lnum)=~@/)?0:1 foldmethod=expr foldlevel=0 foldcolumn=2 foldminlines=0<CR><CR>
nnoremap \z :setlocal foldexpr=(getline(v:lnum)=~@/)?1:0 foldmethod=expr foldlevel=0 foldcolumn=2 foldminlines=0<CR><CR>

\z: Свернуть совпадающее выражение из последнего поиска
\Z: Свернуть все, что NOT соответствует последнему поиску

Это очень полезно, когда я хочу увидеть все комментарии или вообще не комментировать. Сначала выполните \ и найдите ^# (если это символ начала комментария на вашем языке), нажмите «Ввод», затем выполните свертывание, как указано выше.

Редактировать: вы можете добавить ниже, чтобы сбросить складывание обратно в ручной режим, если хотите:
nnoremap \F :setlocal foldmethod=manual<CR><CR>

person Community    schedule 23.10.2019
comment
sdkks Это просто. Когда я устанавливаю команду foldmethod=manual в vimrc после ваших двух команд, я не могу ее развернуть. Нужно ли мне снова устанавливать его вручную в окне vim каждый раз, если я хочу развернуться? Складывание ограничено одним поиском, можем ли мы расширить его до более чем одного шаблона поиска. - person Eashwar Gadanchi; 23.10.2019
comment
@EashwarGadanchi, вы можете развернуть все с помощью zE после установки ручного метода с помощью \F . Если я вас правильно понял, вы хотите накапливать складки каждый раз с разным поиском, боюсь, с помощью этого простого метода это невозможно, так как команда ищет и сворачивает все на основе определенного выражения. Я бы искал плагин для этого расширенного варианта использования. Я еще не пробовал. - person ; 23.10.2019

Я получил ответ на этот вопрос от пользователя Reddit на форуме Reddit Vim.

https://www.reddit.com/r/vim/comments/91qz90/search_a_pattern_and_fold_the_matching_lines_in/

function! FoldSearchPattern() abort
    if !exists('w:foldpatterns')
        let w:foldpatterns=[]
        setlocal foldmethod=expr foldlevel=0 foldcolumn=2
    endif
    if index(w:foldpatterns, @/) == -1
        call add(w:foldpatterns, @/)
        setlocal foldexpr=SetFolds(v:lnum)
    endif
endfunction

function! SetFolds(lnum) abort
    for pattern in w:foldpatterns
        if getline(a:lnum) =~ pattern
            if getline(a:lnum + 1) !~ pattern
                return 's1'
            else
                return 1
            endif
        endif
    endfor
endfunction

nnoremap \z :call FoldSearchPattern()<CR>

Надеюсь, это полезно.

person Eashwar Gadanchi    schedule 27.07.2018