Làm cách nào để tạo màu đầu ra `less`?


25

Khi tôi chạy một chương trình (ví dụ grephoặc ls) mà không có máy nhắn tin, đầu ra của nó có màu. Tuy nhiên khi tôi chạy nó, đầu ra của nó sẽ lesskhông hiển thị màu nào.

Ví dụ, lệnh này xuất đầu ra màu:

grep -r something

nhưng điều này không:

grep -r something | less

Tại sao? Làm thế nào tôi có thể nhìn thấy màu sắc thông qua less?


5
grep --color=always "search string" * | less -Rnhưng tôi có xu hướng sử dụng mostngày nay thay vì less. CSONG : gnu.org/software/src-highlite là công cụ tô màu (ít hoạt động hơn)
Rinzwind

@alex bạn đã cài đặt python-pygmentschưa?
souravc

@souravc không tôi không cài đặt cái đó
Mohammad Reza Rezwani

@ales mặc kệ tôi là chúng tôi? >: - D
Rinzwind

Câu trả lời:


36

Có hai vấn đề ở đây:

  • Các lệnh như lsxông hơi tự động phát hiện hỗ trợ màu sắc, không tìm thấy hỗ trợ từ các đường ống
  • less được đặt thành chỉ hiển thị mã màu theo mặc định.

Cả hai có thể được khắc phục nhưng đó là một chút lộn xộn:

ls --color=always | less -R

Điều này không lscụ thể. Nhiều lệnh hỗ trợ màu cũng có đối số ghi đè.


Một câu trả lời sâu hơn một chút lslà kiểm tra xem STDOUT của nó có thuộc về một thiết bị đầu cuối thực sự hay không. Khi bạn đặt mọi thứ xung quanh, STDOUT được đặt thành STDIN của lệnh tiếp theo.

Bạn có thể thấy điều này tại nơi làm việc trong lsmã nguồn . Đó là sử dụng isattylệnh (giao diện POSIX cốt lõi) để tìm hiểu tình huống này là gì:

  • Là màu sắc theo mặc định:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • Chúng tôi có cố gắng xuất ra nhiều cột không:

    if (format == long_format)
      format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
    
    //...
    
    if (isatty (STDOUT_FILENO))
      {
        format = many_per_line;
        set_quoting_style (NULL, shell_escape_quoting_style);
        qmark_funny_chars = true;
      }
    else
      {
        format = one_per_line;
        qmark_funny_chars = false;
      }
    

grepthực hiện một điều rất giống nhau, trừ khi bị ghi đè rõ ràng, nó sẽ phát hiện hỗ trợ màu, với isatty:

color_option = isatty (STDOUT_FILENO) && should_colorize ();

1
Upvote cuối cùng của tôi (đạt đến giới hạn) cho ngày hôm nay để hỗ trợ bạn với giá 100k. Nhưng tôi và Rinzwind muốn bánh khi điều đó xảy ra.
hytromo

Tôi đã tải xuống một chương trình với tên là ack-grep. Khi gõ ack-grep foo, nó sẽ tìm kiếm foo trên tất cả các thư mục con. Vì vậy, tôi đã làm ack-grep foo | ít hơn, và màu sắc biến mất Nhưng dường như chương trình này không hỗ trợ "--color = always", bất cứ lời cảm ơn nào đã được giúp đỡ
Mohammad Reza Rezwani

1
@alex ack có một --colorcuộc tranh cãi:ack-grep -i select --color | less -R
Oli

@Oli ......... Ôi Chúa ơi ........ điều duy nhất tôi có thể nói về kiến ​​thức và sự giúp đỡ của bạn cũng như sức mạnh của linux
Mohammad Reza Rezwani

1
@ B1KMusic Tôi đồng ý. Tôi đồng ý rất nhiều đến nỗi tôi tìm thấy cách nó hoạt động và cập nhật câu trả lời. Bạn có thể buộc các cột bằng một -Cđối số.
Oli

2

Nếu bạn quan tâm đến màu sắc lessnói chung, bạn có thể muốn xem xét lesspipe.sh. Xem, ví dụ: http://freecode.com/projects/lesspipe .

lesspipe.sh là một bộ lọc đầu vào cho máy nhắn tin ít hơn như được mô tả trong trang man ít hơn. Kịch bản chạy dưới lớp vỏ tương thích ksh (ví dụ bash, zsh) và cho phép bạn sử dụng ít hơn để xem các tệp có nội dung nhị phân, tệp nén, lưu trữ và tệp có trong kho lưu trữ.

Nó cũng sẽ tô màu các tập lệnh shell, tập lệnh perl, v.v. tương tự như trình soạn thảo văn bản, nhưng không sử dụng bất kỳ chương trình "tiền xử lý" nào để thực hiện tô màu.

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.