Скорочений поточний каталог у запиті оболонки?


23

vim має дійсно приємну функцію, яку вона використовує на своїх шляхах, коли вони трохи довгі:

введіть тут опис зображення

Він скорочує шлях до документа на вкладці вгорі. Чи є спосіб зробити щось подібне до цього, щоб мій баш-рядок не виглядав так:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
Отже, що ти хочеш rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? В ідеалі, використовуючи деякий поріг для максимальної довжини підказки?
nicerobot

Саме це я шукаю.
Naftuli Kay

Гаразд, я дав свою відповідь.
nicerobot

Відповіді:


14

Спробуйте це :

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

або, чистий баш:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

потім

PS1='\u@\h ${PS1X} $ '

виробляє (зверніть увагу ~на ${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

Я покращив свою відповідь завдяки @ enzotib's


1
Чи можете ви навести приклад того, як це виглядатиме як підказка для нащадків?
Naftuli Kay

(0) Ваше посилання github розірвано. (1) Можливо, ви захочете ближче ознайомитися з $PWD~тестом. Наразі, якщо HOMEє /home/edта PWDє /home/edwina, ви отримуєте ~winaу версії Perl та ~/inaу оболонці. (2) Ваш код оболонки задавлюється, якщо поточний каталог містить символи підстановки (тобто розширення імені контуру); наприклад, PWD= /abc/*/def. Ви можете виправити це, додавши set -o noglobабо set -f. … (Продовжував)
G-Man каже: «Відновити Моніку»

(Продовження)… (3) Вам не потрібно майже стільки брекетів. У команді Perl $HOME(яка знаходиться всередині подвійних лапок) і $PWDвони досить хороші. У команді оболонки, останні три посилань змінної оболонки прекрасна, але перші три може бути "${PWD#$HOME}", "$PWD"і "$p". (4) Дивіться також відповідь mbentley та мої коментарі до неї.
G-Man каже: "Відновіть Моніку"

15

Схожий на відповідь @nicerobot, але дещо коротший:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

Це покаже наступний приклад результату:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$

13

Мені подобається PROMPT_DIRTRIMв баш ...

export PROMPT_DIRTRIM=2

змінить ваш приклад підказки на ...

rfkrocktk@work-laptop ../com/tkassembled/ $

Це працює для мене.


Робить не те, що він просив, але дякує, що повідомили мені про цю особливість.
nicerobot

3
@nicerobot Так, у вас була справжня відповідь. :) Я знаю, що це не дає абревіатури, яку він просив, але часто, коли ми бачимо прості варіанти, наші очікування змінюються. Крім того, він є стандартним, і я вважав, що заслуговує на згадку.
BentFX

1
Я відчуваю, що одна з функцій ДП полягає не лише у наданні ідеальної відповіді на питання, а й у наданні інших варіантів роботи ОП та іншим, які знаходять питання шляхом пошуку. Зверніть увагу на контекст відповіді, який я надав "Мені подобається ... працює на мене". Але все-таки деякі вважають, що він заслуговує на голосування вниз.
BentFX

Я, як правило, бачу відповіді, які не відповідають безпосередньо на питання, але я згоден з вами, що надання альтернатив може бути дійсною відповіддю або відповіддю .
nicerobot

Відповідь BentFX не відповідає на питання ОП в цілому, але саме тему Скорочений поточний каталог у запиті оболонки? що, мабуть, для більшості відвідувачів цієї теми саме те, що вони шукають.
ТНТ

4

Додавши відповідь до enzotib , наступний фрагмент:

  1. Перетворити /Path/To/Your/Home/в ~/(таким чином шлях буде ~/a/b/cзамість /P/T/Y/H/a/b/c)
  2. Використовуйте першу букву "крапкового файлу", а не показуйте лише крапку ( /a/./c/dстане /a/.b/c/d):

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

Переконайтесь, що ви використовуєте одиничні цитати або баш розгортаєте її передчасно.


3

Формат для використання у вашому PS1є \W(див. PROMPTINGРозділ на bashсторінці людини).

PS1="\u@\h \W\$ "

І ви, можливо, захочете прочитати інші параметри там, ви можете зробити якісь цікаві речі з командного рядка.


2
Я думаю, що \ W взагалі не робить того, що він просить.
nicerobot

1
@nicerobot Це не дає першої ініціативи кожного компонента шляху, але він дає поточну робочу директорію коротшим чином. Я впевнений, що неможливо скоротити каталог таким чином, не використовуючи якийсь некрасивий скрипт, що виконується кожним підказом. Ми побачимо, що він має сказати з цього приводу.
Кевін

1

Мені подобається результат з прикладу nicerobot, але я знайшов одне питання. У мене є каталог, який містить дефіс A-E, і це розглядалося -Eяк аргумент, printfколи це був мій поточний робочий каталог. Щоб виправити це, я додав --останні printfта додані лапки навколо виводу на випадок, якщо нічого не виводиться:

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"

(1) Хороший опис у питанні імені каталогу, що містить -другий символ. Хоча це правда, що --це загальне вирішення питання аргументів, починаючи з цього -, кращим методом printfможна вважати printf "%s" "${q:1}", оскільки це також захищає від аргументів, що містять %. (Наприклад, спробуйте PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) Дивіться також мої коментарі до відповіді nicerobot.
G-Man каже: "Відновити Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.