diff --git a/alacritty.yml b/alacritty.yml index 90a27254..fcc637c3 100644 --- a/alacritty.yml +++ b/alacritty.yml @@ -33,6 +33,9 @@ window: # Setting this to false will result in window without borders and title bar. decorations: true +# How many lines of scrollback to keep +scroll_history: 10000 + # Display tabs using this many cells (changes require restart) tabspaces: 8 diff --git a/alacritty_macos.yml b/alacritty_macos.yml index 7593cabe..baf17e61 100644 --- a/alacritty_macos.yml +++ b/alacritty_macos.yml @@ -31,6 +31,9 @@ window: # Setting this to false will result in window without borders and title bar. decorations: true +# How many lines of scrollback to keep +scroll_history: 10000 + # Display tabs using this many cells (changes require restart) tabspaces: 8 diff --git a/src/config.rs b/src/config.rs index eb7f0f72..58f4b815 100644 --- a/src/config.rs +++ b/src/config.rs @@ -396,6 +396,14 @@ pub struct Config { /// Number of spaces in one tab #[serde(default="default_tabspaces", deserialize_with = "deserialize_tabspaces")] tabspaces: usize, + + /// How much scrolling history to keep + #[serde(default="default_scroll_history")] + scroll_history: u32, +} + +fn default_scroll_history() -> u32 { + 10_000 } fn failure_default_vec<'a, D, T>(deserializer: D) -> ::std::result::Result, D::Error> @@ -1244,6 +1252,10 @@ impl Config { .map(|path| path.into()) } + pub fn scroll_history(&self) -> usize { + self.scroll_history as _ + } + pub fn write_defaults() -> io::Result> { let path = ::xdg::BaseDirectories::with_prefix("alacritty") .map_err(|err| io::Error::new(io::ErrorKind::NotFound, ::std::error::Error::description(&err))) diff --git a/src/grid/mod.rs b/src/grid/mod.rs index c6543270..1cb0876e 100644 --- a/src/grid/mod.rs +++ b/src/grid/mod.rs @@ -28,9 +28,6 @@ mod tests; mod storage; use self::storage::Storage; -/// Lines to keep in scrollback buffer -const SCROLLBACK_LINES: usize = 10_000; - /// Convert a type to a linear index range. pub trait ToRange { fn to_range(&self) -> RangeInclusive; @@ -101,19 +98,8 @@ pub struct GridIterator<'a, T: 'a> { } impl Grid { - pub fn scroll_display(&mut self, count: isize) { - self.display_offset = min( - max((self.display_offset as isize) + count, 0isize) as usize, - self.scroll_limit - ); - } - - pub fn reset_scroll(&mut self) { - self.display_offset = 0; - } - - pub fn new(lines: index::Line, cols: index::Column, template: T) -> Grid { - let mut raw = Storage::with_capacity(*lines + SCROLLBACK_LINES, lines); + pub fn new(lines: index::Line, cols: index::Column, scrollback: usize, template: T) -> Grid { + let mut raw = Storage::with_capacity(*lines + scrollback, lines); let template_row = Row::new(cols, &template); // Allocate all lines in the buffer, including scrollback history @@ -137,6 +123,17 @@ impl Grid { } } + pub fn scroll_display(&mut self, count: isize) { + self.display_offset = min( + max((self.display_offset as isize) + count, 0isize) as usize, + self.scroll_limit + ); + } + + pub fn reset_scroll_display(&mut self) { + self.display_offset = 0; + } + pub fn resize(&mut self, lines: index::Line, cols: index::Column) { // Check that there's actually work to do and return early if not if lines == self.lines && cols == self.cols { diff --git a/src/term/mod.rs b/src/term/mod.rs index 669ada2f..20cb1b5a 100644 --- a/src/term/mod.rs +++ b/src/term/mod.rs @@ -808,7 +808,7 @@ impl Term { } pub fn reset_scroll(&mut self) { - self.grid.reset_scroll(); + self.grid.reset_scroll_display(); } #[inline] @@ -822,7 +822,7 @@ impl Term { let num_cols = size.cols(); let num_lines = size.lines(); - let grid = Grid::new(num_lines, num_cols, template); + let grid = Grid::new(num_lines, num_cols, config.scroll_history(), template); let tabspaces = config.tabspaces(); let tabs = IndexRange::from(Column(0)..grid.num_cols())