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

Я хотел бы, чтобы подсказка находилась в вертикальной середине окна (или в точке, рядом с которой мои глаза направлены).

Вы можете утверждать, что я могу изменить размер окна и добиться этого, но иногда мне нравится вертикальное пространство (например, при запуске ls -la). Таким образом, в идеале я мог бы переключать положение подсказки между некоторой точкой и нижней частью окна.

(Я использую iTerm под MacOS с zsh, но мне интересен агностический / общий способ сделать это)

1 ответ1

1

Следующий код (использует функции zsh, но при этом можно использовать и другие оболочки), определяет две функции оболочки: prompt_middle и prompt_restore .

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

Вы можете назначить эти функции некоторым ярлыкам или использовать некоторую логику для переключения между этими двумя режимами.

# load terminfo modules to make the associative array $terminfo available
zmodload zsh/terminfo 

# save current prompt to parameter PS1o
PS1o="$PS1"

# calculate how many lines one half of the terminal's height has
halfpage=$((LINES/2))

# construct parameter to go down/up $halfpage lines via termcap
halfpage_down=""
for i in {1..$halfpage}; do
  halfpage_down="$halfpage_down$terminfo[cud1]"
done

halfpage_up=""
for i in {1..$halfpage}; do
  halfpage_up="$halfpage_up$terminfo[cuu1]"
done

# define functions
function prompt_middle() {
  # print $halfpage_down
  PS1="%{${halfpage_down}${halfpage_up}%}$PS1o"
}

function prompt_restore() {
  PS1="$PS1o"
}

Лично вместо переключения между двумя режимами я бы использовал гораздо более простой подход (вам нужны определения $halfpage_up/down сверху):

magic-enter () {
    if [[ -z $BUFFER ]]
    then
            print ${halfpage_down}${halfpage_up}$terminfo[cuu1]
            zle reset-prompt
    else
            zle accept-line
    fi
}
zle -N magic-enter
bindkey "^M" magic-enter

Это проверяет, является ли текущая командная строка пустой (см. Мой другой ответ), и если это так, переместите подсказку до середины терминала. Теперь вы можете перемотать вашу подсказку еще одним нажатием ENTER (или, возможно, вы хотите вызвать ее дважды, аналогично двойному щелчку).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .