Псевдоним "CD", так что он будет автоматически автозаполнения и попытаться перейти в каталог - PullRequest
2 голосов
/ 24 июня 2011

Мне интересно, может ли кто-нибудь сделать это.Скажем, у меня есть такая структура папок:

Folder A
    Folder Apple
    Folder Orange

Если я в данный момент нахожусь в папке A, я бы хотел, чтобы, если я наберу "cd Ap" и нажму Enter, он автоматически поместит меня в«Apple» подпапка.По сути, он попытается выполнить автозаполнение и открыть папку на основе частичного ввода.

Если я в настоящее время нахожусь в папке A, и я набираю "cd ap" и нажимаю клавишу ввода (строчная буква "a"), я получаю сообщение об ошибке, потому что не удается выполнить автозаполнение фактического имени подпапки.Это возможно?Я работаю в Корне.

Ответы [ 3 ]

0 голосов
/ 25 июня 2011

Вот функция ksh (непроверенная)

cd () {
  typeset prefix=$1
  typeset destination=""
  for f in *; do
    [[ -d "$f" ]] || continue
    case "$f" in 
      "$prefix"*) destination="$f"; break ;;
    esac
  done
  if [[ -z "$destination" ]]; then
    print -u2 "error: can't find directory with prefix '$prefix'"
  else
    command cd "$destination"
  fi
}

С ksh, Esc \ является эквивалентом завершения bash tab.

0 голосов
/ 06 октября 2014

Для Bash вы можете добавить следующее к ~/.bashrc.По умолчанию выполняется сопоставление без учета регистра.Это немного долго, но должно обрабатывать все, что вы на него бросаете (за исключением попытки автозаполнения cd ../my_direc из каталога символических ссылок (см. здесь для получения дополнительной информации об этом).

ЕслиВы используете этот скрипт и оставляете его без учета регистра, вы также можете добавить bind 'set completion-ignore-case on' к вашему ~/.bashrc, чтобы TAB-завершение также не учитывало регистр.

cd() {
    # Attempts to autocomplete the directory name
    #
    # If it fails to find a match, it'll still execute the input, in case the argument was
    # something like "-".
    case_insens=1 # set to one if you want it to try case-insensitive matching

    # for exact matches, cd immediately
    if [ -d "$1" ]; then
        builtin cd "$1"
        return
    fi
    # deal with no arguments passed
    if [ $# -eq 0 ]; then
        builtin cd
        return
    fi

    # first loop for case-sensitive (since we prefer a case-sensitive match)
    # for more on this globbing, see: bit.ly/1CZ9qym
    for element in "$(dirname "$1")"/{*,.[!.]*,..?*}; do
        # skip if this result is not a directory
        [ -d "$element" ] || continue

        if [[ "$(basename "$element")" == "$(basename "$1")"* ]]; then
            # if there's no ambiguity, switch to that folder
            if [ $(find -L "$(dirname "$1")" -maxdepth 1 -name "$(basename "$1")*" -type d 2>/dev/null | wc -l) -gt 1 ]; then
                echo "'$1' matches multiple results:  "
                echo "$(find -L "$(dirname "$1")" -maxdepth 1 -name "$(basename "$1")*" -type d 2>/dev/null)" 
                # try to cd anyway
                builtin cd "$1" &> /dev/null 
                unset case_insens element
                return
            else
                builtin cd "$element"
                unset case_insens element
                return              
            fi
        fi
    done

    if [ $case_insens -eq 1 ]; then
        #case-insensitive argument
        ci_arg="${1,,}"
    else
        builtin cd "$1"
        unset case_insens element
        return
    fi

    #Case-insensitive loop
    for element in "$(dirname "$1")"/{*,.[!.]*,..?*}; do
        # skip if this result is not a directory
        [ -d "$element" ] || continue   

        ci_element_name="$(basename "${element,,}")"
        if [[ "$ci_element_name" == "$(basename "$ci_arg")"* ]]; then
            # if there's no ambiguity, switch to that folder
            if [ $(find -L "$(dirname "$element")" -maxdepth 1 -iname "${ci_element_name}*" -type d 2>/dev/null | wc -l) -gt 1 ]; then
                echo "'$ci_arg' matches multiple results:  "
                echo "$(find -L "$(dirname "$element")" -maxdepth 1 -iname "${ci_element_name}*" -type d 2>/dev/null)"
                # try to cd anyway
                builtin cd "$1" &> /dev/null
                unset ci_arg case_insens ci_element element
                return
            else
                builtin cd "$element"
                unset ci_arg case_insens ci_element element
                return
            fi
        fi
    done
    # we still haven't found a match, so pass the (faulty) argument to the cd command
    builtin cd "$1"
    unset ci_arg case_insens ci_element element
}

Пример использования

cd ~
cd deskt
0 голосов
/ 24 июня 2011

Я не совсем отвечу на ваш вопрос, но подойду ближе.Мне кажется, что нажатие клавиши табуляции не является препятствием для вас, это капитализация.Я знаю это чувство, это как выбор между camelCase и неудобной печатью.

Я делал это только в bash, мои извинения.Если я помню, bash и ksh довольно близки, поэтому я надеюсь, что это сработает для вас.

set completion-ignore-case on включает в bash завершение без учета регистра.Естественно, это относится к любым сценариям запуска, которые вам могут понадобиться.

Удачи, скажите нам, работает ли он в ksh!

...