Paksa judul pada layar GNU

9

Secara default, judul sesi layar adalah nama dari perintah terakhir yang dimasukkan, yang baik untuk saya, tetapi dalam beberapa kasus saya ingin mengubahnya. Saya tahu perintah Ctrl- A A, tetapi hanya mengubah judul sampai perintah berikutnya, dan saya ingin tetap di sana sampai saya memutuskan sebaliknya.

EDIT: Inilah preexecfungsi yang saya temukan di.zshrc

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek$CMD\e\\"
fi
gregseth
sumber

Jawaban:

9

Tergantung bagaimana hal-hal diatur, tetapi secara default, sesuatu seperti ini seharusnya bekerja.

settitle() {
    printf "\033k$1\033\\"
}

Lalu lari:

settitle NEWTITLE.

Lihat dokumen judul layar dan faq layar GNU untuk detail lebih lanjut.

Diberikan Ctrl+ A Ahanya mengubahnya sampai perintah berikutnya, itu mungkin diatur oleh $PS1(semua shell), atau $PROMPT_COMMAND/ DEBUG trap(hanya bash) atau precmd/ preexec(hanya zsh).

Anda harus mencari tempat yang \eatau \033muncul dengan katau \\setelah, pada dasarnya seperti saya settitlecontoh di atas.

MEMPERBARUI

Anda bilang punya kebiasaan preexec.

Mengapa tidak mengubahnya ke ini:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek${TITLE:-$CMD}\e\\"
fi

Kemudian Anda dapat mengatur judul khusus dengan menjalankan:

TITLE="my title"

dan hapus judul dengan menjalankan

TITLE=

Jangan lupa untuk berubah precmddan $PS1juga jika perlu.

KE SAMPING

Anda bahkan bisa memperpanjang ini ke semua terminal (misalnya xterm, gnome-terminal, dll) dengan tidak keras coding \ekdan \e\\.

Beginilah cara saya melakukannya:

terminit()
{
    # determine the window title escape sequences
    case "$TERM" in
    aixterm|dtterm|putty|rxvt|xterm*)
        titlestart='\033]0;'
        titlefinish='\007'
        ;;
    cygwin)
        titlestart='\033];'
        titlefinish='\007'
        ;;
    konsole)
        titlestart='\033]30;'
        titlefinish='\007'
        ;;
    screen*)
        # status line
        #titlestart='\033_'
        #titlefinish='\033\'
        # window title
        titlestart='\033k'
        titlefinish='\033\'
        ;;
    *)
        if type tput >/dev/null 2>&1
        then
            if tput longname >/dev/null 2>&1
            then
                titlestart="$(tput tsl)"
                titlefinish="$(tput fsl)"
            fi
        else
            titlestart=''
            titlefinish=''
        fi
        ;;
    esac
}


# or put it inside a case $- in *i* guard
if test -t 0; then
    terminit
fi

# set the xterm/screen/etc. title
settitle()
{
    test -z "${titlestart}" && return 0

    printf "${titlestart}$*${titlefinish}"
}

Kemudian Anda dapat mengubah preexecke:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   settitle "${TITLE:-$CMD}"
fi
Mikel
sumber
Perintah yang Anda berikan tidak persis sama dengan Ctrl-A A. Dan tentang prompt, maksud Anda saya harus memodifikasi $PS1setiap kali saya ingin judul tidak berubah?
gregseth
Maksud saya periksa itu tidak mengandung ESC k sesuatu ESC \. Lakukan PROMPT_COMMAND.
Mikel
ESC dapat ditulis \eatau \033.
Mikel
Tautan layar judul dokumen harus memiliki informasi yang diperlukan
Mikel
5

Jika judul jendela Anda mencerminkan aplikasi yang sedang berjalan di jendela, itu karena shell Anda melakukan itu. Jika melakukan itu, itu karena distribusi Anda, administrator sistem Anda atau Anda mengonfigurasikannya.

Jika perintah muncul sebagai judul jendela saat perintah dijalankan, ini dilakukan oleh preexecfungsi (di zsh), atau emulasi daripadanya di bawah bash .

Jika judul berubah ketika setiap perintah selesai, ini dilakukan oleh precmdfungsi di zsh, PROMPT_COMMANDparameter di bash, atau sebagai bagian dari prompt ( PS1parameter) di shell apa pun. (Perintah untuk mengubah judul adalah urutan pelepasan yang dipancarkan oleh aplikasi apa pun sebagai bagian dari aliran keluaran terminal, sehingga dapat disematkan dalam prompt.)

Mencari urutan escape seperti \e]0;new title\a, \e]2;new title\aatau \eknew title\e\\dalam file inisialisasi shell Anda ( ~/.bashrc, ~/.zshrc, ...). Jika tidak ada yang relevan, pengaturan mungkin dalam file sistem (misalnya /etc/bash.bashrc, /etc/zsh/zshrc); kemudian timpa parameter atau fungsi itu dalam file inisialisasi Anda sendiri.

Lihat jawaban Mikel untuk pengaturan judul yang dapat ditimpa di preexec.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih, Anda membuatnya sangat jelas. Saya memang menemukan preexecfungsi yang didefinisikan dalam .zshrc saya. Masalahnya, itulah perilaku yang saya inginkan ... sebagian besar waktu. Saya ingin dapat menonaktifkannya dengan cepat di satu layar tertentu. Mungkin ada variabel yang bisa saya dapatkan di preexecfungsi ketika saya secara manual mengatur judul, atau sesuatu seperti itu?
gregseth
@regregh: Agak sulit untuk dijelaskan secara umum, tetapi jika Anda memposting preexecfungsi Anda , saya atau orang lain mungkin dapat menyarankan perubahan sederhana.
Gilles 'SO- stop being evil'
Saya akan menyebutkan preexec, tetapi Greg tidak mengatakan dia menggunakan zsh. Itu akan mengajari saya. ;-)
Mikel
@Mikel: Penjelasan saya lebih baik dari Anda, tetapi preexecdesain baru Anda lebih baik dari saya.
Gilles 'SANGAT berhenti menjadi jahat'
Saya setuju. :-) Jawaban orisinal saya mencoba mengajar OP untuk menemukan jawabannya sendiri. Milikmu lebih segera membantu. Bagaimanapun, kita semua menang.
Mikel