Nhận đầu ra màu bất ngờ trên một số lệnh


8

Tôi chỉ cần thêm nó vào .bashrcđể có được đầu ra màu với less:

# Colorize less man pages.
export LESS_TERMCAP_md=$'\e[01;34m'
export LESS_TERMCAP_us=$'\e[01;33m'
export LESS_TERMCAP_so=$'\e[01;44;37m'
export LESS_TERMCAP_mb=$'\e[01;31m'
export LESS_TERMCAP_mr=$'\e[01;35m'
export LESS_TERMCAP_me=$'\e[00m'
export LESS_TERMCAP_ue=$'\e[00m'
export LESS_TERMCAP_se=$'\e[00m'

... Và bây giờ tất cả các lệnh nhất định bất ngờ (dường như có liên quan đến hiển thị các biến môi trường) tạo ra đầu ra màu phù hợp với các cài đặt mới này. Có phải tôi đang trốn sai? Hay là hành vi cố ý này? Tôi đã thử một vài biến thể thoát khác, nhưng chúng không hoạt động less.

Ví dụ, đây là một ảnh chụp màn hình của một envlệnh.

lệnh env

php -i cũng có đầu ra màu, nhưng chỉ trên phần biến môi trường.

Lệnh php -i

Câu trả lời:


4

Đây là hành vi bình thường. Các biến môi trường này chứa các chuỗi thoát khiến thiết bị đầu cuối thay đổi màu nền trước của nó. Bạn có được hiệu ứng hình ảnh tương tự khi bất kỳ chương trình nào xuất ra chúng, có thể lesshoặc env.

Các biến này cần chứa các ký tự thoát thực tế, ít hơn không thực hiện bất kỳ xử lý hậu kỳ nào trên chúng.

Thông thường, bạn có thể đặt các biến cấu hình ít hơn trong tệp lesskey của mình , nhưng điều này không hoạt động đối với các LESS_TERMCAP_xxbiến, bởi vì ít đọc chúng hơn trước khi nó đọc tệp lesskey (ít hơn 444). Vì vậy, bạn không có lựa chọn nào khác ngoài việc đưa chúng vào môi trường.

Nếu bạn muốn các biến này chỉ áp dụng cho manvà không mục đích sử dụng khác less, bạn có thể sử dụng một bí danh cho manbộ rằng PAGERbiến một kịch bản wrapper rằng bộ các biến môi trường.

#!/bin/sh
escape=␛     # a literal escape character
export LESS_TERMCAP_md=$escape'[01;34m'

exec less "$@"

(Ngoài ra, sử dụng #!/bin/bashtrên dòng đầu tiên và bạn có thể sử dụng #'\e'cú pháp để nhận ký tự thoát. Trên các hệ thống có /bin/shdấu gạch ngang, sử dụng /bin/shnhanh hơn một chút, mặc dù trong thực tế có thể không đáng chú ý.)

Gọi tập lệnh này less-colorvà thêm alias man='PAGER=less-color man'vào ~/.bashrchoặc ~/.zshrc. Trên một số hệ thống, thay vì tạo bí danh, bạn có thể yêu mancầu sử dụng một máy nhắn tin khác bằng cách đặt MANPAGERbiến môi trường: export MANPAGER=less-colortrong của bạn ~/.profile.


1

Tôi giả sử rằng bạn đã đặt nhầm các giá trị LESS_ * của các biến đó thành các chuỗi có chứa các ký tự thoát thực tế, trái ngược với các chuỗi có dấu gạch chéo ngược theo sau là một e. Do đó, mỗi khi bạn hiển thị các giá trị đó, chúng sẽ thay đổi màu của thiết bị đầu cuối của bạn.

Tôi sẽ xem xét rất kỹ các cài đặt bạn đã thực hiện trong .bashrc của mình và đảm bảo chúng chính xác. Tôi nghi ngờ rằng tất cả những gì bạn cần làm là loại bỏ ký hiệu đô la.


Loại bỏ ký hiệu đô la làm rối tung các trang người đàn ông của tôi. Ví dụ: man top= \e[01;34mSYNOPSIS\e[00mthay vì tô màu từ "SYNOPSIS".
Jeff

Ký hiệu đô la không hoạt động. Bạn có thể nghĩ về một cách giải quyết? Có lẽ một cách để hạn chế các biến LESS đó chỉ được sử dụng trên các trang man?
Jeff

0

Như @Gilles chỉ ra trong câu trả lời của mình, đây là một hành vi được mong đợi.

Hãy để tôi chỉ thêm vài thông tin. LESS_TERMCAP_xxghi đè các khả năng TERMCAP. Việc ghi đè này được quản lý bởi lesschính nó screen.cvà giá trị sẽ được sử dụng sau này như thể nó được thư viện TERMCAP trả về. Điều đó có nghĩa là nó phải là chuỗi ký tự điều khiển thô.

Tài khoản của tôi về cách "sửa" cái này là lesstự bọc

$ cat ~/bin/less 
#!/bin/bash

# Start bold mode
export LESS_TERMCAP_md=$'\e[1;37m'
# Start standout mode
export LESS_TERMCAP_so=$'\e[1;37;41m'
# End standout mode
export LESS_TERMCAP_se=$'\e[0m'
# Start underlining
export LESS_TERMCAP_us=$'\e[4;93m'
# End underlining
export LESS_TERMCAP_ue=$'\e[0m'
# End all mode like so, us, mb, md and mr
export LESS_TERMCAP_me=$'\e[0m'

exec /usr/bin/less "$@"

Thật buồn cười, tôi đang làm việc này ngay bây giờ và nó trông thật tuyệt. Bạn có một phiên bản cũng hoạt động với #!/bin/sh(đó là dấu gạch ngang, trong trường hợp của tôi)? Tôi không thể tìm ra cách chèn một ESCký tự bằng chữ vim.
Jeff

1
@Jeff Chỉ cần từ trên đầu của tôi, bạn luôn có thể làm một cái gì đó như export LESS_TERMCAP_me="$(printf '\e[0m')". Trên thực tế nếu bạn nhìn vào câu trả lời của @Gilles, anh ấy tuyên bố export LESS_TERMCAP_me=$escape'[0m'cũng nên làm việc với /bin/sh.
Miroslav Koškár
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.