LINUX.ORG.RU

Поиск нескольких строк в Vim

 


0

4

Предположим, есть файл с текстом. Нужно найти параграфы (т.е. последовательность строк в данном случае), совпадающие с выделенным.

Если пытаться выделить параграф в visual mode, скопировать через y и искать с помощью /<C-R>", то переводы строк вставляются как ^M, а не как \n, и ничего не находится.

Как быть? В GVim это можно обойти, выделив текст и вызвав поиск из меню, но меня интересует консольный вариант.

После установки: vim-visual-star-search добавляется возможность просто выделить текст и нажать * (но не на кейпаде, где отдельная кнопка, а Shift-8 или где она на цифрах), выделенный кусок будет искаться по всему файлу с обычной навигацией по n/N.

Но лучше всего поставить себе: vim-oblique (+ его зависимость), который содержит эту же возможность + много чего другого полезного, не представляю себе нормальный поиск без этого плагина в повседневной активной работе в Vim.

redhat ()
Ответ на: комментарий от redhat

Спасибо за плагины, но хотелось бы этот вопрос решить без них. Мне не нужны возможности IDE, я хочу лёгкий универсальный редактор, который можно без проблем перенести на удалённый сервер.

lampslave ★★ ()
Ответ на: комментарий от lampslave

Может что-нибудь такое подойдёт:

