mirror of https://github.com/helix-editor/helix
config: Rename [terminal] to [editor] and pass it into Editor
parent
f0eb6ed96a
commit
a2ccfffda1
|
@ -80,7 +80,12 @@ impl Application {
|
||||||
let syn_loader_conf = toml::from_slice(lang_conf).expect("Could not parse languages.toml");
|
let syn_loader_conf = toml::from_slice(lang_conf).expect("Could not parse languages.toml");
|
||||||
let syn_loader = std::sync::Arc::new(syntax::Loader::new(syn_loader_conf));
|
let syn_loader = std::sync::Arc::new(syntax::Loader::new(syn_loader_conf));
|
||||||
|
|
||||||
let mut editor = Editor::new(size, theme_loader.clone(), syn_loader.clone());
|
let mut editor = Editor::new(
|
||||||
|
size,
|
||||||
|
theme_loader.clone(),
|
||||||
|
syn_loader.clone(),
|
||||||
|
config.editor.clone(),
|
||||||
|
);
|
||||||
|
|
||||||
let editor_view = Box::new(ui::EditorView::new(std::mem::take(&mut config.keys)));
|
let editor_view = Box::new(ui::EditorView::new(std::mem::take(&mut config.keys)));
|
||||||
compositor.push(editor_view);
|
compositor.push(editor_view);
|
||||||
|
@ -489,7 +494,7 @@ impl Application {
|
||||||
terminal::enable_raw_mode()?;
|
terminal::enable_raw_mode()?;
|
||||||
let mut stdout = stdout();
|
let mut stdout = stdout();
|
||||||
execute!(stdout, terminal::EnterAlternateScreen)?;
|
execute!(stdout, terminal::EnterAlternateScreen)?;
|
||||||
if self.config.terminal.mouse {
|
if self.config.editor.mouse {
|
||||||
execute!(stdout, EnableMouseCapture)?;
|
execute!(stdout, EnableMouseCapture)?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -12,12 +12,8 @@ use helix_core::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use helix_view::{
|
use helix_view::{
|
||||||
document::Mode,
|
document::Mode, editor::Action, input::KeyEvent, keyboard::KeyCode, view::View, Document,
|
||||||
editor::Action,
|
DocumentId, Editor, ViewId,
|
||||||
input::KeyEvent,
|
|
||||||
keyboard::KeyCode,
|
|
||||||
view::{View, PADDING},
|
|
||||||
Document, DocumentId, Editor, ViewId,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use anyhow::{anyhow, bail, Context as _};
|
use anyhow::{anyhow, bail, Context as _};
|
||||||
|
@ -452,7 +448,11 @@ fn goto_first_nonwhitespace(cx: &mut Context) {
|
||||||
fn goto_window(cx: &mut Context, align: Align) {
|
fn goto_window(cx: &mut Context, align: Align) {
|
||||||
let (view, doc) = current!(cx.editor);
|
let (view, doc) = current!(cx.editor);
|
||||||
|
|
||||||
let scrolloff = PADDING.min(view.area.height as usize / 2); // TODO: user pref
|
let scrolloff = cx
|
||||||
|
.editor
|
||||||
|
.config
|
||||||
|
.scrolloff
|
||||||
|
.min(view.area.height as usize / 2); // TODO: user pref
|
||||||
|
|
||||||
let last_line = view.last_line(doc);
|
let last_line = view.last_line(doc);
|
||||||
|
|
||||||
|
@ -890,7 +890,11 @@ fn scroll(cx: &mut Context, offset: usize, direction: Direction) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let scrolloff = PADDING.min(view.area.height as usize / 2); // TODO: user pref
|
let scrolloff = cx
|
||||||
|
.editor
|
||||||
|
.config
|
||||||
|
.scrolloff
|
||||||
|
.min(view.area.height as usize / 2); // TODO: user pref
|
||||||
|
|
||||||
view.first_line = match direction {
|
view.first_line = match direction {
|
||||||
Forward => view.first_line + offset,
|
Forward => view.first_line + offset,
|
||||||
|
@ -3927,10 +3931,9 @@ fn align_view_middle(cx: &mut Context) {
|
||||||
.cursor(doc.text().slice(..));
|
.cursor(doc.text().slice(..));
|
||||||
let pos = coords_at_pos(doc.text().slice(..), pos);
|
let pos = coords_at_pos(doc.text().slice(..), pos);
|
||||||
|
|
||||||
const OFFSET: usize = 7; // gutters
|
view.first_col = pos.col.saturating_sub(
|
||||||
view.first_col = pos
|
((view.area.width as usize).saturating_sub(crate::ui::editor::GUTTER_OFFSET as usize)) / 2,
|
||||||
.col
|
);
|
||||||
.saturating_sub(((view.area.width as usize).saturating_sub(OFFSET)) / 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scroll_up(cx: &mut Context) {
|
fn scroll_up(cx: &mut Context) {
|
||||||
|
|
|
@ -10,7 +10,7 @@ pub struct Config {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub keys: Keymaps,
|
pub keys: Keymaps,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub terminal: TerminalConfig,
|
pub editor: helix_view::editor::Config,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, PartialEq, Deserialize)]
|
#[derive(Debug, Default, Clone, PartialEq, Deserialize)]
|
||||||
|
@ -19,18 +19,6 @@ pub struct LspConfig {
|
||||||
pub display_messages: bool,
|
pub display_messages: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Deserialize)]
|
|
||||||
#[serde(rename_all = "kebab-case")]
|
|
||||||
pub struct TerminalConfig {
|
|
||||||
pub mouse: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for TerminalConfig {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self { mouse: true }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parsing_keymaps_config_file() {
|
fn parsing_keymaps_config_file() {
|
||||||
use crate::keymap;
|
use crate::keymap;
|
||||||
|
|
|
@ -36,7 +36,7 @@ pub struct EditorView {
|
||||||
pub autoinfo: Option<Info>,
|
pub autoinfo: Option<Info>,
|
||||||
}
|
}
|
||||||
|
|
||||||
const OFFSET: u16 = 7; // 1 diagnostic + 5 linenr + 1 gutter
|
pub const GUTTER_OFFSET: u16 = 7; // 1 diagnostic + 5 linenr + 1 gutter
|
||||||
|
|
||||||
impl Default for EditorView {
|
impl Default for EditorView {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
|
@ -72,9 +72,9 @@ impl EditorView {
|
||||||
loader: &syntax::Loader,
|
loader: &syntax::Loader,
|
||||||
) {
|
) {
|
||||||
let area = Rect::new(
|
let area = Rect::new(
|
||||||
view.area.x + OFFSET,
|
view.area.x + GUTTER_OFFSET,
|
||||||
view.area.y,
|
view.area.y,
|
||||||
view.area.width - OFFSET,
|
view.area.width - GUTTER_OFFSET,
|
||||||
view.area.height.saturating_sub(1),
|
view.area.height.saturating_sub(1),
|
||||||
); // - 1 for statusline
|
); // - 1 for statusline
|
||||||
|
|
||||||
|
@ -339,7 +339,7 @@ impl EditorView {
|
||||||
use helix_core::diagnostic::Severity;
|
use helix_core::diagnostic::Severity;
|
||||||
if let Some(diagnostic) = doc.diagnostics().iter().find(|d| d.line == line) {
|
if let Some(diagnostic) = doc.diagnostics().iter().find(|d| d.line == line) {
|
||||||
surface.set_stringn(
|
surface.set_stringn(
|
||||||
viewport.x - OFFSET,
|
viewport.x - GUTTER_OFFSET,
|
||||||
viewport.y + i as u16,
|
viewport.y + i as u16,
|
||||||
"●",
|
"●",
|
||||||
1,
|
1,
|
||||||
|
@ -360,7 +360,7 @@ impl EditorView {
|
||||||
format!("{:>5}", line + 1)
|
format!("{:>5}", line + 1)
|
||||||
};
|
};
|
||||||
surface.set_stringn(
|
surface.set_stringn(
|
||||||
viewport.x + 1 - OFFSET,
|
viewport.x + 1 - GUTTER_OFFSET,
|
||||||
viewport.y + i as u16,
|
viewport.y + i as u16,
|
||||||
line_number_text,
|
line_number_text,
|
||||||
5,
|
5,
|
||||||
|
@ -401,7 +401,7 @@ impl EditorView {
|
||||||
format!("{:>5}", line_number + 1)
|
format!("{:>5}", line_number + 1)
|
||||||
};
|
};
|
||||||
surface.set_stringn(
|
surface.set_stringn(
|
||||||
viewport.x + 1 - OFFSET,
|
viewport.x + 1 - GUTTER_OFFSET,
|
||||||
viewport.y + head.row as u16,
|
viewport.y + head.row as u16,
|
||||||
line_number_text,
|
line_number_text,
|
||||||
5,
|
5,
|
||||||
|
@ -778,7 +778,7 @@ impl Component for EditorView {
|
||||||
}
|
}
|
||||||
|
|
||||||
let (view, doc) = current!(cx.editor);
|
let (view, doc) = current!(cx.editor);
|
||||||
view.ensure_cursor_in_view(doc);
|
view.ensure_cursor_in_view(doc, cx.editor.config.scrolloff);
|
||||||
|
|
||||||
// mode transitions
|
// mode transitions
|
||||||
match (mode, doc.mode()) {
|
match (mode, doc.mode()) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
mod completion;
|
mod completion;
|
||||||
mod editor;
|
pub(crate) mod editor;
|
||||||
mod info;
|
mod info;
|
||||||
mod markdown;
|
mod markdown;
|
||||||
mod menu;
|
mod menu;
|
||||||
|
@ -63,7 +63,7 @@ pub fn regex_prompt(
|
||||||
|
|
||||||
fun(view, doc, registers, regex);
|
fun(view, doc, registers, regex);
|
||||||
|
|
||||||
view.ensure_cursor_in_view(doc);
|
view.ensure_cursor_in_view(doc, cx.editor.config.scrolloff);
|
||||||
}
|
}
|
||||||
Err(_err) => (), // TODO: mark command line as error
|
Err(_err) => (), // TODO: mark command line as error
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,26 @@ pub use helix_core::register::Registers;
|
||||||
use helix_core::syntax;
|
use helix_core::syntax;
|
||||||
use helix_core::Position;
|
use helix_core::Position;
|
||||||
|
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Deserialize)]
|
||||||
|
#[serde(rename_all = "kebab-case")]
|
||||||
|
pub struct Config {
|
||||||
|
/// Padding to keep between the edge of the screen and the cursor when scrolling. Defaults to 5.
|
||||||
|
pub scrolloff: usize,
|
||||||
|
/// Mouse support. Defaults to true.
|
||||||
|
pub mouse: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Config {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
scrolloff: 5,
|
||||||
|
mouse: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Editor {
|
pub struct Editor {
|
||||||
pub tree: Tree,
|
pub tree: Tree,
|
||||||
|
@ -33,6 +53,8 @@ pub struct Editor {
|
||||||
pub theme_loader: Arc<theme::Loader>,
|
pub theme_loader: Arc<theme::Loader>,
|
||||||
|
|
||||||
pub status_msg: Option<(String, Severity)>,
|
pub status_msg: Option<(String, Severity)>,
|
||||||
|
|
||||||
|
pub config: Config,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
@ -48,6 +70,7 @@ impl Editor {
|
||||||
mut area: Rect,
|
mut area: Rect,
|
||||||
themes: Arc<theme::Loader>,
|
themes: Arc<theme::Loader>,
|
||||||
config_loader: Arc<syntax::Loader>,
|
config_loader: Arc<syntax::Loader>,
|
||||||
|
config: Config,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let language_servers = helix_lsp::Registry::new();
|
let language_servers = helix_lsp::Registry::new();
|
||||||
|
|
||||||
|
@ -66,6 +89,7 @@ impl Editor {
|
||||||
registers: Registers::default(),
|
registers: Registers::default(),
|
||||||
clipboard_provider: get_clipboard_provider(),
|
clipboard_provider: get_clipboard_provider(),
|
||||||
status_msg: None,
|
status_msg: None,
|
||||||
|
config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +132,7 @@ impl Editor {
|
||||||
fn _refresh(&mut self) {
|
fn _refresh(&mut self) {
|
||||||
for (view, _) in self.tree.views_mut() {
|
for (view, _) in self.tree.views_mut() {
|
||||||
let doc = &self.documents[view.doc];
|
let doc = &self.documents[view.doc];
|
||||||
view.ensure_cursor_in_view(doc)
|
view.ensure_cursor_in_view(doc, self.config.scrolloff)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,7 +291,7 @@ impl Editor {
|
||||||
pub fn ensure_cursor_in_view(&mut self, id: ViewId) {
|
pub fn ensure_cursor_in_view(&mut self, id: ViewId) {
|
||||||
let view = self.tree.get_mut(id);
|
let view = self.tree.get_mut(id);
|
||||||
let doc = &self.documents[view.doc];
|
let doc = &self.documents[view.doc];
|
||||||
view.ensure_cursor_in_view(doc)
|
view.ensure_cursor_in_view(doc, self.config.scrolloff)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn document(&self, id: DocumentId) -> Option<&Document> {
|
pub fn document(&self, id: DocumentId) -> Option<&Document> {
|
||||||
|
|
|
@ -8,8 +8,6 @@ use helix_core::{
|
||||||
Position, RopeSlice, Selection,
|
Position, RopeSlice, Selection,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const PADDING: usize = 5;
|
|
||||||
|
|
||||||
type Jump = (DocumentId, Selection);
|
type Jump = (DocumentId, Selection);
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -84,7 +82,7 @@ impl View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ensure_cursor_in_view(&mut self, doc: &Document) {
|
pub fn ensure_cursor_in_view(&mut self, doc: &Document, scrolloff: usize) {
|
||||||
let cursor = doc
|
let cursor = doc
|
||||||
.selection(self.id)
|
.selection(self.id)
|
||||||
.primary()
|
.primary()
|
||||||
|
@ -95,7 +93,7 @@ impl View {
|
||||||
let height = self.area.height.saturating_sub(1); // - 1 for statusline
|
let height = self.area.height.saturating_sub(1); // - 1 for statusline
|
||||||
let last_line = (self.first_line + height as usize).saturating_sub(1);
|
let last_line = (self.first_line + height as usize).saturating_sub(1);
|
||||||
|
|
||||||
let scrolloff = PADDING.min(self.area.height as usize / 2); // TODO: user pref
|
let scrolloff = scrolloff.min(self.area.height as usize / 2);
|
||||||
|
|
||||||
// TODO: not ideal
|
// TODO: not ideal
|
||||||
const OFFSET: usize = 7; // 1 diagnostic + 5 linenr + 1 gutter
|
const OFFSET: usize = 7; // 1 diagnostic + 5 linenr + 1 gutter
|
||||||
|
|
Loading…
Reference in New Issue