LuaLS / LuaLS/lua-language-server
Please add an option under the 'hint' category to specify a max length for hints
还没有人认领这个 Issue。
- 主要语言
- Lua
- 星标
- 4.4k
- 派生
- 442
- PR 合并指标
- 30 天内没有已合并 PR
描述
How are you using the lua-language-server?
NeoVim
Which OS are you using?
Windows WSL
What is the issue affecting?
Other
Expected Behaviour
Ideally if the hint is over a certain length it would be trimmed to fit within that length.
Actual Behaviour
Currently there does appear to be some trimming of the hint if it is exceedingly long but it appears that it is very generous with what 'too long' is. In my case I would want it to be far more conservative, but I understand not everyone would have the same preference so a config value would be nice. I'll insert some examples below.
Reproduction steps
First make a really long type (a lot of '@cast' annotations will get you there quickly). Then enable inlay hints and watch as whole lines get filled with the inlay hint.
Additional Notes
Here is an excerpt from my Neovim configuration to demonstrate who bad it can get, I've wrapped the hints in comments to make reading easier:
for _, path --[[ : string ]] in ipairs(--[[ t: ]] vim.api.nvim_list_runtime_paths()) do
local lua_path --[[ : string]] = vim.fs.joinpath(path, "/lua")
local response --[[ : { gen: integer, flags: integer, atime: { nsec: integer, sec: integer }, ctime: { nsec: integer, sec: integer }, birthtime: { nsec: integer, sec: integer }, uid: integer,
gid: integ...(too long)...eger }|nil ]], _, _ = vim.uv.fs_stat(--[[ path: ]] lua_path)
if (response or {}).type == "directory" then
table.insert(paths, lua_path)
end
end
As you can see, the verbosity of the type for response makes the hint basically useless. There doesn't appear to be any faculty for controlling hint length in the lsp client capabilities or Neovim's lsp client so I'm hoping to be able to configure the server to just not send such long inlay hints in the first place.
I got carried away thinking about how limited hints could be displayed. Feel free to ignore everything past this point.
As for what to send instead, in my opinion I see three options:
- Nothing at all. If the type is too long just don't send the hint at all. This could be confusing to some but I believe it's better then filling your line with useless information.
- Hard trim the hint. In the case of the
responsehint, something like this: { gen: integer, flags: integer, atime: { nsec: integer, sec: integer }, ... } | nil. However this could be complex if it isn't simple to calculate a point to cut. - Simplify nested types. Using the response hint as an example again:
: { gen: integer, flags: integer, atime: table, ctime: table, birthtime: table, uid: integer } | nil. This could be combined with 2 to handle very large flat types (a table literal with dozens of keys).
If possible it would prioritise the type information for the top most values, then prioritise the types in the order their defined. The chances of a developer wanting to know the type of a table nested three layers deep is going to rare in comparison to a developer wanting to know the type of the second value in a table.
Ideally that would mean:
- Abbreviating the deepest table literal with
{key: value, ...}and potentially shortening it to justtableif the key/value is particularly long. - Starting at the deepest depth, abbreviate types in reverse definition order.
- If no more types can be abbreviated at the current depth, go up a level and try again.
Ultimately your not guaranteed to be able to shorten any arbitrary type like this, but it would go a long way for long literal types. Only a subset of literals would need to support abbreviation, these are them (in my opinion):
- Table abbreviations would look like:
{ key: value, ... } - Union abbreviations would look like
type | type | ... - Tuple abbreviations would look like
[type, type, ...]
Log File
No response
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
Issue 中没有指明文件或测试。首先定位 hint 配置以及格式化和发送 inlay hints 的代码,然后在 Neovim 中复现较长的 @cast 示例。当 hint 下可配置的最大长度能够限制过长的 hint 且不影响较短的 hint,并且已验证所选择的截断行为时,即可视为完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- lua, neovim
- 领域
- developer-experience, tooling
- Issue 类型
- 功能
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 30/100