nnoremap <leader>* yip/<c-r>=substitute(@", '<c-v><c-j>', '\\n', 'g')<cr><cr>

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Эээ, строку под курсором находит, а вот параграф нет.

Может быть как-то можно менять ^M на \n при вставке?

lampslave ★★ ()
Ответ на: комментарий от lampslave

Обычно не комментирую подобное, но раз в месяц можно.

Ты хочешь изкоробочное решение? Оно есть, именно его в плагин и засунули, чтобы ты не вбивал вручную каждый раз или маппил сам. Если интересно, как это делается подробно, смотри в плагин и достань те длинные строки, которые придется вбивать самому вручную каждый раз. Или маппить. Но тогда чем это будет отличаться от плагина? Ничем.

без проблем перенести на удалённый сервер.

А в чем проблема переноса или использования вима на удаленном сервере, если плагин — это обычный кусок настройки, ни чем не отличающийся от того, что у тебя в ~/.vimrc ?

Тем более, что менеджеры плагинов, например vim-plug, который тоже представляет из себя файлик в дире vim, установит все нужные плагины по первому же запуску вима?

лёгкий универсальный редактор

Сравним помиллисекундный запуск вима

vim --startuptime /dev/stdout +qall
без этого плагина:
063.352 
и с ним:
061.874
разница составила полторы миллисекунды, это ~2/1000 секунды, жесть вим стал нелегким не универсальным редактором!

У тебя сколько отклик дисплея монитора? от 2-5 до 12 миллисекунд? А мы говорим в данном случае про сранные полторы миллисекунды.

К слову, у меня вим с ~50 плагинами загружается за 250 миллисекунд.

redhat ()
Ответ на: комментарий от redhat

вот содержимое плагина, который, как ты себе представляешь, сделает твой вим нелегким и не универсальным:

" From http://got-ravings.blogspot.com/2008/07/vim-pr0n-visual-search-mappings.html

" makes * and # work on visual mode too.
function! s:VSetSearch(cmdtype)
  let temp = @s
  norm! gv"sy
  let @/ = '\V' . substitute(escape(@s, a:cmdtype.'\'), '\n', '\\n', 'g')
  let @s = temp
endfunction

xnoremap * :<C-u>call <SID>VSetSearch('/')<CR>/<C-R>=@/<CR><CR>
xnoremap # :<C-u>call <SID>VSetSearch('?')<CR>?<C-R>=@/<CR><CR>

" recursively vimgrep for word under cursor or selection if you hit leader-star
nmap <leader>* :execute 'noautocmd vimgrep /\V' . substitute(escape(expand("<cword>"), '\'), '\n', '\\n', 'g') . '/ **'<CR>
vmap <leader>* :<C-u>call <SID>VSetSearch()<CR>:execute 'noautocmd vimgrep /' . @/ . '/ **'<CR>

Добавь в ~/.vimrc и пользуйся, 721 байт.

redhat ()
Ответ на: комментарий от redhat

Пожалуйста, не надо считать меня идиотом. Я потрудился открыть репозиторий и поглядеть, что у плагина внутри. Я знаю, что это можно скопировать в .vimrc и жить припеваючи.

Проблема не в этом. Я ищу решение, которое не надо мапить вообще, в надежде, что оно существует, а я о нём просто не знаю. Можете считать, что это вопрос из серии «как выйти из vim». Если такого решения нет - другое дело, придётся вернуться к костылям (хотя это и обидно, потому что подобное умеет любой нормальный редактор).

Касательно переноса на сервер - я хочу просто скопировать .vimrc (вменяемой длины, а не километровый) и начать уже делать чего-нибудь.

lampslave ★★ ()
Ответ на: комментарий от lampslave

вменяемой длины, а не километровый

А разница?

najlus ★★★★★ ()
Ответ на: комментарий от najlus

Ориентироваться легче. Конфиг же не мёртвый, периодически в него будут вноситься изменения, которые желательно бы отслеживать и синхронизировать.

Картинку с IE с кучей тулбаров видели? То же самое.

lampslave ★★ ()
Ответ на: комментарий от mos

Я тоже люблю копировать ссылки с первой страницы гугла :) Только вот мне западло руками набивать \n для каждого переноса строки, не говоря уже о самом тексте.

lampslave ★★ ()
Ответ на: комментарий от lampslave

слушать «советы» скородрочеров и школоты не западло. так и запишем.)

я конечно не знал, что ты погуглил, прежде чем сюда идти. не модно это ))

mos ★★☆☆☆ ()
Последнее исправление: mos (всего исправлений: 1)
Ответ на: комментарий от lampslave

Конфиг же не мёртвый, периодически в него будут вноситься изменения, которые желательно бы отслеживать и синхронизировать.

А разве не проще забабахать скрипт, который по SSH/Rsync будет кидать локальный .vimrc на сервер, вместо того, чтобы вручную переносить записи из одного файла в другой?

Картинку с IE с кучей тулбаров видели? То же самое.

Ничуть.

najlus ★★★★★ ()
Ответ на: комментарий от najlus

Автоматизация нужна не ради автоматизации, а чтобы жизнь облегчать.

lampslave ★★ ()
Ответ на: комментарий от lampslave

У меня как раз параграф находит. Можно попробовать поменять что-то в substitute, даже не знаю, что может отличатся и не работать.

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Я может быть что-то не так делаю? Вот замапил я выражение, открыл файл такого вида, дальше что? Надо найти/подсветить все параграфы с единицами и двойками.

1111111
2222

1111111
2222

333

1111111
2222
lampslave ★★ ()
Последнее исправление: lampslave (всего исправлений: 1)
Ответ на: комментарий от lampslave

Перейти на один из параграфов и нажать ,* или \*, в зависимости от настройки <leader> (второй вариант - это вариант по умолчанию). Это в нормальном режиме. Может я зря предположил, что по команде понятно её использование.

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Кино :) Я так и делал, но почему-то выделялась одна строка. Перезапустил vim, замапил снова - начало выделяться нормально. Спасибо.

Уточнение для тех, кто возможно попадёт сюда через поиск. Указываемый параграф должен быть отделён от остального текста пустыми строками, предварительно выделять в visual mode ничего не нужно.

lampslave ★★ ()
Последнее исправление: lampslave (всего исправлений: 1)
Ответ на: комментарий от lampslave

Может быть как-то можно менять ^M на \n при вставке?

Не при вставке, но при нажатии на <CR>

cnoremap <CR> <C-\>esubstitute(getcmdline(), '<C-v><C-m>', '\\n', 'g')<CR><CR>
Если нужно только для поиска, то :help getcmdtype() в помощь.

Это если * и # не привык использовать.

salsa ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.