如何在 fish vi 键绑定中添加键映射?

如何在 fish vi 键绑定中添加键映射?

我刚刚开始使用 fish,我很喜欢它提供的 vi 键绑定。

不过,我想添加一个我在 vi 中使用的自定义键盘映射。我通常space+c在可视模式下映射到 yan "*(系统剪贴板)。如何在 fish 中添加这样的键盘映射?

我在 MacOS 12 上使用 fish 3.3.1。

编辑:我试过了

bind -M visual \x20c '"*y'

并收到以下错误

fish: Unexpected end of string, quotes are not balanced

还尝试用修饰符代替空格,得到了相同的结果。

答案1

有几种可能性:

  • 首先,如果您当前正在使用"*y拉到系统剪贴板,那么您可以通过bindFish 看到默认绑定是:

    bind -M visual -m default '"*y' 'commandline -s | xsel -p; commandline -f end-selection repaint-mode'
    

    因此,您应该能够SPACEc通过以下方式重新创建该内容:

    bind -M visual -m default \x20c 'commandline -s | xsel -p; commandline -f end-selection repaint-mode'
    
  • 还有fish_clipboard_copy以下列出的功能文档,所以bind另一种可能性可能是:

    bind -M visual -m default \20c fish_clipboard_copy
    

    ...但我认为您也需要使用相反的方法fish_clipboard_paste,而不是xsel

答案2

错误是因为绑定设置的命令无效。您无法"*y在命令行中运行(如果您尝试使用fish -c '"*y',则会得到相同的错误)。

命令 tobind只需要是命令即可。这就是 usingfish_clipboard_copy正常工作的原因。至少在 fish 3.3.1 及之前版本中,无法执行其他键绑定。

答案3

我认为不可能对两个“普通”字符进行绑定。当文档bind指的是“字符序列”,我认为它意味着零个或多个修饰符(ctrl、alt、shift)后跟一个“常规”字符。

我有和的绑定来!!模仿!$bash 对它们的操作,它看起来像这样:

function bind_bang
    switch (commandline -t)[-1]
    case "!"
        commandline -t $history[1]; commandline -f repaint
    case "*"
        commandline -i !
    end
end

function bind_dollar
    switch (commandline -t)[-1]
    case "!"
        commandline -t ""
        commandline -f history-token-search-backward
    case "*"
        commandline -i '$'
    end
end

bind ! bind_bang
bind '$' bind_dollar

每个绑定函数都必须寻找前一个字符在命令行中。

我不使用 fish 中的 vi 模式(我早在 fish 有 vi 模式之前就开始使用它了,所以我的手指已经受过训练了)——我不确定你将如何实现粘贴。

相关内容