Wie ändere ich den Titel des Münzfensters?

35

MinTTY ist die neue Standardkonsole für Cygwin.

Was ist ein Shell-Befehl (etwas, das ich in .bashrc oder noch besser in .zshrc einfügen kann), um den Titel des MinTTY-Fensters zu ändern?

Ich möchte, dass der Titel des Fensters der Pfad zum aktuellen Verzeichnis ist und aktualisiert wird, wenn ich die Verzeichnisse in der Konsole wechsle.

Leonel
quelle
1
Cygwins Standardeinstellung für Eingabeaufforderungen (dh $PS1) enthält bereits eine Steuersequenz, die den Fenstertitel auf user @ machine: working_directory setzt.
Ak2
Ein kürzlich veröffentlichtes MSYS2_packages / filesystem commit 6e6310d (Dateisystem: Neue spezifische Variable MSYS2_PS1., 2016-05-01) führte ein MSYS2_PS1-Eingabeaufforderungsskript ein, das unterschiedliche Cygwin / MSYS2-Konfigurationen ermöglicht. Ich habe eine Optimierung vorgeschlagen, um sicherzustellen, dass eine vorhandene PS1 eine mittlere Priorität hat. Github.com/Alexpux/MSYS2-packages/pull/651 . Hoffe das hilft.
Philip Oakley
@Philip, (Anmerkung von sich selbst) Dieser Tweak hat sich als umstritten erwiesen und es werden weitere Tweaks hinzugefügt (oder entfernt), um die minimal realisierbare Korrektur zu erstellen, die die verschiedenen Verwendungen abdeckt.
Philip Oakley
1
Verwandte, wenn Sie nur einen statischen Titel wie "Cygwin i686" oder "Cygwin x86_64" benötigen , dann können Sie -T <title>in den Windows-Shortcut-Eigenschaften verwenden. Siehe auch die mintty man page.
Jww

Antworten:

50

Was ist falsch

Der folgende Befehl hat bei mir nicht funktioniert:

echo -ne "\e]0;MYTITLE\a"

Es stellt sich heraus, dass meine Standard-Cygwin-Installation die folgende Definition der Eingabeaufforderung in .bashrc enthält:

PS1=\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$

Beachten Sie, dass der erste Teil der Eingabeaufforderung ( \e]0;\w\a) den Fenstertitel jedes Mal festlegt, wenn die Eingabeaufforderung angezeigt wird.

Die Lösung

Fügen Sie diese Zeilen hinzu .bashrc, die 2 Funktionen definieren:

function settitle() {
      export PS1="\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$ "
      echo -ne "\e]0;$1\a"
}
function settitlepath() {
      export PS1="\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$ "
}

Dann können Sie mit diesem Befehl einen benutzerdefinierten Titel festlegen:

settitle "MYWonderfullTest here"

oder Sie können mit diesem Befehl zu Cygwins Standard (dem aktuellen Pfad) zurückkehren:

settitlepath

Hoffe das hilft

boly38
quelle
1
Ein großartiger Job, der das PS1-Problem behebt, auf das die meisten Benutzer mit den Standardeinstellungen von Cygwin stoßen werden.
Markku K.
3
Dies hätte als Antwort akzeptiert werden müssen, da es im Gegensatz zu der am höchsten bewerteten Antwort
Tapan Chandra,
1
Ich liebe eine Antwort, die ich einfach ausschneiden und einfügen kann. Und erklärt auch deutlich, wo das Problem wirklich liegt.
Darrel Lee
Diese Funktionen funktionieren gut für mich! Denken Sie daran, dass Cygwin zum erneuten Laden Ihrer .bashrc-Datei einen Neustart von Cygwin ausführen muss ODER schreiben muss. source ~/.bashrcAndernfalls führt Cygwin weiterhin die alte Version von bashrc aus, die sich beim Start von Cygwin auf der Festplatte befand. - Getestet auf Cygwin version 2.8.1 (64 bit)- eine 2017-Version
Hanshenrik
Warum wurde diese Antwort nie akzeptiert?
Schmied
26

Sie können dies mit der xterm-Steuersequenz wie folgt ändern:

echo -ne '\e]0;Title\a'

Siehe http://code.google.com/p/mintty/issues/detail?id=241

James Fu
quelle
4
Hat für mich keine Auswirkung: / Vielleicht ist dieser Trick in den letzten 6 Monaten gebrochen?
Voltrevo
Benutzt du Bash?
James Fu
2
Es hat keine Auswirkung, wenn es von einem Bildschirm aus ausgegeben wird.
Ярослав Рахматуллин
10
Wahrscheinlich liegt das Problem darin, dass die Eingabeaufforderung bereits für die Aktualisierung des Titels konfiguriert ist (z. B. mit dem aktuellen Pfad), sodass der Befehl funktioniert, aber plötzlich von der Eingabeaufforderung überschrieben wird.
Andrea Polci
2
Zum Testen "echo -ne '\ e] 0; Title \ a' && cat". Diese Methode verhindert, dass die Eingabeaufforderung sie sofort zurücksetzt. (Wenn das funktioniert, können Sie PS1 in Ihrem Profil ändern, wie in anderen Antworten beschrieben)
Curtis Yallop
3

