Đặt tiêu đề cửa sổ xterm (PuTTY) khi sử dụng màn hình?


12

Tôi đang cố gắng để có được tiêu đề screencủa tôi xterm. Tôi có cái này hoạt động bên ngoài screen, nhưng screengiữ bất kỳ tiêu đề nào được đặt ra khi tôi bắt đầu nó. Đây là .bashrc:

hàm bash_prompt_command () {
    # Nên giữ bao nhiêu ký tự của $ PWD
    pwdmaxlen địa phương = 25
    # Chỉ ra rằng đã có cắt bớt dir
    trunc_symbol cục bộ = ".."
    thư mục địa phương = $ {PWD ## * /}
    pwdmaxlen = $ (((pwdmaxlen <$ {# dir})? $ {# dir}: pwdmaxlen))
    NEW_PWD = $ {PWD / # $ HOME / \ ~}
    pwdoffset cục bộ = $ (($ {# NEW_PWD} - pwdmaxlen))
    nếu [$ {pwdoffset} -gt "0"]
    sau đó
        NEW_PWD = $ {NEW_PWD: $ pwdoffset: $ pwdmaxlen}
        NEW_PWD = $ {trunc_symbol} / $ {NEW_PWD # * /}
    fi

    xuất NEW_PWD
}

PROMPT_COMMAND = bash_prompt_command
# Biểu đồ màu @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
trường hợp "$ {HẠN}" trong
    "xterm")
        TITLEebar = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        PS1 = "$ {TITLEebar} \ [\ 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 "
        ;;
    "màn")
        TITLEebar = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        ESC = '\ [\ ek \ e \\\]'
        PS1 = "$ {TITLEebar} \ [\ 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

Và đây là .screenrc:

hardstatus alwayslastline
chuỗi 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; màn hình \ 007'

màn hình trên
shelltitle '$ | bash'

Tôi đang làm gì không đúng?

Cập nhật (19 tháng 8 năm 2010): Vấn đề là bạn không thể cập nhật tiêu đề của thiết bị đầu cuối từ trong màn hình khi bạn đặt alwayslastline. Vì vậy, giải pháp của tôi là chỉ từ bỏ và giải quyết một tiêu đề được xác định trước, hữu ích cho các phiên trên màn hình của tôi. Tôi đã cập nhật .bashrc.screenrccó thể tìm thấy tại http://bitbucket.org/jsumners/rcfiles/src .

Câu trả lời:


4

Các mã thoát là khác nhau bên trong màn hình .

Điều này bên ngoài màn hình:

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

tương đương với màn hình bên trong này:

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

Thay đổi thanh tiêu đề $ {TERM} = "screen" của bạn thành

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

sẽ giải quyết vấn đề của bạn.


Đây không phải là làm việc. Tôi không hiểu tại sao.
James Sumners

Tôi đã xác định rằng cài đặt hardstatus alwayslastlinenhư tôi làm để screenngăn screenviệc đặt xtermtiêu đề. Bây giờ nếu tôi có thể tìm ra cách làm cả hai cùng một lúc.
James Sumners

Có phải vì hardstatus của bạn có% t (cho tiêu đề) trong đó?
crb

Không. Chỉ cần loại bỏ điều đó và nhận được kết quả tương tự. Tôi tin rằng tôi sẽ phải đặt bí danh cho screenviệc đặt tiêu đề cửa sổ và sau đó khởi chạy chương trình. Và sau đó chỉ cần từ bỏ các tiêu đề thiết bị đầu cuối năng động trong khi sử dụng screen. :(
James Sumners

1
bug.launchpad.net/byobu/+orms/338722/comments/10 nói rằng đó là một hạn chế trong màn hình
agnul

7

Trên thực tế, có một cách để gửi các chuỗi thoát trực tiếp đến xterm, đi qua màn hình. Nó không dễ tìm, nhưng từ mã màn hình (src / ansi.c) Tôi nghĩ rằng nó đã ở đó từ năm 2005. Tôi có nó hoạt động trong xterm, Gnome Terminal và putty. Tôi đã tìm thấy một ghi chú trong nguồn mintty cho biết nó không hoạt động ở đó đơn giản vì họ không xử lý DCS (trừ khi nó được sửa gần đây).

Từ tài liệu cho màn hình bên dưới (tại 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 (Chuỗi điều khiển thiết bị) là mã thoát được sử dụng để gửi trực tiếp đến thiết bị đầu cuối (tôi nghĩ đó là mục đích ban đầu của nó từ nhiều năm trước). Một chuỗi như vậy được kết thúc bằng mã thoát ST (Terminator String).

Quấn chuỗi để đặt tiêu đề cửa sổ của thiết bị đầu cuối bên trong khối DCS..ST, và nó đi qua màn hình và cập nhật chính xác, ngay cả với hardstatus alwayslastline.

DCS = \ 033P, ST = \ 033 \

Ví dụ - để cập nhật tiêu đề cửa sổ với thư mục làm việc hiện tại, hãy sử dụng

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

Muộn còn hơn không! Hy vọng điều này sẽ giúp được ai đó.

Chỉ trong trường hợp tôi sai về thay đổi nguồn màn hình: Tôi đang chạy phiên bản mới nhất từ ​​git phiên màn hình, đến lượt nó đang sử dụng gần như mới nhất từ ​​git màn hình (với một số thay đổi cụ thể cho phiên màn hình). Nhưng các thông điệp tường trình được ghi ngày từ màn hình năm 2005 (bạn có thể thấy các thay đổi được thực hiện đối với cam kết đó liên quan đến việc xử lý DCS nếu bạn sao chép màn hình git repo và sử dụng lệnh bên dưới).

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

1

crb là loại quyền, nhưng

a) mã thoát mà anh ta sử dụng không làm việc cho tôi. Nó nên được \033kthay vì \033_. Xem screen (1)dưới "TITLES (naming windows)". Nên nó phải là:

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

b) loại thoát này chỉ được sử dụng để đặt tiêu đề của cửa sổ màn hình. Một phiên bản của màn hình có thể có nhiều cửa sổ, mỗi cửa sổ có một tên, đó là những gì được hiển thị trong hardstatuscaptionvới tchuỗi thoát.

c) thoát bash bình thường hoạt động nếu bạn đặt terminfo đúng cho xterm trong .screenrc:

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

(cái này cũng works on my machinedùng cho putty)

Vì vậy, để đặt tiêu đề phù hợp cho cả cửa sổ màn hình và tiêu đề putty / xterm, tôi sử dụng đôi khi như:

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

để tham khảo: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html


1

Tôi sẽ không trả lời hoàn toàn câu hỏi, nhưng hãy để tôi đề xuất cách giải quyết vấn đề. Nhiều trình quản lý cửa sổ hỗ trợ đặc tả EWMH . Ngoài ra còn có một công cụ dòng lệnh wmctrlcó thể tương tác với chúng. Sử dụng công cụ này, người ta có thể dễ dàng thay đổi tiêu đề của cửa sổ đang hoạt động bằng lệnh sau:

  wmctrl -r :ACTIVE: -T "FooTitle"

Cũng có thể thay đổi biểu tượng cửa sổ, bố cục và các thuộc tính khác. Công cụ có thể sẽ không hoạt động cho PuTTY vì Windows không hỗ trợ EWMH, nhưng hầu hết các hệ thống Linux nên chấp nhận nó.

Với phương pháp này, không quan trọng bạn có sử dụng screenhay không.


0

2 tuần qua tôi đã tìm kiếm nhiều diễn đàn và tôi không tìm thấy câu trả lời cho câu hỏi:

Làm thế nào để có được tất cả đầu ra lệnh cho tiêu đề Putty?

Cần nó cho các chương trình khác để biết khi nào một số công việc trên máy chủ được thực hiện và nó được thực hiện đúng hay sai. Plink stdout và stdin không hoạt động, tôi đã sử dụng nhiều điều chỉnh với độ trễ chờ và đối với một số lệnh không hoạt động cho người khác. XSEL và XCLIP không thể được cài đặt trên máy chủ đó.

Vì vậy, đây là giải pháp:

  1. Nhận đầu ra lệnh trong một tập tin.
  2. Echo tập tin đó để tiêu đề.

Trên máy khách putty và máy chủ suse trông như thế này:

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

Hy vọng ai đó sẽ có thể sử dụng này. Tất nhiên, nó sẽ không hoạt động cho tất cả các loại máy chủ và cài đặt máy khách putty, nhưng ý tưởng sẽ hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.