Support merge conflict formatting
This commit is contained in:
parent
6580432286
commit
9c002841ff
4 changed files with 39 additions and 20 deletions
|
|
@ -34,6 +34,8 @@ pub enum TokenKind {
|
||||||
Constant,
|
Constant,
|
||||||
/// A function call or some other active operation
|
/// A function call or some other active operation
|
||||||
Function,
|
Function,
|
||||||
|
/// An active merge conflict
|
||||||
|
MergeConflict,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
|
|
||||||
|
|
@ -15,39 +15,39 @@ impl LangPack {
|
||||||
file_name.extension().and_then(|e| e.to_str()).unwrap_or(""),
|
file_name.extension().and_then(|e| e.to_str()).unwrap_or(""),
|
||||||
) {
|
) {
|
||||||
(_, "rs") => Self {
|
(_, "rs") => Self {
|
||||||
highlighter: Highlighter::default().rust(),
|
highlighter: Highlighter::default().rust().git(),
|
||||||
comment_syntax: Some(vec!['/', '/', ' ']),
|
comment_syntax: Some(vec!['/', '/', ' ']),
|
||||||
},
|
},
|
||||||
(_, "md") => Self {
|
(_, "md") => Self {
|
||||||
highlighter: Highlighter::default().markdown(),
|
highlighter: Highlighter::default().markdown().git(),
|
||||||
comment_syntax: None,
|
comment_syntax: None,
|
||||||
},
|
},
|
||||||
(_, "toml") => Self {
|
(_, "toml") => Self {
|
||||||
highlighter: Highlighter::default().toml(),
|
highlighter: Highlighter::default().toml().git(),
|
||||||
comment_syntax: Some(vec!['#', ' ']),
|
comment_syntax: Some(vec!['#', ' ']),
|
||||||
},
|
},
|
||||||
(_, "c" | "h" | "cpp" | "hpp" | "cxx" | "js" | "ts" | "go") => Self {
|
(_, "c" | "h" | "cpp" | "hpp" | "cxx" | "js" | "ts" | "go") => Self {
|
||||||
highlighter: Highlighter::default().generic_clike(),
|
highlighter: Highlighter::default().generic_clike().git(),
|
||||||
comment_syntax: Some(vec!['/', '/', ' ']),
|
comment_syntax: Some(vec!['/', '/', ' ']),
|
||||||
},
|
},
|
||||||
(_, "glsl" | "vert" | "frag") => Self {
|
(_, "glsl" | "vert" | "frag") => Self {
|
||||||
highlighter: Highlighter::default().glsl(),
|
highlighter: Highlighter::default().glsl().git(),
|
||||||
comment_syntax: Some(vec!['/', '/', ' ']),
|
comment_syntax: Some(vec!['/', '/', ' ']),
|
||||||
},
|
},
|
||||||
(_, "py") => Self {
|
(_, "py") => Self {
|
||||||
highlighter: Highlighter::default().python(),
|
highlighter: Highlighter::default().python().git(),
|
||||||
comment_syntax: Some(vec!['#', ' ']),
|
comment_syntax: Some(vec!['#', ' ']),
|
||||||
},
|
},
|
||||||
(_, "tao") => Self {
|
(_, "tao") => Self {
|
||||||
highlighter: Highlighter::default().tao(),
|
highlighter: Highlighter::default().tao().git(),
|
||||||
comment_syntax: Some(vec!['#', ' ']),
|
comment_syntax: Some(vec!['#', ' ']),
|
||||||
},
|
},
|
||||||
("makefile" | "Makefile", _) => Self {
|
("makefile" | "Makefile", _) => Self {
|
||||||
highlighter: Highlighter::default().makefile(),
|
highlighter: Highlighter::default().makefile().git(),
|
||||||
comment_syntax: Some(vec!['#', ' ']),
|
comment_syntax: Some(vec!['#', ' ']),
|
||||||
},
|
},
|
||||||
_ => Self {
|
_ => Self {
|
||||||
highlighter: Highlighter::default(),
|
highlighter: Highlighter::default().git(),
|
||||||
comment_syntax: None,
|
comment_syntax: None,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -170,7 +170,7 @@ impl Highlighter {
|
||||||
pub fn generic_clike(self) -> Self {
|
pub fn generic_clike(self) -> Self {
|
||||||
self
|
self
|
||||||
// Keywords
|
// Keywords
|
||||||
.with(TokenKind::Keyword, r"\b[(var)(enum)(let)(this)(fn)(struct)(class)(import)(if)(while)(for)(in)(loop)(else)(break)(continue)(const)(static)(type)(extern)(return)(async)(throw)(catch)(union)(auto)(namespace)(public)(private)(function)(func)(goto)]\b")
|
.with(TokenKind::Keyword, r"\b[(var)(enum)(let)(this)(fn)(struct)(class)(import)(if)(while)(for)(in)(loop)(else)(break)(continue)(const)(static)(type)(extern)(return)(async)(throw)(catch)(union)(auto)(namespace)(public)(private)(function)(func)(goto)(case)(default)(switch)]\b")
|
||||||
// Primitives
|
// Primitives
|
||||||
.with(TokenKind::Type, r"\b[(([(unsigned)(signed)][[:space:]])*u?int[0-9]*(_t)?)(float)(double)(bool)(char)(size_t)(void)]\b")
|
.with(TokenKind::Type, r"\b[(([(unsigned)(signed)][[:space:]])*u?int[0-9]*(_t)?)(float)(double)(bool)(char)(size_t)(void)]\b")
|
||||||
.clike_comments()
|
.clike_comments()
|
||||||
|
|
@ -277,4 +277,11 @@ impl Highlighter {
|
||||||
// Comments
|
// Comments
|
||||||
.with(TokenKind::Comment, r"#[^$]*$")
|
.with(TokenKind::Comment, r"#[^$]*$")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn git(self) -> Self {
|
||||||
|
self.with(
|
||||||
|
TokenKind::MergeConflict,
|
||||||
|
r"^[(<<<<<<<)(=======)(>>>>>>>)]( [^$]*)?$",
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
16
src/theme.rs
16
src/theme.rs
|
|
@ -64,6 +64,8 @@ pub struct Theme {
|
||||||
pub hl_token_special: Color,
|
pub hl_token_special: Color,
|
||||||
pub hl_token_constant: Color,
|
pub hl_token_constant: Color,
|
||||||
pub hl_token_function: Color,
|
pub hl_token_function: Color,
|
||||||
|
|
||||||
|
pub hl_merge_conflict: Color,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Theme {
|
impl Default for Theme {
|
||||||
|
|
@ -103,13 +105,15 @@ impl Default for Theme {
|
||||||
hl_token_special: Color::AnsiValue(160),
|
hl_token_special: Color::AnsiValue(160),
|
||||||
hl_token_constant: Color::AnsiValue(81),
|
hl_token_constant: Color::AnsiValue(81),
|
||||||
hl_token_function: Color::AnsiValue(122),
|
hl_token_function: Color::AnsiValue(122),
|
||||||
|
|
||||||
|
hl_merge_conflict: Color::AnsiValue(124),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Theme {
|
impl Theme {
|
||||||
pub fn token_color(&self, token: TokenKind) -> Color {
|
pub fn token_color(&self, token: TokenKind) -> (Color, Option<Color>) {
|
||||||
match token {
|
let fg = match token {
|
||||||
TokenKind::Whitespace => self.hl_token_whitespace,
|
TokenKind::Whitespace => self.hl_token_whitespace,
|
||||||
TokenKind::Ident => self.hl_token_ident,
|
TokenKind::Ident => self.hl_token_ident,
|
||||||
TokenKind::Keyword => self.hl_token_keyword,
|
TokenKind::Keyword => self.hl_token_keyword,
|
||||||
|
|
@ -126,6 +130,12 @@ impl Theme {
|
||||||
TokenKind::Special => self.hl_token_special,
|
TokenKind::Special => self.hl_token_special,
|
||||||
TokenKind::Constant => self.hl_token_constant,
|
TokenKind::Constant => self.hl_token_constant,
|
||||||
TokenKind::Function => self.hl_token_function,
|
TokenKind::Function => self.hl_token_function,
|
||||||
}
|
TokenKind::MergeConflict => self.text,
|
||||||
|
};
|
||||||
|
let bg = match token {
|
||||||
|
TokenKind::MergeConflict => Some(self.hl_merge_conflict),
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
(fg, bg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -286,19 +286,19 @@ impl Input {
|
||||||
.selection()
|
.selection()
|
||||||
.zip(pos)
|
.zip(pos)
|
||||||
.map_or(false, |(s, pos)| s.contains(&pos));
|
.map_or(false, |(s, pos)| s.contains(&pos));
|
||||||
let (fg, c) = match line.get(coord as usize).copied() {
|
let (fg, hl_bg, c) = match line.get(coord as usize).copied() {
|
||||||
Some('\n') if selected => (state.theme.whitespace, '⮠'),
|
Some('\n') if selected => (state.theme.whitespace, None, '⮠'),
|
||||||
Some(c) => {
|
Some(c) => {
|
||||||
if let Some(fg) = pos
|
if let Some((fg, bg)) = pos
|
||||||
.and_then(|pos| buffer.highlights.get_at(pos))
|
.and_then(|pos| buffer.highlights.get_at(pos))
|
||||||
.map(|tok| state.theme.token_color(tok.kind))
|
.map(|tok| state.theme.token_color(tok.kind))
|
||||||
{
|
{
|
||||||
(fg, c)
|
(fg, bg, c)
|
||||||
} else {
|
} else {
|
||||||
(state.theme.text, c)
|
(state.theme.text, None, c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => (Color::Reset, ' '),
|
None => (Color::Reset, None, ' '),
|
||||||
};
|
};
|
||||||
let bg = match finder.map(|s| s.contains(pos?)) {
|
let bg = match finder.map(|s| s.contains(pos?)) {
|
||||||
Some(Some(true)) => state.theme.select_bg,
|
Some(Some(true)) => state.theme.select_bg,
|
||||||
|
|
@ -316,7 +316,7 @@ impl Input {
|
||||||
} else if line_selected && frame.has_focus() {
|
} else if line_selected && frame.has_focus() {
|
||||||
state.theme.line_select_bg
|
state.theme.line_select_bg
|
||||||
} else {
|
} else {
|
||||||
Color::Reset
|
hl_bg.unwrap_or(Color::Reset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue