How to have a random background color in Terminal.app
문제
In X11 days, I had a script that would randomly pick a pastel background color and then open a fresh xterm. This was easy to do because I could just pass an argument for (as I recall) -background.
Does Terminal.app have such an interface? I would prefer to do this via a bash script but I can cope with AppleScript if needed.
I tend to use tabs within one Terminal window which may complicate things as well.
I'm currently on Mojave.
해결책
You can indeed use AppleScript to change the Terminal background color.
For example:
tell application "Terminal"
set background color of first window to {33717, 0, 21000, 32288}
end tell
You can execute it from the command line with:
osascript -e 'tell application "Terminal"' -e 'set background color of first window to {33717, 0, 21000, 32288}' -e 'end tell'
You can then change more attributes:
tell application "Terminal"
set background color of first window to {33717, 0, 21000, 32288}
set cursor color of first window to "white"
set normal text color of first window to "white"
set bold text color of first window to "yellow"
end tell
To execute this kind of longer script from the Terminal, you can save it into a separate file ~/.terminal_change_color.scpt
then, call it from the terminal:
osascript ~/.terminal_change_color.scpt
You can then add it to your ~/.bash_profile
so that it executes for every new Terminal window you open:
echo "osascript ~/.terminal_change_color.scpt" >> ~/.bash_profile
Below is a longer script to choose a random background color. As @nohillside noticed, you also need to adjust the text color to make it readable (white text on dark background, and black text on light backgound). The script handles that.
global kColorValueMaximum
set kColorValueMaximum to 65535
-- Choose a random color for the background
set randomRed to (random number) * kColorValueMaximum
set randomGreen to (random number) * kColorValueMaximum
set randomBlue to (random number) * kColorValueMaximum
set myBackgroundColor to {randomRed, randomGreen, randomBlue}
-- Select appropriate text colors based on that background
set {myTextColor, myBoldColor} to my ContrastingTextColors(myBackgroundColor)
-- Now inflict them on the frontmost window
tell application "Terminal"
set targetWindow to window 1
set background color of targetWindow to myBackgroundColor
set cursor color of targetWindow to myTextColor
set normal text color of targetWindow to myTextColor
set bold text color of targetWindow to myBoldColor
end tell
on ContrastingTextColors(myColor)
set whiteColor to {kColorValueMaximum, kColorValueMaximum, kColorValueMaximum, kColorValueMaximum}
set lightGreyColor to {40000, 40000, 40000, kColorValueMaximum}
set blackColor to {0, 0, 0, kColorValueMaximum}
set darkGreyColor to {20000, 20000, 20000, kColorValueMaximum}
-- From http://www.wilsonmar.com/1colors.htm
set myRed to (item 1 of myColor) / kColorValueMaximum
set myGreen to (item 2 of myColor) / kColorValueMaximum
set myBlue to (item 3 of myColor) / kColorValueMaximum
set magicY to (0.3 * myRed) + (0.59 * myGreen) + (0.11 * myBlue)
if (magicY < 0.5) then
return {whiteColor, lightGreyColor}
else
return {blackColor, darkGreyColor}
end if
end ContrastingTextColors
Alternatively, you can create like 30 themes into your Terminal Preferences > Profiles, and select one randomly:
tell application "Terminal"
set themes to {"Basic", "Homebrew", "Man Page", "Novel", "Pro"}
set theme to some item of themes
set current settings of window 1 to settings set theme
end tell
Credits to:
다른 팁
I added slightly to Yoric's spectacular answer because I prefer what I call "pastel" colors. Replacing the first seven lines of his script long script with:
global kColorValueMaximum
set kColorValueMaximum to 65535
set kColorValueRange to 32768
set kColorValueMinimum to kColorValueMaximum - kColorValueRange
-- Choose a random color for the background
set randomRed to (random number) * kColorValueRange + kColorValueMinimum
set randomGreen to (random number) * kColorValueRange + kColorValueMinimum
set randomBlue to (random number) * kColorValueRange + kColorValueMinimum
Making the Range 16384, to me, was too lite. 32768 sometimes gives a slightly dark color so you might want to tweak that to suite your taste.