设置 Konsole 窗口的名称

设置 Konsole 窗口的名称

如何在 KDE 中设置 Konsole 窗口的名称?我知道我们可以更改选项卡的名称,并且 Konsole 窗口标题已预先配置为使用当前选项卡的名称,但这不是我想要做的。

我有一个 Konsole 窗口,其中有三个选项卡始终保持打开状态(vimwikicmus和一个自定义 Python 脚本),我希望能够在众多其他 Konsole 窗口中轻松找到它们,每个窗口都有自己的一组标签。

解决方法是将所有选项卡命名为我想要的窗口名称,但这样做有很多缺点。最好使用重命名整个窗口的简单方法。我也可以对这个“特殊”窗口使用不同的终端仿真器,但我真的很喜欢 Konsole。

答案1

您可以在末尾添加一个 bash 函数~/.bashrc

title() {
  echo $'\033]30;'$*$'\007'
}

(保存 .bashrc 后记得在控制台中输入:. ~/.bashrc以将该功能添加到您的 shell,否则您可以打开一个新的终端)

您可以像这样使用新功能:

title this is my console

答案2

似乎至少在 Konsole 的最新版本中,标题无法更改。不过,您可以更改选项卡,例如通过以下 ANSI 序列:

echo $'\033]30;NewName\007'

更新:

为了获得灵感,我尝试了另一种方法。我创建了一个文件~/konsole-name.sh

function kname {
    name=$(grep $WINDOWID .knamerc)
    name=${name#*$'\t'}
    if [[ $name ]] ; then
        qdbus org.kde.konsole $KONSOLE_DBUS_SESSION \
            org.kde.konsole.Session.setTitle 1 $name > /dev/null
    fi
}

function kname-set {
    sed -i "/^$WINDOWID\t/d" .knamerc
    echo $WINDOWID$'\t'"$1" >> .knamerc
    kname
}

我在 .bashrc 中添加了以下内容:

. ~/konsole-name.sh && kname

然后,当启动新的 konsole 时,我只需kname-set THE-ONE-TRUE-KONSOLE在第一个窗口中键入内容即可。所有新创建的选项卡都将使用相同的名称。您可以通过在其第一个选项卡中调用该函数来为任何 konsole 指定其“名称”。

您可能需要.knamerc在注销时破坏该文件。

剩下的就留给读者练习吧:-)

答案3

让 Konsole 的标题显示活动 Konsole 选项卡的文本

为了使标题反映当前选定的 Konsole 选项卡的文本,必须使用 Konsole 配置“在标题栏上显示窗口标题”选项已禁用(即未选中)。如果没有这样做,则设置-konsole-active-tab-text.sh,位于此答案的底部,只能更改 Konsole 选项卡文本,但 Konsole 标题不会受到影响,并且在执行代码时将保留其值。

事实上,如果你看到这种行为,标签会改变,但标题仍固定在原来的值,这是一个很好的迹象,表明“在标题栏上显示窗口标题”为当前 Konsole 实例设置配置选项。

要设置此属性,请打开 Konsole常规配置使用设置/配置 Konsole菜单项。确保已选中左侧顶部的“常规”项,并在右侧的常规设置下,然后设置或确认“在标题栏上显示窗口标题”配置项是未选中

将 Konsole 标题设置为固定字符串(独立于选项卡)

另一方面,如果您希望简单地设置 Konsole 标题并使其独立于当前选定选项卡中的文本,则可以设置/保留“显示窗口标题...”选项已检查然后,您可以使用以下代码片段将 Konsole Title 设置为固定设置并保持它独立的对窗口中所有当前选项卡和新创建的选项卡的 Konsole 选项卡文本设置的任何先前/后续更改:

设置控制台标题.sh

#!/usr/bin/env bash

# Script: set-konsole-title.sh
# Author: Michael Goldshteyn
# Last modified: 2022-07-26

# Prerequisites
# Requires KDE Plasma 5 or higher
# The "Show window title on the titlebar" configuration option
#   must be enabled (checked "on," in Konsole Config/General)

# Note: If no argument is passed to the script, the Konsole title
#   will get set to an empty string.
konsole_title="$1:-"

# Use an ANSI escape code to change the Konsole Title
printf $'\033]2;%s\007' "$konsole_title"

标题/标签文本关联

我想重申,以下方法假设“在标题栏上显示窗口标题”如前所述,未选中此选项,不仅允许以编程方式更改选项卡文本,还可以动态地将 Konsole 窗口的标题与当前活动选项卡中的文本绑定在一起。这意味着 Konsole 标题将是动态的,随着您在选项卡之间移动而变化,更新以反映在选项卡激活期间激活的选项卡的文本,此后与此选项卡的文本保持同步(只要它保持活动状态)。

