pub struct Desc { /* private fields */ }
Expand description
The names and capabilities that make up a terminal description.
Predefined capabilities are read by indexing a Desc
object
with a Boolean
,
Number
, or
String
capability name. For example,
desc[bw]
returns a bool
, desc[cols]
returns a u16
, and
&desc[setaf]
returns a &[u8]
. User-defined capabilities are
queried using the get_*_ext()
methods.
An absent capability will be false
, 0xffff
, or an empty
slice, for booleans, numbers, and strings respectively.
The desc!
macro provides syntax for Desc
literals.
§Examples
Read the description for xterm-256color
and look up the rs1
capability:
use tinf::Desc;
use tinf::cap::rs1;
let mut file = Desc::file("xterm-256color")?;
let desc = Desc::parse(&mut file)?;
assert_eq!(&desc[rs1], b"\x1bc\x1b]104\x07");
Implementations§
Source§impl Desc
impl Desc
Sourcepub fn file(term_name: &str) -> Result<File, DescError>
pub fn file(term_name: &str) -> Result<File, DescError>
Finds and opens the compiled terminfo description for the
terminal named by term_name
.
This assumes that the local terminfo database uses a directory tree format for storing compiled descriptions, and it searches in these directories:
- The directory named by the
TERMINFO
environment variable. $HOME/.terminfo
- The list of directories named by the
TERMINFO_DIRS
environment variable (with empty entries replaced by/usr/share/terminfo
). /etc/terminfo
/lib/terminfo
/usr/share/terminfo
For each directory, file
checks for a description named
term_name
in a subdirectory named by the first letter of
term_name
as a character or hex representation, for example
/x/xterm
or /78/xterm
. (Note that if term_name
has more
than one path component, only the last one is used).
#Errors
This returns an error if file
could not find and open a
description for term_name
, or if term_name
is invalid.
Sourcepub fn parse(r: &mut dyn Read) -> Result<Desc, DescError>
pub fn parse(r: &mut dyn Read) -> Result<Desc, DescError>
Creates a Desc
from a compiled terminfo description.
§Errors
This returns an error if the input is not a valid terminfo description.
Sourcepub fn current() -> &'static Desc
pub fn current() -> &'static Desc
The description for the terminal type from the TERM
environment variable, or the “dumb terminal” description if
TERM
is empty.
Examples found in repository?
5fn main() {
6 let desc = Desc::current();
7 let names = desc.names();
8 if names.len() > 0 {
9 println!("{}", names[0]);
10 }
11 for b in cap::Boolean::iter() {
12 if desc[b] {
13 println!("{}", b.short_name());
14 }
15 }
16 for b in desc.bool_exts() {
17 if desc.get_bool_ext(b) {
18 println!("* {}", b.name());
19 }
20 }
21 for n in cap::Number::iter() {
22 if desc[n] != 0xffff {
23 println!("{}#{}", n.short_name(), desc[n]);
24 }
25 }
26 for n in desc.num_exts() {
27 if desc.get_num_ext(n) != 0xffff {
28 println!("* {}#{}", n.name(), desc.get_num_ext(n));
29 }
30 }
31 for s in cap::String::iter() {
32 if &desc[s] != b"" {
33 println!("{}={}", s.short_name(), show(&desc[s]));
34 }
35 }
36 for s in desc.str_exts() {
37 if desc.get_str_ext(s) != b"" {
38 println!("* {}={}", s.name(), show(desc.get_str_ext(s)));
39 }
40 }
41}
Sourcepub fn names(&self) -> &[String]
pub fn names(&self) -> &[String]
The terminal’s names.
Examples found in repository?
5fn main() {
6 let desc = Desc::current();
7 let names = desc.names();
8 if names.len() > 0 {
9 println!("{}", names[0]);
10 }
11 for b in cap::Boolean::iter() {
12 if desc[b] {
13 println!("{}", b.short_name());
14 }
15 }
16 for b in desc.bool_exts() {
17 if desc.get_bool_ext(b) {
18 println!("* {}", b.name());
19 }
20 }
21 for n in cap::Number::iter() {
22 if desc[n] != 0xffff {
23 println!("{}#{}", n.short_name(), desc[n]);
24 }
25 }
26 for n in desc.num_exts() {
27 if desc.get_num_ext(n) != 0xffff {
28 println!("* {}#{}", n.name(), desc.get_num_ext(n));
29 }
30 }
31 for s in cap::String::iter() {
32 if &desc[s] != b"" {
33 println!("{}={}", s.short_name(), show(&desc[s]));
34 }
35 }
36 for s in desc.str_exts() {
37 if desc.get_str_ext(s) != b"" {
38 println!("* {}={}", s.name(), show(desc.get_str_ext(s)));
39 }
40 }
41}
Sourcepub fn get_bool_ext(&self, name: &UserDef) -> bool
pub fn get_bool_ext(&self, name: &UserDef) -> bool
Query a user-defined boolean capability.
If the capability is absent, returns false
.
Examples found in repository?
5fn main() {
6 let desc = Desc::current();
7 let names = desc.names();
8 if names.len() > 0 {
9 println!("{}", names[0]);
10 }
11 for b in cap::Boolean::iter() {
12 if desc[b] {
13 println!("{}", b.short_name());
14 }
15 }
16 for b in desc.bool_exts() {
17 if desc.get_bool_ext(b) {
18 println!("* {}", b.name());
19 }
20 }
21 for n in cap::Number::iter() {
22 if desc[n] != 0xffff {
23 println!("{}#{}", n.short_name(), desc[n]);
24 }
25 }
26 for n in desc.num_exts() {
27 if desc.get_num_ext(n) != 0xffff {
28 println!("* {}#{}", n.name(), desc.get_num_ext(n));
29 }
30 }
31 for s in cap::String::iter() {
32 if &desc[s] != b"" {
33 println!("{}={}", s.short_name(), show(&desc[s]));
34 }
35 }
36 for s in desc.str_exts() {
37 if desc.get_str_ext(s) != b"" {
38 println!("* {}={}", s.name(), show(desc.get_str_ext(s)));
39 }
40 }
41}
Sourcepub fn bool_exts(&self) -> Vec<&UserDef>
pub fn bool_exts(&self) -> Vec<&UserDef>
List the names of any user-defined boolean capabilities.
Examples found in repository?
5fn main() {
6 let desc = Desc::current();
7 let names = desc.names();
8 if names.len() > 0 {
9 println!("{}", names[0]);
10 }
11 for b in cap::Boolean::iter() {
12 if desc[b] {
13 println!("{}", b.short_name());
14 }
15 }
16 for b in desc.bool_exts() {
17 if desc.get_bool_ext(b) {
18 println!("* {}", b.name());
19 }
20 }
21 for n in cap::Number::iter() {
22 if desc[n] != 0xffff {
23 println!("{}#{}", n.short_name(), desc[n]);
24 }
25 }
26 for n in desc.num_exts() {
27 if desc.get_num_ext(n) != 0xffff {
28 println!("* {}#{}", n.name(), desc.get_num_ext(n));
29 }
30 }
31 for s in cap::String::iter() {
32 if &desc[s] != b"" {
33 println!("{}={}", s.short_name(), show(&desc[s]));
34 }
35 }
36 for s in desc.str_exts() {
37 if desc.get_str_ext(s) != b"" {
38 println!("* {}={}", s.name(), show(desc.get_str_ext(s)));
39 }
40 }
41}
Sourcepub fn get_num_ext(&self, name: &UserDef) -> u16
pub fn get_num_ext(&self, name: &UserDef) -> u16
Query a user-defined numeric capability.
If the capability is absent, returns 0xffff
.
Examples found in repository?
5fn main() {
6 let desc = Desc::current();
7 let names = desc.names();
8 if names.len() > 0 {
9 println!("{}", names[0]);
10 }
11 for b in cap::Boolean::iter() {
12 if desc[b] {
13 println!("{}", b.short_name());
14 }
15 }
16 for b in desc.bool_exts() {
17 if desc.get_bool_ext(b) {
18 println!("* {}", b.name());
19 }
20 }
21 for n in cap::Number::iter() {
22 if desc[n] != 0xffff {
23 println!("{}#{}", n.short_name(), desc[n]);
24 }
25 }
26 for n in desc.num_exts() {
27 if desc.get_num_ext(n) != 0xffff {
28 println!("* {}#{}", n.name(), desc.get_num_ext(n));
29 }
30 }
31 for s in cap::String::iter() {
32 if &desc[s] != b"" {
33 println!("{}={}", s.short_name(), show(&desc[s]));
34 }
35 }
36 for s in desc.str_exts() {
37 if desc.get_str_ext(s) != b"" {
38 println!("* {}={}", s.name(), show(desc.get_str_ext(s)));
39 }
40 }
41}
Sourcepub fn num_exts(&self) -> Vec<&UserDef>
pub fn num_exts(&self) -> Vec<&UserDef>
List the names of any user-defined numeric capabilities.
Examples found in repository?
5fn main() {
6 let desc = Desc::current();
7 let names = desc.names();
8 if names.len() > 0 {
9 println!("{}", names[0]);
10 }
11 for b in cap::Boolean::iter() {
12 if desc[b] {
13 println!("{}", b.short_name());
14 }
15 }
16 for b in desc.bool_exts() {
17 if desc.get_bool_ext(b) {
18 println!("* {}", b.name());
19 }
20 }
21 for n in cap::Number::iter() {
22 if desc[n] != 0xffff {
23 println!("{}#{}", n.short_name(), desc[n]);
24 }
25 }
26 for n in desc.num_exts() {
27 if desc.get_num_ext(n) != 0xffff {
28 println!("* {}#{}", n.name(), desc.get_num_ext(n));
29 }
30 }
31 for s in cap::String::iter() {
32 if &desc[s] != b"" {
33 println!("{}={}", s.short_name(), show(&desc[s]));
34 }
35 }
36 for s in desc.str_exts() {
37 if desc.get_str_ext(s) != b"" {
38 println!("* {}={}", s.name(), show(desc.get_str_ext(s)));
39 }
40 }
41}
Sourcepub fn get_str_ext(&self, name: &UserDef) -> &[u8] ⓘ
pub fn get_str_ext(&self, name: &UserDef) -> &[u8] ⓘ
Query a user-defined string capability.
If the capability is absent, returns an empty slice.
Examples found in repository?
5fn main() {
6 let desc = Desc::current();
7 let names = desc.names();
8 if names.len() > 0 {
9 println!("{}", names[0]);
10 }
11 for b in cap::Boolean::iter() {
12 if desc[b] {
13 println!("{}", b.short_name());
14 }
15 }
16 for b in desc.bool_exts() {
17 if desc.get_bool_ext(b) {
18 println!("* {}", b.name());
19 }
20 }
21 for n in cap::Number::iter() {
22 if desc[n] != 0xffff {
23 println!("{}#{}", n.short_name(), desc[n]);
24 }
25 }
26 for n in desc.num_exts() {
27 if desc.get_num_ext(n) != 0xffff {
28 println!("* {}#{}", n.name(), desc.get_num_ext(n));
29 }
30 }
31 for s in cap::String::iter() {
32 if &desc[s] != b"" {
33 println!("{}={}", s.short_name(), show(&desc[s]));
34 }
35 }
36 for s in desc.str_exts() {
37 if desc.get_str_ext(s) != b"" {
38 println!("* {}={}", s.name(), show(desc.get_str_ext(s)));
39 }
40 }
41}
Sourcepub fn str_exts(&self) -> Vec<&UserDef>
pub fn str_exts(&self) -> Vec<&UserDef>
List the names of any user-defined string capabilities.
Examples found in repository?
5fn main() {
6 let desc = Desc::current();
7 let names = desc.names();
8 if names.len() > 0 {
9 println!("{}", names[0]);
10 }
11 for b in cap::Boolean::iter() {
12 if desc[b] {
13 println!("{}", b.short_name());
14 }
15 }
16 for b in desc.bool_exts() {
17 if desc.get_bool_ext(b) {
18 println!("* {}", b.name());
19 }
20 }
21 for n in cap::Number::iter() {
22 if desc[n] != 0xffff {
23 println!("{}#{}", n.short_name(), desc[n]);
24 }
25 }
26 for n in desc.num_exts() {
27 if desc.get_num_ext(n) != 0xffff {
28 println!("* {}#{}", n.name(), desc.get_num_ext(n));
29 }
30 }
31 for s in cap::String::iter() {
32 if &desc[s] != b"" {
33 println!("{}={}", s.short_name(), show(&desc[s]));
34 }
35 }
36 for s in desc.str_exts() {
37 if desc.get_str_ext(s) != b"" {
38 println!("* {}={}", s.name(), show(desc.get_str_ext(s)));
39 }
40 }
41}