Как настроить Vim на поиск и сортировку всех строк, содержащих определенную строку?

Я использую vim для управления списком дел и хотел бы установить горячую клавишу, чтобы сделать следующее:

  1. Найдите все строки, содержащие слово под курсором. Мир всегда представляет собой тег в формате #mytaghere.

  2. Отсортируйте все эти строки в алфавитном порядке по другому тегу, содержащемуся в них. Снова тег в формате #mytaghere. Например, все строки с тегом #priorityA будут расположены в алфавитном порядке над всеми строками с тегом #priorityB и так далее.

  3. Поместите все эти строки в окно быстрого исправления Vim.

Мне удалось получить ограниченную версию 1 и 3, поместив в мой файл .vimrc следующее:

map <f2> :vimgrep <cword> % <bar> copen <enter>
set iskeyword=@,48-57,_,192-255,95,35 "lets cword include #s and _s

Эта настройка дает сбой всякий раз, когда слово под курсором содержит #, и работает, когда символ является чем-то другим (например, _ ). Возникает ошибка: «E682: неверный шаблон поиска или разделитель», который кажется, что # мешает с вимгрепом.

Кроме того, я не могу понять, как сортировать строки по тегам приоритета.

Заранее благодарю за любую помощь. Я только изучаю Vim, и если бы я мог просто решить эту проблему, я бы смог использовать его для всей своей организации.


person user2153281    schedule 10.03.2013    source источник
comment
Вероятно, лучше всего использовать разделители вокруг шаблона vimgrep, :vimgrep /<cword>/ % .... Кроме того, здесь может пригодиться :sort //.   -  person glts    schedule 10.03.2013
comment
На vim.org есть много плагинов todo. Вы пробовали какой-нибудь из них?   -  person romainl    schedule 10.03.2013
comment
Я просмотрел несколько разных плагинов, а также несколько проприетарных программ. Однако все, что мне действительно нужно, — это возможность искать теги и сортировать результаты. Чем проще я смогу сохранить свое решение, тем лучше.   -  person user2153281    schedule 10.03.2013


Ответы (2)


Команда :vimgrep существует в двух формах:

:vim[grep][!] /{pattern}/[g][j] {file} ...
:vim[grep][!] {pattern} {file} ...

Для /{pattern}/ фактически можно использовать любой разделитель, не являющийся ключевым словом. Когда ваш <cword> начинается с #, Vim интерпретирует это как начальный разделитель, а затем жалуется, что нет конечного разделителя.

Выберите разделитель и поместите его вокруг <cword>; чтобы сделать поиск буквальным, используйте \V и экранируйте текущее слово, которое теперь вставляется через регистр выражения =:

:noremap <f2> :vimgrep /<C-r>='\V'.escape(expand('<cword>'), '/\')<CR>/ % <bar> copen <enter>

О, и вы должны использовать :noremap; это делает сопоставление невосприимчивым к переназначению и рекурсии.

person Ingo Karkat    schedule 10.03.2013
comment
Большое спасибо за помощь! Это отлично работает, чтобы найти все мои теги и поместить их в окно быстрого исправления. Теперь я просто застрял в том, как их сортировать. Использование :sort сортирует по номеру строки, потому что это то, что указано первым в строке в окне быстрого исправления после имени файла: Dropbox/todo.txt|100 col 34| Фактическая строка для сортировки находится здесь. Итак, я пытаюсь определить диапазон, чтобы исключить все после второго |, но ни одно из моих определений диапазона не работает. - person user2153281; 11.03.2013
comment
Окно быстрого исправления является особенным, вы не можете просто изменить его, как другой буфер. Однако вы можете получать элементы и манипулировать ими с помощью функций getqflist() и setqflist(). - person Ingo Karkat; 11.03.2013
comment
Но после того, как я запустил «установить модифицируемый», а затем «сортировать», сам список отсортирован, просто по неправильному тексту. Он даже спрашивает, хочу ли я сохранить, когда пытаюсь закрыть буфер. Другими словами, я думаю, что я спрашиваю, как использовать «сортировку» таким образом, чтобы игнорировать anyFileNameHere.txt|anyTextHere| - person user2153281; 11.03.2013
comment
Вы можете пропустить ведущий {pattern} с :sort, вы пробовали пропустить это?! - person Ingo Karkat; 11.03.2013
comment
Да, однако ни один из шаблонов, которые я использовал, не работал, чтобы игнорировать все, кроме самой строки. Прошу прощения за свое невежество - я читаю документацию по vim для поиска шаблонов, а также ищу в Интернете. Я просто не знаю, как построить правильный шаблон. - person user2153281; 11.03.2013
comment
Что ж, если вы не можете найти правильный шаблон самостоятельно, я предлагаю задать другой вопрос с подходящим примером того, чего вы хотите достичь. - person Ingo Karkat; 11.03.2013
comment
После нескольких поисков в Google я нашел страницу, объясняющую шаблоны, и заставил ее работать. Спасибо за вашу помощь и терпение. - person user2153281; 11.03.2013
comment
Рад, что смог помочь. Справка отличная и содержит всю информацию на :help pattern, кстати. - person Ingo Karkat; 11.03.2013

Благодаря Ingo Karkat я смог найти следующее решение:

noremap <f2> :vimgrep /<C-r>='\V'.escape(expand('<cword>'), '/\')<CR>/ % <bar> copen <enter>

Приведенное выше возьмет все, что находится под курсором, и поместит его в окно быстрого исправления.

:set modifiable
:sort /.*|.*|/

Приведенное выше сортирует все в окне быстрого исправления, игнорируя имя файла и информацию о строке / столбце.

Чтобы сделать все сразу (найти все строки с тегами и отсортировать их по первому символу этих строк):

noremap <f2> :vimgrep /<C-r>='\V'.escape(expand('<cword>'), '/\')<CR>/ % <bar> copen <enter> <bar> :set modifiable <enter> <bar> :sort /.*\|.*\|/ <enter>
person user2153281    schedule 10.03.2013