В чем разница между списком местоположений и списком быстрых исправлений в vim


94

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

In Vim the quickfix commands are used more generally to find a list of positions 
in files.For example, |:vimgrep| finds pattern matches.  You can use the positions 
in a script with the |getqflist()| function. Thus you can do a lot more than the
edit/compile/fix cycle!
...
...

                         *location-list* *E776* 
A location list is similar to a quickfix list and contains a list of positions 
in files.  A location list is associated with a window and each window can have 
a separate location list.  A location list can be associated with only one window.  
The location list is independent of the quickfix list.

...

введите описание изображения здесь

ОБНОВИТЬ

Отсюда я нашел следующее .

These commands all fill a list with the results of their search. "grep" and 
"vimgrep" fill the "quickfix list", which can be opened with :cw or :copen, 
and is a list shared between ALL windows. "lgrep" and "lvimgrep" fill the 
"location list," which is local to the current window, and can be opened 
with :lw or :lopen. Both of these lists can be used to instantly jump to 
the matching line in whatever file it occurs in.

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

Ответы:


110

Список местоположений является локальным для текущего окна, поэтому у вас может быть столько же списков местоположений, сколько окон: 30 окон? Хорошо, вот ваши 30 списков одновременных местоположений.

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

Не путайте «списки» местоположения / quickfix (структуры данных) с «окнами» местоположения / quickfix (окнами, отображающими содержимое этих структур данных). «Окна» ведут себя аналогично, а «списки» - нет. Разница важна, потому что эти окна, к счастью, не единственные способы взаимодействия с этими списками: есть много команд, которые позволяют нам перемещаться по этим спискам, не открывая связанные окна, и знание разницы между этими списками является ключом к эффективному использованию этих команд. .

Практический иллюстрированный пример:

$ vim -O foo.txt bar.txt

  1. Есть ли :lvim foo %в foo.txtсоздать список местоположения для окна , содержащего foo.txt.

  2. Сделайте :lneнесколько раз , чтобы перейти к нескольким fooдюйма foo.txt.

  3. Сосредоточьтесь bar.txtи делайте :lne. Что происходит?

  4. Теперь выполните :lvim bar %in, bar.txtчтобы создать список местоположений для окна, содержащего bar.txt.

  5. Сделайте :lneнесколько раз. К каким матчам вы переходите? В каком буфере? В каком окне?

  6. Переключитесь в другое окно и сделайте :lneнесколько раз. Что происходит?

  7. Снова переключитесь на bar.txt. Что :lneделать?

  8. Теперь, сделать :vim bar %в , bar.txtчтобы создать список QuickFix.

  9. Сделайте :cnнесколько раз , чтобы перейти к нескольким barдюйма bar.txt.

  10. Теперь сосредоточьтесь на том foo.txt, что делает :cn?

Местоположение, в которое вы переходите, :lneзависит от окна, в котором вы находитесь, но ошибка, с которой вы переходите :cn, всегда одна и та же (пока вы не замените текущий список быстрых исправлений другим).

Оба списка имеют относительно четкие роли, ИМО: список быстрого исправления (и, следовательно, окно быстрого исправления) обычно и вполне логично посвящен ошибкам, и список местоположений кажется (мне) подходящим для поиска.


10
В более общем плане: список quickfix лучше всего подходит, когда ваш поиск или компиляция включает несколько файлов, список местоположений лучше всего, когда задействован только один файл.
Trebor Rude

5
В частности, если вы запустите vim с -q errors.txt, после помещения ошибок компиляции в errors.txt(т.е. gcc -Wall *.c >errors.txt 2>&1), vim заполнит список quickfix из списка ошибок компиляции, что очень удобно.
Кевин

@TreborRude, я так не думаю. Например, предположим, что у вас есть две вертикально разделенные окна (как показано в ответ выше) и хотите найти несколько файлов ( foo1.txt, foo2.txt, ...) для fooв левом окне и несколько файлов ( bar1.txt, bar2.txt, ...) для barв правом окне. Вы можете запустить :lv foo foo*в левом окне, а затем :lv bar bar*в правом окне. Тогда в левом окне :lneотобразится следующее совпадение для foo, а не bar. Это связано с тем, что :lvиспользуется список местоположений того окна, в котором вы его запускаете, поэтому каждый поиск имеет свой собственный список местоположений.
ma11hew28
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.