fix_lsp_window shrinks LSP hover float: nvim_win_text_height already accounts for conceal_lines

オープン 初心者向け
#720 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 21 日以内に返信

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
78/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
lua, markdown, neovim
領域
devtools

調査の方向性

lua/render-markdown/lib/compat.luaから始めてM.fix_lsp_windowを調べ、特にnvim_win_text_height()とconceal_linesのextmarkをどのように使っているかを確認してください。報告に記載されたレンダリングのタイミングとウィンドウの高さの挙動を確認します。提案されている再現方法では、Neovimでsqlsを使い、幅の広いテーブルにホバーします。測定された高さでレンダリング済みのテーブル全体がホバーフロートに表示され、縮小されすぎない状態になれば完了です。

索引モデルが issue の本文から書いたものです。

説明

Describe the bug

LSP hover floats get shrunk to a few lines when the hover document contains a rendered markdown table, because compat.fix_lsp_window() subtracts one line per conceal_lines extmark from nvim_win_text_height(), which already returns the post-fold height.

With sqls hovering a 14-column table (18-line hover doc) the float ends up 112x3 instead of 112x19; the rendered table is unreadable (only the first rows visible) even though it was rendered correctly.

:RenderMarkdown disable gives the normal 112x18 float, so this is the plugin, not lspconfig/sqls.

To reproduce

Environment: NVIM v0.13.0-dev-2042+g74f3ce7970, render-markdown 8e87953 (2026-10-10), default opts (file_types = { 'markdown', 'codecompanion' }).

  1. sqlite db with e.g. CREATE TABLE big(a INT, b TEXT, c REAL, d BLOB, e INT, f TEXT, g INT, h TEXT, i INT, j TEXT, k INT, l TEXT, m INT, n TEXT);
  2. sqls connected, cursor on the table name, :lua vim.lsp.buf.hover()

The hover doc is:

# `big` table

| Name   | Type   | Primary key … | … |
| :--------------- | :--------------- | :---------------------- | … |
| `a` | `INT` | `NO` | `-` |  |
…
Actual
win 112x3   nvim_win_text_height = 18 at the time fix_lsp_window runs, 19 after the render settles
extmarks: 15 with conceal_lines, 17 rows of virt_lines (the drawn table)
height = 18 - 15 = 3
Expected

Float large enough for the rendered content (112x19).

Root cause

lua/render-markdown/lib/compat.lua:

-- account for conceal lines marks allowing us to reduce window height
local height = vim.api.nvim_win_text_height(win, {}).all
for _, extmark in ipairs(extmarks) do
    if extmark:get().opts.conceal_lines then
        height = height - 1
    end
end
if height < vim.api.nvim_win_get_height(win) then
    vim.api.nvim_win_set_height(win, height)
end

Verified on this Neovim build that nvim_win_text_height() already excludes lines collapsed by conceal_lines marks: for the same 18-line hover doc, a normal (non-float) markdown buffer after render shows the table on rows 3..20 (18 rows, checked with a pty + screenstring()), while nvim_win_text_height() reports 19 (18 rows + the trailing empty line). So the subtraction is a second deduction and the more conceal_lines marks a table produces, the smaller the float gets.

Note also that the function only ever shrinks (if height < ...), so nothing restores the height when the measurement is too small.

Suggested fix

Trust the measurement, and re-measure after the marks have settled:

function M.fix_lsp_window(buf, win, extmarks)
    local has_lsp = pcall(vim.api.nvim_win_get_var, win, 'lsp_floating_bufnr')
    if not has_lsp then
        return
    end
    local env = require('render-markdown.lib.env')
    local str = require('render-markdown.lib.str')
    -- width handling unchanged
    local width = 0
    for _, line in ipairs(vim.api.nvim_buf_get_lines(buf, 0, -1, false)) do
        width = math.max(width, str.width(line))
    end
    if width <= vim.api.nvim_win_get_width(win) then
        env.win.set(win, 'wrap', false)
    end
    vim.schedule(function()
        if not vim.api.nvim_win_is_valid(win) then
            return
        end
        local height = vim.api.nvim_win_text_height(win, {}).all
        if height ~= vim.api.nvim_win_get_height(win) then
            pcall(vim.api.nvim_win_set_height, win, height)
        end
    end)
end

With this patch the same hover shows 112x19 with the whole table visible. Small terminals stay fine: nvim_win_set_height is clamped by Neovim to the available rows (16-line terminal -> height 14, scrolling inside the float still works).

Checklist
  • I have read the CONTRIBUTING guide
  • I have searched existing issues
主要言語
Lua
スター
5.2k
フォーク
155
平均マージ
5日 10時間
マージ済み PR(30日)
1

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

MeanderingProgrammer/render-markdown.nvim のほかの issue

MeanderingProgrammer/render-markdown.nvim の issue をすべて見る

似ている issue

Lua の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。