summaryrefslogtreecommitdiff
path: root/helix-view/src/document.rs
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-03-30 09:19:48 +0000
committerBlaž Hrastnik2021-03-30 09:23:12 +0000
commit1b5316ea74845a23bebf492dd091fd1fc3a8dcaa (patch)
tree0d8113f0cba3995a5e055f63a6e1436993b34319 /helix-view/src/document.rs
parent88bb7a1f38764c1ae4781afecbf68a7707a60c49 (diff)
Track document modified state.
Diffstat (limited to 'helix-view/src/document.rs')
-rw-r--r--helix-view/src/document.rs17
1 files changed, 15 insertions, 2 deletions
diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs
index 6e73104a..94684362 100644
--- a/helix-view/src/document.rs
+++ b/helix-view/src/document.rs
@@ -31,6 +31,7 @@ pub struct Document {
// /// Corresponding language scope name. Usually `source.<lang>`.
pub(crate) language: Option<Arc<LanguageConfiguration>>,
+ modified: bool,
/// Pending changes since last history commit.
changes: ChangeSet,
/// State at last commit. Used for calculating reverts.
@@ -75,6 +76,7 @@ impl Document {
restore_cursor: false,
syntax: None,
language: None,
+ modified: false,
changes,
old_state,
diagnostics: Vec::new(),
@@ -111,7 +113,7 @@ impl Document {
// TODO: do we need some way of ensuring two save operations on the same doc can't run at once?
// or is that handled by the OS/async layer
- pub fn save(&self) -> impl Future<Output = Result<(), anyhow::Error>> {
+ pub fn save(&mut self) -> impl Future<Output = Result<(), anyhow::Error>> {
// we clone and move text + path into the future so that we asynchronously save the current
// state without blocking any further edits.
@@ -120,10 +122,12 @@ impl Document {
let identifier = self.identifier();
// TODO: mark changes up to now as saved
- // TODO: mark dirty false
let language_server = self.language_server.clone();
+ // reset the modified flag
+ self.modified = false;
+
async move {
use smol::{fs::File, prelude::*};
let mut file = File::create(path).await?;
@@ -224,6 +228,10 @@ impl Document {
let success = self._apply(&transaction);
+ self.modified = true;
+ // TODO: be smarter about modified by keeping track of saved version instead. That way if
+ // current version == version then it's not modified.
+
if !transaction.changes().is_empty() {
// Compose this transaction with the previous one
take_with(&mut self.changes, |changes| {
@@ -280,6 +288,11 @@ impl Document {
}
#[inline]
+ pub fn modified(&self) -> bool {
+ self.modified
+ }
+
+ #[inline]
pub fn mode(&self) -> Mode {
self.mode
}