2013-03-10 3 views
2

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

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

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

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

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

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

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

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

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

+0

Это, вероятно, лучше использовать разделители вокруг рисунка vimgrep, ': vimgrep/ /% ... '. Кроме того, здесь может использоваться ': sort //'. – glts

+0

На vim.org есть много плагинов todo. Вы пробовали кого-нибудь из них? – romainl

+0

Я просмотрел несколько разных плагинов, а также несколько различных проприетарных программ. Тем не менее, мне действительно нужна возможность поиска тегов и сортировки результатов. Чем проще я смогу сохранить свое решение, тем лучше. – user2153281

ответ

1

Команда :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> 

О, и you should use :noremap; он делает отображение неустойчивым к переназначению и рекурсии.

+0

Большое спасибо за помощь! Это отлично работает, чтобы найти все мои теги и поместить их в окно quickfix. Теперь я просто зациклился на том, как их сортировать. Использование: сортировка сортируется по номеру строки, потому что это то, что указано первым в строке в окне quickfix после имени файла: Dropbox/todo.txt | 100 col 34 | Фактическая строка для сортировки здесь Итак, я пытаюсь определить диапазон, чтобы исключить все после второго |, но ни одно из моих определений диапазонов не работает – user2153281

+0

Окно quickfix является специальным, вы не можете просто изменить его, как другой буфер. Однако вы можете получать и обрабатывать элементы с функциями 'getqflist()' и 'setqflist()'. –

+0

Но после того, как я запустил «set modifiable», а затем «sort», сам список отсортирован, как раз по неправильному тексту. Он даже спрашивает, хочу ли я сохранить, когда пытаюсь закрыть буфер. Другими словами, я предполагаю, что я спрашиваю, как использовать «сортировку» таким образом, который игнорирует anyFileNameHere.txt | anyTextHere | – user2153281

0

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

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

выше будет брать все под курсором и поместите его в окно QuickFix.

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^