我正在尝试写一个缩写来执行以下操作:
如果整个缓冲区中某处有
<<
,它将用 bash -c "<the-buffer>"
将其括起来
所以,如果我跑步
tee $HOME/Desktop/test << END
I am testing!
END
它将运行以下命令。
bash -c "tee $HOME/Desktop/test << END
I am testing!
END"
我想出的代码是:
function run_in_bash
# Run the command in bash
bash -c "(commandline --current-buffer)"
end
abbr --add run_in_bash_abbr --regex '.*<<.*' --function run_in_bash
但是现在当我跑步时:
tee $HOME/Desktop/test << END
I am testing!
END
它说
fish: Expected a string, but found a redirection
。我在这里能做什么?
这里存在一些误解,不幸的是其中之一意味着这种方法从根本上是行不通的。
首先是 abbr 函数需要 打印替换文本,而不是运行它。
所以你会做
echo bash -c \'"$(commandline --current-buffer)"\'
,而不是直接bash -c "..."
。它还必须是 $()
,以便替换发生在那里,并在插入命令行的情况下打印它。您还必须转义缓冲区文本,以便将其用作单个参数 - commandline --current-buffer | string escape
。
第二个原因是,缩写是由最后一个标记触发的,而正则表达式仅与该一个标记相匹配,这也是导致这种方法无法实现的原因。
这意味着一旦您输入
<<
,缩写就会运行,并用它打印的内容替换 <<
并且仅替换 <<
。
(或者至少会,但由于
<<
不是 Fish 中的有效标记,因此它会单独在 <
上运行缩写,因此您实际上无法将 <<
与缩写匹配)