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.
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.
Câu trả lời:
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 preexec
chứ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 terminfo
mô-đ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 $cap
lệ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.
Đây là một bash
tương đương với giải pháp zsh của Gilles. Bash không có mô-đun terminfo riêng, nhưng tput
lệ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 trap
dòng là một cách hacky để thi đua zsh của preexec
chứ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.