Mendapatkan keluaran berwarna yang tidak terduga pada beberapa perintah

8

Saya baru saja menambahkan ini ke saya .bashrcuntuk mendapatkan keluaran berwarna dengan 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'

... dan sekarang semua perintah tertentu yang tiba-tiba (tampaknya terkait dengan menampilkan variabel lingkungan) menghasilkan keluaran warna yang cocok dengan pengaturan baru ini. Apakah saya lolos dari kesalahan? Atau apakah perilaku yang disengaja ini? Saya mencoba beberapa variasi pelarian lainnya, tetapi tidak berhasil less.

Sebagai contoh, ini adalah screenshot dari sebuah envperintah.

perintah env

php -i juga memiliki keluaran berwarna, tetapi hanya pada bagian variabel lingkungan.

perintah php -i

Jeff
sumber

Jawaban:

4

Ini adalah perilaku normal. Variabel lingkungan ini mengandung urutan pelarian yang menyebabkan terminal mengubah warna latar depan. Anda mendapatkan efek visual yang sama ketika suatu program mengeluarkannya, baik itu lessatau env.

Variabel-variabel ini perlu mengandung karakter escape aktual, lebih sedikit yang tidak melakukan postprocessing padanya.

Biasanya Anda dapat menempatkan lebih sedikit variabel konfigurasi di file lesskey Anda , tetapi ini tidak berfungsi untuk LESS_TERMCAP_xxvariabel, karena lebih sedikit membacanya sebelum membaca file lesskey (kurang dari 444). Jadi Anda tidak punya pilihan selain menempatkan mereka di lingkungan.

Jika Anda ingin variabel-variabel ini hanya berlaku untuk mandan tidak untuk penggunaan lain dari less, Anda dapat menggunakan alias untuk manyang menetapkan PAGERvariabel ke skrip pembungkus yang menetapkan variabel lingkungan.

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

exec less "$@"

(Atau, gunakan #!/bin/bashdi baris pertama dan Anda dapat menggunakan #'\e'sintaks untuk mendapatkan karakter melarikan diri. Pada sistem di mana /bin/shtanda hubung, menggunakan /bin/shsangat sedikit lebih cepat, meskipun mungkin tidak terlihat dalam praktiknya.)

Panggil skrip ini less-color, dan tambahkan alias man='PAGER=less-color man'ke ~/.bashrcatau ~/.zshrc. Pada beberapa sistem, alih-alih membuat alias, Anda dapat meminta manuntuk menggunakan pager yang berbeda dengan mengatur MANPAGERvariabel lingkungan: export MANPAGER=less-colordi ~/.profile.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

Saya berasumsi bahwa Anda telah keliru menetapkan nilai variabel LESS_ * ke string yang berisi karakter escape aktual, sebagai lawan dari string yang berisi backslash diikuti oleh e. Jadi setiap kali Anda menampilkan nilai-nilai itu, mereka mengubah warna terminal Anda.

Saya akan melihat dengan sangat hati-hati pada pengaturan yang Anda buat di .bashrc Anda, dan memastikan semuanya benar. Saya menduga bahwa semua yang perlu Anda lakukan adalah menghilangkan tanda dolar.

offby1
sumber
Menghapus tanda dolar mengacaukan halaman manual saya. Misalnya, man top= \e[01;34mSYNOPSIS\e[00malih-alih mewarnai kata "SYNOPSIS".
Jeff
Tanda dolar tidak berfungsi. Bisakah Anda memikirkan solusinya? Mungkin cara untuk membatasi variabel KURANG itu hanya digunakan pada halaman manual?
Jeff
0

Seperti @Gilles tunjukkan dalam jawabannya, ini adalah perilaku yang diharapkan.

Izinkan saya menambahkan info pasangan. LESS_TERMCAP_xxmenimpa kemampuan TERMCAP. Penggantian ini dikelola dengan lesssendirinya di dalam screen.cdan nilainya hanya digunakan nanti seolah dikembalikan oleh pustaka TERMCAP. Itu berarti harus urutan mentah dari karakter kontrol.

Akun saya tentang cara "memperbaiki" ini adalah untuk membungkus lessdirinya sendiri

$ 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 "$@"
Miroslav Koškár
sumber
Lucu, saya sedang mengerjakan ini sekarang dan terlihat bagus. Apakah Anda memiliki versi yang juga berfungsi #!/bin/sh(yang dash, dalam kasus saya)? Saya tidak tahu bagaimana cara memasukkan ESCkarakter literal dengan vim.
Jeff
1
@ Jeff Hanya dari atas kepala saya, Anda selalu dapat melakukan sesuatu seperti export LESS_TERMCAP_me="$(printf '\e[0m')". Sebenarnya jika Anda melihat jawaban @Gilles, ia mengklaim export LESS_TERMCAP_me=$escape'[0m'harus bekerja dengan /bin/shjuga.
Miroslav Koškár