Fügen Sie dies in .zshrc ein:

# Change title of MinTTY to current dir
function settitle() {
    echo -ne "\033]2;"$1"\007"
}
function chpwd() {
    settitle $(cygpath -m `pwd`)
}

Die Reihenfolge der Sonderzeichen in der Funktion settitle bewirkt, dass MinTTY den Titel des Fensters ändert.

Wenn Sie in zsh eine Funktion mit dem speziellen Namen chpwd definieren, wird diese nach jedem chdir aufgerufen .

Funktioniert unter WinXP mit Cygwin 1.7 und MinTTY unter zsh.

Leonel
quelle
Funktioniert auch in der WSL (natürlich ohne settitle "$(pwd)@$HOST"
Cygpath
2

In bash kann die Variable PROMPT_COMMAND so eingestellt werden, dass sie eine Reihe von Befehlen enthält, die durch Semikolons getrennt sind. Sie können dies verwenden, um die gleiche Titeleinstellung vorzunehmen, wie in der anderen Antwort beschrieben, in der es um zsh geht.

holprig
quelle
2
1) Echo $ PS1 und kopieren Sie diese Zeichenfolge in Ihre Zwischenablage oder Texteditor, wie in
   Echo $ PS1
2) Bearbeiten Sie ~ / .bash_profile und fügen Sie den folgenden Shell-Code hinzu, wobei Sie $ PS1 nach Bedarf ersetzen, aber die Variable $ {TERMINAL_TITLE} in der Bedingung "false" belassen.
3) Speichern Sie die Datei und setzen Sie die Umgebungsvariable TERMINAL_TILE wie in
   export TERMINAL_TITLE = "Mein benutzerdefinierter Titel"
4) Geben Sie Ihr Bash-Profil wie in
   . ~ / .bash_profile
Genießen

if [-z "$ {TERMINAL_TITLE}"]
dann
  PS1 = '\ [\ e] 0; \ w \ a \] \ n \ [\ e [32 m \] \ u @ \ h \ [\ e [33 m \] \ w \ [\ e [0 m \] \ n \ $ '
sonst
  PS1 = '\ [\ e] 0; $ {TERMINAL_TITLE} \ a \] \ n \ [\ e [32m \] \ u @ \ h \ [\ e [33m \] \ w \ [\ e [0m \ ] \ n \ $ '
fi
Umlaufbahn Andrews
quelle
1

Ich habe Leonels Antwort verwendet, aber ich habe festgestellt, dass der Titel dabei nur flimmert, was bedeutet, dass zumindest der Echo-Befehl wie vorgesehen funktioniert. Ich habe zsh interaktiv mit aktiviertem Debug-Modus ausgeführt

zsh -xv

Das Ändern des Verzeichnisses ruft offensichtlich eine andere Funktion auf, die title()nach precmd()und chpwd()effektiv überschrieben wird. Also habe ich das in meine .zshrc gesteckt und es hat funktioniert.

function settitle() {
    echo -ne "\033]2;"$1"\007"
}
function title() {
    settitle $(cygpath -m `pwd`)
}

Wenn Sie verwenden möchten chpwd()oder precmd()stattdessen deaktivieren Sie einfach die Titelfunktion: title(){}.

user239512
quelle
1

Ich wollte nur meine Lösung für dieses Problem mitteilen, da ich mintty verwende, um ein Skript auszuführen.

Meine Mintty-Verknüpfung lautet:

C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico /usr/bin/bash.exe -l -c /scripts/connect.sh

Das von mir geschriebene connect.sh-Skript, das in der obigen Verknüpfung aufgerufen wird, fordert mich auf, den Server anzugeben , zu dem ich eine Verbindung herstellen möchte, UND die im Skript definierte Settitle-Funktion auszuführen.

connect.sh

#!/bin/bash

echo "Enter servername when prompted"
echo -n "servername: " 
read servername
function settitle() {
    echo -ne "\033]2;"$servername"\007"
}
function title() {
    settitle $(cygpath -m `pwd`)
}
settitle
ssh my_username@$servername
user273306
quelle
Warum definieren Sie die Funktion, titlewenn Sie sie nicht verwenden?
Pabouk
0

Versuchen Sie, dies in .bash_profile einzufügen

export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}:${PWD/#$HOME/~}\007"'

Für mich geht das.

netawater
quelle
2
Die Frage bezieht sich auf das Ändern des Fenstertitels und nicht auf eine Eingabeaufforderung.
Kenorb
1
Bitte fügen Sie dies in .bash_profile hinzu, es ist OK für den Titelwechsel, danke!
Netawater