2016-07-12 7 views
-1

Я хочу, чтобы мои Баш быстрые пути укоротить:Как сократить путь между частями // в Баш

~/workspace/project/my-project 
# Should be 
~/w/p/my-project 

Это может быть достигнуто за счет только укорачивание части строки пути между // до всего первого символа ,

Есть ли способ сделать это, например, в sed?

редактировать:

мысли кто-то смотрит в это может найти то, что я заканчивал полезно, так что я его редактирования здесь.

.bashrc:

dir_chomp() { 
    pwd | sed "s|^$HOME|~|" 2> /dev/null | sed 's:\(\.\?[^/]\)[^/]*/:\1/:g' 
} 

parse_git_branch() { 
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' 
} 

export PS1="\[\033[32m\]\$(dir_chomp)\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ " 

стремительные примеры (окраска не показывает):

~/w/e/coolstuff (master) $ 
~/.c/A/Cache $ 
+0

Я чувствую, что это неизбежно, потому что это 'parse_git_branch() { git branch 2>/dev/null | sed -e '/^[^ *]/d' -e 's/* \ (. * \)/(\ 1) /' } 'отлично работает в этом приглашении:' export PS1 = "\ [\ 033 [32m \] \ w \ [\ 033 [33m \] \ $ (parse_git_branch) \ [\ 033 [00m \] $ "' – RusinaRange

+0

@lurker: Однако, если вы установите 'PS1 = \ $ (parse_git_branch)', тогда 'PS1' * * повторно оценивается каждый раз. – rici

+0

Вы должны посмотреть сообщение [this] (http://stackoverflow.com/questions/3497885/code-challenge-bash-prompt-path-shortener). – drewyupdrew

ответ

2

Если вы хотите безоговорочно сократить все компоненты пути, вы можете сделать это довольно легко с sed:

sed 's:\([^/]\)[^/]*/:\1/:g' 

Если вы хотите также вставить ~ на начало путей, которые начинаются с $HOME, вы можете добавить это к команде sed (хотя эта наивная версия предполагает, что $HOME не включает двоеточие).

sed 's:^'"$HOME"':~:/;s:\([^/]\)[^/]*/:\1/:g' 

Лучшим решением является использование Баш замена:

short_pwd() { 
    local pwd=$(pwd) 
    pwd=${pwd/#$HOME/\~} 
    sed 's:\([^/]\)[^/]*/:\1/:g' <<<"$pwd" 
} 

С этой функцией Баш, вы можете "вызвать" его из PS1 строки:

$ PS1='$(short_pwd)\$ ' 
~/s/tmp$ PS1='\$ ' 
$ 
+0

Это работает, когда вы прокладываете его так: 'pwd | sed "s |^$ HOME | ~ |" 2>/dev/null | sed 's/\ ([^ /] \) [^ /] * \ // \ 1 \ // g''. Может ли это быть изменено, чтобы сократить до одного символа AND и сохранить ведущие точки? – RusinaRange

+0

Как в '~/.config/anapp/settings' ->' ~/.c/a/settings' – RusinaRange

+0

@RusinaRange: Теперь вы меняете цели: – rici

1

Использование PROMPT_COMMAND к динамически устанавливайте динамическую подсказку каждый раз, когда она отображается.

shorten_path() { 
    cwd=${PWD/workspace/w} 
    cwd=${cwd/project/p} 
    cwd=${cwd/$HOME/~} 
    PS1="$cwd "'\$ ' 
} 

PROMPT_COMMAND=shorten_path 

Это заменяет использование \w побега с помощью специального кода, чтобы сократить текущий рабочий каталог. У этого есть неудачный побочный эффект замены ~ на имя вашего домашнего каталога, поэтому, поэтому третья строка необходима, чтобы вернуть ее, если это необходимо.

+0

Вы вручную заменяете определенные ключевые слова на пути? – RusinaRange

+0

Да; Возможно, я задал вопрос слишком конкретно. – chepner