
Я использую окно quickfix для агрегации результатов поиска из grep
. Однако иногда мне хочется вернуться к некоторым результатам. Есть ли способ создать еще одно окно quickfix, куда я мог бы вставить строки и ссылаться на них позже?
Спасибо
решение1
Vim поставляется с:help cfilter-plugin
что позволяет вамудалятьзаписи быстрого исправления вам больше не нужны, поэтому все работает наоборот.
В качестве альтернативы вы можете создать новый список быстрых исправлений на основе текущего, поскольку Vim поддерживает стек таких списков (cp.:help :colder
). Однако если вы хотите интерактивно выбрать несколько записей, то создание нового списка в первый раз и последующий вызов этого нового списка может оказаться обременительным.
Так что вы могли бы разумно использоватьlocation-list
Вместо этого он работает так же, как Quickfix, но является локальным для окна (в данном случае: окна Quickfix).
Чтобы скопировать всю текущую запись без ее повторного анализа, используйте низкоуровневыйgetqflist()
иsetloclist()
может быть использован:
:call setloclist(0, [getqflist()[line('.') - 1]], 'a')
| | | |
| | | +-- ... and append
| | +-- select the current one
| +-- entries from the quickfix list
+-- Location list for the current window ...
Вы можете привязать это к ключу nnoremap <LocalLeader>ql
, добавив в начало и поместив определение сопоставления в ~/.vim/after/ftplugin/qf.vim
.
Плагин решения
Вот полный плагин, который также поддерживает подсчет, повтор через .
, визуальный режим и сбор записей списка местоположений в список быстрых исправлений. Он требует моегоплагин ingo-library, 1.040 или выше, в настоящее время доступно только как снимок для разработчиков наGitHub. Его также можно скопировать в ~/.vim/after/ftplugin/qf.vim
:
function! s:Mapping( mappingType, sourceType, targetType, startLnum, endLnum ) abort
if ingo#window#quickfix#IsQuickfixList(1) != a:sourceType
call ingo#err#Set(printf('Not in a %s list', (a:sourceType == 1 ? 'quickfix' : 'location')))
return 0
endif
let l:qfEntries = ingo#window#quickfix#GetList()[(a:startLnum - 1) : (a:endLnum - 1)]
if empty(l:qfEntries)
call ingo#err#Set('No entries')
return 0
endif
silent call ingo#event#Trigger(printf('QuickFixCmdPre %scopy', ingo#window#quickfix#GetPrefix(a:targetType)))
call ingo#window#quickfix#SetOtherList(a:targetType, l:qfEntries, 'a')
silent call ingo#event#Trigger(printf('QuickFixCmdPost %scopy', ingo#window#quickfix#GetPrefix(a:targetType)))
echomsg printf('%s entr%s copied to %s', len(l:qfEntries), (len(l:qfEntries) == 1 ? 'y' : 'ies'), ingo#window#quickfix#GetName(a:targetType))
let l:mappingPrefix = "\<Plug>(QuickfixCopyTo" . a:mappingType
silent! call repeat#set(l:mappingPrefix . 'Lines)', len(l:qfEntries))
silent! call visualrepeat#set(l:mappingPrefix . 'Selection)', len(l:qfEntries))
return 1
endfunction
" [N]<LocalLeader>qc Copy the current [N] location list entries to the
" quickfix list.
" [N]<LocalLeader>ql Copy the current [N] quickfix entries to a location list
" (for the current quickfix window).
nnoremap <buffer> <silent> <Plug>(QuickfixCopyToQuickfixLines) :<C-u>if ! <SID>Mapping('Quickfix', 2, 1, line('.'), line('.') + v:count1 - 1)<Bar>echoerr ingo#err#Get()<Bar>endif<CR>
xnoremap <buffer> <silent> <Plug>(QuickfixCopyToQuickfixSelection) :<C-u>if ! <SID>Mapping('Quickfix', 2, 1, line("'<"), line("'>"))<Bar>echoerr ingo#err#Get()<Bar>endif<CR>
nnoremap <buffer> <silent> <Plug>(QuickfixCopyToLocListLines) :<C-u>if ! <SID>Mapping('LocList', 1, 2, line('.'), line('.') + v:count1 - 1)<Bar>echoerr ingo#err#Get()<Bar>endif<CR>
xnoremap <buffer> <silent> <Plug>(QuickfixCopyToLocListSelection) :<C-u>if ! <SID>Mapping('LocList', 1, 2, line("'<"), line("'>"))<Bar>echoerr ingo#err#Get()<Bar>endif<CR>
if ! hasmapto('<Plug>(QuickfixCopyToQuickfixLines)', 'n')
nmap <LocalLeader>qc <Plug>(QuickfixCopyToQuickfixLines)
endif
if ! hasmapto('<Plug>(QuickfixCopyToQuickfixSelection)', 'v')
xmap <LocalLeader>qc <Plug>(QuickfixCopyToQuickfixSelection)
endif
if ! hasmapto('<Plug>(QuickfixCopyToLocListLines)', 'n')
nmap <LocalLeader>ql <Plug>(QuickfixCopyToLocListLines)
endif
if ! hasmapto('<Plug>(QuickfixCopyToLocListSelection)', 'v')
xmap <LocalLeader>ql <Plug>(QuickfixCopyToLocListSelection)
endif