Zsh с iTerm2 на MacOS с небольшой панелью и длинной подсказкой: пробел после подсказки удален - PullRequest
2 голосов
/ 13 апреля 2020

РЕШЕНИЕ ЕЩЕ НЕ НАЙДЕНО:

Я столкнулся с различными проблемами с zsh, которые не ожидаются на MaOS Catalina/iTerm2.

I) Действительно, если я разделю, например, большое оригинальное окно iTerm2 (только один терминал) на 4 панели, и, более того, если у меня длинное приглашение, то первый пробел между end of prompt и удалением команды.

II) Другие странные поведения: например, если я в этой панели выполняю команду ls и выполняю после запроса completion с TAB, вторая буква 's' из 'ls' удаляется ИЛИ другое поведение : между командой ls и каталогами / файлами, предложенными завершение.

Ниже приведены снимки экрана, чтобы проиллюстрировать и помочь вам понять:

1) Исходные панели, на которых я воспроизводлю ошибку в нижней правой панели:

enter image description here

2) Завершение командой 'ls': курсор на второй букве 'ls', то есть 's '

enter image description here

3) Пример завершения, здесь с помощью команды ls: нет больше пробела между командой 'ls' и каталогами / файлами завершено или пробел между последним фиолетовым символом канала и командой 'ls' удален.

enter image description here

Я хотел бы получить несколько советов по устранению проблем 2) и 3) . В идеале я хотел бы сохранить свое длинное приглашение (из-за длинного PATH текущего каталога) и понять, почему у меня такое странное поведение.

Мое приглашение определено как .zshrc:

PS1='%F{magenta}|%F{green}%n@%F{cyan}%m%F{magenta}|%f%T%F{magenta}|%B%~%b%F{magenta}|%f '

вы можете увидеть пробел в конце подсказки |%f ', которая, кажется, не соблюдается

