Tiêu đề bắt buộc trên màn hình GNU


9

Theo mặc định, tiêu đề của phiên màn hình là tên của lệnh cuối cùng được nhập, điều này tốt cho tôi, nhưng trong một số trường hợp tôi muốn thay đổi nó. Tôi biết lệnh Ctrl- A Anhưng nó chỉ thay đổi tiêu đề cho đến lệnh tiếp theo và tôi muốn nó ở đó cho đến khi tôi quyết định khác.

EDIT: Đây là preexecchức năng tôi tìm thấy trong.zshrc

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

Câu trả lời:


9

Phụ thuộc vào cách mọi thứ được thiết lập, nhưng theo mặc định, một cái gì đó như thế này sẽ hoạt động.

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

Sau đó chạy:

settitle NEWTITLE.

Xem tài liệu tiêu đề màn hìnhfaq màn hình GNU để biết thêm chi tiết.

Đã cho Ctrl+ A Achỉ thay đổi nó cho đến lệnh tiếp theo, có thể nó được đặt bởi $PS1(tất cả các shell) hoặc $PROMPT_COMMAND/ DEBUG trap(chỉ bash) hoặc precmd/ preexec(chỉ zsh).

Bạn nên tìm kiếm bất kỳ nơi nào \ehoặc \033xuất hiện cùng khoặc \\sau nó, về cơ bản giống như settitleví dụ của tôi ở trên.

CẬP NHẬT

Bạn nói rằng bạn đã có một tùy chỉnh preexec.

Tại sao không thay đổi nó thành này:

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

Sau đó, bạn có thể đặt tiêu đề tùy chỉnh bằng cách chạy:

TITLE="my title"

và bỏ đặt tiêu đề bằng cách chạy

TITLE=

Đừng quên thay đổi precmd$PS1nếu cần thiết.

QUA MỘT BÊN

Bạn thậm chí có thể mở rộng này cho tất cả các thiết bị đầu cuối (ví dụ xterm, gnome-terminalvv) bằng cách không cứng mã hóa \ek\e\\.

Đây là cách tôi làm điều đó:

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}"
}

Sau đó, bạn có thể thay đổi preexecthành:

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

Lệnh bạn đưa ra thực hiện chính xác giống như Ctrl-A A. Và về lời nhắc, ý bạn là tôi phải sửa đổi $PS1bất cứ khi nào tôi muốn tiêu đề không thay đổi?
gregseth

Ý tôi là kiểm tra xem nó không chứa ESC k gì đó ESC \. Ditto PROMPT_COMMAND.
Mikel

ESC có thể được viết \ehoặc \033.
Mikel

Các liên kết tài liệu tiêu đề màn hình nên có thông tin cần thiết
Mikel

5

Nếu tiêu đề cửa sổ của bạn phản ánh ứng dụng hiện đang chạy trong cửa sổ, thì đó là vì trình bao của bạn đang làm điều đó. Nếu nó làm điều đó, đó là vì phân phối của bạn, quản trị viên hệ thống của bạn hoặc bạn đã định cấu hình nó.

Nếu lệnh xuất hiện dưới dạng tiêu đề cửa sổ trong khi lệnh đang chạy, điều này được thực hiện bởi preexechàm (tính bằng zsh) hoặc mô phỏng theo bash .

Nếu tiêu đề thay đổi khi mỗi lệnh hoàn thành, điều này được thực hiện bởi precmdhàm trong zsh, PROMPT_COMMANDtham số trong bash hoặc là một phần của dấu nhắc ( PS1tham số) trong bất kỳ shell nào. (Lệnh thay đổi tiêu đề là một chuỗi thoát được phát ra bởi bất kỳ ứng dụng nào như một phần của luồng đầu ra của thiết bị đầu cuối, vì vậy nó có thể được nhúng trong một dấu nhắc.)

Hãy tìm một chuỗi thoát như \e]0;new title\a, \e]2;new title\ahoặc \eknew title\e\\trong tệp khởi tạo shell của bạn ( ~/.bashrc, ~/.zshrc,,). Nếu không có gì liên quan, các thiết lập có thể được trong một tập tin hệ thống (ví dụ /etc/bash.bashrc, /etc/zsh/zshrc); sau đó ghi đè tham số hoặc hàm đó trong tệp khởi tạo của riêng bạn.

Xem câu trả lời của Mikel cho một cài đặt tiêu đề có thể ghi đè preexec.


Cảm ơn, bạn đã làm cho nó rất rõ ràng. Tôi thực sự đã tìm thấy một preexechàm được định nghĩa trong .zshrc của tôi. Vấn đề là, đó là hành vi tôi muốn ... hầu hết thời gian. Tôi muốn có thể vô hiệu hóa nó một cách nhanh chóng trên một màn hình cụ thể. Có lẽ có một biến mà tôi có thể nhận được trong preexechàm khi tôi tự đặt tiêu đề hoặc một cái gì đó tương tự?
gregseth

@gregseth: Nói chung hơi khó để giải thích, nhưng nếu bạn đăng preexecchức năng của mình , tôi hoặc người khác có thể đề xuất một thay đổi đơn giản.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi sẽ đề cập đến preexec, nhưng Greg không nói anh ta đang sử dụng zsh. Điều đó sẽ dạy tôi. ;-)
Mikel

@Mikel: Lời giải thích của tôi tốt hơn của bạn, nhưng preexecthiết kế mới của bạn tốt hơn của tôi.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đồng ý. :-) Câu trả lời ban đầu của tôi là cố gắng dạy OP tìm câu trả lời cho chính mình. Bạn đã ngay lập tức hữu ích hơn. Dù bằng cách nào, tất cả chúng ta đều thắng.
Mikel
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.