以下方法可以以编程方式设置当前活动选项卡的选项卡文本(可能是固定字符串),然后让 Konsole 标题选择性地反映当前活动选项卡中显示的文本。

额外提示

可以在 Konsole 的选项卡配置部分中指定新打开选项卡的初始文本 - 在设置菜单,选择配置 Konsole至于先前观点并选择左侧的 Tabs 配置部分配置——Konsole打开的对话框。

继续...

如果您注意到您的 Konsole 标题(奇怪地)恢复为默认选项卡文本的显示,则很可能是因为没有为新打开的选项卡运行以下脚本(将其文本更改为您喜欢的文本)。

通过编程方式更改活动控制台选项卡的文本

下面是一个脚本,展示了如何实现这一点,从 KDE Plasma 5 开始,作为一个完全注释的独立 Bash shell 脚本,你可以将其添加到有用的实用程序脚本集合中:

设置-konsole-active-tab-text.sh

#!/usr/bin/env bash
set -x

# Script: set-konsole-active-tab-text.sh
# Author: Michael Goldshteyn
# Last modified: 2022-07-26

# A Bash script that can be used to set the text of the currently
# active tab of a Konsole process, optionally updating the Konsole
# window's title in the window caption as a side-effect, and keeping
# the two in sync.

######################### Prerequisites #########################
# KDE Plasma 5 or higher
#
# Optional:
# The "Show window title on the titlebar" option must be disabled
#   (i.e., unchecked) under the Konsole Configuration/General
#   section, for the Konsole title text to stay synchronized with
#   the text of the currenly active Konsole tab.
#
# Link to the Stack Exchange (Super User) answer with the latest
#   version of this code: https://superuser.com/a/1733814/52267
#################################################################

set_konsole_tab_text()
{
  local -i starting_pid
  local -i pid_to_check
  local -i ppid_to_check
  local exe_filename_of_parent_proc
  local -i tab_owner_konsole_pid
  local dbus_service_name
  local dbus_path
  local -i role
  local tab_text

  # If no tab text is passed in, the tab text will be set to the
  # empty string
  tab_text="$1"

  # The following code is necessary even if no tabs are visible,
  #   because Konsole suppresses the display of tabs when only
  #   a single tab is present. At least one tab is always open
  #   while a Konsole process is running. When more than one
  #   tab is open, the tabs will be shown and the text of all
  #   displayed tabs will become visible.

  # Find the PID of the Konsole process that owns the currently
  #   selected tab, by walking up the process ancestor chain of
  #   the shell process running in the context of the current
  #   tab (i.e., whatever process is executing this code).
  # Important Note: We may need to iterate up the process chain
  #   multiple times, if the following code is being executed
  #   within a subshell (e.g., if this code is placed into a
  #   shell script that gets executed within a separate (child)
  #   instance of Bash).

  # Get the process id of the current (shell) process
  starting_pid="$$" 
  pid_to_check="$starting_pid"
  # Seek out our Konsole ancestor process
  until [[ -n $tab_owner_konsole_pid ]]; do
    # Get the PID of the parent of the current process in the chain
    ppid_to_check="$(ps -p "$pid_to_check" -o ppid= | tr -d ' ')"
    # Get the name of the associated executable (i.e., app filename)
    exe_filename_of_parent_proc="$(ps -p "$ppid_to_check" -o comm=)"
    # Is it an instance of the Konsole app?
    if [[ "$exe_filename_of_parent_proc" == konsole ]]; then
      # Eureka - we found it!
      tab_owner_konsole_pid="$ppid_to_check"
    else # No, keep searching up the process ancestor chain
      pid_to_check="$ppid_to_check" # ..., from the parent process
    fi
  done

  # Construct the name of the qdbus service using the above
  dbus_service_name="org.kde.konsole-$tab_owner_konsole_pid"
  # The $KONSOLE_DBUS_SESSION environment varable gets set
  #   automatically by Konsole (and gets exported to the child
  #   shell associated with the tab).
  # This value should be used for the dbus_path argument to qdbus
  dbus_path="$KONSOLE_DBUS_SESSION"

  # Use this for the role arg of the setTitle() method, below
  role=1 

  # Set the tab text using a dbus method call
  qdbus "$dbus_service_name"\
        "$dbus_path"\
        setTitle "$role" "$tab_text"
}

# Set the text of the currently active Konsole tab to the text
# passed as an argument to this script
set_tab_text "$@"

答案4

如果你愿意,你可以使用gnome 终端,它允许您设置自定义标题。您可以在以下位置设置自定义标题:

  • 编辑 -> 当前个人资料 -> 标题和命令 -> 初始标题
  • 并在下拉菜单中单击:“在初始标题之前”

此初始标题附加到您的标签标题,您也可以通过以下方式自定义:

  • 终端 -> 设置标题。

gnome-terminal 还允许您使用 alt+1、alt+2 等轻松切换选项卡!

相关内容