2008-12-04 6 views
24

Dưới đây là biến PS1 của tôi:PS1 line-gói với màu sắc vấn đề

PS1='\u:\W$(__git_ps1 "\e[32m\][%s]\e[0m\]")$ ' 

công trình lớn cho nhặt chi nhánh Git của tôi, nhưng nó có tác dụng phụ không mong muốn của gói các dòng khi các màu sắc đang hoạt động, vì vậy chúng trùng lặp khi bạn sử dụng các lệnh dài.

Bất kỳ ai có kỹ năng PS1 ma thuật đều có thể giúp tôi khắc phục sự cố này không?

Trả lời

39

Có, cần thiết để thoát khỏi màu sắc đúng cách.

Fix:

PS1='\u:\W$(__git_ps1 "\[\e[32m\][%s]\[\e[0m\]")$ ' 
+0

Cảm ơn, mà làm tôi day! – Viktiglemma

+5

Và đối với những người quá lười biếng để thực hiện một sự khác biệt, lối thoát thiết bị đầu cuối phải được bao quanh bởi '\ [' '\]' để bash có thể đếm chính xác các ký tự in ở đầu dòng. http://manpages.ubuntu.com/manpages/precise/en/man1/bash.1.html#contenttoc26 – alberge

+0

Aupajo, tôi gặp sự cố tương tự, sử dụng PS1 được tạo. Tôi không biết đủ để xem những gì không được thoát đúng cách. Bất kỳ đề xuất? Lệnh của tôi là: 'xuất PS1 =" \ [\ e [0; 40m \] \ h: \ W \ u \ 033 [0; 32m \ $ (parse_git_branch) \ [\ e [0m \] $ "' – karl

16

Tôi có thể đề nghị phương pháp sau đây cho màu sắc trong Bash, nó làm cho mã nhiều hơn nữa có thể đọc được và rất khó để bạn có thể bỏ lỡ một hoặc hai lối thoát.

Đặt sau trong ~/.bashrc

BLACK=$(tput setaf 0) 
RED=$(tput setaf 1) 
GREEN=$(tput setaf 2) 
LIME_YELLOW=$(tput setaf 190) 
YELLOW=$(tput setaf 3) 
POWDER_BLUE=$(tput setaf 153) 
BLUE=$(tput setaf 4) 
MAGENTA=$(tput setaf 5) 
CYAN=$(tput setaf 6) 
WHITE=$(tput setaf 7) 
BRIGHT=$(tput bold) 
NORMAL=$(tput sgr0) 
BLINK=$(tput blink) 
REVERSE=$(tput smso) 
UNDERLINE=$(tput smul) 

Một PS1 mẫu của bạn (hoặc thực sự bất cứ điều gì mà in ra màn hình) sẽ là:

PS1="\[${WHITE}\](\[${YELLOW}\]\[email protected]\h\[${WHITE}\])\[${NORMAL}\]$ " 

