Skip to content

Commit b1e5e9c

Browse files
committed
Passing all zsh-syntax-highlighting tests, a few more bugs to fix yet
1 parent a3bcee4 commit b1e5e9c

File tree

3 files changed

+39
-24
lines changed

3 files changed

+39
-24
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ authors = ["Aaron Hill <[email protected]>"]
55

66
[dependencies]
77
lazy_static = "0.2"
8+
clippy = {version = "*", optional = true}
89

910
[build-dependencies]
1011
bindgen = "0.26.3"

src/brackets.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ use linkroot;
44
use std::os::raw::{c_char, c_void};
55
use {getshfunc, doshfunc, newlinklist, insertlinknode, linknode};
66

7-
pub fn brackets_paint(buf: &str, widget: &str, cursor: usize) {
8-
let mut style: String;
7+
pub fn brackets_paint(bracket_color_size: usize, buf: &str, cursor: usize, widget: &str) {
8+
let mut style: String = "".to_owned();
99
let mut level: usize = 0;
10-
let bracket_color_size: usize = 5; // TODO
10+
//let bracket_color_size: usize = 5; // TODO
1111
let pos;
1212

1313
let mut level_pos: HashMap<usize, usize> = HashMap::new();
@@ -25,12 +25,9 @@ pub fn brackets_paint(buf: &str, widget: &str, cursor: usize) {
2525
last_of_level.insert(level, i);
2626
},
2727
')' | ']' | '}' => {
28-
let matching_pos = match last_of_level.get(&level) {
29-
Some(val) => *val,
30-
None => continue
31-
};
28+
let matching_pos = *last_of_level.get(&level).unwrap_or(&0);
3229
level_pos.insert(i, level);
33-
level -= 1;
30+
level = level.saturating_sub(1);
3431

3532
if brackets_match(*chars.get(matching_pos).unwrap_or(&' '), chars[i]) {
3633
matching.insert(matching_pos, i);
@@ -42,6 +39,7 @@ pub fn brackets_paint(buf: &str, widget: &str, cursor: usize) {
4239
if val.1 != chr {
4340
continue;
4441
}
42+
break;
4543
}
4644
//it = Box::new(it.skip(chars[(pos+1)..].iter().position(|c| c == chr).unwrap_or(chars.len() + 1)));
4745
},
@@ -51,7 +49,9 @@ pub fn brackets_paint(buf: &str, widget: &str, cursor: usize) {
5149

5250
for pos in level_pos.keys() {
5351
if matching.contains_key(pos) {
54-
style = format!("bracket-level-{}", ((level_pos[pos] - 1) % bracket_color_size) + 1);
52+
if bracket_color_size != 0 {
53+
style = format!("bracket-level-{}", (level_pos[pos] - 1) % bracket_color_size + 1);
54+
}
5555
} else {
5656
style = "bracket-error".to_owned();
5757
}
@@ -60,10 +60,10 @@ pub fn brackets_paint(buf: &str, widget: &str, cursor: usize) {
6060
}
6161

6262
if widget != "zle-line-finish" {
63-
pos = cursor + 1;
63+
pos = cursor; // cursor is already zero-based
6464
if level_pos.get(&pos).is_some() && matching.get(&pos).is_some() {
6565
let other_pos = matching[&pos];
66-
do_highlight(other_pos, other_pos + 1, "standout");
66+
do_highlight(other_pos, other_pos + 1, "cursor-matchingbracket");
6767
}
6868
}
6969

src/lib.rs

+27-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#![feature(const_fn)]
22

3+
#![cfg_attr(feature="clippy", feature(plugin))]
4+
#![cfg_attr(feature="clippy", plugin(clippy))]
5+
36
#![allow(non_upper_case_globals)]
47
#![allow(non_camel_case_types)]
58
#![allow(non_snake_case)]
@@ -39,8 +42,8 @@ pub static mut bintab: BinWrapper<'static> = BinWrapper(&mut [builtin {
3942
flags: 0
4043
},
4144
handlerfunc: Some(bin_fastbrackets),
42-
minargs: 2,
43-
maxargs: 3,
45+
minargs: 3,
46+
maxargs: 4,
4447
funcid: 0,
4548
optstr: null_mut(),
4649
defopts: null_mut()
@@ -121,18 +124,24 @@ pub extern fn bin_fastbrackets(name: *mut c_char, mut raw_args: *mut *mut c_char
121124
}
122125
}
123126

124-
let cursor = if args.len() == 2 {
125-
0
126-
} else {
127-
match args[2].parse::<usize>() {
128-
Ok(s) => s,
129-
Err(e) => {
130-
unsafe { zwarnnam(name, CString::new(format!("Invalid cursor argument: {:?}", e)).unwrap().into_raw()) } ;
131-
return 1
132-
}
127+
let cursor = match args[2].parse::<usize>() {
128+
Ok(s) => s,
129+
Err(e) => {
130+
unsafe { zwarnnam(name, CString::new(format!("Invalid cursor argument: {:?} {:?}", args[2], e)).unwrap().into_raw()) } ;
131+
return 1
132+
}
133+
};
134+
135+
let bracket_color_size = match args[0].parse::<usize>() {
136+
Ok(s) => s,
137+
Err(e) => {
138+
unsafe { zwarnnam(name, CString::new(format!("Bad bracket color size (should be impossible): {:?} {:?}", args[0], e)).unwrap().into_raw()) } ;
139+
return 1
140+
133141
}
134142
};
135-
brackets_paint(&args[0], &args[1], cursor);
143+
144+
brackets_paint(bracket_color_size, &args[1], cursor, &args.get(3).unwrap_or(&"".to_owned()));
136145

137146
0
138147
}
@@ -144,7 +153,12 @@ mod tests {
144153

145154
#[test]
146155
fn simple_bracket() {
147-
brackets_paint("[]", "lol", 0);
156+
brackets_paint(8, "[]", "lol", 0);
157+
}
158+
159+
#[test]
160+
fn cursor_bracket() {
161+
brackets_paint(3, ": ((( )))", "no", 2);
148162
}
149163

150164
/*#[test]

0 commit comments

Comments
 (0)