sjbach / lusty

LustyExplorer / LustyJuggler for Vim
http://www.vim.org/scripts/script.php?script_id=1890
257 stars 30 forks source link

:LustyBufferGrep doesn't search in every buffer #36

Open romainl opened 13 years ago

romainl commented 13 years ago

Hi.

If I load a number of files in Vim like this:

vim a.txt b.txt c.txt d.txt

I've got a.txt in the current window and the buffer list (:ls) is populated accordingly.

I can use :LustyBufferExplorer to jump to d.txt as expected.

However, when using :LustyBufferGrep the list of sources has all the expected buffers (a.txt to d.txt) but I'm unable to search within them. Only within the current one.

:LustyBufferGrep seems to only work when I've "opened" all the buffers: if I jump to another buffer LustyExplorer is now able to search within the first and the second. That's only 2 buffers but the list of sources still displays 4 buffers.

Is that the correct behaviour?

How shall I do to make it work with all loaded buffers? Say all 150 of them.

Thanks.

sjbach commented 13 years ago

Thanks for the report. I've been caught by this as well - seems like Vim doesn't initiate BufRead for files given on the command line until they're entered for the first time. Since :LustyBufferGrep searches based on the in-memory buffer (mostly for speed), it won't find any matches in these files.

The workaround I've incorporated into my workflow:

Possible solutions:

I'd prefer the first solution; the second one probably opens up a can of worms.

romainl commented 13 years ago

Thanks. Actually I don't do that often so it's not that big of a deal but it can come as a surprise for other users. Opening multiple files like that is quite common, I think.

To be honest I didn't notice this "bug" in my normal workflow. I "discovered" it while doing some experiments to answer a question on StackOverflow.

Yes, the 1st solution seems to be the best of the two.

Thanks again for your answer and for this extremelly useful script.

zoz commented 13 years ago

I just found ":bufdo edit" which will load all the buffers into the editor memory.

I am new to vim, so not sure if this helps.

sjbach commented 13 years ago

Thanks zoz, in tandem with eventignore, that may just be what we need.

grota commented 12 years ago

Ok I did some digging and I wanted to share some findings.

I also see that we are not the only ones that encounter this "problem", kien's ctrlp solves it like this: https://github.com/kien/ctrlp.vim/blob/master/autoload/ctrlp/line.vim#L36 i.e. by explicitly loading the buffer's content. I'm trying to do the same in lusty, see the following (proof of concept) patch. It basically works because I can see that the lines get loaded and grepped but there are still some "structural" issues that I can't quite solve easily: it seems like vim's buffer loading messages break LustyBufferGrep input mode.

I'm basically giving up right now on this issue, but leaving this comment for the posterity.

diff --git c/plugin/lusty-explorer.vim i/plugin/lusty-explorer.vim
index de02b5a..5b4a680 100644
--- c/plugin/lusty-explorer.vim
+++ i/plugin/lusty-explorer.vim
@@ -1474,6 +1474,7 @@ class BufferGrep < Explorer
       # Used to avoid duplicating match strings, which slows down refresh.
       highlight_hash = {}

+      current_bufnr = VIM::Buffer.current.number
       # Search through every line of every open buffer for the
       # given expression.
       @buffer_entries.each do |entry|
@@ -1481,6 +1482,12 @@ class BufferGrep < Explorer
         line_count = vim_buffer.count
         (1..line_count). each do |i|
           line = vim_buffer[i]
+          if line.empty?
+            VIM::command "buffer #{vim_buffer.number}"
+            vim_buffer = entry.vim_buffer
+            line = vim_buffer[i]
+            VIM::command "buffer #{current_bufnr}"
+          end
           match = regex.match(line)
           if match
             matched_str = match.to_s
lisandrofernandez commented 9 years ago

Late but same problem here.