Препятствование zsh использовать псевдонимы в CWD (подсказка)

Существует TiLP. Я использовал его со своим TI-84 + SE: это позволяет Вам управлять приложениями, программами и переменными и IIRC, это также имеет "экранную функцию" представления — или это имеет функцию снимка экрана, или можно просто использовать import или что-то еще для захвата снимка экрана TiLP, показывающего экран.

6
11.04.2013, 01:01
2 ответа

Быстрая escape-последовательность %~ (включенный в $current_dir) расширяется до текущего каталога, принимая сокращения во внимание. Сокращения:

  • ~ для Вашего корневого каталога;
  • ~joe для корневого каталога пользователя joe;
  • ~foo для именованного каталога: каталог, искаженный к foo с hash -d foo=…;
  • ~[bar] для динамического именованного каталога.

Можно использовать %/ вместо %~. Это никогда не использует сокращения каталога.

Если Вы хотите быть более необычными, можно выполнить собственный код, чтобы определить, как текущий каталог отображен. Один подход должен использовать замену параметра в строке приглашения. Это требует prompt_subst опция, которая будет установлена, который делает oh-my-zsh (иначе: setopt prompt_subst). Текущий каталог всегда доступен в параметре PWD. Вот простая версия, которая только сокращает Ваш корневой каталог к ~:

local current_dir='%{$terminfo[bold]$fg[cyan]%} ${${PWD/#%$HOME/~}/#$HOME\//~/}%{$reset_color%}'

${${PWD/#%$HOME/\~}/#$HOME\//\~/} средства: если $PWD точно то же как $HOME, затем установите результат на ~, иначе установите результат на $PWD; затем, если текущий результат начинается $HOME/, затем замените этот префикс ~/, иначе оставьте результат без изменений.

Более четкий подход должен поддержать параметр, содержащий симпатичную печатную версию текущего каталога. Обновите этот параметр в chpwd сцепите функцию, которая выполняется на каждом изменении текущего каталога. Также инициализируйте тот параметр в Вашем .zshrc.

Существует только один chpwd функция, не переопределяйте oh-my-zsh's. Oh-my-zsh chpwd вызывает функцию в массиве chpwd_functions, поэтому добавьте Ваш к массиву.

function my_update_pretty_PWD {
  case $PWD in
    $HOME(/*)#) pretty_PWD=\~${PWD#$HOME};;
    *) pretty_PWD=$PWD;;
  esac
}
chpwd_functions+=(my_update_pretty_PWD)
my_update_pretty_PWD
local current_dir='%{$terminfo[bold]$fg[cyan]%} ${pretty_PWD}%{$reset_color%}'

Если Вы хотите сократить корневые каталоги пользователей, но не названные каталогами, можно очистить корневые каталоги в подоболочке и использовать % расширение параметра отмечает для выполнения автоматических сокращений в подоболочке.

function my_update_pretty_PWD {
  pretty_PWD=$(hash -rd; print -lr -- ${(%)PWD})
}

Или если Вы предпочитаете встроенный подход:

local current_dir='%{$terminfo[bold]$fg[cyan]%} $(hash -rd; print -lr -- ${(%)PWD})%{$reset_color%}'
6
27.01.2020, 20:28
  • 1
    Фантастическое объяснение, как обычно. Спасибо Gilles! –  Amelio Vazquez-Reina 11.04.2013, 16:31
  • 2
    Решение, которое добавляет функцию my_update_pretty_PWD кому: chpwd_functions производит немного раздражающее поведение в моей системе (с zsh 5.0.2). Каждый раз, когда я запускаю оболочку, подсказка не показывает текущий каталог (какой бы ни это может быть, в зависимости от того, где я запускаю zsh с). Проблема уходит, как только я ввожу a cd команда (cd . достаточно). Я также отредактировал Ваше встроенное решение, потому что после рассмотрения вывода я заметил, что это печатает дополнительное \ в подсказке (это находится в определении local_current_dir). –  Amelio Vazquez-Reina 14.04.2013, 05:43
  • 3
    @user815423426, право. Выполненный my_update_pretty_PWD также однажды в Вашем .zshrc. –  Gilles 'SO- stop being evil' 14.04.2013, 11:49

auto_name_dirs опция ответственна за это поведение.

Используйте команду unsetopt auto_name_dirs отключить его.

0
27.01.2020, 20:28
  • 1
    Downvoter: добавьте комментарий, объясняющий почему Вы downvoted мой ответ? Я хотел бы учиться. –   11.04.2013, 02:33
  • 2
    auto_name_dirs не влияет на названные каталоги. Это влияет на параметры, которые, оказывается, установлены на имя каталога. Выдержать сравнение zsh -c 'hash -d here=$PWD; p="%~"; echo ${(%)p}' с zsh -c 'here=$PWD; echo ~here; p="%~"; echo ${(%)p}'. –  Gilles 'SO- stop being evil' 11.04.2013, 04:39
  • 3
    Моя ошибка. Я думал, что переменные, содержащие имена каталогов, были псевдонимами каталога. (Я использую их как таковой.) Я буду читать об именованных каталогах сегодня вечером.Спасибо. –   11.04.2013, 04:54
  • 4
    я думаю это auto_name_dirs точно проблема здесь. Все переменные среды (которые указывают на каталог) привыкают при расширении '% ~'. Автоматически добавленного к hash -d список. Этого, кажется, не происходит в Вашем примере кода, хотя, вероятно, потому что это не является интерактивным?! Но так как OP использует ОМЗ, и у них есть это значение по умолчанию, и я просто испытывал ту же проблему, я совершенно уверен. –  blueyed 04.11.2013, 19:29
  • 5
    Это на самом деле работает. Я downvoted, потому что это не казалось, но это действительно предотвращает новые автоматические name_dir записи, который решает проблему, если сделано на входе в систему. –  bukzor 19.05.2016, 00:07

Теги

Похожие вопросы