Kann ich die Terminal-Eingabeaufforderung in der vertikalen Mitte eines Fensters haben?

1

Mir ist gerade aufgefallen, dass ich mich bei der Verwendung des Terminals sehr zusammengekauert habe, da sich die Eingabeaufforderung immer am unteren Rand des Terminalfensters befindet, das vertikal maximiert ist.

Ich möchte, dass sich die Eingabeaufforderung in der vertikalen Mitte des Fensters befindet (oder an einem Punkt in der Nähe, auf den meine Augen gerichtet sind).

Sie könnten argumentieren, dass ich die Größe des Fensters ändern und dies erreichen kann, aber manchmal mag ich den vertikalen Raum (z. B. beim Laufen ls -la). Im Idealfall konnte ich die Position der Eingabeaufforderung zwischen einem bestimmten Punkt und dem unteren Rand des Fensters umschalten.

(Ich verwende iTerm unter MacOS mit zsh, bin aber an einer agnostischen / generischen Methode interessiert)

edmz
quelle

Antworten:

2

Der folgende Code (verwendet zsh-Funktionen, aber das Prinzip kann auch mit anderen Shells verwendet werden) definiert zwei Shell-Funktionen prompt_middleund prompt_restore.

Die erste Funktion hält die Eingabeaufforderung immer über der Mitte des Terminals, indem eine entsprechende Anzahl von Leerzeilen unter der Eingabeaufforderung erzwungen wird. Die letztere Funktion stellt das normale Verhalten wieder her.

Sie können diese Funktionen einigen Verknüpfungen zuweisen oder eine Logik verwenden, um zwischen diesen beiden Modi umzuschalten.

# 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"
}

Anstatt zwischen zwei Modi zu wechseln, würde ich persönlich einen viel einfacheren Ansatz verwenden (Sie benötigen die Definitionen $halfpage_up/downvon oben):

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

Dadurch wird überprüft, ob die aktuelle Befehlszeile leer ist (siehe meine andere Antwort ), und in diesem Fall wird die Eingabeaufforderung in die Mitte des Terminals verschoben. Jetzt können Sie Ihre Eingabeaufforderung durch erneutes Drücken der ENTERTaste schnell vorspulen (oder Sie möchten sie, ähnlich wie bei einem Doppelklick, durch zweimaliges Drücken aufrufen ).

mpy
quelle