有什么方法可以通过按组合键返回到 fish shell 中准备输入的命令吗?

Is there any way to come back to a ready-to-enter command in fish shell by just pressing a combination of keys?

有时我有一个命令准备好按 enter 但我已经以某种方式更改了该命令并且它是一个长命令,然后我记得我必须打开一个文本文件(例如获取一些信息我将在命令中使用)。所以大多数时候我所做的是取消该命令 (Ctrl+C),然后打开文本文件获取我需要的信息,然后使用文本文件中粘贴的值再次重新键入命令。这对我来说不是很有效,特别是如果服务器没有任何类型的 GUI 并且我无法复制以前的命令所以我不会丢失它。

所以我的问题是,是否有任何一种组合键可以用来保存准备输入的命令,这样我就不会丢失它,也不必重新输入它?

谢谢!

目前无法开箱即用。

最简单的方法可能是

  • 更改取消绑定以隐藏命令行

  • 添加绑定以调用隐藏的命令行

它会像这样工作:

调用函数:

function recall_commandline
    if set -q stashed_commandline
        commandline -r -- $stashed_commandline
    end
end

添加到 __fish_cancel_commandline(使用 funced __fish_cancel_commandline。如果您满意,请执行 funcsave __fish_cancel_commandline):

set -g stashed_commandline $cmd
# right before:
commandline ""

添加到fish_user_key_bindings

bind \cr recall_commandline

这将允许您按 Ctrl+r 来调用上次取消的命令行。将它扩展到多个是非常重要的(因为 "commandlines" 可以有多行),将命令行添加到历史记录以便可以使用正常绑定重新调用它们也是如此。

我有以下函数来转换comment/uncomment当前语句:

function toggle-comment-cmd-buffer --description 'Comment/Uncomment the current or every line'
    set -l cmdlines (commandline -b)
    if test "$cmdlines" = ""
        return
    end
    set -l cmdlines (printf '%s\n' '#'$cmdlines | string replace -r '^##' '')
    commandline -r $cmdlines
    string match -q '#*' $cmdlines[1]; and commandline -f execute
end

我这样绑定:bind \e\# toggle-comment-cmd-buffer。这样我就可以快速评论并将当前语句放入我的命令历史记录中以便执行其他操作。然后我可以调出注释再按[alt-#]去掉注释字符继续修改命令

我在我的个人鱼配置中设置了它,因为我已经习惯了在 ksh93 中做类似的事情。