Два основных ответвления оболочек являются производными Оболочки Bourne (sh, удар, ksh, пепел, yash и zsh) и csh производными (tcsh и... uhm... tcsh).
Я подозреваю (хотя у меня нет фактических чисел), что удар наиболее широко используется, это, кажется, оболочка по умолчанию в большинстве Linux.
Большинство вещей, записанных в одной производной оболочки Bourne, будет, вероятно, работать в других. Большинство вещей, записанных в Оболочке Bourne, должно будет, вероятно, быть изменено для выполнения под csh или tcsh.
Лично я использовал ksh, когда я начал, потому что это - то, что было в системе, которую я использовал. Я главным образом использую удар теперь.
, у меня возникла точно такая же проблема.
Поэтому я написал скрипт оболочки, который привязал к горячей клавише.
Когда я нажимаю на горячую клавишу, он получает идентификатор окна текущего активного окна (того, которое имеет фокус).
Затем появляется всплывающее диалоговое окно, в котором вы вводите заголовок, который вы хотите, чтобы это окно было.
Затем каждый раз, когда окно меняет свое название, оно меняет его обратно на нужное вам название.
Чтобы использовать скрипт, вам понадобится:
оболочка fish
shell
.
(Я написал его на рыбе, а не на баш-кузе, от башки у меня голова болит)
kdialog
какой-то способ привязать сценарий к горячей клавише
.
(Я использую xbindkeys
, потому что все, что мне нужно было сделать, чтобы заставить его работать, это добавить:
"[PATH TO SCRIPT]/[NAME OF SCRIPT]".
Mod4 + t
(т.е. клавиша окна + t)
моему /home/o1/.xbindkeysrc
)
Благодаря этому чуваку , который дал мне информацию о волшебной штуке с экспропом.
(Год назад, а потом я так и не смог написать сценарий до сегодняшнего дня. xD )
P.S. Если кто-нибудь из новичков найдет этот ответ и не знает, как им пользоваться, просто спросите меня, и я провожу вас по нему. ^^
EDIT: Я обновил его так, что вы можете использовать его из командной строки с помощью переключателей -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
EDIT: На самом деле я больше не использую этот скрипт Fish;
.
Я переписал его на Руби:
#!/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
#
То, что Вы ищете, походит на средство меток окна. Я сомневаюсь, что KDE имеет поддержку этого, другие WMs (как XMonad или DWM и т.д.) делают.
Таким образом одна возможность достигнуть этого повышения производительности состояла бы в том, чтобы торговать kwin
в для XMonad и настраивают XMonad, чтобы сделать метки. XMonad метки механизма, как описано во второй ссылке должны были бы обязать сочетание клавиш открывать подсказку, которые позволяют нам, Вы отмечаете сфокусированное окно. (Конфигурацией XMONAD является на самом деле Haskell-программа, поэтому обратитесь за помощью в #xmonad.
Править: В то время как я советовал бы всем, по крайней мере, пробовать мозаичное размещение WM некоторое время, я забыл указывать, что, в то время как XMonad обычно упоминается как мозаичное размещение WM, существует "простое плавание" - режим. Конечно, существуют другие WMs, которые поддерживают метки и немозаичное размещение разметок, но я не знаю об их совместимости с KDE.
С тех пор нет никакого способа установить заголовок окна для защиты от записи не будет никакого решения той проблемы, так как много программ сбрасывают свой заголовок после различных действий, поскольку Вы уже обнаружили.
Но возможно хорошее предложение для KDE и людей Gnome ;-)
Я искал то же самое и по той же причине. В итоге потратил на это слишком много времени с этим сценарием из 70 строк.
Как это работает?
Затем он запустит цикл в фоновом режиме, проверяйте каждое 3 секунды и установите заголовок, если он изменится.
Предупреждение: не запускайте дважды в одном окне, скрипт не идеален.
пример имени сценария: липкий заголовок
#!/bin/bash
# stop all instance of this script if "killall" provided as first argument
if [ "$1" == "killall" ]; then
scriptname=$(basename "$0")
pattern="[0-9]* /bin/bash .*$scriptname$"
pids=$(ps ax -o pid,cmd | grep -P "$pattern" | sed 's/^ *//;s/ *$//' | grep -Pv ' grep|killall$' | cut -d" " -f1)
if [ "$pids" != "" ]; then
kill -TERM $pids
echo "$(echo '$pids' | wc -l) instances stopped"
else
echo "None found to stop"
fi
exit 0
fi
# ask for window
echo -en "\nClick the window you want to set its title "
id=$(printf %i $(xwininfo | grep 'Window id' | cut -d" " -f4))
# fail if no window id
if [ "$id" == "" ]; then
echo 'Error: Window id not found'
exit 1
else
echo "- Got it"
fi
# ask for title
read -e -p "Enter target title: " title
# fail if no title
if [ "$title" == "" ]; then
echo "Error: No title to set"
exit 1
fi
# define loop as a function, so we can run it in background
windowByIdSetStickyTitle() {
local id title curr_title
id="$1"
title="$2"
while true; do
# get current title
curr_title="$(xdotool getwindowname $id 2>/dev/null)"
# exit if we can't find window anymore
if [ $? -ne 0 ]; then
echo "Window id does not exist anymore"
break
fi
# update title if changed
if [ "$curr_title" != "$title" ]; then
xdotool set_window --name "$title" $id
fi
# needed else you will eat up a significant amount of cpu
sleep 3
done
}
# infinite loop
windowByIdSetStickyTitle $id "$title" &
# done
echo "Sticky title set"
exit 0