3

我正在使用Oh-My-ZSH来创建一些别名和功能,以减轻我重复的工作量。

我需要从计算机中的任何位置导航到我的前端目录。这就是我所拥有的:

frontend(){
  cd ~/Desktop/Work/Frontend
  cd $1
}

现在,当我输入frontend或时,这很有效,但是,我的所有项目文件夹都以,等frontend myProject后缀。.m.tablet

我怎样才能写出这样的东西:

  • 将让我自动导航到后面跟着的文件夹.something

  • 当有多个选项(如project.mproject.tablet)时,会提示我选项类似于您在终端中点击选项卡并获得多个自动完成选项。

我希望我的问题是有道理的。

谢谢。

4

2 回答 2

5

先找zsh解决办法,再找bash解决办法。

更新:事实证明,zsh实现(基于 builtin compctl)比bash实现(基于 builtin complete)简单得多。

将感兴趣的代码保存到文件(例如,frontend)并获取它(例如,);以交互方式,或者最好从您的 bash/zsh 配置文件中。. ./frontend

一旦到位,子目录名称的自动完成~/Desktop/Work/Frontend将按如下方式工作:

  • 例如,键入,frontend myProject然后按 TAB。
  • myProject然后与以下子目录的名称进行前缀匹配~/Desktop/Work/Frontend
    • 如果只有 1 个匹配项,myProject将立即扩展到完整的子目录名称。
    • 否则,会发出哔声,表示有多个匹配项:
      • zsh:所有匹配的子目录的名称都会立即列出。
      • bash:再次按 TAB列出所有匹配的子目录的名称
      • 继续键入直到前缀匹配明确,然后再次按 TAB。

注意:在bash中,也只需按 TAB一次即可列出多个匹配项,请将以下内容添加到您的 shell 配置文件bind "set show-all-if-ambiguous on"中。


zsh解决方案:

# Define the shell function.
frontend(){
  cd ~/Desktop/Work/Frontend/"${1:-}"
}

# Tell zsh to autocomplete directory names in the same directory as
# the function's when typing a command based on the shell function.
compctl -/ -W ~/Desktop/Work/Frontend frontend

重击解决方案:

注意:complete -o dirnames不幸的是,它不带参数 - 它总是自动完成当前目录。因此,需要一个返回潜在匹配项的自定义 shell 函数,并结合-o filenames, 。

# Define the main shell function.
frontend(){
    local BASEDIR=~/Desktop/Work/Frontend
  cd "$BASEDIR/${1:-}"
}

# Define the custom completion function.
_frontend_completions() {
    local BASEDIR=~/Desktop/Work/Frontend

    # Initialize the array variable through which
    # completions must be passed out.
  COMPREPLY=() 

    # Find all matching directories in the base folder that start
    # with the name prefix typed so far and return them.
  for f in "$BASEDIR/${COMP_WORDS[COMP_CWORD]}"*; do
    [[ -d $f ]] && COMPREPLY+=( "$(basename "$f")" )
  done

}

# Tell bash to autocomplete directory names as returned by the
# _frontend_completions() helper functoin when typing a command 
# based on the main shell function.
complete -o filenames -F _frontend_completions frontend fe
于 2014-02-28T22:54:45.800 回答
1

我强烈推荐你使用AutoJump

但是,如果必须,也许您想alias
在添加中使用 like ~/.zshrc

alias fend='cd path/to/frontend'    
于 2014-02-28T22:18:15.197 回答