Bạn chỉ cần đặt \ [\ xung quanh các từ màu.

Nếu bạn có một thiết bị đầu cuối 256 màu, bạn có thể thử nghiệm với các giá trị số khác để 'tput setaf' tất cả các con đường lên đến 255.

+0

Ồ, đơn giản, rõ ràng và tuyệt vời. Có một số đại diện, vào nhà. – Aupajo

1

Đây là những chức năng màu tôi sử dụng thường xuyên ... wrote họ năm trước đây và đã quen với họ rằng chúng là một phần thường xuyên của kịch bản của tôi. Chỉ cần gắn khối mã này vào tệp .bashrc của bạn, bắt đầu một phiên mới và bạn đã được thiết lập!

tôi sử dụng như là màu sắc/phong cách thay thế printf:

## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ [ Aesthir's Color Functions ] ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
Normal() { printf '\e[m'"$*"; }     ; Tblack() { printf '\e[0;30m'"$*"'\e[m'; } 
TNormal() { printf '\e[m'"$*"; }     ; Tred() { printf '\e[0;31m'"$*"'\e[m'; } 
Bold() { printf '\e[1m'"$*"'\e[m'; }    ; Tgreen() { printf '\e[0;32m'"$*"'\e[m'; } 
TBold() { printf '\e[1m'"$*"'\e[m'; }   ; Tbrown() { printf '\e[0;33m'"$*"'\e[m'; } 
Underline() { printf '\e[4m'"$*"'\e[m'; }  ; Tyellow() { printf '\e[0;33m'"$*"'\e[m'; } 
TUnderline() { printf '\e[4m'"$*"'\e[m'; }  ; Tblue() { printf '\e[0;34m'"$*"'\e[m'; } 
Flash() { printf '\e[5m'"$*"'\e[m'; }   ; Tmagenta() { printf '\e[0;35m'"$*"'\e[m'; } 
TFlash() { printf '\e[5m'"$*"'\e[m'; }   ; Tpurple() { printf '\e[0;35m'"$*"'\e[m'; } 
Invert() { printf '\e[7m'"$*"'\e[m'; }   ; Taqua() { printf '\e[0;36m'"$*"'\e[m'; } 
TInvert() { printf '\e[7m'"$*"'\e[m'; }   ; Tcyan() { printf '\e[0;36m'"$*"'\e[m'; } 
Invisible() { printf '\e[8m'"$*"'\e[m'; }  ; Tgrey() { printf '\e[0;37m'"$*"'\e[m'; } 
TInvisible() { printf '\e[8m'"$*"'\e[m'; }  ; Twhite() { printf '\e[0;37m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ Bold Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞∞∞∞∞ Underlined Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
TblackB() { printf '\e[1;30m'"$*"'\e[m'; }  ; TblackU() { printf '\e[4;30m'"$*"'\e[m'; } 
TgreyB() { printf '\e[1;30m'"$*"'\e[m'; }  ; TredU() { printf '\e[4;31m'"$*"'\e[m'; } 
TredB() { printf '\e[1;31m'"$*"'\e[m'; }   ; TgreenU() { printf '\e[4;32m'"$*"'\e[m'; } 
TgreenB() { printf '\e[1;32m'"$*"'\e[m'; }  ; TbrownU() { printf '\e[4;33m'"$*"'\e[m'; } 
TbrownB() { printf '\e[1;33m'"$*"'\e[m'; }  ; TyellowU() { printf '\e[4;33m'"$*"'\e[m'; } 
TyellowB() { printf '\e[1;33m'"$*"'\e[m'; }  ; TblueU() { printf '\e[4;34m'"$*"'\e[m'; } 
TblueB() { printf '\e[1;34m'"$*"'\e[m'; }  ; TmagentaU() { printf '\e[4;35m'"$*"'\e[m'; } 
TmagentaB() { printf '\e[1;35m'"$*"'\e[m'; }  ; TpurpleU() { printf '\e[4;35m'"$*"'\e[m'; } 
TpurpleB() { printf '\e[1;35m'"$*"'\e[m'; }  ; TaquaU() { printf '\e[4;36m'"$*"'\e[m'; } 
TaquaB() { printf '\e[1;36m'"$*"'\e[m'; }  ; TcyanU() { printf '\e[4;36m'"$*"'\e[m'; } 
TcyanB() { printf '\e[1;36m'"$*"'\e[m'; }  ; TgreyU() { printf '\e[4;37m'"$*"'\e[m'; } 
TwhiteB() { printf '\e[1;37m'"$*"'\e[m'; }  ; TwhiteU() { printf '\e[4;37m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞ Flashing Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞∞∞∞∞∞ Inverted Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
TblackF() { printf '\e[5;30m'"$*"'\e[m'; }  ; TblackI() { printf '\e[7;40m'"$*"'\e[m'; } 
TredF() { printf '\e[5;31m'"$*"'\e[m'; }   ; TredI() { printf '\e[7;41m'"$*"'\e[m'; } 
TgreenF() { printf '\e[5;32m'"$*"'\e[m'; }  ; TgreenI() { printf '\e[7;42m'"$*"'\e[m'; } 
TbrownF() { printf '\e[5;33m'"$*"'\e[m'; }  ; TbrownI() { printf '\e[7;43m'"$*"'\e[m'; } 
TyellowF() { printf '\e[5;33m'"$*"'\e[m'; }  ; TyellowI() { printf '\e[7;43m'"$*"'\e[m'; } 
TblueF() { printf '\e[5;34m'"$*"'\e[m'; }  ; TblueI() { printf '\e[7;44m'"$*"'\e[m'; } 
TmagentaF() { printf '\e[5;35m'"$*"'\e[m'; }  ; TmagentaI() { printf '\e[7;45m'"$*"'\e[m'; } 
TpurpleF() { printf '\e[5;35m'"$*"'\e[m'; }  ; TpurpleI() { printf '\e[7;45m'"$*"'\e[m'; } 
TaquaF() { printf '\e[5;36m'"$*"'\e[m'; }  ; TaquaI() { printf '\e[7;46m'"$*"'\e[m'; } 
TcyanF() { printf '\e[5;36m'"$*"'\e[m'; }  ; TcyanI() { printf '\e[7;46m'"$*"'\e[m'; } 
TgreyF() { printf '\e[5;37m'"$*"'\e[m'; }  ; TgreyI() { printf '\e[7;47m'"$*"'\e[m'; } 
TwhiteF() { printf '\e[5;37m'"$*"'\e[m'; }  ; TwhiteI() { printf '\e[7;47m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞ Invisible Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞ Plain Text on Color Background ∞∞∞∞∞∞∞∞ ## 
TblackV() { printf '\e[8;30m'"$*"'\e[m'; }  ; Bblack() { printf '\e[m'"$*"'\e[m'; } 
TredV() { printf '\e[8;31m'"$*"'\e[m'; }   ; Bred() { printf '\e[0;41m'"$*"'\e[m'; } 
TgreenV() { printf '\e[8;32m'"$*"'\e[m'; }  ; Bgreen() { printf '\e[0;42m'"$*"'\e[m'; } 
TbrownV() { printf '\e[8;33m'"$*"'\e[m'; }  ; Bbrown() { printf '\e[0;43m'"$*"'\e[m'; } 
TyellowV() { printf '\e[8;33m'"$*"'\e[m'; }  ; Byellow() { printf '\e[0;43m'"$*"'\e[m'; } 
TblueV() { printf '\e[8;34m'"$*"'\e[m'; }  ; Bblue() { printf '\e[0;44m'"$*"'\e[m'; } 
TmagentaV() { printf '\e[8;35m'"$*"'\e[m'; }  ; Bmagenta() { printf '\e[0;45m'"$*"'\e[m'; } 
TpurpleV() { printf '\e[8;35m'"$*"'\e[m'; }  ; Bpurple() { printf '\e[0;45m'"$*"'\e[m'; } 
TaquaV() { printf '\e[8;36m'"$*"'\e[m'; }  ; Baqua() { printf '\e[0;46m'"$*"'\e[m'; } 
TcyanV() { printf '\e[8;36m'"$*"'\e[m'; }  ; Bcyan() { printf '\e[0;46m'"$*"'\e[m'; } 
TgreyV() { printf '\e[8;37m'"$*"'\e[m'; }  ; Bgrey() { printf '\e[0;47m'"$*"'\e[m'; } 
TwhiteV() { printf '\e[8;37m'"$*"'\e[m'; }  ; Bwhite() { printf '\e[0;47m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞∞∞ Bold Text on Color Background ∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞ Underlined Text on Color Background ∞∞∞∞∞ ## 
BblackB() { printf '\e[1;40m'"$*"'\e[m'; }  ; BblackU() { printf '\e[4;40m'"$*"'\e[m'; } 
BredB() { printf '\e[1;41m'"$*"'\e[m'; }   ; BredU() { printf '\e[4;41m'"$*"'\e[m'; } 
BgreenB() { printf '\e[1;42m'"$*"'\e[m'; }  ; BgreenU() { printf '\e[4;42m'"$*"'\e[m'; } 
BbrownB() { printf '\e[1;43m'"$*"'\e[m'; }  ; BbrownU() { printf '\e[4;43m'"$*"'\e[m'; } 
ByellowB() { printf '\e[1;43m'"$*"'\e[m'; }  ; ByellowU() { printf '\e[4;43m'"$*"'\e[m'; } 
BblueB() { printf '\e[1;44m'"$*"'\e[m'; }  ; BblueU() { printf '\e[4;44m'"$*"'\e[m'; } 
BmagentaB() { printf '\e[1;45m'"$*"'\e[m'; }  ; BmagentaU() { printf '\e[4;45m'"$*"'\e[m'; } 
BpurpleB() { printf '\e[1;45m'"$*"'\e[m'; }  ; BpurpleU() { printf '\e[4;45m'"$*"'\e[m'; } 
BaquaB() { printf '\e[1;46m'"$*"'\e[m'; }  ; BaquaU() { printf '\e[4;46m'"$*"'\e[m'; } 
BcyanB() { printf '\e[1;46m'"$*"'\e[m'; }  ; BcyanU() { printf '\e[4;46m'"$*"'\e[m'; } 
BgreyB() { printf '\e[1;47m'"$*"'\e[m'; }  ; BgreyU() { printf '\e[4;47m'"$*"'\e[m'; } 
BwhiteB() { printf '\e[1;47m'"$*"'\e[m'; }  ; BwhiteU() { printf '\e[4;47m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞ Flashing Text on Color Background ∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞ Inverted Text on Color Background ∞∞∞∞∞∞ ## 
BblackF() { printf '\e[5;40m'"$*"'\e[m'; }  ; BblackI() { printf '\e[7;30m'"$*"'\e[m'; } 
BredF() { printf '\e[5;41m'"$*"'\e[m'; }   ; BredI() { printf '\e[7;31m'"$*"'\e[m'; } 
BgreenF() { printf '\e[5;42m'"$*"'\e[m'; }  ; BgreenI() { printf '\e[7;32m'"$*"'\e[m'; } 
BbrownF() { printf '\e[5;43m'"$*"'\e[m'; }  ; BbrownI() { printf '\e[7;33m'"$*"'\e[m'; } 
ByellowF() { printf '\e[5;43m'"$*"'\e[m'; }  ; ByellowI() { printf '\e[7;33m'"$*"'\e[m'; } 
BblueF() { printf '\e[5;44m'"$*"'\e[m'; }  ; BblueI() { printf '\e[7;34m'"$*"'\e[m'; } 
BmagentaF() { printf '\e[5;45m'"$*"'\e[m'; }  ; BmagentaI() { printf '\e[7;35m'"$*"'\e[m'; } 
BpurpleF() { printf '\e[5;45m'"$*"'\e[m'; }  ; BpurpleI() { printf '\e[7;35m'"$*"'\e[m'; } 
BaquaF() { printf '\e[5;46m'"$*"'\e[m'; }  ; BaquaI() { printf '\e[7;36m'"$*"'\e[m'; } 
BcyanF() { printf '\e[5;46m'"$*"'\e[m'; }  ; BcyanI() { printf '\e[7;36m'"$*"'\e[m'; } 
BgreyF() { printf '\e[5;47m'"$*"'\e[m'; }  ; BgreyI() { printf '\e[7;37m'"$*"'\e[m'; } 
BwhiteF() { printf '\e[5;47m'"$*"'\e[m'; }  ; BwhiteI() { printf '\e[7;37m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞ Invisible Text on Color Background ∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ Color Code Notes ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
BblackV() { printf '\e[8;40m'"$*"'\e[m'; }  ## Unless I missed something or made a mistake, I ## 
BredV() { printf '\e[8;41m'"$*"'\e[m'; }  ## calculate a total of 7681 different color codes, ## 
BgreenV() { printf '\e[8;42m'"$*"'\e[m'; }  ## none of which produce a duplicate result.  ## 
BbrownV() { printf '\e[8;43m'"$*"'\e[m'; }  ##      These will be fine for now. ## 
ByellowV() { printf '\e[8;43m'"$*"'\e[m'; } 
BblueV() { printf '\e[8;44m'"$*"'\e[m'; } 
BmagentaV() { printf '\e[8;45m'"$*"'\e[m'; } 
BpurpleV() { printf '\e[8;45m'"$*"'\e[m'; } 
BaquaV() { printf '\e[8;46m'"$*"'\e[m'; } 
BcyanV() { printf '\e[8;46m'"$*"'\e[m'; } 
BgreyV() { printf '\e[8;47m'"$*"'\e[m'; } 
BwhiteV() { printf '\e[8;47m'"$*"'\e[m'; } 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
``

Điều duy nhất cần lưu ý là khi muốn một dấu hiệu % phần trăm hay một \ xuyệc ngược, bạn cần phải tăng gấp đôi chúng lên bên trong:
thích: printf "$(Tblue "%%s")\n" 'hi'
nhưng không phải cho Tblue "%s\n" 'hi'
hoặc printf "$(Tblue "%s" 'hi')\n"

Vì các sử dụng printf, bạn có thể làm công cụ như:

printf "hi $(Tred there) man $(BaquaI "%c" '!') $(Bold 'This \\t is %%s') %s\n" "$(BgreenB 'super')" "$(Bblue mega Colorful)"
hoặc trong một tiếng vang:
echo "hi $(Tred there) man $(BaquaI "%c" '!') $(Bold 'This \\t is %s' "$(BblackB 'super')") $(Bblue mega Colorful)"
Một ví dụ hữu ích hơn:
printf "\t%s Volume \"%s\" is not connected.\n" "$(TwhiteB [)$(TredB Error)$(TwhiteB \]:)" "$(Tbrown $Volume)"
Hoặc với các lệnh khác:
eval "echo 'This is OSX' | sed 's:OSX:$(Invert [)$(TaquaF OSX)$(Invert ]):'"
Hoặc một cái gì đó với phô trương hơn một chút:
find . -exec stat -f "Name: $(Tbrown %%N)%t%t$(Tpurple "->")%tPermissions: $(Tgreen %%Sp)" {} \;

Sử dụng trí tưởng tượng của bạn! Cảm thấy tự do khi sử dụng những thứ này ... điều duy nhất tôi hỏi là nếu có ai đó ở đó có nhiều loại hơn, hãy trộn/kết hợp chúng, như TcyanBgreenUI, hoặc tạo nên tên riêng của bạn ... bạn có thể gửi chúng cho tôi và cho tôi biết về bài đăng? hoặc gửi email cho tôi theo số [email protected]. Tôi quá lười biếng để nhập tất cả khả năng.

Tận hưởng!

- Aesthir

+1

Cảm ơn bạn đã chia sẻ công việc tuyệt vời này - thật không may nó có cùng vấn đề với bản gốc của OP, đó là dấu nhắc Bash đặc biệt cần các chuỗi '\ [' và '\]' để tính toán độ dài chuỗi phù hợp. Thật không may tôi đã không thể tìm thấy một cách để cung cấp những trình tự đúng từ bên trong một tuyên bố printf. –

+0

Ah, được rồi, cuối cùng tôi đã tìm thấy một cách để sử dụng các chức năng như thế này với các chuỗi thoát đúng cho một dấu nhắc lệnh. Thay vì cố gắng tìm ra một chuỗi đơn cho $ PS1 luôn hoạt động, tôi đã định nghĩa một hàm để xây dựng lại dấu nhắc mỗi lần và thêm vào $ PROMPT_COMMAND. ví dụ: 'TredB() {echo -n" \ [\ e [1; 31m \] $ * \ [\ e [m \] "; } ' ' build_prompt() {PS1 = "$ (TredB \\ w) #"; } ' ' PROMPT_COMMAND = "$ {PROMPT_COMMAND} build_prompt;" ' –