Atur judul jendela xterm (Putty) saat menggunakan layar?

12

Saya mencoba screenmengatur xtermjudul saya . Saya memiliki ini berfungsi di luar screen, tetapi screenmenjaga judul apa pun di tempat ketika saya mulai. Ini milik saya .bashrc:

function bash_prompt_command () {
    # Berapa banyak karakter $ PWD yang harus disimpan
    pwdmaxlen lokal = 25
    # Tunjukkan bahwa telah ada pemotongan dir
    trunc_symbol lokal = ".."
    dir lokal = $ {PWD ## * /}
    pwdmaxlen = $ (((pwdmaxlen <$ {# dir})? $ {# dir}: pwdmaxlen))
    NEW_PWD = $ {PWD / # $ HOME / \ ~}
    pwdoffset lokal = $ (($ {# NEW_PWD} - pwdmaxlen))
    jika [$ {pwdoffset} -gt "0"]
    kemudian
        NEW_PWD = $ {NEW_PWD: $ pwdoffset: $ pwdmaxlen}
        NEW_PWD = $ {trunc_symbol} / $ {NEW_PWD # * /}
    fi

    ekspor NEW_PWD
}

PROMPT_COMMAND = bash_prompt_command
# Bagan warna @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
huruf "$ {TERM}" di
    "xterm")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        PS1 = "$ {TITLEBAR} \ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \] @ \ e [1; 33m \] \ h \ e [ 1; 32m \]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ \ [\ e [0m "
        ;;
    "layar")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        ESC = '\ [\ ek \ e \\\]'
        PS1 = "$ {TITLEBAR} \ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ $ {ESC} \ [\ e [0m "
        ;;
    *)
        PS1 = "\ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \] @ \ e [1; 33m \] \ h \ e [1; 32m \ ]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ \ [\ e [0m "
    ;;
esac

Dan ini milik saya .screenrc:

hardstatus selalulastline
string hardstatus '% {= kg} [% {Y}% H% {g}] [% =% {= kw}%?% - Lw%?% {= b kR} (% {W}% n-% t%? (% u)%?% {= b kR})% {= kw}%?% + Lw%?%?% =% {g}] [% {Y}% l% {g}]% {g} [% {B}% m.% d.% Y% {G}% c% {g}] '

termcapinfo xterm | xterms | xs | rxvt ti @: te @
termcapinfo xterm 'hs: ts = \ E] 2;: fs = \ 007: ds = \ E] 2; screen \ 007'

altscreen aktif
shelltitle '$ | bash'

Apa yang saya lakukan salah?

Pembaruan (19 Agustus 2010): Masalahnya adalah Anda tidak dapat memperbarui judul terminal dari dalam layar ketika Anda mengatur alwayslastline. Jadi solusi saya adalah menyerah dan puas dengan judul yang telah ditentukan, berguna, untuk sesi layar saya. Saya diperbarui .bashrcdan .screenrcdapat ditemukan di http://bitbucket.org/jsumners/rcfiles/src .

James Sumners
sumber

Jawaban:

4

Kode melarikan diri berbeda di dalam layar .

Ini di luar layar:

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

setara dengan layar bagian dalam ini:

PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME}: ${PWD}\033\\"'

Mengubah kasing kasus Anda $ {TERM} = "screen" menjadi

TITLEBAR='\[\033_\u@\h > ${NEW_PWD}\033\\\]'

akan menyelesaikan masalah Anda.

crb
sumber
Ini tidak bekerja. Saya tidak mengerti mengapa.
James Sumners
Saya telah menentukan pengaturan itu hardstatus alwayslastlineseperti yang saya lakukan untuk screenmencegah screenpengaturan xtermjudul. Sekarang jika saya bisa mencari tahu bagaimana melakukan keduanya sekaligus.
James Sumners
Apakah karena status hard Anda memiliki% t (untuk judul) di dalamnya?
crb
Nggak. Baru saja menghapus itu dan mendapatkan hasil yang sama. Saya percaya saya harus menetapkan alias untuk screenyang menetapkan judul jendela dan kemudian meluncurkan program. Dan kemudian menyerah pada judul terminal dinamis saat menggunakan screen. :(
James Sumners
1
bugs.launchpad.net/byobu/+bug/338722/comments/10 mengatakan ini adalah batasan di layar
agnul
7

Sebenarnya, ada cara untuk mengirim urutan escape langsung ke xterm, melewati layar. Itu tidak mudah ditemukan, tetapi dari kode layar (src / ansi.c) saya pikir itu sudah ada sejak tahun 2005. Saya memilikinya bekerja di xterm, Terminal Gnome, dan dempul. Saya menemukan catatan di sumber mintty menunjukkan itu tidak berfungsi di sana hanya karena mereka tidak menangani DCS (kecuali diperbaiki baru-baru ini).

Dari dokumentasi untuk layar di bawah ini (di http://www.gnu.org/software/screen/manual/html_node/Control-Sequences.html )

ESC P (A) Device Control String
          Outputs a string directly to the host terminal without interpretation.

ANSI DCS (Device Control String) adalah kode pelarian yang digunakan untuk mengirim langsung ke terminal (saya pikir itu adalah tujuan aslinya dari beberapa tahun yang lalu). String semacam itu diakhiri dengan kode pelolosan ST (String Terminator).

Bungkus string untuk mengatur judul jendela terminal di dalam blok DCS..ST, dan melewati layar dan memperbarui dengan benar, bahkan dengan hardstatus selalulastline.

DCS = \ 033P, ST = \ 033 \

Contoh - untuk memperbarui judul jendela dengan direktori kerja saat ini, gunakan

NEW_TITLE="\033]0;${PWD/$HOME/~}\007"
echo -ne "\033P${NEW_TITLE}\033\\"

Lebih baik terlambat daripada tidak sama sekali! Semoga ini bisa membantu seseorang.

Kalau-kalau saya salah tentang perubahan sumber layar: Saya menjalankan git terbaru dari sesi-layar, yang pada gilirannya menggunakan hampir terbaru dari git layar (dengan beberapa perubahan khusus untuk sesi-layar). Tetapi pesan log bertanggal dari layar 2005 (Anda dapat melihat perubahan yang dilakukan pada komit tersebut mengenai penanganan DCS jika Anda mengkloning layar git repo dan menggunakan perintah di bawah ini).

git clone git://git.savannah.gnu.org/screen.git
git difftool e6618a14^! src/ansi.c
bwillan
sumber
1

crb agak benar, tapi

a) kode pelarian yang dia gunakan tidak bekerja untuk saya. Seharusnya \033kbukan \033_. Lihat di screen (1)bawah "TITLES (naming windows)". Jadi seharusnya:

PROMPT_COMMAND='echo -ne "\033k${USER}@${HOSTNAME}: ${PWD}\033\\"'

b) pelarian semacam ini hanya digunakan untuk mengatur judul jendela layar. Satu contoh layar dapat memiliki beberapa jendela, masing-masing memiliki nama, yaitu apa yang ditampilkan hardstatusdan captiondengan turutan pelarian.

c) bash normal escape berfungsi jika Anda mengatur terminfo yang tepat untuk xterm di .screenrc:

termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

(ini juga works on my machineuntuk dempul)

Jadi untuk mengatur judul yang tepat untuk jendela layar dan judul dempul / xterm, saya menggunakan sesuatu seperti:

XTERM_TITLE="${USER}@${HOSTNAME}: ${PWD}"
SCREEN_TITLE="${PWD}"
PROMPT_COMMAND='echo -ne "\033]0;$XTERM_TITLE\007\033k$SCREEN_TITLE\033\\"'

untuk referensi: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html

0x89
sumber
1

Saya tidak akan menjawab pertanyaan sepenuhnya, tetapi izinkan saya menyarankan cara untuk menyelesaikan masalah. Banyak manajer jendela mendukung spesifikasi EWMH . Ada juga alat baris perintah wmctrlyang dapat berinteraksi dengan mereka. Dengan menggunakan alat ini, seseorang dapat dengan mudah mengubah judul jendela aktif dengan perintah berikut:

  wmctrl -r :ACTIVE: -T "FooTitle"

Dimungkinkan juga untuk mengubah ikon jendela, tata letak dan properti lainnya. Alat ini mungkin tidak akan berfungsi untuk Putty karena Windows tidak mendukung EWMH, tetapi sebagian besar sistem Linux harus menerimanya.

Dengan metode ini tidak masalah apakah Anda menggunakan screenatau tidak.

grwlf
sumber
0

2 minggu terakhir saya telah mencari banyak forum dan saya belum menemukan jawaban untuk pertanyaan:

Bagaimana cara mendapatkan semua output perintah ke judul Putty?

Membutuhkannya untuk program lain untuk mengetahui kapan beberapa pekerjaan di server dilakukan dan apakah itu dilakukan dengan benar atau salah. Plink stdout dan stdin tidak berfungsi, saya menggunakan banyak tweak dengan penundaan menunggu dan untuk beberapa perintah yang bekerja untuk yang lain tidak. XSEL dan XCLIP tidak dapat diinstal pada server itu.

Jadi, inilah solusinya:

  1. Dapatkan output perintah dalam file.
  2. Gema file itu ke judul.

Pada klien dempul dan server suse sepertinya:

ls /home | grep domagaja > logutoit.txt 
echo -e "\033]0\\;$(cat logutoit.txt)\\007\\c"

Semoga seseorang dapat menggunakan ini. Itu tidak akan bekerja untuk semua jenis server dan pengaturan klien dempul, tentu saja, tetapi idenya harus bekerja dengan baik.

Jacek Domagała
sumber