3149 lines · 98.9 KB · Rust
RawDownload
use editor::{    display_map::{DisplayRow, DisplaySnapshot, FoldPoint, ToDisplayPoint},    movement::{        self, find_boundary, find_preceding_boundary_display_point, FindRange, TextLayoutDetails,    },    scroll::Autoscroll,    Anchor, Bias, DisplayPoint, Editor, RowExt, ToOffset,};use gpui::{actions, impl_actions, px, ViewContext};use language::{CharKind, Point, Selection, SelectionGoal};use multi_buffer::MultiBufferRow;use serde::Deserialize;use std::ops::Range;use workspace::searchable::Direction; use crate::{    normal::mark,    state::{Mode, Operator},    surrounds::SurroundsType,    Vim,}; #[derive(Clone, Debug, PartialEq, Eq)]pub enum Motion {    Left,    Backspace,    Down {        display_lines: bool,    },    Up {        display_lines: bool,    },    Right,    Space,    NextWordStart {        ignore_punctuation: bool,    },    NextWordEnd {        ignore_punctuation: bool,    },    PreviousWordStart {        ignore_punctuation: bool,    },    PreviousWordEnd {        ignore_punctuation: bool,    },    NextSubwordStart {        ignore_punctuation: bool,    },    NextSubwordEnd {        ignore_punctuation: bool,    },    PreviousSubwordStart {        ignore_punctuation: bool,    },    PreviousSubwordEnd {        ignore_punctuation: bool,    },    FirstNonWhitespace {        display_lines: bool,    },    CurrentLine,    StartOfLine {        display_lines: bool,    },    EndOfLine {        display_lines: bool,    },    SentenceBackward,    SentenceForward,    StartOfParagraph,    EndOfParagraph,    StartOfDocument,    EndOfDocument,    Matching,    UnmatchedForward {        char: char,    },    UnmatchedBackward {        char: char,    },    FindForward {        before: bool,        char: char,        mode: FindRange,        smartcase: bool,    },    FindBackward {        after: bool,        char: char,        mode: FindRange,        smartcase: bool,    },    RepeatFind {        last_find: Box<Motion>,    },    RepeatFindReversed {        last_find: Box<Motion>,    },    NextLineStart,    PreviousLineStart,    StartOfLineDownward,    EndOfLineDownward,    GoToColumn,    WindowTop,    WindowMiddle,    WindowBottom,    NextSectionStart,    NextSectionEnd,    PreviousSectionStart,    PreviousSectionEnd,    NextMethodStart,    NextMethodEnd,    PreviousMethodStart,    PreviousMethodEnd,    NextComment,    PreviousComment,     // we don't have a good way to run a search synchronously, so    // we handle search motions by running the search async and then    // calling back into motion with this    ZedSearchResult {        prior_selections: Vec<Range<Anchor>>,        new_selections: Vec<Range<Anchor>>,    },    Jump {        anchor: Anchor,        line: bool,    },} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]struct NextWordStart {    #[serde(default)]    ignore_punctuation: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]struct NextWordEnd {    #[serde(default)]    ignore_punctuation: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]struct PreviousWordStart {    #[serde(default)]    ignore_punctuation: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]struct PreviousWordEnd {    #[serde(default)]    ignore_punctuation: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]pub(crate) struct NextSubwordStart {    #[serde(default)]    pub(crate) ignore_punctuation: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]pub(crate) struct NextSubwordEnd {    #[serde(default)]    pub(crate) ignore_punctuation: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]pub(crate) struct PreviousSubwordStart {    #[serde(default)]    pub(crate) ignore_punctuation: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]pub(crate) struct PreviousSubwordEnd {    #[serde(default)]    pub(crate) ignore_punctuation: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]pub(crate) struct Up {    #[serde(default)]    pub(crate) display_lines: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]pub(crate) struct Down {    #[serde(default)]    pub(crate) display_lines: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]struct FirstNonWhitespace {    #[serde(default)]    display_lines: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]struct EndOfLine {    #[serde(default)]    display_lines: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]pub struct StartOfLine {    #[serde(default)]    pub(crate) display_lines: bool,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]struct UnmatchedForward {    #[serde(default)]    char: char,} #[derive(Clone, Deserialize, PartialEq)]#[serde(rename_all = "camelCase")]struct UnmatchedBackward {    #[serde(default)]    char: char,} impl_actions!(    vim,    [        StartOfLine,        EndOfLine,        FirstNonWhitespace,        Down,        Up,        NextWordStart,        NextWordEnd,        PreviousWordStart,        PreviousWordEnd,        NextSubwordStart,        NextSubwordEnd,        PreviousSubwordStart,        PreviousSubwordEnd,        UnmatchedForward,        UnmatchedBackward    ]); actions!(    vim,    [        Left,        Backspace,        Right,        Space,        CurrentLine,        SentenceForward,        SentenceBackward,        StartOfParagraph,        EndOfParagraph,        StartOfDocument,        EndOfDocument,        Matching,        NextLineStart,        PreviousLineStart,        StartOfLineDownward,        EndOfLineDownward,        GoToColumn,        RepeatFind,        RepeatFindReversed,        WindowTop,        WindowMiddle,        WindowBottom,        NextSectionStart,        NextSectionEnd,        PreviousSectionStart,        PreviousSectionEnd,        NextMethodStart,        NextMethodEnd,        PreviousMethodStart,        PreviousMethodEnd,        NextComment,        PreviousComment,    ]); pub fn register(editor: &mut Editor, cx: &mut ViewContext<Vim>) {    Vim::action(editor, cx, |vim, _: &Left, cx| vim.motion(Motion::Left, cx));    Vim::action(editor, cx, |vim, _: &Backspace, cx| {        vim.motion(Motion::Backspace, cx)    });    Vim::action(editor, cx, |vim, action: &Down, cx| {        vim.motion(            Motion::Down {                display_lines: action.display_lines,            },            cx,        )    });    Vim::action(editor, cx, |vim, action: &Up, cx| {        vim.motion(            Motion::Up {                display_lines: action.display_lines,            },            cx,        )    });    Vim::action(editor, cx, |vim, _: &Right, cx| {        vim.motion(Motion::Right, cx)    });    Vim::action(editor, cx, |vim, _: &Space, cx| {        vim.motion(Motion::Space, cx)    });    Vim::action(editor, cx, |vim, action: &FirstNonWhitespace, cx| {        vim.motion(            Motion::FirstNonWhitespace {                display_lines: action.display_lines,            },            cx,        )    });    Vim::action(editor, cx, |vim, action: &StartOfLine, cx| {        vim.motion(            Motion::StartOfLine {                display_lines: action.display_lines,            },            cx,        )    });    Vim::action(editor, cx, |vim, action: &EndOfLine, cx| {        vim.motion(            Motion::EndOfLine {                display_lines: action.display_lines,            },            cx,        )    });    Vim::action(editor, cx, |vim, _: &CurrentLine, cx| {        vim.motion(Motion::CurrentLine, cx)    });    Vim::action(editor, cx, |vim, _: &StartOfParagraph, cx| {        vim.motion(Motion::StartOfParagraph, cx)    });    Vim::action(editor, cx, |vim, _: &EndOfParagraph, cx| {        vim.motion(Motion::EndOfParagraph, cx)    });     Vim::action(editor, cx, |vim, _: &SentenceForward, cx| {        vim.motion(Motion::SentenceForward, cx)    });    Vim::action(editor, cx, |vim, _: &SentenceBackward, cx| {        vim.motion(Motion::SentenceBackward, cx)    });    Vim::action(editor, cx, |vim, _: &StartOfDocument, cx| {        vim.motion(Motion::StartOfDocument, cx)    });    Vim::action(editor, cx, |vim, _: &EndOfDocument, cx| {        vim.motion(Motion::EndOfDocument, cx)    });    Vim::action(editor, cx, |vim, _: &Matching, cx| {        vim.motion(Motion::Matching, cx)    });    Vim::action(        editor,        cx,        |vim, &UnmatchedForward { char }: &UnmatchedForward, cx| {            vim.motion(Motion::UnmatchedForward { char }, cx)        },    );    Vim::action(        editor,        cx,        |vim, &UnmatchedBackward { char }: &UnmatchedBackward, cx| {            vim.motion(Motion::UnmatchedBackward { char }, cx)        },    );    Vim::action(        editor,        cx,        |vim, &NextWordStart { ignore_punctuation }: &NextWordStart, cx| {            vim.motion(Motion::NextWordStart { ignore_punctuation }, cx)        },    );    Vim::action(        editor,        cx,        |vim, &NextWordEnd { ignore_punctuation }: &NextWordEnd, cx| {            vim.motion(Motion::NextWordEnd { ignore_punctuation }, cx)        },    );    Vim::action(        editor,        cx,        |vim, &PreviousWordStart { ignore_punctuation }: &PreviousWordStart, cx| {            vim.motion(Motion::PreviousWordStart { ignore_punctuation }, cx)        },    );    Vim::action(        editor,        cx,        |vim, &PreviousWordEnd { ignore_punctuation }, cx| {            vim.motion(Motion::PreviousWordEnd { ignore_punctuation }, cx)        },    );    Vim::action(        editor,        cx,        |vim, &NextSubwordStart { ignore_punctuation }: &NextSubwordStart, cx| {            vim.motion(Motion::NextSubwordStart { ignore_punctuation }, cx)        },    );    Vim::action(        editor,        cx,        |vim, &NextSubwordEnd { ignore_punctuation }: &NextSubwordEnd, cx| {            vim.motion(Motion::NextSubwordEnd { ignore_punctuation }, cx)        },    );    Vim::action(        editor,        cx,        |vim, &PreviousSubwordStart { ignore_punctuation }: &PreviousSubwordStart, cx| {            vim.motion(Motion::PreviousSubwordStart { ignore_punctuation }, cx)        },    );    Vim::action(        editor,        cx,        |vim, &PreviousSubwordEnd { ignore_punctuation }, cx| {            vim.motion(Motion::PreviousSubwordEnd { ignore_punctuation }, cx)        },    );    Vim::action(editor, cx, |vim, &NextLineStart, cx| {        vim.motion(Motion::NextLineStart, cx)    });    Vim::action(editor, cx, |vim, &PreviousLineStart, cx| {        vim.motion(Motion::PreviousLineStart, cx)    });    Vim::action(editor, cx, |vim, &StartOfLineDownward, cx| {        vim.motion(Motion::StartOfLineDownward, cx)    });    Vim::action(editor, cx, |vim, &EndOfLineDownward, cx| {        vim.motion(Motion::EndOfLineDownward, cx)    });    Vim::action(editor, cx, |vim, &GoToColumn, cx| {        vim.motion(Motion::GoToColumn, cx)    });     Vim::action(editor, cx, |vim, _: &RepeatFind, cx| {        if let Some(last_find) = Vim::globals(cx).last_find.clone().map(Box::new) {            vim.motion(Motion::RepeatFind { last_find }, cx);        }    });     Vim::action(editor, cx, |vim, _: &RepeatFindReversed, cx| {        if let Some(last_find) = Vim::globals(cx).last_find.clone().map(Box::new) {            vim.motion(Motion::RepeatFindReversed { last_find }, cx);        }    });    Vim::action(editor, cx, |vim, &WindowTop, cx| {        vim.motion(Motion::WindowTop, cx)    });    Vim::action(editor, cx, |vim, &WindowMiddle, cx| {        vim.motion(Motion::WindowMiddle, cx)    });    Vim::action(editor, cx, |vim, &WindowBottom, cx| {        vim.motion(Motion::WindowBottom, cx)    });     Vim::action(editor, cx, |vim, &PreviousSectionStart, cx| {        vim.motion(Motion::PreviousSectionStart, cx)    });    Vim::action(editor, cx, |vim, &NextSectionStart, cx| {        vim.motion(Motion::NextSectionStart, cx)    });    Vim::action(editor, cx, |vim, &PreviousSectionEnd, cx| {        vim.motion(Motion::PreviousSectionEnd, cx)    });    Vim::action(editor, cx, |vim, &NextSectionEnd, cx| {        vim.motion(Motion::NextSectionEnd, cx)    });    Vim::action(editor, cx, |vim, &PreviousMethodStart, cx| {        vim.motion(Motion::PreviousMethodStart, cx)    });    Vim::action(editor, cx, |vim, &NextMethodStart, cx| {        vim.motion(Motion::NextMethodStart, cx)    });    Vim::action(editor, cx, |vim, &PreviousMethodEnd, cx| {        vim.motion(Motion::PreviousMethodEnd, cx)    });    Vim::action(editor, cx, |vim, &NextMethodEnd, cx| {

Lines 1–500 of 3149.