diff options
| author | Jan Niklas Hasse <jhasse@gmail.com> | 2013-12-20 20:22:41 +0100 | 
|---|---|---|
| committer | Jan Niklas Hasse <jhasse@gmail.com> | 2013-12-20 22:32:27 +0100 | 
| commit | 5cf2f54bb12c66f6ea26b0f3c607817cfaab2c2f (patch) | |
| tree | 2ffc18e36c223b47c49f1c124daea241cf81dbf3 | |
| parent | b6933f8d8b86f78ac7b5f70f0781d794144763a0 (diff) | |
| download | rust-5cf2f54bb12c66f6ea26b0f3c607817cfaab2c2f.tar.gz rust-5cf2f54bb12c66f6ea26b0f3c607817cfaab2c2f.zip  | |
Support ANSI colors in msys terminals. See #2807
| -rw-r--r-- | src/libextra/term.rs | 58 | ||||
| -rw-r--r-- | src/libextra/terminfo/parser/compiled.rs | 15 | 
2 files changed, 28 insertions, 45 deletions
diff --git a/src/libextra/term.rs b/src/libextra/term.rs index aace15ee7a6..05e9b65d19c 100644 --- a/src/libextra/term.rs +++ b/src/libextra/term.rs @@ -15,11 +15,11 @@ use std::io::{Decorator, Writer}; -#[cfg(not(target_os = "win32"))] use std::os; -#[cfg(not(target_os = "win32"))] use terminfo::*; -#[cfg(not(target_os = "win32"))] use terminfo::searcher::open; -#[cfg(not(target_os = "win32"))] use terminfo::parser::compiled::parse; -#[cfg(not(target_os = "win32"))] use terminfo::parm::{expand, Number, Variables}; +use std::os; +use terminfo::*; +use terminfo::searcher::open; +use terminfo::parser::compiled::{parse, msys_terminfo}; +use terminfo::parm::{expand, Number, Variables}; // FIXME (#2807): Windows support. @@ -74,7 +74,6 @@ pub mod attr { } } -#[cfg(not(target_os = "win32"))] fn cap_for_attr(attr: attr::Attr) -> &'static str { match attr { attr::Bold => "bold", @@ -93,29 +92,24 @@ fn cap_for_attr(attr: attr::Attr) -> &'static str { } } -#[cfg(not(target_os = "win32"))] pub struct Terminal<T> { priv num_colors: u16, priv out: T, priv ti: ~TermInfo } -#[cfg(target_os = "win32")] -pub struct Terminal<T> { - priv num_colors: u16, - priv out: T, -} - -#[cfg(not(target_os = "win32"))] impl<T: Writer> Terminal<T> { pub fn new(out: T) -> Result<Terminal<T>, ~str> { - let term = os::getenv("TERM"); - if term.is_none() { - return Err(~"TERM environment variable undefined"); - } + let term = match os::getenv("TERM") { + Some(t) => t, + None => return Err(~"TERM environment variable undefined") + }; - let entry = open(term.unwrap()); + let entry = open(term); if entry.is_err() { + if "cygwin" == term { // msys terminal + return Ok(Terminal {out: out, ti: msys_terminfo(), num_colors: 8}); + } return Err(entry.unwrap_err()); } @@ -241,32 +235,6 @@ impl<T: Writer> Terminal<T> { } } -#[cfg(target_os = "win32")] -impl<T: Writer> Terminal<T> { - pub fn new(out: T) -> Result<Terminal<T>, ~str> { - return Ok(Terminal {out: out, num_colors: 0}); - } - - pub fn fg(&mut self, _color: color::Color) -> bool { - false - } - - pub fn bg(&mut self, _color: color::Color) -> bool { - false - } - - pub fn attr(&mut self, _attr: attr::Attr) -> bool { - false - } - - pub fn supports_attr(&self, _attr: attr::Attr) -> bool { - false - } - - pub fn reset(&self) { - } -} - impl<T: Writer> Decorator<T> for Terminal<T> { fn inner(self) -> T { self.out diff --git a/src/libextra/terminfo/parser/compiled.rs b/src/libextra/terminfo/parser/compiled.rs index bc997c5147d..d42340cb817 100644 --- a/src/libextra/terminfo/parser/compiled.rs +++ b/src/libextra/terminfo/parser/compiled.rs @@ -316,6 +316,21 @@ pub fn parse(file: &mut io::Reader, Ok(~TermInfo {names: term_names, bools: bools_map, numbers: numbers_map, strings: string_map }) } +/// Create a dummy TermInfo struct for msys terminals +pub fn msys_terminfo() -> ~TermInfo { + let mut strings = HashMap::new(); + strings.insert(~"sgr0", bytes!("\x1b[0m").to_owned()); + strings.insert(~"bold", bytes!("\x1b[1m;").to_owned()); + strings.insert(~"setaf", bytes!("\x1b[3%p1%dm").to_owned()); + strings.insert(~"setab", bytes!("\x1b[4%p1%dm").to_owned()); + ~TermInfo { + names: ~[~"cygwin"], // msys is a fork of an older cygwin version + bools: HashMap::new(), + numbers: HashMap::new(), + strings: strings + } +} + #[cfg(test)] mod test { use super::*;  | 
