Переход к каталогу в ZSH (bash)

Я использую Oh-My-ZSH, чтобы создать несколько адресов и функций для облегчения моих повторяющихся действий. нагрузка.

Мне нужно перейти из любого места на моем компьютере в мой каталог Frontend. Вот что у меня есть:

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

Теперь это хорошо работает, когда я набираю frontend или frontend myProject, однако все папки моего проекта имеют постфикс вроде .m, .tablet и т. д.

Как я могу написать вещи, которые:

  • Позволит мне автоматически перейти к папке, за которой следует .something

  • Когда есть несколько вариантов (например, project.m и project.tablet), мне будут предложены варианты, аналогичные тем, если вы нажмете вкладку в своем терминале и получите несколько вариантов для автозаполнения.

Надеюсь, мой вопрос имеет смысл.

Спасибо.


person JDillon522    schedule 28.02.2014    source источник
comment
Можете ли вы также дать ls вывод папки, о которой вы говорите, с именами .m и .tablet?   -  person brokenfoot    schedule 01.03.2014
comment
@brokenfoot Возможно. Я думаю, что могу сделать if, который будет ls работать в случае сбоя, но как оставить его открытым, чтобы пользователь мог выбрать, какой файл ускользает от меня   -  person JDillon522    schedule 01.03.2014


Ответы (2)


Сначала найдите решение zsh, а затем решение bash.

Обновление: оказалось, что реализация zsh (на основе встроенной функции compctl) намного проще, чем реализация bash (на основе встроенной функции complete).

Сохраните интересующий код в файл (например, frontend) и отправьте его (например, . ./frontend); либо в интерактивном режиме, либо, что предпочтительнее, из вашего профиля bash/zsh.

После этого автозаполнение имен подкаталогов в ~/Desktop/Work/Frontend будет работать следующим образом:

  • Введите, например, frontend myProject и нажмите TAB.
  • myProject is then prefix-matched against the names of the subdirectories in ~/Desktop/Work/Frontend:
    • If there's only 1 match, myProject will instantly expand to the full subdirectory name.
    • Otherwise, a beep sounds to indicate that there are multiple matches:
      • zsh: The names of all matching subdirectories are listed right away.
      • bash: Нажмите TAB еще раз, чтобы просмотреть имена всех соответствующих подкаталогов.
      • Продолжайте вводить до тех пор, пока совпадение префикса не станет однозначным, затем снова нажмите клавишу TAB.

Примечание. В bash, чтобы также требовалось только один раз нажать TAB для отображения нескольких совпадений, добавьте следующее в свой профиль оболочки 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

bash решение:

Примечание. complete -o dirnames, к сожалению, не принимает аргументов — он всегда автоматически дополняется для текущего каталога. Таким образом, требуется специальная функция оболочки, которая возвращает возможные совпадения в сочетании с -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
person mklement0    schedule 28.02.2014
comment
Это сэр, абсолютно делает мой день - person JDillon522; 03.03.2014
comment
@ JDillon522 :) Рад это слышать. - person mklement0; 03.03.2014

Я настоятельно рекомендую вам использовать AutoJump.

Но если вам нужно, возможно, вы захотите использовать alias
как в своем ~/.zshrc добавлении:

alias fend='cd path/to/frontend'    
person user3366023    schedule 28.02.2014
comment
Да, я мог бы это сделать. Тем не менее, я работаю над несколькими проектами, и создание псевдонимов для каждого становится немного повторяющимся. Конечно, это 5 секунд из моего дня. Но моя цель — создать что-то более сложное и гибкое. Спасибо хоть. - person JDillon522; 01.03.2014
comment
почему бы вам не попробовать autojump это потрясающе, со временем он узнает, куда вы перешли, и вы можете сказать j mydir, и он перейдет туда из любого места - person user3366023; 01.03.2014