ここではKDEを使用していますが、他のデスクトップ環境でも機能するソリューションがあるかもしれません。私はよくたくさんの窓を扱っています。ほとんどのウィンドウには多くのタブが含まれています(たとえば、多くのタブがあるDolphinウィンドウ、またはFirefox、Konsoleなど)。ウィンドウのタイトルは現在のタブに基づいて変更されます(ほとんどの場合、これはほとんどの場合役に立ちます)が、非常に多くのウィンドウを操作するときは、ウィンドウを少し整理して、手動で再設定できるようにしたいと思います。ウィンドウに名前を付け、アプリケーションが与えるウィンドウタイトルを上書きします 。 1つのFirefoxウィンドウに「Research」という名前を付け、他のFirefoxウィンドウに「Documentation」という名前を付けて、さまざまなタブを整理およびグループ化するために使用したウィンドウを簡単に区別できるようにします。
理想的には、ウィンドウのタイトルバーをクリックして、簡単にカスタム名を付けることができますが、機能する限り、少し面倒な解決策を選びます。
wmctrl -r :SELECT: -T "Research"
を試しました ただし、これは一時的にしか機能しません(たとえば、タブを切り替えるときなど、アプリケーションがタイトルを変更すると、タイトルが元に戻ります)。
承認された回答:
これとまったく同じ問題がありました。
そこで、ホットキーにバインドするシェルスクリプトを作成しました。
ホットキーを押すと、現在アクティブなウィンドウ(フォーカスがあるウィンドウ)のウィンドウIDが取得されます。
次に、そのウィンドウに付けるタイトルを入力するポップアップダイアログが表示されます。
その後、そのウィンドウの名前が変更されるたびに、希望のタイトルに戻ります。
スクリプトを使用するには、次のものが必要です。
-
fish
shell
(bash cuz bashではなく魚で書いたので頭痛がします) -
kdialog
-
スクリプトをホットキーにバインドする方法
(xbindkeys
を使用します 、それを機能させるために私がしなければならなかったのは、追加することだけでした:
"[PATH TO SCRIPT]/[NAME OF SCRIPT]"
Mod4 + t
(つまり、ウィンドウキー+ t)
私の/home/o1/.xbindkeysrc
)
魔法のxpropに関する情報をくれたこの男に感謝します。
(1年前のように、今日までスクリプトを書くことはできませんでした。xD)
P.S.初心者がこの答えを見つけて使用方法がわからない場合は、私に聞いてください。説明します。 ^^
編集:スイッチ-t
を使用してコマンドラインから使用できるように更新しました title_i_want
の場合 および-w
window_id
の場合 。
スクリプトは次のとおりです:
#!/usr/local/bin/fish
# this block is so you can use it from the command line with -t and -w
if test "$argv" != "" -a (math (count $argv)%2 == 0)
for i in (seq 1 (count $argv))
if test $argv[$i] = '-t'
set title_i_want $argv[(math 1 + $i)]
else if test $argv[$i] = '-w'
set window_id $argv[(math 1 + $i)]
end
end
if not test $window_id
echo "YOU DIDN'T ENTER A `window_id` WITH `-w`,
SO MAKE SURE THE WINDOW YOU WANT HAS FOCUS
TWO SECONDS FROM NOW!"
sleep 2
end
end
# get the id of the currently focused window
if not test $window_id
set window_id (xprop -root _NET_ACTIVE_WINDOW | grep -P -o "0x\w+")
end
# get the title to force on that window
if not test $title_i_want
set title_i_want (kdialog --title "entitled" --inputbox "type the title you want and hit enter.
to stop renaming,
just enter nothing and hit esc")
end
# this bit is needed for a kludge that allows window renaming
set has_renamed_before "FALSE"
set interrupt_message "WAIT WAIT I WANT A TURN BLOO BLOO BLEE BLUH BLOO" # hopefully i never want to actually use that as a title xD
xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME $interrupt_message -id $window_id
# take the output of xprop
# pipe it into a while loop
# everytime it outputs a new line
# stuff it into a variable named "current_title"
xprop -spy _NET_WM_NAME -id $window_id | while read current_title
# cut off extraneous not-the-title bits of that string
set current_title (echo $current_title | grep -P -o '(?<=_NET_WM_NAME\(UTF8_STRING\) = ").*(?="\z)')
# if the current title is the interrupt message
# AND
# this script has renamed the window at least once before
# then we wanna let the new name take over
if test $current_title = $interrupt_message -a $has_renamed_before = "TRUE"
exit
# if title_i_want is an empty string, exit
else if test $title_i_want = ""
xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME "WIDNOW WILL START RENAMING ITSELF AS NORMAL" -id $window_id
exit
# otherwise just change the title to what i want
else if test $current_title != $title_i_want
xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME "$title_i_want" -id $window_id
set has_renamed_before "TRUE"
end
end
編集:私は実際にはもうこのFishスクリプトを使用していません;
Rubyで書き直しました:
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'trollop'
opts = Trollop.options do
opt :title_i_want, "title_i_want", default: ""
opt :bluh, "write to bluh", default: nil
opt :copy_title, "copy_title", default: nil
# TODO - AUTO OPTION
opt :auto, "auto", default: nil
end
title_i_want = opts[:title_i_want]
def get_current_wid
`xprop -root _NET_ACTIVE_WINDOW`[/0x\w+/]
end
def with_current_title wid, &block
IO.popen("xprop -spy _NET_WM_NAME _NET_WM_ICON_NAME -id #{wid}") do |io|
loop do
line = io.gets
exit if line.nil?
line = line.strip
# cut off extraneous not-the-title bits of that string
current_title = line[/(?:_NET_WM_(?:ICON_)?NAME\(UTF8_STRING\) = ")(.*)("$)/, 1]
block.call current_title unless current_title.nil?
end
end
end
def get_current_title wid
IO.popen("xprop _NET_WM_NAME _NET_WM_ICON_NAME -id #{wid}") do |io|
line = io.gets.strip
# cut off extraneous not-the-title bits of that string
current_title = line[/(?:_NET_WM_(?:ICON_)?NAME\(UTF8_STRING\) = ")(.*)("$)/, 1]
return current_title unless current_title.nil?
end
end
if opts[:copy_title]
# require "muflax"
p 1
wid = get_current_wid
`echo -n '#{get_current_title wid}(WID: #{wid})'|xclip -selection c`
exit
end
if opts[:bluh]
require "muflax"
loop do
# p 1 #db
wid = get_current_wid
# p 2 #db
File.open "bluh", "a+" do |f| f.puts get_current_title wid end
while wid == get_current_wid
# puts "..." #db
sleep 1
end
end
exit
end
#> 1A - from terminal - give title_i_want
if not title_i_want.empty?
#> 1A.1 - get current wid - assume it's the terminal_wid
terminal_wid = get_current_wid
#> 1A.2 - wait for wid to change
while get_current_wid == terminal_wid
puts "focus the window you want to title «#{title_i_want}»..."
sleep 1
end
#> 1A.3 - set new wid to target TWID
TWID = get_current_wid
#> 1B - from hotkey (or just sleeping) - no give title_i_want
else
#> 1B.1 - set current wid to target TWID
TWID = get_current_wid
#> 1B.2 - get title_i_want (with kdialog)
#> 1B.2.1 - default to current title
with_current_title TWID do |current_title|
# v :current_title #db
default_title = current_title
sublime_match = /
(?<beginning>.*?) # beginning might be...
# path
# untitled, find results, other useless junk
# 𝌆 dired
(?<dirty>\s•)? # dirty?
(?:\s\(\.?(?<projname>[^()]*)\))? # project name, preceded by "." (i name them that way), and in rkaks (sublime does that)
# or, sans dot, it's the dir, if the window was opened as a dir
(?<issub>\s-\sSublime\sText\s2\s\(UNREGISTERED\)) # garbage at the end that marks it as a sublime window
/x =~ current_title
#if it's a sublime window...
if sublime_match
dummy = beginning.split("/")
if dummy.length > 1
taildir = dummy[-2]
end
/𝌆 (?<direddir>.*)/ =~ beginning
default_title =
if projname ; projname
elsif taildir ; taildir
elsif direddir ; direddir
else ; beginning
end
end
if opts[:auto]
title_i_want = default_title
else
title_i_want = `kdialog --title "entitled" --inputbox "type the title you want and hit enter.\nto stop renaming,\njust enter nothing and hit esc" '#{default_title}'`.chomp
end
break
end
end
# v :terminal_wid #db
# v :TWID #db
# v :ARGV #db
# v :title_i_want #db
def set_title wid, title
`xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME "#{title}" -id #{wid}`
`xprop -f _NET_WM_ICON_NAME 8u -set _NET_WM_ICON_NAME "#{title}" -id #{wid}`
end
#> 2 - apply title to TWID
#> 2.1 - allow de-naming
#> 2.2 - allow renaming
# this bit is needed for a kludge that allows window renaming
has_renamed_before = false
interrupt_message = "WAIT WAIT I WANT A TURN BLOO BLOO BLEE BLUH BLOO" # hopefully i never want to actually use that as a title xD
`xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME '#{interrupt_message}' -id #{TWID}`
with_current_title TWID do |current_title|
# if title_i_want is an empty string, exit
if title_i_want.empty?
# p 1 #db
set_title TWID, "WINDOW WILL START RENAMING ITSELF AS NORMAL"
exit
# if the current title is the interrupt message
# AND
# this script has renamed the window at least once before
# then we wanna let the new name take over
elsif current_title == interrupt_message and has_renamed_before
# p 2 #db
exit
# otherwise just change the title to what i want
elsif current_title != title_i_want
# p 3 #db
set_title TWID, title_i_want
has_renamed_before = true
end
end