Я знаю, что мои проблемы обязательно возникают из-за длинной подсказки (Если я применяю ту же команду ' ls 'в $ HOME, все работает нормально, т.е. завершение не удаляет пробелы.

Вот почему я также пытался использовать этот код в .zshrc (из http://aperiodic.net/phil/prompt/ ) для усечения ПУТИ:

###
# Truncate the path if it's too long.

PR_FILLBAR=""
PR_PWDLEN=""

local promptsize=${#${(%):---(%n@%m:%l)---()--}}
local pwdsize=${#${(%):-%~}}

if [[ "$promptsize + $pwdsize" -gt $TERMWIDTH ]]; then
  ((PR_PWDLEN=$TERMWIDTH - $promptsize))
else
  PR_FILLBAR="\${(l.(($TERMWIDTH - ($promptsize + $pwdsize)))..${PR_HBAR}.)}"
fi

Но это ничего не делает, ПУТЬ остается прежней ...

Если у кого-то были проблемы такого же типа, это было бы хорошо сообщить потенциальным решениям, как их исправить. Более того, любые отзывы также приветствуются.

ОБНОВЛЕНИЕ 1: Я получаю лучшие результаты, так как я бы их улучшил, т.е. мне бы этого хотелось zsh автоматически усекает длинное имя каталога с фиксированным пределом до руда.

Перед этим я покажу вам результат, который я хотел бы получить:

PS1, используемый для этой цифры ниже, получен с:

PS1='%F{magenta}|%F{green}%n@%F{cyan}%m%F{magenta}|%f%T%F{magenta}|%F{75}%-2d~/.../%F{13}%1~%F{magenta}| '

и результат в третьей строке:

zsh prompt

ЗАПРОС 1:

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

Как видите, проблема остается, то есть каталог

Travail_3_Alain_Injection_des_Biais_Spectro_dans_XSAF_avec_GCph+WL+XC_et_rajout_dun_Prior_dans_la_matrice_de_Fisher_de_SpecSAF_15_JANVIER_2020

очень, очень долго.

ЗАПРОС 2:

Итак, я знаю, что это может быть сложно реализовать, но возможно ли для усеченного заданного числа максимальных символов иметь возможность усекать все компоненты полного пути (я имею в виду каждый из вышеуказанных каталогов) к другим компонентам, к которым мы применили усечение между началом и концом каталога?

Например, каталог

 Travail_3_Alain_Injection_des_Biais_Spectro_dans_XSAF_avec_GCph+WL+XC_et_rajout_dun_Prior_dans_la_matrice_de_Fisher_de_SpecSAF_15_JANVIER_2020

станет:

Travail_3_...SpecSAF_15_JANVIER_2020

Я хочу сохранить 2 разных цвета между полным путем (усеченным, исключенным для текущего каталога, с цветом 75) и текущим каталогом (цвет 13 в моем последнем результате выше) ).

Кстати, что такое функция $reset_color: обязательно ли ее использовать?

ОБНОВЛЕНИЕ 2: На данный момент я установил следующее подсказка:

PS1='%F{13}|%F{green}%n@%F{cyan}%m%F{13}|%f%T%F{13}|%F{75}%-4d/…… %F{13}%1~%F{13}|%F{15} '

, которая дает следующую визуализацию:

enter image description here

Как видите, я могу отображать до четвертой (с %~4d) глубины каталогов в первой части моего приглашения. И после этой первой части я делаю отображение текущего каталога (по %1~).

ЗАПРОС 3:

Это почти тот результат, который я хотел бы get: имея сначала родительский каталог до четвертой глубины в определенном цвете (здесь %F{75}), а после символа …… текущий каталог в другом определенном цвете (в моем случае, %F{13}.

Почти с тех пор, когда я набираю команду cd, я получаю следующий результат:

`|fab@astro|6:50|/Users/fab/……~|`

Как видите, я хотел бы получить только:

`|fab@astro|6:50|~|`

, т. Е. чтобы заставить исчезнуть путь /Users/fab/…… в подсказку, так как ~ и /Users/fab/ ссылаются на одно и то же.

В более общем смысле, я бы хотел заменить всегда /Users/fab/ на ~ , т. е. для всех запросов, которые я отображаю.

Как это исправить?

ЗАПРОС 4: остается проблема пробела между подсказкой и командой, которая вмешиваться, когда я в маленькой панели. Я понятия не имею, как предотвратить исчезновение этого пространства. У меня есть серио Мы отслеживаем: я понял, что это происходит, когда подсказка отображается в несколько строк из-за того, что панель мала и поэтому подсказка не может содержаться в одной строке, например:

zsh prompt on multiple lines since pane is small

Там я тоже хотел бы исправить эту ошибку "space removing". Я думаю, что одним из решений может быть усечение второй части моего приглашения (текущего каталога), чтобы оно содержало только одну строку (как я указал выше в REQUEST 2 ) а как это реализовать?

РЕШЕНИЕ ЕЩЕ НЕ НАЙДЕНО: извините, я считал, что zsh -5.8 может решить проблему, но на самом деле, из моих последних тестов, это не так.

1 Ответ

1 голос
/ 22 апреля 2020

относительно запроса 3, не могли бы вы показать свой $ HOME? \ w или \ W всегда заменит $ HOME для ~, как описано здесь (я предполагаю, что ваш $ HOME может быть не установлен) ...

В качестве альтернативы и не так чисто, но это делает трюк, (если $ HOME установлен правильно), вы можете попробовать добавить в него что-то вроде этого:

if [[ "${PWD}" == "${HOME}" ]] ; then printf \~; else echo -n ${PWD##*/}; fi

, как обсуждено здесь

это может также выполните трюк для запроса 4, предполагая, что у вас есть супер длинная папка и вы хотите немного ее уменьшить:

pwdvar="${PWD}"
len_pwd=${#pwdvar}
limit_char=50
letters_beg=10
letters_ignored=50
shortpwdvar=$(echo $pwdvar | cut -d '/' -f 5-)
if [[ len_pwd > limit_char  ]] ; then echo ${pwdvar} ; else echo "~/.../"${shortpwdvar::letters_beg}"..."${shortpwdvar:letters_ignored}; fi
...