Fish shell 函数在作业控制中显示 $argv,而不是文件
Fish shell functions show $argv in job control, not file
我正在尝试改用鱼 shell 但我 运行 遇到了一个症结所在。如果我将 vi 别名为 vim 并编辑文件,我无法在作业控制中看到我正在编辑哪个文件。
polis@josh1 ~> function testvi
vim $argv
end
polis@josh1 ~> functions testvi
function testvi
vim $argv
end
polis@josh1 ~> testvi foobar
polis@josh1 ~> jobs
Job Group CPU State Command
2 26087 0% stopped vim $argv
我如何做到输出为:
2 26087 0% stopped vim foobar
我们的想法是先将 $argv
扩展为一个新命令,然后再执行它。我们可以用 eval
.
来做到这一点
然而,这有一个问题,即新命令中的任何特殊字符都会被解释,所以我们需要先将它们转义。
整体功能为:
function testvi
eval "vim "(string escape $argv)
end
这使用了新的 string
内置函数,它在刚刚发布的 fish 2.3.0 中。
结果说明,此处编辑文件 'foobar $baz' 以显示转义有效:
> testvi 'foobar $baz'
> jobs
Job Group State Command
5 60249 stopped vim 'foobar $baz'
在这种情况下,命令缩写比别名(即函数)更可取:
abbr -a vi vim
现在,当您键入 "vi" 并按 space 时,它将神奇地替换为 "vim"。您可以进行更复杂的扩展。例如,我经常使用这些缩写:
abbr -a gca git commit --amend
abbr -a gcm git checkout master
缩写的优点是它们比函数简单得多,并且扩展显示在您的 shell 历史记录中,我发现它比别名函数名更有用。
我正在尝试改用鱼 shell 但我 运行 遇到了一个症结所在。如果我将 vi 别名为 vim 并编辑文件,我无法在作业控制中看到我正在编辑哪个文件。
polis@josh1 ~> function testvi
vim $argv
end
polis@josh1 ~> functions testvi
function testvi
vim $argv
end
polis@josh1 ~> testvi foobar
polis@josh1 ~> jobs
Job Group CPU State Command
2 26087 0% stopped vim $argv
我如何做到输出为:
2 26087 0% stopped vim foobar
我们的想法是先将 $argv
扩展为一个新命令,然后再执行它。我们可以用 eval
.
然而,这有一个问题,即新命令中的任何特殊字符都会被解释,所以我们需要先将它们转义。
整体功能为:
function testvi
eval "vim "(string escape $argv)
end
这使用了新的 string
内置函数,它在刚刚发布的 fish 2.3.0 中。
结果说明,此处编辑文件 'foobar $baz' 以显示转义有效:
> testvi 'foobar $baz'
> jobs
Job Group State Command
5 60249 stopped vim 'foobar $baz'
在这种情况下,命令缩写比别名(即函数)更可取:
abbr -a vi vim
现在,当您键入 "vi" 并按 space 时,它将神奇地替换为 "vim"。您可以进行更复杂的扩展。例如,我经常使用这些缩写:
abbr -a gca git commit --amend
abbr -a gcm git checkout master
缩写的优点是它们比函数简单得多,并且扩展显示在您的 shell 历史记录中,我发现它比别名函数名更有用。