fs: Add global flag '--color' to control terminal colors

* fs: add TerminalColorMode type
* fs: add new config(flags) for TerminalColorMode
* lib/terminal: use TerminalColorMode to determine how to handle colors
* Add documentation for '--terminal-color-mode'
* tree: remove obsolete --color replaced by global --color

This changes the default behaviour of tree. It now displays colors by
default instead of only displaying them when the flag -C/--color was
active. Old behaviour (no color) can be achieved by setting --color to
'never'.

Fixes: #6604
This commit is contained in:
Kevin Verstaen
2022-12-06 13:07:06 +01:00
committed by GitHub
parent a9bd0c8de6
commit c2dfc3e5b3
9 changed files with 157 additions and 4 deletions

View File

@@ -3,12 +3,14 @@
package terminal
import (
"context"
"io"
"os"
"runtime"
"sync"
colorable "github.com/mattn/go-colorable"
"github.com/rclone/rclone/fs"
)
// VT100 codes
@@ -73,13 +75,21 @@ var (
// Start the terminal - must be called before use
func Start() {
once.Do(func() {
ci := fs.GetConfig(context.Background())
f := os.Stdout
if !IsTerminal(int(f.Fd())) {
// If stdout not a tty then remove escape codes
Out = colorable.NewNonColorable(f)
// If stdout is not a tty, remove escape codes EXCEPT if terminal color mode equals "ALWAYS"
if ci.TerminalColorMode == fs.TerminalColorModeAlways {
Out = colorable.NewColorable(f)
} else {
Out = colorable.NewNonColorable(f)
}
} else if runtime.GOOS == "windows" && os.Getenv("TERM") != "" {
// If TERM is set just use stdout
Out = f
} else if ci.TerminalColorMode == fs.TerminalColorModeNever {
Out = colorable.NewNonColorable(f)
} else {
Out = colorable.NewColorable(f)
}