Skip to main content

BufferUpdated

Struct BufferUpdated 

Source
pub struct BufferUpdated(/* private fields */);
Expand description

Hookable: Triggers when a Buffer updates.

This is triggered after a batch of writing calls to the Buffer, once per frame. This can happen after typing a key, calling a command, triggering hooks, or any other action with access to a Pass, which could be used to write to the Buffer.

Think of this is as a “last pass” on the Buffer, right before printing, where it can be adjusted given the modifications to it, like Changes and such.

As an example, here’s a hook that will highlight every non ascii character:

use duat::{
    prelude::*,
    text::{Strs, Tags},
};

fn setup() {
    let ns = Ns::new();
    let tag = form::id_of!("non_ascii_char").to_tag(50);

    let hl_non_ascii = move |tags: &mut Tags, strs: &Strs, range: Range<Point>| {
        for (b, char) in strs[range.clone()].char_indices() {
            let b = b + range.start.byte();
            if !char.is_ascii() {
                tags.insert(ns, b..b + char.len_utf8(), tag);
            }
        }
    };

    hook::add::<BufferOpened>(move |pa, buffer| {
        let _ = buffer.read(pa).moment_for(ns);

        let mut parts = buffer.text_parts(pa);
        let range = Point::default()..parts.strs.end_point();
        hl_non_ascii(&mut parts.tags, parts.strs, range);
    });

    hook::add::<BufferUpdated>(move |pa, buffer| {
        let moment = buffer.read(pa).moment_for(ns);

        let mut parts = buffer.text_parts(pa);
        for change in moment.iter() {
            parts.tags.remove(ns, change.added_range());
            hl_non_ascii(&mut parts.tags, parts.strs, change.added_range())
        }
    });
}

You can see here that I called Buffer::moment_for. This function will give, for a given namespace, a list of all Changes that have taken place since the last call of that function with the same namespace. This is very useful for tracking alterations to the Buffer and acting on them accordingly.

In this case, I’m just taking the added range of changes and adding tags to every non ascii character in them.

Note that the moment_for function will work anywhere (that you have a Pass, this is just a common situation where you’d use it.

§Arguments

Trait Implementations§

Source§

impl Hookable for BufferUpdated

Source§

type Input<'h> = &'h Handle

The arguments that are passed to each hook.
Source§

fn get_input<'h>(&'h mut self, _: &mut Pass) -> Self::Input<'h>

How to get the arguments from the Hookable. Read more
Source§

impl PartialEq<Handle> for BufferUpdated

Source§

fn eq(&self, other: &Handle) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.