Since LUA is single threaded I reached a limit to performance
optimization, both 'git_icons' and 'file_icons' require string
matching and manipulations which eventually hurt performance
when running on large amount of files.
In order to solve that this commit introduces the option to spawn
commands and process the entries in a separate neovim process which
prints to stdio as if it was a regular shell command. This speeds up
things significantly and also makes the UI super responsive as if fzf
was run in the shell. This required a few lua hacks to be able to load
nvim-web-devicons in a '--headless --clean' instance and sharing the
user configuration through the RPC interface from the running instance.
This is enabled by default for 'files' and 'grep' providers and can also
be enabled for 'git.files' if required, control using the 'multiprocess'
option.
also changes buffers preview to read lines from the buffer instead
of attaching the exisiting buffer to the preview window, the former
turned out to changed the 'lastused' field of the buffer which was
undesireable for buffer sorting.
'nvim-jdtls' extends the LSP to support eclipse jdt classes
since classes are inside '.jar' file it displays them as 'jdt://'
URIs which are then handled by 'nvim-jdtls', we can then use
'vim.lsp.util.jump_to_location' to open the URIs.
Warning: this may cause a performance degradation so you have to
manually enable this by setting `grep.experimental = true` or directly
via `:lua require'fzf-lua'.live_grep({ experimental = true })`
'fzf_binds' and 'previewers.builtin.keymap' were merged and moved under
'keymap.fzf' and 'keymap.builtin' respectively.
See ':help fzf-lua-customization' how to reconfigure.
See :help local-options for more details, but essentially, we have to be
very careful with how we set window-local options on popup windows,
because buffers might take some window-local options from the last
window they were displayed in with them to the new window in certain
circumstances.
This commit changes the backup/restore for the window options so that
the possible window-local options that might get clobbered are saved
from the original active window and reapplied to the preview window just
before it's closed. This ensures any buffers loaded from the picker will
have the same window options applied that were in the active window when
fzf was opened.
Whenever the file ends with newline, the builtin previewer was adding an
empty line at the end of the file. That's a side effect splitting and
rejoining the lines with \n. Basically, when we split a\nb\nc\n we get
{'a', 'b', 'c', ''}, then nvim_buf_set_lines treats each item in the
table as a line, and inserts an empty line at the end.
We do need to account for files that don't end with a new line though,
hence the check.
I don't have a way to test the \r\n logic locally, no Windows hosts
around, but it should work too.