mirror of
https://github.com/helix-editor/helix
synced 2024-06-02 08:06:07 +02:00
4dcf1fe66b
* rework positioning/rendering, enables softwrap/virtual text This commit is a large rework of the core text positioning and rendering code in helix to remove the assumption that on-screen columns/lines correspond to text columns/lines. A generic `DocFormatter` is introduced that positions graphemes on and is used both for rendering and for movements/scrolling. Both virtual text support (inline, grapheme overlay and multi-line) and a capable softwrap implementation is included. fix picker highlight cleanup doc formatter, use word bondaries for wrapping make visual vertical movement a seperate commnad estimate line gutter width to improve performance cache cursor position cleanup and optimize doc formatter cleanup documentation fix typos Co-authored-by: Daniel Hines <d4hines@gmail.com> update documentation fix panic in last_visual_line funciton improve soft-wrap documentation add extend_visual_line_up/down commands fix non-visual vertical movement streamline virtual text highlighting, add softwrap indicator fix cursor position if softwrap is disabled improve documentation of text_annotations module avoid crashes if view anchor is out of bounds fix: consider horizontal offset when traslation char_idx -> vpos improve default configuration fix: mixed up horizontal and vertical offset reset view position after config reload apply suggestions from review disabled softwrap for very small screens to avoid endless spin fix wrap_indicator setting fix bar cursor disappearring on the EOF character add keybinding for linewise vertical movement fix: inconsistent gutter highlights improve virtual text API make scope idx lookup more ergonomic allow overlapping overlays correctly track char_pos for virtual text adjust configuration deprecate old position fucntions fix infinite loop in highlight lookup fix gutter style fix formatting document max-line-width interaction with softwrap change wrap-indicator example to use empty string fix: rare panic when view is in invalid state (bis) * Apply suggestions from code review Co-authored-by: Michael Davis <mcarsondavis@gmail.com> * improve documentation for positoning functions * simplify tests * fix documentation of Grapheme::width * Apply suggestions from code review Co-authored-by: Michael Davis <mcarsondavis@gmail.com> * add explicit drop invocation * Add explicit MoveFn type alias * add docuntation to Editor::cursor_cache * fix a few typos * explain use of allow(deprecated) * make gj and gk extend in select mode * remove unneded debug and TODO * mark tab_width_at #[inline] * add fast-path to move_vertically_visual in case softwrap is disabled * rename first_line to first_visual_line * simplify duplicate if/else --------- Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
80 lines
1.8 KiB
Rust
80 lines
1.8 KiB
Rust
#[macro_use]
|
|
pub mod macros;
|
|
|
|
pub mod clipboard;
|
|
pub mod document;
|
|
pub mod editor;
|
|
pub mod env;
|
|
pub mod graphics;
|
|
pub mod gutter;
|
|
pub mod handlers {
|
|
pub mod dap;
|
|
pub mod lsp;
|
|
}
|
|
pub mod base64;
|
|
pub mod info;
|
|
pub mod input;
|
|
pub mod keyboard;
|
|
pub mod theme;
|
|
pub mod tree;
|
|
pub mod view;
|
|
|
|
use std::num::NonZeroUsize;
|
|
|
|
// uses NonZeroUsize so Option<DocumentId> use a byte rather than two
|
|
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
|
|
pub struct DocumentId(NonZeroUsize);
|
|
|
|
impl Default for DocumentId {
|
|
fn default() -> DocumentId {
|
|
// Safety: 1 is non-zero
|
|
DocumentId(unsafe { NonZeroUsize::new_unchecked(1) })
|
|
}
|
|
}
|
|
|
|
impl std::fmt::Display for DocumentId {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
f.write_fmt(format_args!("{}", self.0))
|
|
}
|
|
}
|
|
|
|
slotmap::new_key_type! {
|
|
pub struct ViewId;
|
|
}
|
|
|
|
pub enum Align {
|
|
Top,
|
|
Center,
|
|
Bottom,
|
|
}
|
|
|
|
pub fn align_view(doc: &Document, view: &mut View, align: Align) {
|
|
let doc_text = doc.text().slice(..);
|
|
let cursor = doc.selection(view.id).primary().cursor(doc_text);
|
|
let viewport = view.inner_area(doc);
|
|
let last_line_height = viewport.height.saturating_sub(1);
|
|
|
|
let relative = match align {
|
|
Align::Center => last_line_height / 2,
|
|
Align::Top => 0,
|
|
Align::Bottom => last_line_height,
|
|
};
|
|
|
|
let text_fmt = doc.text_format(viewport.width, None);
|
|
let annotations = view.text_annotations(doc, None);
|
|
(view.offset.anchor, view.offset.vertical_offset) = char_idx_at_visual_offset(
|
|
doc_text,
|
|
cursor,
|
|
-(relative as isize),
|
|
0,
|
|
&text_fmt,
|
|
&annotations,
|
|
);
|
|
}
|
|
|
|
pub use document::Document;
|
|
pub use editor::Editor;
|
|
use helix_core::char_idx_at_visual_offset;
|
|
pub use theme::Theme;
|
|
pub use view::View;
|