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 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 mut decorations = DecorationManager::default();
|
||||
|
@ -165,13 +209,16 @@ impl EditorView {
|
|||
}
|
||||
}
|
||||
|
||||
let gutter_overflow = view.gutter_offset(doc) == 0;
|
||||
if !gutter_overflow {
|
||||
let gutter_width = view.gutter_offset(doc);
|
||||
if gutter_width > 0 {
|
||||
let mut gutter_area = inner.with_width(gutter_width);
|
||||
gutter_area.x -= gutter_width;
|
||||
|
||||
Self::render_gutter(
|
||||
editor,
|
||||
doc,
|
||||
view,
|
||||
view.area,
|
||||
gutter_area,
|
||||
theme,
|
||||
is_focused & self.terminal_focused,
|
||||
&mut decorations,
|
||||
|
@ -201,6 +248,7 @@ impl EditorView {
|
|||
inline_diagnostic_config,
|
||||
config.end_of_line_diagnostics,
|
||||
));
|
||||
|
||||
render_document(
|
||||
surface,
|
||||
inner,
|
||||
|
|
|
@ -315,6 +315,8 @@ pub struct Config {
|
|||
/// Column numbers at which to draw the rulers. Defaults to `[]`, meaning no rulers.
|
||||
pub rulers: Vec<u16>,
|
||||
#[serde(default)]
|
||||
pub nullspace: NullspaceConfig,
|
||||
#[serde(default)]
|
||||
pub whitespace: WhitespaceConfig,
|
||||
/// Persistently display open buffers along the top
|
||||
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)]
|
||||
#[serde(default)]
|
||||
pub struct WhitespaceConfig {
|
||||
|
@ -960,6 +978,7 @@ impl Default for Config {
|
|||
lsp: LspConfig::default(),
|
||||
terminal: get_terminal_provider(),
|
||||
rulers: Vec::new(),
|
||||
nullspace: NullspaceConfig::default(),
|
||||
whitespace: WhitespaceConfig::default(),
|
||||
bufferline: BufferLine::default(),
|
||||
indent_guides: IndentGuidesConfig::default(),
|
||||
|
|
|
@ -191,7 +191,25 @@ impl View {
|
|||
}
|
||||
|
||||
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 {
|
||||
|
|
Loading…
Reference in New Issue