我想将zsh的函数移植为fishshell

时间:2016-01-12 16:21:24

标签: shell command-line fish

我有一个与fishshell有关的问题。

我写了zsh的功能:

function agvim() {
  vim $(ag "$@" | peco --query "$LBUFFER" | awk -F : '{print "-c " $2 " " $1}')
}

它有效。

但我刚移植此功能无法正常工作,此功能从zsh移植到fishshell。

function agvim
  ag $argv | peco --query "$LBUFFER" | awk -F : '{print "-c " $2 " " $1}' >> $HOME/.agvim_history
  vim (tail -n 1 $HOME/.agvim_history)
end

然而它无法正常工作。 vim命令将以tail的输出作为文件名打开。 因为我认为expand-command-substitution与zsh略有不同。 这是尾部的输出示例-c 3 bin/ec,我想将此输出用作选项。

请告诉我更好的解决方案。

2 个答案:

答案 0 :(得分:1)

  

这是尾部的输出示例-c 3 bin / ec,我想将此输出用作选项。

你遇到的问题是zsh,就像bash一样,会在空格上拆分命令替换,而fish只会在换行符上拆分。

这意味着zsh会将“-c”,“3”和“bin / ec”发送给vim,而fish会发送“-c 3 bin / ec”作为一个参数。

有几种方法可以解决这个问题 - 一种方法,如果你是从git运行鱼,就是使用tail | string split " "。另一个适用于任何鱼类版本的是使用sed(tail | sed "s/ /\n/g")。

答案 1 :(得分:-1)

如果您信任输入,则可以使用eval

function agvim
  eval vim (ag $argv | peco --query "$LBUFFER" | awk -F: '{print "-c",$2,$1}')
end