Skip to content

telescope.nvim 和 telescope-fzf-native.nvim 插件安装之前置条件

趁着国庆假期,把默认 Neovim 的配置从原来的单个 init.lua 配置文件,重构为系统化的多个配置文件。同时也熟悉一下如何一步一步从零使用 Lazyvim 管理插件。

问题出在 telescope-fzf-native.nvim 这个插件安装之后,每次启动 Neovim 都会出现以下报错:

Failed to run `config` for telescope.nvim
                                                                                                                        ...a/lazy/telescope.nvim/lua/telescope/_extensions/init.lua:10: 'fzf' extension doesn't exist or isn't installed: ...nvim-data/lazy/telescope-fzf-native.nvim/lua/fzf_lib.lua:11: cannot load module 'C:/Users/Alowr/AppData/Local/nvim-data/lazy/telescope-fzf-native.nvim/lua/../build/libfzf.dll': 找不到指定的模块。^M                                                                                                                                                                                                                                                                                              # stacktrace:                                                                                                             - telescope.nvim\lua\telescope\_extensions\init.lua:10 _in_ **load_extension**                                          - telescope.nvim\lua\telescope\_extensions\init.lua:62 _in_ **load_extension**                                          - lua/alowree/plugins/telescope.lua:40 _in_ **config**                                                                  - lua/alowree/lazy.lua:14                                                                                               - init.lua:2

我的电脑平行安装了多个 Neovim 版本,我发现每个配置在运行时都会因为这个插件产生同样的报错。于是为了解决这个报错,尝试了以下几种方法。

安装编译软件

进入目录 C:\Users\Alowr\AppData\Local\nvim-data\lazy\telescope-fzf-native.nvim,有个 README.md 文件,里面说:

md
This requires:

- CMake, and the Microsoft C++ Build Tools on Windows
- CMake, make and GCC or Clang on Linux and MacOS

由于使用的电脑是 Windows 系统,于是按照上述指引中的第一条分别安装指定的两个软件:

  • CMake
  • Microsoft C++ Build Tools

安装之后,重启 Neovim 同样的报错仍然存在,并捕捉到以下关键信息:

make: *** [Makefile:23: build/libfzf.dll] Error 1

此时,在 Markdown 文件编辑过程中,<leader>ff 无法调出查找功能。

使用 zig 替换 gcc

进入目录 C:\Users\Alowr\AppData\Local\nvim-data\lazy\telescope-fzf-native.nvim,有个 Makefile 文件,打开,根据报错信息提示,可以发现问题代码在第 23 行。

于是尝试注释掉第 4 行,添加第 5 行,更换 gcczig cc 命令,并将 zig.exe 安装路径添加至环境变量。

CFLAGS += -Wall -Werror -fpic -std=gnu99

ifeq ($(OS),Windows_NT)
    # CC = gcc
    CC = zig cc
    TARGET := libfzf.dll
ifeq (,$(findstring MSYS,$(MSYSTEM)))
	# On Windows, but NOT msys
    MKD = cmd /C mkdir
    RM = cmd /C rmdir /Q /S
else
    MKD = mkdir -p
    RM = rm -rf
endif
else
    MKD = mkdir -p
    RM = rm -rf
    TARGET := libfzf.so
endif

all: build/$(TARGET)

build/$(TARGET): src/fzf.c src/fzf.h
	$(MKD) build
	$(CC) -O3 $(CFLAGS) -shared src/fzf.c -o build/$(TARGET)

build/test: build/$(TARGET) test/test.c
	$(CC) -Og -ggdb3 $(CFLAGS) test/test.c -o build/test -I./src -L./build -lfzf -lexaminer

.PHONY: lint format clangdhappy clean test ntest
lint:
	luacheck lua

format:
	clang-format --style=file --dry-run -Werror src/fzf.c src/fzf.h test/test.c

test: build/test
	@LD_LIBRARY_PATH=${PWD}/build:${PWD}/examiner/build:${LD_LIBRARY_PATH} ./build/test

ntest:
	nvim --headless --noplugin -u test/minrc.vim -c "PlenaryBustedDirectory test/ { minimal_init = './test/minrc.vim' }"

clangdhappy:
	compiledb make

clean:
	$(RM) build

重启 Neovim 报错仍然存在。这说明,这个 Makefile 中的脚本在经过上述修改之后,仍然未能运行成功。但是根据报错提示信息中行号的变化,我们可以肯定报错原因就是 build 命令未能运行成功所致。

手动编译生成

进入目录 C:\Users\Alowr\AppData\Local\nvim-data\lazy\telescope-fzf-native.nvim,在当前目录打开 PowerShell 并运行以下命令:

```ps
 zig cc -O3 -Wall -Werror -fpic -std=gnu99 -shared src/fzf.c -o build/libfzf.dll
```

这时当前目录会生成一个 build 子目录,包含一些文件。

重启 Neovim 发现这个插件导致的报错不再出现,<leader>ff 已经可以正常使用。

小结

由于本人不使用 C 语言,上述涉及到的 CMake,GCC,Clang 等一系列工具相互之间的替代关系也不甚明了,只是想安静地使用 Neovim 及其相关插件,便不再深究。

  1. 由于解决这个问题似乎根本没有使用到 CMake 和 Microsoft C++ Build Tools 这两个软件,尤其是后者占用空间接近 7G,选择删除
  2. 此次暂时手动解决,默认版本后续是否存在其他问题尚未可知,可以其他配置版本中再小心比较和对照

问题再探

查看官方文档 nvim-telescope/telescope-fzf-native.nvim: FZF sorter for telescope written in c

md
Make (Linux, MacOS, Windows with MinGW)

This requires `gcc` or `clang` and `make`

由于 make 已经事先安装,此时只需安装 gcc 即可。

  1. 下载 MinGW-w64 压缩包 Releases · niXman/mingw-builds-binaries (github.com)
  2. 解压并将整个文件目录 mingw64 移动至 D:Program Files\ 目录下,再将 D:\Program Files\mingw64\bin 添加至环境变量
  3. 重启电脑,打开 PowerShell 并运行命令 gcc -v,如果可以正确显示版本信息,表示安装成功
  4. 删除原有插件 telescope-fzf-native.nvim,重启 Neovim 会自动重新安装,安装完毕会正常创建 build 脚本

完美解决。