Fix unindent to work with tabs, take a count

This commit is contained in:
Blaž Hrastnik 2021-05-19 00:34:46 +09:00
parent f366b97bce
commit 4f335fabc8

View file

@ -1873,14 +1873,17 @@ pub fn indent(cx: &mut Context) {
}
pub fn unindent(cx: &mut Context) {
let count = cx.count;
let (view, doc) = cx.current();
let lines = get_lines(doc, view.id);
let mut changes = Vec::with_capacity(lines.len());
let tab_width = doc.tab_width();
let indent_width = count * tab_width;
for line_idx in lines {
let line = doc.text().line(line_idx);
let mut width = 0;
let mut pos = 0;
for ch in line.chars() {
match ch {
@ -1889,14 +1892,17 @@ pub fn unindent(cx: &mut Context) {
_ => break,
}
if width >= tab_width {
pos += 1;
if width >= indent_width {
break;
}
}
if width > 0 {
// now delete from start to first non-blank
if pos > 0 {
let start = doc.text().line_to_char(line_idx);
changes.push((start, start + width, None))
changes.push((start, start + pos, None))
}
}