Telescope.nvim 的 :Telescope 命令如何传递含空格或 Lua table 形式的选项
Telescope.nvim 的 :Telescope 命令如何传递含空格或 Lua table 形式的选项【免费下载链接】telescope.nvimFind, Filter, Preview, Pick. All lua, all the time.项目地址: https://gitcode.com/GitHub_Trending/te/telescope.nvim在 Neovim 中已经装好 Telescope.nvim 之后直接用:Telescope find_files打开 picker 是最常见的用法但一旦想临时改选项——比如把find_files的搜索命令换成 fd或者调整layout_config——命令行上就碰到两类写法问题选项的默认值是 Lua table 时值该怎么写以及选项值里含空格时:Telescope命令viml 形式根本无法表达。官方帮助*telescope.command*一节和 lua/telescope/command.lua 的解析实现把这两件事说得比较清楚本文按“先弄清两种 API、再写 table 选项、再处理空格选项、最后验证”的顺序整理。前提条件来自 README.md 的 RequirementsNeovim v0.11.7 且以 LuaJIT 构建用:version检查已安装 nvim-lua/plenary.nvimTelescope 本身已安装并能运行:Telescope find_files。命令行传选项的两种 API官方帮助doc/telescope.txt 的*telescope.command*章节说明Telescope 命令有两种调用方式lua API直接调用 Lua 函数选项就是一个普通的 Lua table没有解析限制。在 Neovim 命令行中的写法是加:lua前缀:lua require(telescope.builtin).find_files { hidden true, layout_config { prompt_position top } }viml API:Telescope picker keyvalue形式。命令字符串会先被解析成等价的 Lua 调用选项用赋值当对应 Lua 函数需要 table 时值要写成 viml 的 list/dictionary 语法。帮助中给出的例子:Telescope find_files hiddentrue layout_config{prompt_position:top}帮助同时明确给出了 viml API 的硬性限制任何选项里都不能含空格原文 there can be no spaces in any of the options。这是下面两节的分界线table 形式的值可以留在 viml API 里写含空格的值必须换到 lua API。在 viml 形式里写 Lua table 选项解析逻辑在 lua/telescope/command.lua 的convert_user_opts里选项按其默认配置值的类型分发处理默认类型是 table 的选项会先按 vimscript 表达式求值vim.fn.eval失败后再按 Lua 表达式求值且只接受结果为 table 的值。仓库自带的 lua/tests/automated/command_spec.lua 记录了各类写法及其期望的转换结果可直接照抄这几种写法viml dictionary。两种等价写法#{...}与{key:value}:Telescope find_files layout_config{prompt_position:top} :Telescope find_files layout_config#{prompt_position:bottom}测试文件期望前者解析为layout_config { prompt_position top }。Lua table值不含空格时:Telescope find_files layout_config{prompt_positionbottom}期望解析为layout_config { prompt_position bottom }。逗号分隔的 list。find_command、vimgrep_arguments以及sections、search_dirs、symbols、ignore_symbols源码中的split_keywords这类选项在上面两种 table 求值都失败后会把值按逗号split成 list。README.md 的 Vim Commands 一节给出的示例:Telescope find_files find_commandrg,--ignore,--hidden,--files prompt_prefix测试文件还记录了find_command fd,-t,f,-H期望解析为{fd, -t, f, -H}、fdfind,--type,f,--no-ignore期望解析为{fdfind, --type, f, --no-ignore}。所以规则可以归纳为覆盖find_command这类表实际上是命令词列表的选项用逗号连写、中间不能有空格嵌套 table如layout_config用 viml 或 Lua 的 table 语法写同样保持无空格。find_command在:help telescope.builtin中登记为function|table类型、默认自动探测覆盖它不会破坏默认行为。含空格的选项为什么不行以及改走 :lua API帮助原文给出了两个例子想用find_files的cwd选项只搜索/foo bar/subfolder/这个文件夹时路径含空格viml API 做不了同样下面这条命令也不成立因为选项值里有空格:Telescope find_files layout_config{ prompt_position : top }原因在于:Telescope命令在 plugin/telescope.lua 中以nargs *注册命令行参数先按空白切分含空格的值会被拆成多个参数load_command再把每个参数按拆开还原选项此时原始值已经无法恢复。解决办法是改用上面第一种 API它传的就是完整的 Lua table字符串里含空格、嵌套 table 都不受影响。帮助给出的命令行形式是:lua require(telescope.builtin).find_files { hidden true, layout_config { prompt_position top } }对含空格的路径路径沿用帮助中的示例值写成:lua require(telescope.builtin).find_files { cwd /foo bar/subfolder/ }cwd是find_files文档中登记的 string 选项见:help telescope.builtin。同样的调用也可以直接写在 lua 配置文件里或在 vim 文件里加lua前缀帮助对这两种位置都给了对应示例。验证选项是否传对按以下顺序核对即可全部是仓库文档中已有的检查方式选项名拼写命令行输入:Telescope |tab可补全 picker 名输入 picker 名后再按Tab补全选项名补全列表来自默认配置项的 keyplugin/telescope.lua 的complete函数可快速确认选项名没写错。运行 picker按 README.md 的 Usage 建议先跑:Telescope find_files确认安装可用改成带选项的命令如:Telescope find_files find_commandfd,-t,f,-H后 picker 正常打开说明选项被接受。find_command决定find_files列出文件时执行的命令换了之后结果列表的来源也随之改变。解析用例仓库根目录的 Makefile 有test目标会启动一次 headless Neovim 运行lua/tests/automated/下的自动化测试其中包含上面引用的 command_spec.luanvim --headless --noplugin -u scripts/minimal_init.vim -c PlenaryBustedDirectory lua/tests/automated/ { minimal_init ./scripts/minimal_init.vim }该命令只启动 headless 实例跑测试不修改仓库文件。正文中列出的每种写法的期望解析结果均取自该测试文件的断言属于文档记录的示例。 4.类型不匹配的征兆如果某个选项写成的值与它的默认类型对不上解析器会发出 WARN 通知Type of ... does not match见 lua/telescope/command.lua 的_switch_metatable。看到这条通知时先检查选项的类型写法。限制与边界viml API:Telescope命令的选项不允许出现任何空格包括 table 值内部这是文档明确的限制不是笔误可绕开的写法问题。含空格的值一律改走:lua形式。viml API 中只有keyvalue形式的参数才会被当作选项不含的参数按扩展子命令名处理load_command的逻辑也对应 README 里Telescope dap configurations这类扩展用法。table 值求值失败且不属于逗号分隔类选项时该选项会被置为 nil源码注释 discard invalid lua expression即选项被静默忽略、不报错这时结合第 4 条的 WARN 通知判断是否写错。需要更多 picker 和选项的完整列表时读:help telescope.builtintelescope.command帮助章节doc/telescope.txt是本文所有语法结论的出处。【免费下载链接】telescope.nvimFind, Filter, Preview, Pick. All lua, all the time.项目地址: https://gitcode.com/GitHub_Trending/te/telescope.nvim创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考