mirror of https://github.com/helix-editor/helix
added 'nullspace' option
parent
0a4432b104
commit
a243e2e1e6
|
@ -93,7 +93,51 @@ impl EditorView {
|
||||||
let theme = &editor.theme;
|
let theme = &editor.theme;
|
||||||
let config = editor.config();
|
let config = editor.config();
|
||||||
|
|
||||||
let view_offset = doc.view_offset(view.id);
|
if config.nullspace.enable {
|
||||||
|
let gutter_width = view.gutter_offset(doc);
|
||||||
|
let text_width = config.text_width as u16;
|
||||||
|
|
||||||
|
let view_width = text_width + gutter_width;
|
||||||
|
|
||||||
|
if view_width < view.area.width {
|
||||||
|
let null_width = (area.width - view_width) / 2;
|
||||||
|
|
||||||
|
let null_l = area.with_width(null_width).clip_bottom(1);
|
||||||
|
let null_r = Rect::new(
|
||||||
|
area.x + view_width + null_width,
|
||||||
|
area.y,
|
||||||
|
area.width - view_width - null_width,
|
||||||
|
area.height,
|
||||||
|
)
|
||||||
|
.clip_bottom(1);
|
||||||
|
|
||||||
|
let null_style = theme
|
||||||
|
.try_get("ui.null")
|
||||||
|
.or_else(|| Some(theme.get("ui.linenr")))
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
fn fill_area(s: &mut Surface, r: Rect, c: char) {
|
||||||
|
for y in r.top()..r.bottom() {
|
||||||
|
for x in r.left()..r.right() {
|
||||||
|
let cell = s.get_mut(x, y).unwrap();
|
||||||
|
cell.symbol.clear();
|
||||||
|
cell.symbol.push(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We currently on use the first char in the 'pattern'
|
||||||
|
// but in future I would like to use the whole string
|
||||||
|
// to render nicer patterns.
|
||||||
|
let c = config.nullspace.pattern.chars().nth(0).unwrap();
|
||||||
|
|
||||||
|
fill_area(surface, null_l, c);
|
||||||
|
fill_area(surface, null_r, c);
|
||||||
|
|
||||||
|
surface.set_style(null_l, null_style);
|
||||||
|
surface.set_style(null_r, null_style);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let text_annotations = view.text_annotations(doc, Some(theme));
|
let text_annotations = view.text_annotations(doc, Some(theme));
|
||||||
let mut decorations = DecorationManager::default();
|
let mut decorations = DecorationManager::default();
|
||||||
|
@ -165,13 +209,16 @@ impl EditorView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let gutter_overflow = view.gutter_offset(doc) == 0;
|
let gutter_width = view.gutter_offset(doc);
|
||||||
if !gutter_overflow {
|
if gutter_width > 0 {
|
||||||
|
let mut gutter_area = inner.with_width(gutter_width);
|
||||||
|
gutter_area.x -= gutter_width;
|
||||||
|
|
||||||
Self::render_gutter(
|
Self::render_gutter(
|
||||||
editor,
|
editor,
|
||||||
doc,
|
doc,
|
||||||
view,
|
view,
|
||||||
view.area,
|
gutter_area,
|
||||||
theme,
|
theme,
|
||||||
is_focused & self.terminal_focused,
|
is_focused & self.terminal_focused,
|
||||||
&mut decorations,
|
&mut decorations,
|
||||||
|
@ -201,6 +248,7 @@ impl EditorView {
|
||||||
inline_diagnostic_config,
|
inline_diagnostic_config,
|
||||||
config.end_of_line_diagnostics,
|
config.end_of_line_diagnostics,
|
||||||
));
|
));
|
||||||
|
|
||||||
render_document(
|
render_document(
|
||||||
surface,
|
surface,
|
||||||
inner,
|
inner,
|
||||||
|
|
|
@ -315,6 +315,8 @@ pub struct Config {
|
||||||
/// Column numbers at which to draw the rulers. Defaults to `[]`, meaning no rulers.
|
/// Column numbers at which to draw the rulers. Defaults to `[]`, meaning no rulers.
|
||||||
pub rulers: Vec<u16>,
|
pub rulers: Vec<u16>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
|
pub nullspace: NullspaceConfig,
|
||||||
|
#[serde(default)]
|
||||||
pub whitespace: WhitespaceConfig,
|
pub whitespace: WhitespaceConfig,
|
||||||
/// Persistently display open buffers along the top
|
/// Persistently display open buffers along the top
|
||||||
pub bufferline: BufferLine,
|
pub bufferline: BufferLine,
|
||||||
|
@ -698,6 +700,22 @@ impl std::str::FromStr for GutterType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
|
#[serde(default)]
|
||||||
|
pub struct NullspaceConfig {
|
||||||
|
pub enable: bool,
|
||||||
|
pub pattern: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for NullspaceConfig {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
enable: true,
|
||||||
|
pattern: String::from("╲"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub struct WhitespaceConfig {
|
pub struct WhitespaceConfig {
|
||||||
|
@ -960,6 +978,7 @@ impl Default for Config {
|
||||||
lsp: LspConfig::default(),
|
lsp: LspConfig::default(),
|
||||||
terminal: get_terminal_provider(),
|
terminal: get_terminal_provider(),
|
||||||
rulers: Vec::new(),
|
rulers: Vec::new(),
|
||||||
|
nullspace: NullspaceConfig::default(),
|
||||||
whitespace: WhitespaceConfig::default(),
|
whitespace: WhitespaceConfig::default(),
|
||||||
bufferline: BufferLine::default(),
|
bufferline: BufferLine::default(),
|
||||||
indent_guides: IndentGuidesConfig::default(),
|
indent_guides: IndentGuidesConfig::default(),
|
||||||
|
|
|
@ -191,7 +191,25 @@ impl View {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn inner_area(&self, doc: &Document) -> Rect {
|
pub fn inner_area(&self, doc: &Document) -> Rect {
|
||||||
self.area.clip_left(self.gutter_offset(doc)).clip_bottom(1) // -1 for statusline
|
let config = doc.config.load();
|
||||||
|
let gutter_width = self.gutter_offset(doc);
|
||||||
|
|
||||||
|
if config.nullspace.enable {
|
||||||
|
let text_width = config.text_width as u16;
|
||||||
|
let view_width = gutter_width + text_width;
|
||||||
|
|
||||||
|
if self.area.width > view_width {
|
||||||
|
let null_width = (self.area.width - view_width) / 2;
|
||||||
|
|
||||||
|
return self
|
||||||
|
.area
|
||||||
|
.clip_left(gutter_width + null_width)
|
||||||
|
.clip_bottom(1)
|
||||||
|
.with_width(text_width.min(self.area.width));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.area.clip_left(gutter_width).clip_bottom(1) // -1 for statusline
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn inner_height(&self) -> usize {
|
pub fn inner_height(&self) -> usize {
|
||||||
|
|
Loading…
Reference in New Issue