如何在 gnome-terminal 中重命名终端选项卡标题?

pen*_*ner 93 gnome-terminal

过去可以右键单击选项卡并更改标题。不知道如何做到这一点了。刚刚升级到 Fedora 21。

编辑:我已从 gnome-terminal 切换到 ROXterm

Wes*_*ger 135

在 中创建一个函数~/.bashrc

function set-title() {
  if [[ -z "$ORIG" ]]; then
    ORIG=$PS1
  fi
  TITLE="\[\e]2;$*\a\]"
  PS1=${ORIG}${TITLE}
}
Run Code Online (Sandbox Code Playgroud)

然后使用您的新命令设置终端标题。它也适用于名称中的空格

set-title my new tab title
Run Code Online (Sandbox Code Playgroud)

可以随后set-title再次使用(原始 PS1 保留为ORIG)。

  • 请解释这是如何工作的细节以及为什么。 (3认同)
  • @GabrielStaples 不,“a$@b”扩展为“aarg1”“arg2”“arg3”“arg4b”(几个单词),而“a$*b”扩展为“aarg1 arg2 arg3 arg4b” ”`(一个词)。在这种情况下,“$*”就是我们想要的(实际上,用户应该提供一个带引号的参数,但为了方便起见,接受多个参数“$*”是这种特定情况下的适当解决方案(即使在大多数情况下) `$@` 是正确的选项)。 (3认同)
  • 我想到了。请参阅此处的详细描述,以及我演示如何获取随时间或当前工作目录变化的动态变化标题的案例,例如:https://unix.stackexchange.com/questions/177572/how-重命名-gnome-terminal中的终端选项卡标题/566383#566383。 (2认同)

don*_*sti 47

user title代码除去1gnome-terminal 3.14。要设置标题,您可以使用转义序列:

printf "\e]2;YOUR TITLE GOES HERE\a"
Run Code Online (Sandbox Code Playgroud)

或例如bash

PROMPT_COMMAND='echo -ne "\033]0;YOUR TITLE GOES HERE\007"'
Run Code Online (Sandbox Code Playgroud)

1:请参阅 gnome错误 724110和 gnome错误 740188

  • 感谢您提供讨论的链接。我想这个答案是否定的。其中一个链接的有趣引述:“现代用户不使用终端”。哈哈。 (14认同)
  • 显然,它又回来了……“是的,抱歉,我们在半年前发布的 GNOME 3.20(2016 年 3 月版)中恢复了 --title 选项,但 Ubuntu 16.04 随附了 GNOME 3.18(2015 年 9 月版),其中已删除此选项。” Michael Catanzaro 的 2016-09-01 18:41:45 UTC 评论 #31(来自第二个错误,740188) (6认同)
  • @sage - 没有功能,Michael 的评论是关于 `--title` 选项,我可以确认它确实已恢复。但是,这里的 Q 是关于重命名当前打开的选项卡的右键单击选项 - 一个不同的问题...... (2认同)

gee*_*ekQ 26

新版本的 gnome-terminal 丢弃了最有用的专业功能。:-(

我尝试设置并运行旧版本的 gnome-terminal 并比较了替代方案。

如果terminator对您来说太异国情调,这mate-terminal是一个不错的选择!它是 gnome-terminal 的一个分支,并保留了所有好的特性:

  • 您可以从命令行打开多个选项卡给它们不同的标题

    mate-terminal --tab -t "aaa" --tab -t "bbb" --tab -t "ccc"
    
    Run Code Online (Sandbox Code Playgroud)
  • 你可以设置一个快捷键(我使用Ctrl +按住Shift)给定在TLE


Gab*_*les 13

截至 2021 年 3 月,我的新脚本:

我现在有了“设置标题”功能的新版本。对于它的最新版本,请在此处某处搜索我的~/.bash_aliases文件。这就是它可能的样子。它现在有一个-h帮助菜单,而不是PS1第一次运行它时依赖变量的备份,这很挑剔,它只是使用sed's'tream 'ed'itor 命令和正则表达式来去除现有的标题PS1取而代之的是变量中的字符串。

gs_set_title() {
    CMD="gs_set_title"
    # Help menu
    if [ "$1" == "-h" ] || [ "$1" == "-?" ]; then
        echo "Set the title of your currently-opened terminal tab."
        echo "Usage:   $CMD any title you want"
        echo "   OR:   $CMD \"any title you want\""
        echo "   OR (to make a dynamic title which relies on variables or functions):"
        echo "         $CMD '\$(some_cmd)'"
        echo "     OR  $CMD '\${SOME_VARIABLE}'"
        echo "Examples:"
        echo "         1. static title"
        echo "           $CMD my new title"
        echo "         2. dynamic title"
        echo "           $CMD 'Current Directory is \"\$PWD\"'"
        echo "       OR  $CMD 'Date and time of last cmd is \"\$(date)\"'"
        return $EXIT_SUCCESS
    fi

    TITLE="$@"
    # Set the PS1 title escape sequence; see "Customizing the terminal window title" here:
    # https://wiki.archlinux.org/index.php/Bash/Prompt_customization#Customizing_the_terminal_window_title
    ESCAPED_TITLE="\[\e]2;${TITLE}\a\]"

    # Delete any existing title strings, if any, in the current PS1 variable. See my Q here:
    # https://askubuntu.com/questions/1310665/how-to-replace-terminal-title-using-sed-in-ps1-prompt-string
    PS1_NO_TITLE="$(echo "$PS1" | sed 's|\\\[\\e\]2;.*\\a\\\]||g')"
    PS1="${PS1_NO_TITLE}${ESCAPED_TITLE}"
}
Run Code Online (Sandbox Code Playgroud)

原答案:

@Weston Ganger编写了此函数(并在此处发布)以放入~/.bashrc

function set-title() {
  if [[ -z "$ORIG" ]]; then
    ORIG=$PS1
  fi
  TITLE="\[\e]2;$*\a\]"
  PS1=${ORIG}${TITLE}
}
Run Code Online (Sandbox Code Playgroud)

然后您可以通过调用设置终端标题set-title TERMINAL NAME(名称周围的引号是可选的)。

对我来说,这看起来很神秘(请参阅我在他的回答评论),所以我昨晚花了几个小时阅读和学习,以弄清楚他做了什么以及为什么有效。这是我发现的:

  1. gnome-terminal3.16.2 左右开始(请参阅此答案下的评论),“--title不再支持该选项。” 否则,你就会这样做gnome-terminal --title="my title"就像我以前在这里做的那样
  2. 根据这里的这个答案,以及围绕这个答案的许多评论,您应该使用$@而不是$*代表上面脚本中的所有输入参数。显然$@更不容易出错且更兼容,因为它是表示“所有输入参数”的 POSIX 方式。因此,在我下面的版本中,我使用$@代替$*.
  3. 事实证明,在几乎所有终端(只要给定终端支持它)中,都有ANSI 转义码,这是一种“带内信号”形式,可用于设置终端标题。请参阅此处最优秀的 archlinux wiki 中标题为“自定义终端窗口标题”的部分。用于设置终端标题的 Bash 转义序列如下所示:并将此标题应用到您的终端窗口,您所要做的就是通过添加此“设置标题”转义序列来修改其“提示字符串 1”或变量之后您当前的提示字符串1,像这样:。由于不再支持\[\e]2;new title\a\]PS1PS1="${PS1}\[\e]2;new title\a\]"gnome-terminal--title 争论,这似乎是设置标题的唯一方法。

现在,这是我对 Weston Ganger 函数的版本,并附有大量解释性评论。这将进入我的 dotfiles,所以我永远不会丢失它:

# Set the title string at the top of your current terminal window or terminal window tab
set-title() {
    # If the length of string stored in variable `PS1_BAK` is zero...
    # - See `man test` to know that `-z` means "the length of STRING is zero"
    if [[ -z "$PS1_BAK" ]]; then
        # Back up your current Bash Prompt String 1 (`PS1`) into a global backup variable `PS1_BAK`
        PS1_BAK=$PS1 
    fi

    # Set the title escape sequence string with this format: `\[\e]2;new title\a\]`
    # - See: https://wiki.archlinux.org/index.php/Bash/Prompt_customization#Customizing_the_terminal_window_title
    TITLE="\[\e]2;$@\a\]"
    # Now append the escaped title string to the end of your original `PS1` string (`PS1_BAK`), and set your
    # new `PS1` string to this new value
    PS1=${PS1_BAK}${TITLE}
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

  • 静态标题字符串(标题保持固定):
    • set-title my tab 1 或者 set-title "my tab 1"
    • set-title $PWD 或者 set-title "$PWD"
  • 动态标题字符串(每次输入任何终端命令时标题都会更新):您可以在标题字符串中使用函数调用或变量,并在每次输入新命令时动态更新它们。只需在标题字符串中输入命令或访问全局变量即可。一定要 在标题字符串周围使用单引号才能正常工作!
    • set-title '$PWD'- 每次您cd进入新目录时,都会更新当前工作目录的标题!
    • set-title '$(date "+%m/%d/%Y - %k:%M:%S")'- 每次更改输入新的终端命令时,都会将标题更新为新的日期和时间!格式如下所示:02/06/2020 - 23:32:58

有关的:

  1. https://askubuntu.com/questions/315408/open-terminal-with-multiple-tabs-and-execute-application/1026563#1026563
  2. 我的点文件(配置文件、脚本和通用用户设置):https : //github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles

主要参考资料:

  1. [我的问题] https://askubuntu.com/questions/1310665/how-to-replace-terminal-title-using-sed-in-ps1-prompt-string
  2. 如何在 gnome-terminal 中重命名终端选项卡标题?
  3. https://wiki.archlinux.org/index.php/Bash/Prompt_customization#Customizing_the_terminal_window_title
  4. https://www.thegeekstuff.com/2008/09/bash-shell-take-control-of-ps1-ps2-ps3-ps4-and-prompt_command/
  5. 为什么bash的提示变量叫PS1?
  6. Bash 参考手册:https : //www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html


小智 5

如果您使用的是 Ubuntu 16.04,您可能需要:

PS1=$
PROMPT_COMMAND=
echo -en "\033]0;New title\a"
Run Code Online (Sandbox Code Playgroud)

我在链接中列出了有关它的更多信息。