I would like to set up a ZSH hook to set the terminal window title to contain information such as the previously entered command and the PWD. The naïve window title-setting shell function would look like this:

title() { printf "\033]0;%s\007" "$*" }

But, in basic usage, this proves to be completely inadequate. It is very easy to interrupt the ANSI escape sequence with various special characters, such as ;. I have tried explicitly substituting ; with \; which does not work. How can I escape arbitrary sequences of characters so that a valid escape sequence can be generated to set the window title correctly?

EDIT: This problem actually seems to be a quirk of st. I will post the solution I figured out below.

  • 1
    What terminal emulator are you using? ; is fine for me with xterm, screen, gnome-terminal, Eterm and rxvt here. Nov 10, 2020 at 5:57
  • I am using st.
    – lemonhuman
    Nov 10, 2020 at 18:44

1 Answer 1


st interprets the ; as delimiting another argument in the escape sequence. st sets the window title to the contents of the first argument only. To fix this, I have replaced the code handling the specific escape sequence from this:

if (narg > 1)

To this:

if (narg > 1) {
    char *buf = malloc(1);
    buf[0] = '\0';
    int n = 0;
    for (int i=1;i<narg;i++) {
        buf = realloc(buf, n+=(strlen(strescseq.args[i]) + 1));
        strcat(buf, strescseq.args[i]);
        if (i + 1 != narg)
            strcat(buf, ";");

This may or may not be a good solution.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.