Hiển thị công cụ bên dưới lời nhắc tại dấu nhắc shell?


21

Hãy nói rằng dấu nhắc của tôi trông như thế này (dấu _ đại diện cho con trỏ của tôi)

~ % _

Có cách nào tôi có thể làm cho nó trông như thế này không

~ % _
[some status]

Câu hỏi ban đầu là về zsh, nhưng bây giờ có câu trả lời khác.


Làm thế nào về màn hình + buobu ?: launchpad.net/byobu , và có lẽ kmandla.wordpress.com/2010/01/03/... cho ảnh chụp màn hình
Janus

Câu trả lời:


17

Các cài đặt sau dường như hoạt động. Văn bản trên dòng thứ hai sẽ biến mất nếu dòng lệnh tràn dòng đầu tiên. Các preexecchức năng xóa dòng thứ hai trước khi chạy lệnh; nếu bạn muốn giữ nó, hãy đổi thành preexec () { echo; }.

terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }

%thoát được ghi lại trong hướng dẫn zsh ( man zshmisc).

Terminfo là một API truy cập đầu cuối. Zsh có một terminfomô-đun cho phép truy cập vào cơ sở dữ liệu mô tả thiết bị đầu cuối: $terminfo[$cap]là chuỗi các ký tự được gửi để thực hiện khả năng của thiết bị đầu cuối $cap, tức là để chạy $caplệnh của nó . Xem man 5 terminfo(trên Linux, số phần có thể thay đổi trên các thông báo khác) để biết thêm thông tin.

Chuỗi hành động là: di chuyển con trỏ xuống một dòng ( cud1), sau đó sao lưu ( cuu1); lưu vị trí con trỏ ( sc); di chuyển con trỏ xuống một dòng; in [some status]; khôi phục vị trí con trỏ. Bit xuống và xuống ở đầu chỉ cần thiết trong trường hợp dấu nhắc nằm ở dòng dưới cùng của màn hình. Dòng preexec xóa dòng thứ hai ( el) để nó không bị lẫn với đầu ra từ lệnh.

Nếu văn bản trên dòng thứ hai rộng hơn thiết bị đầu cuối, màn hình có thể bị cắt xén. Sử dụng Ctrl+ Ltrong một nhúm để sửa chữa.


5

Đây là một bashtương đương với giải pháp zsh của Gilles. Bash không có mô-đun terminfo riêng, nhưng tputlệnh (đi kèm terminfo) thực hiện nhiều điều tương tự.

PS1_line1='\w \$ '
PS1_line2='[some status]'

if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
    PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
    PS2="\[$(tput el)\]> "
    trap 'tput el' DEBUG
else
    PS1="$PS1_line2 :: $PS1_line1"
fi

Nếu thiết bị đầu cuối không hỗ trợ một trong các khả năng, nó sẽ rơi trở lại dấu nhắc một dòng.

Các trapdòng là một cách hacky để thi đua zsh của preexecchức năng. Xem /superuser/175799/ để biết thêm thông tin.

EDIT : Kịch bản được cải tiến dựa trên ý kiến ​​của Gilles.


@Gilles: Cảm ơn bạn đã nhập! Tôi nghĩ rằng tôi đã làm cho nó hoạt động tốt hơn bây giờ. Đã thử bash 4.1.5 trong gnome-terminal và xterm, và bash 3.2.48 trong OSX Terminal.
Jander
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.