Rust编写的CLI工具第一次使用fish完成时出错

oxf4rvwz  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(140)

问题描述:

我为wsl编写了一个学习rust的CLI工具,它可以使用Windows的explorer.exe打开文件,我称之为'op'。
问题是每次我打开一个新的wsl并在fish shell中输入'op ',然后使用'Tab'来完成,然后就会出现一个错误:

> op error: the directory does not exist
Oops: command not found
- (line 1):
Oops "./completion"
^~~^
from sourcing file -
        called on line 1 of file /usr/share/fish/completions/op.fish
from sourcing file /usr/share/fish/completions/op.fish

(Text“op”为彩色,其他为白色)
/usr/share/fish/completions/op.fish:

op completion fish | source

这似乎与fishshell(3.6.0)有关(bash没有bug,因为没有完成)。但这个bug只发生一次,命令'op'将在那之后有意义。
我有一个‘minigrep‘,它遵循的书。它运行完美,没有错误。
这里是'op'的source code

预期行为:

第一次运行后,正确的行为如下:

> # type 'op ' then 'Tab':
> op 
code/                    culture/  github/  software/
computer-base-for-stat/  essays/

> # type 'Tab' again (first item 'code/' was selected and pre-completed.)
> op code/
code/                    culture/  github/  software/
computer-base-for-stat/  essays/

> # type 'Enter' ('code/' was completed)
> op code/

> # type 'Enter' again
> op code/
> # directory 'code' will open by explorer.exe

更新和解决方案

感谢@faho,这个bug的来源描述如下:
不知何故,op.fish在/usr/share/fish/completions中有一个completion fish脚本www.example.com(通常由同名软件生成。)。但是我的'op'没有生成它,所以这个op.fish与我的'op'冲突完成。
有两种简单的方法来解决它:
1.重命名“op”(不是通过别名,而是通过重建)。
1.将一个空文件写入~/.config/fish/completions/op.fish,这样fish将加载它而不是/usr/share/fish/completions/op.fish。
我已经使用了第二种方式和'op'现在工作得很好!

biswetbf

biswetbf1#

您的代码具有调试打印:
https://github.com/GlekoMa/op/blob/7ae843acbd37a3f64b162aaf4b984094c7be0aa8/src/main.rs#L17

println!("Oops {:?}", path); // This code is for debug.

这将打印Oops ...,所以fish也会,因为你告诉它要source输出,试图将其作为命令运行,命令“Oops”将不存在,所以它将打印错误。
这只会发生在加载完成时,这条鱼通常会在你第一次尝试完成某件事时这样做。
删除该调试语句,在生成完成语句时不打印它(即您得到completion子命令),而是将其打印到stderr(这意味着它将在加载完成语句时显示!)或在其前面加上//作为注解。

brc7rcf0

brc7rcf02#

我已经找到了bug的来源,同时创建了一个最小的可复制的示例:
我用相同的代码创建了一个新项目,发现它运行得很好,没有这个bug!
所以我删除了文件/usr/share/fish/completions/op.fish,并尝试在新的终端中运行'op'。这次没有出现错误。
为我的愚蠢道歉!

相关问题