diff options
author | Skyler Hawthorne | 2022-02-25 08:36:54 +0000 |
---|---|---|
committer | GitHub | 2022-02-25 08:36:54 +0000 |
commit | a494f47a5df543a3ab8d6530a5acbc2a5bd04d44 (patch) | |
tree | 084ef1b24c593d58d6616b37e073073d93009ff3 /helix-view/src/document.rs | |
parent | b935fac9576cf333e22b82e40da8c4d73c8e547d (diff) |
Configurable auto pairs (#1624)
* impl auto pairs config
Implements configuration for which pairs of tokens get auto completed.
In order to help with this, the logic for when *not* to auto complete
has been generalized from a specific hardcoded list of characters to
simply testing if the next/prev char is alphanumeric.
It is possible to configure a global list of pairs as well as at the
language level. The language config will take precedence over the
global config.
* rename AutoPair -> Pair
* clean up insert_char command
* remove Rc
* remove some explicit cloning with another impl
* fix lint
* review comments
* global auto-pairs = false takes precedence over language settings
* make clippy happy
* print out editor config on startup
* move auto pairs accessor into Document
* rearrange auto pair doc comment
* use pattern in Froms
Diffstat (limited to 'helix-view/src/document.rs')
-rw-r--r-- | helix-view/src/document.rs | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index f13338ba..671ceb75 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -1,4 +1,5 @@ use anyhow::{anyhow, bail, Context, Error}; +use helix_core::auto_pairs::AutoPairs; use serde::de::{self, Deserialize, Deserializer}; use serde::Serialize; use std::cell::Cell; @@ -20,7 +21,7 @@ use helix_core::{ }; use helix_lsp::util::LspFormatting; -use crate::{DocumentId, ViewId}; +use crate::{DocumentId, Editor, ViewId}; /// 8kB of buffer space for encoding and decoding `Rope`s. const BUF_SIZE: usize = 8192; @@ -98,7 +99,7 @@ pub struct Document { pub line_ending: LineEnding, syntax: Option<Syntax>, - // /// Corresponding language scope name. Usually `source.<lang>`. + /// Corresponding language scope name. Usually `source.<lang>`. pub(crate) language: Option<Arc<LanguageConfiguration>>, /// Pending changes since last history commit. @@ -946,6 +947,28 @@ impl Document { self.diagnostics .sort_unstable_by_key(|diagnostic| diagnostic.range); } + + /// Get the document's auto pairs. If the document has a recognized + /// language config with auto pairs configured, returns that; + /// otherwise, falls back to the global auto pairs config. If the global + /// config is false, then ignore language settings. + pub fn auto_pairs<'a>(&'a self, editor: &'a Editor) -> Option<&'a AutoPairs> { + let global_config = (editor.auto_pairs).as_ref(); + + // NOTE: If the user specifies the global auto pairs config as false, then + // we want to disable it globally regardless of language settings + #[allow(clippy::question_mark)] + { + if global_config.is_none() { + return None; + } + } + + match &self.language { + Some(lang) => lang.as_ref().auto_pairs.as_ref().or(global_config), + None => global_config, + } + } } impl Default for Document { |