Fzf-Lsp

Если вы пользуетесь Neovim в Windows, сразу можно готовиться переписывать плагины за другими.

Не успел я объяснить автору nvim-fzf как работают named pipes в Windows, чтобы он наконец сделал нормальную поддержку этой ОС, пришлось чинить fzf-lsp. Последний использует «стандартный» плагин fzf.vim, написанный самим автором fzf, для показа сообщений из встроенного в Neovim LSP.

Конечно же, написать кроссплатформенно автор не может, у него же нет Windows (непреодолимое препятствие в наши дни!). Дёргать preview.sh, который на моей машине дёргает bash из дистибутива Git и открывает всплывающее чёрное окно для fzf preview — вот кроссплатформенность для разработчиков в наши дни.

Вот как это фиксится.

diff --git a/lua/fzf_lsp.lua b/lua/fzf_lsp.lua
index 79c0365..09c6fe0 100644
--- a/lua/fzf_lsp.lua
+++ b/lua/fzf_lsp.lua
@@ -6,7 +6,7 @@ local M = {}
local __file = debug.getinfo(1, "S").source:match("@(.*)$")
assert(__file ~= nil)
local bin_dir = fn.fnamemodify(__file, ":p:h:h") .. "/bin"
-local bin = { preview = (bin_dir .. "/preview.sh") }
+local bin = { preview = (bin_dir .. '/' .. vim.env.FZF_PREVIEW_COMMAND) }
-- }}}

-- utility functions {{{
@@ -325,8 +325,8 @@ end

local function fzf_locations(bang, prompt, header, source, infile)
   local preview_cmd = (infile and
-    (bin.preview .. " " .. fn.expand("%") .. ":{}") or
-    (bin.preview .. " {}")
+    ('for /f "delims=: tokens=1" %L in ({}) do @(IF %L GEQ 10 (set /a "pre=%L-10">nul) ELSE (set "pre=0"))&&@cmd /a /q /s /v:on /c "' .. bin.preview .. ' --line-range %pre%: --highlight-line %L ' .. fn.expand("%") .. '"')  or
+    ('for /f "delims=: tokens=1,2" %L in ({}) do @(IF %M GEQ 10 (set /a "pre=%M-10">nul) ELSE (set "pre=0"))&&@cmd /a /q /s /v:on /c "' .. bin.preview .. ' --line-range %pre%: --highlight-line %M %L"')
   )
   local options = {
   "--prompt", prompt .. ">",

Одной строкой cmd мы делим строки из диагностики на куски (разделитель: :), и берём первый из них (номер строки) для показа диагностики для текущего буфера, и два (имя файла и номер строки) — для диагностики во всех буферах сразу (это :Diagnostics и :DiagnosticsAll в fzf-lsp). Полученное скармливаем в качестве параметров программе предварительного просмотра, bat. Выводим диапазон -10 от текущей строки, подсвечиваем текущую строку.

Я в курсе, что автор ничего не должен никому. Можно даже сказать, что FOSS расшифровывается как «Fuck Off, [we're writing] Shitty Software». Поэтому придётся поддерживать собственные форки как для fzf.vim, так и для fzf-lsp.