Fixed some neovim test context issues, added repeated commands in vim mode, and ported some tests to use the neovim testing strategy

K Simmons created

Change summary

Cargo.lock                                                         | 7629 
assets/keymaps/vim.json                                            |   59 
crates/collab/src/integration_tests.rs                             |    2 
crates/editor/src/test.rs                                          |   57 
crates/gpui/src/app.rs                                             |    3 
crates/gpui/src/test.rs                                            |    2 
crates/gpui_macros/src/gpui_macros.rs                              |    7 
crates/vim/Cargo.toml                                              |    1 
crates/vim/src/motion.rs                                           |   35 
crates/vim/src/normal.rs                                           |  559 
crates/vim/src/normal/change.rs                                    |  164 
crates/vim/src/normal/delete.rs                                    |    4 
crates/vim/src/normal/yank.rs                                      |    4 
crates/vim/src/object.rs                                           |  178 
crates/vim/src/state.rs                                            |    3 
crates/vim/src/test_contexts/neovim_backed_binding_test_context.rs |   39 
crates/vim/src/test_contexts/neovim_backed_test_context.rs         |  384 
crates/vim/src/test_contexts/vim_test_context.rs                   |    3 
crates/vim/src/vim.rs                                              |   28 
crates/vim/src/visual.rs                                           |   10 
crates/vim/test_data/neovim_backed_test_context_works.json         |    1 
crates/vim/test_data/test_a.json                                   |    1 
crates/vim/test_data/test_backspace.json                           |    1 
crates/vim/test_data/test_change_around_sentence.json              |    0 
crates/vim/test_data/test_change_around_sentence/0text.txt         |    1 
crates/vim/test_data/test_change_around_sentence/10head.txt        |    1 
crates/vim/test_data/test_change_around_sentence/1head.txt         |    1 
crates/vim/test_data/test_change_around_sentence/2mode.txt         |    1 
crates/vim/test_data/test_change_around_sentence/3text.txt         |    1 
crates/vim/test_data/test_change_around_sentence/4head.txt         |    1 
crates/vim/test_data/test_change_around_sentence/5mode.txt         |    1 
crates/vim/test_data/test_change_around_sentence/6text.txt         |    1 
crates/vim/test_data/test_change_around_sentence/7head.txt         |    1 
crates/vim/test_data/test_change_around_sentence/8mode.txt         |    1 
crates/vim/test_data/test_change_around_sentence/9text.txt         |    1 
crates/vim/test_data/test_change_around_word.json                  |    0 
crates/vim/test_data/test_change_around_word/0text.txt             |   12 
crates/vim/test_data/test_change_around_word/100head.txt           |    1 
crates/vim/test_data/test_change_around_word/101mode.txt           |    1 
crates/vim/test_data/test_change_around_word/102text.txt           |   12 
crates/vim/test_data/test_change_around_word/103head.txt           |    1 
crates/vim/test_data/test_change_around_word/104mode.txt           |    1 
crates/vim/test_data/test_change_around_word/105text.txt           |   12 
crates/vim/test_data/test_change_around_word/106head.txt           |    1 
crates/vim/test_data/test_change_around_word/107mode.txt           |    1 
crates/vim/test_data/test_change_around_word/108text.txt           |   12 
crates/vim/test_data/test_change_around_word/109head.txt           |    1 
crates/vim/test_data/test_change_around_word/10head.txt            |    1 
crates/vim/test_data/test_change_around_word/110mode.txt           |    1 
crates/vim/test_data/test_change_around_word/111text.txt           |   12 
crates/vim/test_data/test_change_around_word/112head.txt           |    1 
crates/vim/test_data/test_change_around_word/113mode.txt           |    1 
crates/vim/test_data/test_change_around_word/114text.txt           |   12 
crates/vim/test_data/test_change_around_word/115head.txt           |    1 
crates/vim/test_data/test_change_around_word/116mode.txt           |    1 
crates/vim/test_data/test_change_around_word/117text.txt           |    9 
crates/vim/test_data/test_change_around_word/118head.txt           |    1 
crates/vim/test_data/test_change_around_word/119mode.txt           |    1 
crates/vim/test_data/test_change_around_word/11mode.txt            |    1 
crates/vim/test_data/test_change_around_word/120text.txt           |   10 
crates/vim/test_data/test_change_around_word/121head.txt           |    1 
crates/vim/test_data/test_change_around_word/122mode.txt           |    1 
crates/vim/test_data/test_change_around_word/123text.txt           |   11 
crates/vim/test_data/test_change_around_word/124head.txt           |    1 
crates/vim/test_data/test_change_around_word/125mode.txt           |    1 
crates/vim/test_data/test_change_around_word/126text.txt           |   12 
crates/vim/test_data/test_change_around_word/127head.txt           |    1 
crates/vim/test_data/test_change_around_word/128mode.txt           |    1 
crates/vim/test_data/test_change_around_word/129text.txt           |   12 
crates/vim/test_data/test_change_around_word/12text.txt            |   12 
crates/vim/test_data/test_change_around_word/130head.txt           |    1 
crates/vim/test_data/test_change_around_word/131mode.txt           |    1 
crates/vim/test_data/test_change_around_word/132text.txt           |   11 
crates/vim/test_data/test_change_around_word/133head.txt           |    1 
crates/vim/test_data/test_change_around_word/134mode.txt           |    1 
crates/vim/test_data/test_change_around_word/135text.txt           |   11 
crates/vim/test_data/test_change_around_word/136head.txt           |    1 
crates/vim/test_data/test_change_around_word/137mode.txt           |    1 
crates/vim/test_data/test_change_around_word/13head.txt            |    1 
crates/vim/test_data/test_change_around_word/14mode.txt            |    1 
crates/vim/test_data/test_change_around_word/15text.txt            |   12 
crates/vim/test_data/test_change_around_word/16head.txt            |    1 
crates/vim/test_data/test_change_around_word/17mode.txt            |    1 
crates/vim/test_data/test_change_around_word/18text.txt            |   11 
crates/vim/test_data/test_change_around_word/19head.txt            |    1 
crates/vim/test_data/test_change_around_word/1head.txt             |    1 
crates/vim/test_data/test_change_around_word/20mode.txt            |    1 
crates/vim/test_data/test_change_around_word/21text.txt            |   11 
crates/vim/test_data/test_change_around_word/22head.txt            |    1 
crates/vim/test_data/test_change_around_word/23mode.txt            |    1 
crates/vim/test_data/test_change_around_word/24text.txt            |   11 
crates/vim/test_data/test_change_around_word/25head.txt            |    1 
crates/vim/test_data/test_change_around_word/26mode.txt            |    1 
crates/vim/test_data/test_change_around_word/27text.txt            |   11 
crates/vim/test_data/test_change_around_word/28head.txt            |    1 
crates/vim/test_data/test_change_around_word/29mode.txt            |    1 
crates/vim/test_data/test_change_around_word/2mode.txt             |    1 
crates/vim/test_data/test_change_around_word/30text.txt            |   12 
crates/vim/test_data/test_change_around_word/31head.txt            |    1 
crates/vim/test_data/test_change_around_word/32mode.txt            |    1 
crates/vim/test_data/test_change_around_word/33text.txt            |   12 
crates/vim/test_data/test_change_around_word/34head.txt            |    1 
crates/vim/test_data/test_change_around_word/35mode.txt            |    1 
crates/vim/test_data/test_change_around_word/36text.txt            |   12 
crates/vim/test_data/test_change_around_word/37head.txt            |    1 
crates/vim/test_data/test_change_around_word/38mode.txt            |    1 
crates/vim/test_data/test_change_around_word/39text.txt            |   12 
crates/vim/test_data/test_change_around_word/3text.txt             |   12 
crates/vim/test_data/test_change_around_word/40head.txt            |    1 
crates/vim/test_data/test_change_around_word/41mode.txt            |    1 
crates/vim/test_data/test_change_around_word/42text.txt            |   12 
crates/vim/test_data/test_change_around_word/43head.txt            |    1 
crates/vim/test_data/test_change_around_word/44mode.txt            |    1 
crates/vim/test_data/test_change_around_word/45text.txt            |   12 
crates/vim/test_data/test_change_around_word/46head.txt            |    1 
crates/vim/test_data/test_change_around_word/47mode.txt            |    1 
crates/vim/test_data/test_change_around_word/48text.txt            |    9 
crates/vim/test_data/test_change_around_word/49head.txt            |    1 
crates/vim/test_data/test_change_around_word/4head.txt             |    1 
crates/vim/test_data/test_change_around_word/50mode.txt            |    1 
crates/vim/test_data/test_change_around_word/51text.txt            |   10 
crates/vim/test_data/test_change_around_word/52head.txt            |    1 
crates/vim/test_data/test_change_around_word/53mode.txt            |    1 
crates/vim/test_data/test_change_around_word/54text.txt            |   11 
crates/vim/test_data/test_change_around_word/55head.txt            |    1 
crates/vim/test_data/test_change_around_word/56mode.txt            |    1 
crates/vim/test_data/test_change_around_word/57text.txt            |   12 
crates/vim/test_data/test_change_around_word/58head.txt            |    1 
crates/vim/test_data/test_change_around_word/59mode.txt            |    1 
crates/vim/test_data/test_change_around_word/5mode.txt             |    1 
crates/vim/test_data/test_change_around_word/60text.txt            |   12 
crates/vim/test_data/test_change_around_word/61head.txt            |    1 
crates/vim/test_data/test_change_around_word/62mode.txt            |    1 
crates/vim/test_data/test_change_around_word/63text.txt            |   11 
crates/vim/test_data/test_change_around_word/64head.txt            |    1 
crates/vim/test_data/test_change_around_word/65mode.txt            |    1 
crates/vim/test_data/test_change_around_word/66text.txt            |   11 
crates/vim/test_data/test_change_around_word/67head.txt            |    1 
crates/vim/test_data/test_change_around_word/68mode.txt            |    1 
crates/vim/test_data/test_change_around_word/69text.txt            |   12 
crates/vim/test_data/test_change_around_word/6text.txt             |   11 
crates/vim/test_data/test_change_around_word/70head.txt            |    1 
crates/vim/test_data/test_change_around_word/71mode.txt            |    1 
crates/vim/test_data/test_change_around_word/72text.txt            |   12 
crates/vim/test_data/test_change_around_word/73head.txt            |    1 
crates/vim/test_data/test_change_around_word/74mode.txt            |    1 
crates/vim/test_data/test_change_around_word/75text.txt            |   11 
crates/vim/test_data/test_change_around_word/76head.txt            |    1 
crates/vim/test_data/test_change_around_word/77mode.txt            |    1 
crates/vim/test_data/test_change_around_word/78text.txt            |   12 
crates/vim/test_data/test_change_around_word/79head.txt            |    1 
crates/vim/test_data/test_change_around_word/7head.txt             |    1 
crates/vim/test_data/test_change_around_word/80mode.txt            |    1 
crates/vim/test_data/test_change_around_word/81text.txt            |   12 
crates/vim/test_data/test_change_around_word/82head.txt            |    1 
crates/vim/test_data/test_change_around_word/83mode.txt            |    1 
crates/vim/test_data/test_change_around_word/84text.txt            |   12 
crates/vim/test_data/test_change_around_word/85head.txt            |    1 
crates/vim/test_data/test_change_around_word/86mode.txt            |    1 
crates/vim/test_data/test_change_around_word/87text.txt            |   11 
crates/vim/test_data/test_change_around_word/88head.txt            |    1 
crates/vim/test_data/test_change_around_word/89mode.txt            |    1 
crates/vim/test_data/test_change_around_word/8mode.txt             |    1 
crates/vim/test_data/test_change_around_word/90text.txt            |   11 
crates/vim/test_data/test_change_around_word/91head.txt            |    1 
crates/vim/test_data/test_change_around_word/92mode.txt            |    1 
crates/vim/test_data/test_change_around_word/93text.txt            |   11 
crates/vim/test_data/test_change_around_word/94head.txt            |    1 
crates/vim/test_data/test_change_around_word/95mode.txt            |    1 
crates/vim/test_data/test_change_around_word/96text.txt            |   11 
crates/vim/test_data/test_change_around_word/97head.txt            |    1 
crates/vim/test_data/test_change_around_word/98mode.txt            |    1 
crates/vim/test_data/test_change_around_word/99text.txt            |   12 
crates/vim/test_data/test_change_around_word/9text.txt             |   12 
crates/vim/test_data/test_change_in_sentence.json                  |    0 
crates/vim/test_data/test_change_in_sentence/0text.txt             |    1 
crates/vim/test_data/test_change_in_sentence/10head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/11mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/12text.txt            |    1 
crates/vim/test_data/test_change_in_sentence/13head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/14mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/15text.txt            |    1 
crates/vim/test_data/test_change_in_sentence/16head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/17mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/18text.txt            |    1 
crates/vim/test_data/test_change_in_sentence/19head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/1head.txt             |    1 
crates/vim/test_data/test_change_in_sentence/20mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/21text.txt            |    1 
crates/vim/test_data/test_change_in_sentence/22head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/23mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/24text.txt            |    1 
crates/vim/test_data/test_change_in_sentence/25head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/26mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/27text.txt            |    1 
crates/vim/test_data/test_change_in_sentence/28head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/29mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/2mode.txt             |    1 
crates/vim/test_data/test_change_in_sentence/30text.txt            |    1 
crates/vim/test_data/test_change_in_sentence/31head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/32mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/33text.txt            |    2 
crates/vim/test_data/test_change_in_sentence/34head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/35mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/36text.txt            |    2 
crates/vim/test_data/test_change_in_sentence/37head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/38mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/39text.txt            |    2 
crates/vim/test_data/test_change_in_sentence/3text.txt             |    1 
crates/vim/test_data/test_change_in_sentence/40head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/41mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/42text.txt            |    2 
crates/vim/test_data/test_change_in_sentence/43head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/44mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/45text.txt            |    2 
crates/vim/test_data/test_change_in_sentence/46head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/47mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/48text.txt            |    4 
crates/vim/test_data/test_change_in_sentence/49head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/4head.txt             |    1 
crates/vim/test_data/test_change_in_sentence/50mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/51text.txt            |    3 
crates/vim/test_data/test_change_in_sentence/52head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/53mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/54text.txt            |    3 
crates/vim/test_data/test_change_in_sentence/55head.txt            |    1 
crates/vim/test_data/test_change_in_sentence/56mode.txt            |    1 
crates/vim/test_data/test_change_in_sentence/5mode.txt             |    1 
crates/vim/test_data/test_change_in_sentence/6text.txt             |    1 
crates/vim/test_data/test_change_in_sentence/7head.txt             |    1 
crates/vim/test_data/test_change_in_sentence/8mode.txt             |    1 
crates/vim/test_data/test_change_in_sentence/9text.txt             |    1 
crates/vim/test_data/test_change_in_word.json                      |    0 
crates/vim/test_data/test_change_in_word/0text.txt                 |   12 
crates/vim/test_data/test_change_in_word/100head.txt               |    1 
crates/vim/test_data/test_change_in_word/101mode.txt               |    1 
crates/vim/test_data/test_change_in_word/102text.txt               |   12 
crates/vim/test_data/test_change_in_word/103head.txt               |    1 
crates/vim/test_data/test_change_in_word/104mode.txt               |    1 
crates/vim/test_data/test_change_in_word/105text.txt               |   12 
crates/vim/test_data/test_change_in_word/106head.txt               |    1 
crates/vim/test_data/test_change_in_word/107mode.txt               |    1 
crates/vim/test_data/test_change_in_word/108text.txt               |   12 
crates/vim/test_data/test_change_in_word/109head.txt               |    1 
crates/vim/test_data/test_change_in_word/10head.txt                |    1 
crates/vim/test_data/test_change_in_word/110mode.txt               |    1 
crates/vim/test_data/test_change_in_word/111text.txt               |   12 
crates/vim/test_data/test_change_in_word/112head.txt               |    1 
crates/vim/test_data/test_change_in_word/113mode.txt               |    1 
crates/vim/test_data/test_change_in_word/114text.txt               |   12 
crates/vim/test_data/test_change_in_word/115head.txt               |    1 
crates/vim/test_data/test_change_in_word/116mode.txt               |    1 
crates/vim/test_data/test_change_in_word/117text.txt               |   12 
crates/vim/test_data/test_change_in_word/118head.txt               |    1 
crates/vim/test_data/test_change_in_word/119mode.txt               |    1 
crates/vim/test_data/test_change_in_word/11mode.txt                |    1 
crates/vim/test_data/test_change_in_word/120text.txt               |   12 
crates/vim/test_data/test_change_in_word/121head.txt               |    1 
crates/vim/test_data/test_change_in_word/122mode.txt               |    1 
crates/vim/test_data/test_change_in_word/123text.txt               |   12 
crates/vim/test_data/test_change_in_word/124head.txt               |    1 
crates/vim/test_data/test_change_in_word/125mode.txt               |    1 
crates/vim/test_data/test_change_in_word/126text.txt               |   12 
crates/vim/test_data/test_change_in_word/127head.txt               |    1 
crates/vim/test_data/test_change_in_word/128mode.txt               |    1 
crates/vim/test_data/test_change_in_word/129text.txt               |   12 
crates/vim/test_data/test_change_in_word/12text.txt                |   12 
crates/vim/test_data/test_change_in_word/130head.txt               |    1 
crates/vim/test_data/test_change_in_word/131mode.txt               |    1 
crates/vim/test_data/test_change_in_word/132text.txt               |   12 
crates/vim/test_data/test_change_in_word/133head.txt               |    1 
crates/vim/test_data/test_change_in_word/134mode.txt               |    1 
crates/vim/test_data/test_change_in_word/135text.txt               |   12 
crates/vim/test_data/test_change_in_word/136head.txt               |    1 
crates/vim/test_data/test_change_in_word/137mode.txt               |    1 
crates/vim/test_data/test_change_in_word/13head.txt                |    1 
crates/vim/test_data/test_change_in_word/14mode.txt                |    1 
crates/vim/test_data/test_change_in_word/15text.txt                |   12 
crates/vim/test_data/test_change_in_word/16head.txt                |    1 
crates/vim/test_data/test_change_in_word/17mode.txt                |    1 
crates/vim/test_data/test_change_in_word/18text.txt                |   12 
crates/vim/test_data/test_change_in_word/19head.txt                |    1 
crates/vim/test_data/test_change_in_word/1head.txt                 |    1 
crates/vim/test_data/test_change_in_word/20mode.txt                |    1 
crates/vim/test_data/test_change_in_word/21text.txt                |   12 
crates/vim/test_data/test_change_in_word/22head.txt                |    1 
crates/vim/test_data/test_change_in_word/23mode.txt                |    1 
crates/vim/test_data/test_change_in_word/24text.txt                |   12 
crates/vim/test_data/test_change_in_word/25head.txt                |    1 
crates/vim/test_data/test_change_in_word/26mode.txt                |    1 
crates/vim/test_data/test_change_in_word/27text.txt                |   12 
crates/vim/test_data/test_change_in_word/28head.txt                |    1 
crates/vim/test_data/test_change_in_word/29mode.txt                |    1 
crates/vim/test_data/test_change_in_word/2mode.txt                 |    1 
crates/vim/test_data/test_change_in_word/30text.txt                |   12 
crates/vim/test_data/test_change_in_word/31head.txt                |    1 
crates/vim/test_data/test_change_in_word/32mode.txt                |    1 
crates/vim/test_data/test_change_in_word/33text.txt                |   12 
crates/vim/test_data/test_change_in_word/34head.txt                |    1 
crates/vim/test_data/test_change_in_word/35mode.txt                |    1 
crates/vim/test_data/test_change_in_word/36text.txt                |   12 
crates/vim/test_data/test_change_in_word/37head.txt                |    1 
crates/vim/test_data/test_change_in_word/38mode.txt                |    1 
crates/vim/test_data/test_change_in_word/39text.txt                |   12 
crates/vim/test_data/test_change_in_word/3text.txt                 |   12 
crates/vim/test_data/test_change_in_word/40head.txt                |    1 
crates/vim/test_data/test_change_in_word/41mode.txt                |    1 
crates/vim/test_data/test_change_in_word/42text.txt                |   12 
crates/vim/test_data/test_change_in_word/43head.txt                |    1 
crates/vim/test_data/test_change_in_word/44mode.txt                |    1 
crates/vim/test_data/test_change_in_word/45text.txt                |   12 
crates/vim/test_data/test_change_in_word/46head.txt                |    1 
crates/vim/test_data/test_change_in_word/47mode.txt                |    1 
crates/vim/test_data/test_change_in_word/48text.txt                |   12 
crates/vim/test_data/test_change_in_word/49head.txt                |    1 
crates/vim/test_data/test_change_in_word/4head.txt                 |    1 
crates/vim/test_data/test_change_in_word/50mode.txt                |    1 
crates/vim/test_data/test_change_in_word/51text.txt                |   12 
crates/vim/test_data/test_change_in_word/52head.txt                |    1 
crates/vim/test_data/test_change_in_word/53mode.txt                |    1 
crates/vim/test_data/test_change_in_word/54text.txt                |   12 
crates/vim/test_data/test_change_in_word/55head.txt                |    1 
crates/vim/test_data/test_change_in_word/56mode.txt                |    1 
crates/vim/test_data/test_change_in_word/57text.txt                |   12 
crates/vim/test_data/test_change_in_word/58head.txt                |    1 
crates/vim/test_data/test_change_in_word/59mode.txt                |    1 
crates/vim/test_data/test_change_in_word/5mode.txt                 |    1 
crates/vim/test_data/test_change_in_word/60text.txt                |   12 
crates/vim/test_data/test_change_in_word/61head.txt                |    1 
crates/vim/test_data/test_change_in_word/62mode.txt                |    1 
crates/vim/test_data/test_change_in_word/63text.txt                |   12 
crates/vim/test_data/test_change_in_word/64head.txt                |    1 
crates/vim/test_data/test_change_in_word/65mode.txt                |    1 
crates/vim/test_data/test_change_in_word/66text.txt                |   12 
crates/vim/test_data/test_change_in_word/67head.txt                |    1 
crates/vim/test_data/test_change_in_word/68mode.txt                |    1 
crates/vim/test_data/test_change_in_word/69text.txt                |   12 
crates/vim/test_data/test_change_in_word/6text.txt                 |   12 
crates/vim/test_data/test_change_in_word/70head.txt                |    1 
crates/vim/test_data/test_change_in_word/71mode.txt                |    1 
crates/vim/test_data/test_change_in_word/72text.txt                |   12 
crates/vim/test_data/test_change_in_word/73head.txt                |    1 
crates/vim/test_data/test_change_in_word/74mode.txt                |    1 
crates/vim/test_data/test_change_in_word/75text.txt                |   12 
crates/vim/test_data/test_change_in_word/76head.txt                |    1 
crates/vim/test_data/test_change_in_word/77mode.txt                |    1 
crates/vim/test_data/test_change_in_word/78text.txt                |   12 
crates/vim/test_data/test_change_in_word/79head.txt                |    1 
crates/vim/test_data/test_change_in_word/7head.txt                 |    1 
crates/vim/test_data/test_change_in_word/80mode.txt                |    1 
crates/vim/test_data/test_change_in_word/81text.txt                |   12 
crates/vim/test_data/test_change_in_word/82head.txt                |    1 
crates/vim/test_data/test_change_in_word/83mode.txt                |    1 
crates/vim/test_data/test_change_in_word/84text.txt                |   12 
crates/vim/test_data/test_change_in_word/85head.txt                |    1 
crates/vim/test_data/test_change_in_word/86mode.txt                |    1 
crates/vim/test_data/test_change_in_word/87text.txt                |   12 
crates/vim/test_data/test_change_in_word/88head.txt                |    1 
crates/vim/test_data/test_change_in_word/89mode.txt                |    1 
crates/vim/test_data/test_change_in_word/8mode.txt                 |    1 
crates/vim/test_data/test_change_in_word/90text.txt                |   12 
crates/vim/test_data/test_change_in_word/91head.txt                |    1 
crates/vim/test_data/test_change_in_word/92mode.txt                |    1 
crates/vim/test_data/test_change_in_word/93text.txt                |   12 
crates/vim/test_data/test_change_in_word/94head.txt                |    1 
crates/vim/test_data/test_change_in_word/95mode.txt                |    1 
crates/vim/test_data/test_change_in_word/96text.txt                |   12 
crates/vim/test_data/test_change_in_word/97head.txt                |    1 
crates/vim/test_data/test_change_in_word/98mode.txt                |    1 
crates/vim/test_data/test_change_in_word/99text.txt                |   12 
crates/vim/test_data/test_change_in_word/9text.txt                 |   12 
crates/vim/test_data/test_delete_around_sentence.json              |    0 
crates/vim/test_data/test_delete_around_sentence/0text.txt         |    1 
crates/vim/test_data/test_delete_around_sentence/10head.txt        |    1 
crates/vim/test_data/test_delete_around_sentence/1head.txt         |    1 
crates/vim/test_data/test_delete_around_sentence/2mode.txt         |    1 
crates/vim/test_data/test_delete_around_sentence/3text.txt         |    1 
crates/vim/test_data/test_delete_around_sentence/4head.txt         |    1 
crates/vim/test_data/test_delete_around_sentence/5mode.txt         |    1 
crates/vim/test_data/test_delete_around_sentence/6text.txt         |    1 
crates/vim/test_data/test_delete_around_sentence/7head.txt         |    1 
crates/vim/test_data/test_delete_around_sentence/8mode.txt         |    1 
crates/vim/test_data/test_delete_around_sentence/9text.txt         |    1 
crates/vim/test_data/test_delete_around_word.json                  |    0 
crates/vim/test_data/test_delete_around_word/0text.txt             |   12 
crates/vim/test_data/test_delete_around_word/100head.txt           |    1 
crates/vim/test_data/test_delete_around_word/101mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/102text.txt           |   12 
crates/vim/test_data/test_delete_around_word/103head.txt           |    1 
crates/vim/test_data/test_delete_around_word/104mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/105text.txt           |   12 
crates/vim/test_data/test_delete_around_word/106head.txt           |    1 
crates/vim/test_data/test_delete_around_word/107mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/108text.txt           |   12 
crates/vim/test_data/test_delete_around_word/109head.txt           |    1 
crates/vim/test_data/test_delete_around_word/10head.txt            |    1 
crates/vim/test_data/test_delete_around_word/110mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/111text.txt           |   12 
crates/vim/test_data/test_delete_around_word/112head.txt           |    1 
crates/vim/test_data/test_delete_around_word/113mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/114text.txt           |   12 
crates/vim/test_data/test_delete_around_word/115head.txt           |    1 
crates/vim/test_data/test_delete_around_word/116mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/117text.txt           |    9 
crates/vim/test_data/test_delete_around_word/118head.txt           |    1 
crates/vim/test_data/test_delete_around_word/119mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/11mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/120text.txt           |   10 
crates/vim/test_data/test_delete_around_word/121head.txt           |    1 
crates/vim/test_data/test_delete_around_word/122mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/123text.txt           |   11 
crates/vim/test_data/test_delete_around_word/124head.txt           |    1 
crates/vim/test_data/test_delete_around_word/125mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/126text.txt           |   12 
crates/vim/test_data/test_delete_around_word/127head.txt           |    1 
crates/vim/test_data/test_delete_around_word/128mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/129text.txt           |   12 
crates/vim/test_data/test_delete_around_word/12text.txt            |   12 
crates/vim/test_data/test_delete_around_word/130head.txt           |    1 
crates/vim/test_data/test_delete_around_word/131mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/132text.txt           |   11 
crates/vim/test_data/test_delete_around_word/133head.txt           |    1 
crates/vim/test_data/test_delete_around_word/134mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/135text.txt           |   11 
crates/vim/test_data/test_delete_around_word/136head.txt           |    1 
crates/vim/test_data/test_delete_around_word/137mode.txt           |    1 
crates/vim/test_data/test_delete_around_word/13head.txt            |    1 
crates/vim/test_data/test_delete_around_word/14mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/15text.txt            |   12 
crates/vim/test_data/test_delete_around_word/16head.txt            |    1 
crates/vim/test_data/test_delete_around_word/17mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/18text.txt            |   11 
crates/vim/test_data/test_delete_around_word/19head.txt            |    1 
crates/vim/test_data/test_delete_around_word/1head.txt             |    1 
crates/vim/test_data/test_delete_around_word/20mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/21text.txt            |   10 
crates/vim/test_data/test_delete_around_word/22head.txt            |    1 
crates/vim/test_data/test_delete_around_word/23mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/24text.txt            |   10 
crates/vim/test_data/test_delete_around_word/25head.txt            |    1 
crates/vim/test_data/test_delete_around_word/26mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/27text.txt            |   11 
crates/vim/test_data/test_delete_around_word/28head.txt            |    1 
crates/vim/test_data/test_delete_around_word/29mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/2mode.txt             |    1 
crates/vim/test_data/test_delete_around_word/30text.txt            |   12 
crates/vim/test_data/test_delete_around_word/31head.txt            |    1 
crates/vim/test_data/test_delete_around_word/32mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/33text.txt            |   12 
crates/vim/test_data/test_delete_around_word/34head.txt            |    1 
crates/vim/test_data/test_delete_around_word/35mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/36text.txt            |   12 
crates/vim/test_data/test_delete_around_word/37head.txt            |    1 
crates/vim/test_data/test_delete_around_word/38mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/39text.txt            |   12 
crates/vim/test_data/test_delete_around_word/3text.txt             |   12 
crates/vim/test_data/test_delete_around_word/40head.txt            |    1 
crates/vim/test_data/test_delete_around_word/41mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/42text.txt            |   12 
crates/vim/test_data/test_delete_around_word/43head.txt            |    1 
crates/vim/test_data/test_delete_around_word/44mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/45text.txt            |   12 
crates/vim/test_data/test_delete_around_word/46head.txt            |    1 
crates/vim/test_data/test_delete_around_word/47mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/48text.txt            |    9 
crates/vim/test_data/test_delete_around_word/49head.txt            |    1 
crates/vim/test_data/test_delete_around_word/4head.txt             |    1 
crates/vim/test_data/test_delete_around_word/50mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/51text.txt            |   10 
crates/vim/test_data/test_delete_around_word/52head.txt            |    1 
crates/vim/test_data/test_delete_around_word/53mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/54text.txt            |   11 
crates/vim/test_data/test_delete_around_word/55head.txt            |    1 
crates/vim/test_data/test_delete_around_word/56mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/57text.txt            |   12 
crates/vim/test_data/test_delete_around_word/58head.txt            |    1 
crates/vim/test_data/test_delete_around_word/59mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/5mode.txt             |    1 
crates/vim/test_data/test_delete_around_word/60text.txt            |   12 
crates/vim/test_data/test_delete_around_word/61head.txt            |    1 
crates/vim/test_data/test_delete_around_word/62mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/63text.txt            |   11 
crates/vim/test_data/test_delete_around_word/64head.txt            |    1 
crates/vim/test_data/test_delete_around_word/65mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/66text.txt            |   11 
crates/vim/test_data/test_delete_around_word/67head.txt            |    1 
crates/vim/test_data/test_delete_around_word/68mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/69text.txt            |   12 
crates/vim/test_data/test_delete_around_word/6text.txt             |   11 
crates/vim/test_data/test_delete_around_word/70head.txt            |    1 
crates/vim/test_data/test_delete_around_word/71mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/72text.txt            |   12 
crates/vim/test_data/test_delete_around_word/73head.txt            |    1 
crates/vim/test_data/test_delete_around_word/74mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/75text.txt            |   11 
crates/vim/test_data/test_delete_around_word/76head.txt            |    1 
crates/vim/test_data/test_delete_around_word/77mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/78text.txt            |   12 
crates/vim/test_data/test_delete_around_word/79head.txt            |    1 
crates/vim/test_data/test_delete_around_word/7head.txt             |    1 
crates/vim/test_data/test_delete_around_word/80mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/81text.txt            |   12 
crates/vim/test_data/test_delete_around_word/82head.txt            |    1 
crates/vim/test_data/test_delete_around_word/83mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/84text.txt            |   12 
crates/vim/test_data/test_delete_around_word/85head.txt            |    1 
crates/vim/test_data/test_delete_around_word/86mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/87text.txt            |   11 
crates/vim/test_data/test_delete_around_word/88head.txt            |    1 
crates/vim/test_data/test_delete_around_word/89mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/8mode.txt             |    1 
crates/vim/test_data/test_delete_around_word/90text.txt            |   10 
crates/vim/test_data/test_delete_around_word/91head.txt            |    1 
crates/vim/test_data/test_delete_around_word/92mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/93text.txt            |   10 
crates/vim/test_data/test_delete_around_word/94head.txt            |    1 
crates/vim/test_data/test_delete_around_word/95mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/96text.txt            |   11 
crates/vim/test_data/test_delete_around_word/97head.txt            |    1 
crates/vim/test_data/test_delete_around_word/98mode.txt            |    1 
crates/vim/test_data/test_delete_around_word/99text.txt            |   12 
crates/vim/test_data/test_delete_around_word/9text.txt             |   12 
crates/vim/test_data/test_delete_in_sentence.json                  |    0 
crates/vim/test_data/test_delete_in_sentence/0text.txt             |    1 
crates/vim/test_data/test_delete_in_sentence/10head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/11mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/12text.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/13head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/14mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/15text.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/16head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/17mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/18text.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/19head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/1head.txt             |    1 
crates/vim/test_data/test_delete_in_sentence/20mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/21text.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/22head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/23mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/24text.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/25head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/26mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/27text.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/28head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/29mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/2mode.txt             |    1 
crates/vim/test_data/test_delete_in_sentence/30text.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/31head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/32mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/33text.txt            |    2 
crates/vim/test_data/test_delete_in_sentence/34head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/35mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/36text.txt            |    2 
crates/vim/test_data/test_delete_in_sentence/37head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/38mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/39text.txt            |    2 
crates/vim/test_data/test_delete_in_sentence/3text.txt             |    1 
crates/vim/test_data/test_delete_in_sentence/40head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/41mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/42text.txt            |    2 
crates/vim/test_data/test_delete_in_sentence/43head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/44mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/45text.txt            |    2 
crates/vim/test_data/test_delete_in_sentence/46head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/47mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/48text.txt            |    4 
crates/vim/test_data/test_delete_in_sentence/49head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/4head.txt             |    1 
crates/vim/test_data/test_delete_in_sentence/50mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/51text.txt            |    3 
crates/vim/test_data/test_delete_in_sentence/52head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/53mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/54text.txt            |    3 
crates/vim/test_data/test_delete_in_sentence/55head.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/56mode.txt            |    1 
crates/vim/test_data/test_delete_in_sentence/5mode.txt             |    1 
crates/vim/test_data/test_delete_in_sentence/6text.txt             |    1 
crates/vim/test_data/test_delete_in_sentence/7head.txt             |    1 
crates/vim/test_data/test_delete_in_sentence/8mode.txt             |    1 
crates/vim/test_data/test_delete_in_sentence/9text.txt             |    1 
crates/vim/test_data/test_delete_in_word.json                      |    0 
crates/vim/test_data/test_delete_in_word/0text.txt                 |   12 
crates/vim/test_data/test_delete_in_word/100head.txt               |    1 
crates/vim/test_data/test_delete_in_word/101mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/102text.txt               |   12 
crates/vim/test_data/test_delete_in_word/103head.txt               |    1 
crates/vim/test_data/test_delete_in_word/104mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/105text.txt               |   12 
crates/vim/test_data/test_delete_in_word/106head.txt               |    1 
crates/vim/test_data/test_delete_in_word/107mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/108text.txt               |   12 
crates/vim/test_data/test_delete_in_word/109head.txt               |    1 
crates/vim/test_data/test_delete_in_word/10head.txt                |    1 
crates/vim/test_data/test_delete_in_word/110mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/111text.txt               |   12 
crates/vim/test_data/test_delete_in_word/112head.txt               |    1 
crates/vim/test_data/test_delete_in_word/113mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/114text.txt               |   12 
crates/vim/test_data/test_delete_in_word/115head.txt               |    1 
crates/vim/test_data/test_delete_in_word/116mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/117text.txt               |   12 
crates/vim/test_data/test_delete_in_word/118head.txt               |    1 
crates/vim/test_data/test_delete_in_word/119mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/11mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/120text.txt               |   12 
crates/vim/test_data/test_delete_in_word/121head.txt               |    1 
crates/vim/test_data/test_delete_in_word/122mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/123text.txt               |   12 
crates/vim/test_data/test_delete_in_word/124head.txt               |    1 
crates/vim/test_data/test_delete_in_word/125mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/126text.txt               |   12 
crates/vim/test_data/test_delete_in_word/127head.txt               |    1 
crates/vim/test_data/test_delete_in_word/128mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/129text.txt               |   12 
crates/vim/test_data/test_delete_in_word/12text.txt                |   12 
crates/vim/test_data/test_delete_in_word/130head.txt               |    1 
crates/vim/test_data/test_delete_in_word/131mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/132text.txt               |   12 
crates/vim/test_data/test_delete_in_word/133head.txt               |    1 
crates/vim/test_data/test_delete_in_word/134mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/135text.txt               |   12 
crates/vim/test_data/test_delete_in_word/136head.txt               |    1 
crates/vim/test_data/test_delete_in_word/137mode.txt               |    1 
crates/vim/test_data/test_delete_in_word/13head.txt                |    1 
crates/vim/test_data/test_delete_in_word/14mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/15text.txt                |   12 
crates/vim/test_data/test_delete_in_word/16head.txt                |    1 
crates/vim/test_data/test_delete_in_word/17mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/18text.txt                |   12 
crates/vim/test_data/test_delete_in_word/19head.txt                |    1 
crates/vim/test_data/test_delete_in_word/1head.txt                 |    1 
crates/vim/test_data/test_delete_in_word/20mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/21text.txt                |   12 
crates/vim/test_data/test_delete_in_word/22head.txt                |    1 
crates/vim/test_data/test_delete_in_word/23mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/24text.txt                |   12 
crates/vim/test_data/test_delete_in_word/25head.txt                |    1 
crates/vim/test_data/test_delete_in_word/26mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/27text.txt                |   12 
crates/vim/test_data/test_delete_in_word/28head.txt                |    1 
crates/vim/test_data/test_delete_in_word/29mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/2mode.txt                 |    1 
crates/vim/test_data/test_delete_in_word/30text.txt                |   12 
crates/vim/test_data/test_delete_in_word/31head.txt                |    1 
crates/vim/test_data/test_delete_in_word/32mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/33text.txt                |   12 
crates/vim/test_data/test_delete_in_word/34head.txt                |    1 
crates/vim/test_data/test_delete_in_word/35mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/36text.txt                |   12 
crates/vim/test_data/test_delete_in_word/37head.txt                |    1 
crates/vim/test_data/test_delete_in_word/38mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/39text.txt                |   12 
crates/vim/test_data/test_delete_in_word/3text.txt                 |   12 
crates/vim/test_data/test_delete_in_word/40head.txt                |    1 
crates/vim/test_data/test_delete_in_word/41mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/42text.txt                |   12 
crates/vim/test_data/test_delete_in_word/43head.txt                |    1 
crates/vim/test_data/test_delete_in_word/44mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/45text.txt                |   12 
crates/vim/test_data/test_delete_in_word/46head.txt                |    1 
crates/vim/test_data/test_delete_in_word/47mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/48text.txt                |   12 
crates/vim/test_data/test_delete_in_word/49head.txt                |    1 
crates/vim/test_data/test_delete_in_word/4head.txt                 |    1 
crates/vim/test_data/test_delete_in_word/50mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/51text.txt                |   12 
crates/vim/test_data/test_delete_in_word/52head.txt                |    1 
crates/vim/test_data/test_delete_in_word/53mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/54text.txt                |   12 
crates/vim/test_data/test_delete_in_word/55head.txt                |    1 
crates/vim/test_data/test_delete_in_word/56mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/57text.txt                |   12 
crates/vim/test_data/test_delete_in_word/58head.txt                |    1 
crates/vim/test_data/test_delete_in_word/59mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/5mode.txt                 |    1 
crates/vim/test_data/test_delete_in_word/60text.txt                |   12 
crates/vim/test_data/test_delete_in_word/61head.txt                |    1 
crates/vim/test_data/test_delete_in_word/62mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/63text.txt                |   12 
crates/vim/test_data/test_delete_in_word/64head.txt                |    1 
crates/vim/test_data/test_delete_in_word/65mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/66text.txt                |   12 
crates/vim/test_data/test_delete_in_word/67head.txt                |    1 
crates/vim/test_data/test_delete_in_word/68mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/69text.txt                |   12 
crates/vim/test_data/test_delete_in_word/6text.txt                 |   12 
crates/vim/test_data/test_delete_in_word/70head.txt                |    1 
crates/vim/test_data/test_delete_in_word/71mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/72text.txt                |   12 
crates/vim/test_data/test_delete_in_word/73head.txt                |    1 
crates/vim/test_data/test_delete_in_word/74mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/75text.txt                |   12 
crates/vim/test_data/test_delete_in_word/76head.txt                |    1 
crates/vim/test_data/test_delete_in_word/77mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/78text.txt                |   12 
crates/vim/test_data/test_delete_in_word/79head.txt                |    1 
crates/vim/test_data/test_delete_in_word/7head.txt                 |    1 
crates/vim/test_data/test_delete_in_word/80mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/81text.txt                |   12 
crates/vim/test_data/test_delete_in_word/82head.txt                |    1 
crates/vim/test_data/test_delete_in_word/83mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/84text.txt                |   12 
crates/vim/test_data/test_delete_in_word/85head.txt                |    1 
crates/vim/test_data/test_delete_in_word/86mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/87text.txt                |   12 
crates/vim/test_data/test_delete_in_word/88head.txt                |    1 
crates/vim/test_data/test_delete_in_word/89mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/8mode.txt                 |    1 
crates/vim/test_data/test_delete_in_word/90text.txt                |   12 
crates/vim/test_data/test_delete_in_word/91head.txt                |    1 
crates/vim/test_data/test_delete_in_word/92mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/93text.txt                |   12 
crates/vim/test_data/test_delete_in_word/94head.txt                |    1 
crates/vim/test_data/test_delete_in_word/95mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/96text.txt                |   12 
crates/vim/test_data/test_delete_in_word/97head.txt                |    1 
crates/vim/test_data/test_delete_in_word/98mode.txt                |    1 
crates/vim/test_data/test_delete_in_word/99text.txt                |   12 
crates/vim/test_data/test_delete_in_word/9text.txt                 |   12 
crates/vim/test_data/test_e.json                                   |    0 
crates/vim/test_data/test_gg.json                                  |    1 
crates/vim/test_data/test_h.json                                   |    1 
crates/vim/test_data/test_insert_end_of_line.json                  |    1 
crates/vim/test_data/test_insert_line_above.json                   |    1 
crates/vim/test_data/test_j.json                                   |    1 
crates/vim/test_data/test_jump_to_end.json                         |    1 
crates/vim/test_data/test_jump_to_line_boundaries.json             |    1 
crates/vim/test_data/test_k.json                                   |    1 
crates/vim/test_data/test_l.json                                   |    1 
crates/vim/test_data/test_neovim.json                              |    1 
crates/vim/test_data/test_neovim/0text.txt                         |    1 
crates/vim/test_data/test_neovim/1head.txt                         |    1 
crates/vim/test_data/test_neovim/2mode.txt                         |    1 
crates/vim/test_data/test_repeated_cb.json                         |    0 
crates/vim/test_data/test_repeated_ce.json                         |    0 
crates/vim/test_data/test_repeated_cj.json                         |    0 
crates/vim/test_data/test_repeated_cl.json                         |    0 
crates/vim/test_data/test_repeated_word.json                       |    0 
crates/vim/test_data/test_w.json                                   |    0 
crates/vim/test_data/test_word_text_object/0text.txt               |    9 
crates/vim/test_data/test_word_text_object/100head.txt             |    1 
crates/vim/test_data/test_word_text_object/101mode.txt             |    1 
crates/vim/test_data/test_word_text_object/102text.txt             |    9 
crates/vim/test_data/test_word_text_object/103head.txt             |    1 
crates/vim/test_data/test_word_text_object/104mode.txt             |    1 
crates/vim/test_data/test_word_text_object/105text.txt             |    9 
crates/vim/test_data/test_word_text_object/106head.txt             |    1 
crates/vim/test_data/test_word_text_object/107mode.txt             |    1 
crates/vim/test_data/test_word_text_object/108text.txt             |    9 
crates/vim/test_data/test_word_text_object/109head.txt             |    1 
crates/vim/test_data/test_word_text_object/10head.txt              |    1 
crates/vim/test_data/test_word_text_object/110mode.txt             |    1 
crates/vim/test_data/test_word_text_object/111text.txt             |    9 
crates/vim/test_data/test_word_text_object/112head.txt             |    1 
crates/vim/test_data/test_word_text_object/113mode.txt             |    1 
crates/vim/test_data/test_word_text_object/114text.txt             |    9 
crates/vim/test_data/test_word_text_object/115head.txt             |    1 
crates/vim/test_data/test_word_text_object/116mode.txt             |    1 
crates/vim/test_data/test_word_text_object/117text.txt             |    9 
crates/vim/test_data/test_word_text_object/118head.txt             |    1 
crates/vim/test_data/test_word_text_object/119mode.txt             |    1 
crates/vim/test_data/test_word_text_object/11mode.txt              |    1 
crates/vim/test_data/test_word_text_object/120text.txt             |    8 
crates/vim/test_data/test_word_text_object/121head.txt             |    1 
crates/vim/test_data/test_word_text_object/122mode.txt             |    1 
crates/vim/test_data/test_word_text_object/123text.txt             |    9 
crates/vim/test_data/test_word_text_object/124head.txt             |    1 
crates/vim/test_data/test_word_text_object/125mode.txt             |    1 
crates/vim/test_data/test_word_text_object/126text.txt             |    9 
crates/vim/test_data/test_word_text_object/127head.txt             |    1 
crates/vim/test_data/test_word_text_object/128mode.txt             |    1 
crates/vim/test_data/test_word_text_object/129text.txt             |    9 
crates/vim/test_data/test_word_text_object/12text.txt              |    9 
crates/vim/test_data/test_word_text_object/130head.txt             |    1 
crates/vim/test_data/test_word_text_object/131mode.txt             |    1 
crates/vim/test_data/test_word_text_object/132text.txt             |    8 
crates/vim/test_data/test_word_text_object/133head.txt             |    1 
crates/vim/test_data/test_word_text_object/134mode.txt             |    1 
crates/vim/test_data/test_word_text_object/135text.txt             |    8 
crates/vim/test_data/test_word_text_object/136head.txt             |    1 
crates/vim/test_data/test_word_text_object/137mode.txt             |    1 
crates/vim/test_data/test_word_text_object/138text.txt             |    8 
crates/vim/test_data/test_word_text_object/139head.txt             |    1 
crates/vim/test_data/test_word_text_object/13head.txt              |    1 
crates/vim/test_data/test_word_text_object/140mode.txt             |    1 
crates/vim/test_data/test_word_text_object/141text.txt             |    8 
crates/vim/test_data/test_word_text_object/142head.txt             |    1 
crates/vim/test_data/test_word_text_object/143mode.txt             |    1 
crates/vim/test_data/test_word_text_object/144text.txt             |    9 
crates/vim/test_data/test_word_text_object/145head.txt             |    1 
crates/vim/test_data/test_word_text_object/146mode.txt             |    1 
crates/vim/test_data/test_word_text_object/147text.txt             |    9 
crates/vim/test_data/test_word_text_object/148head.txt             |    1 
crates/vim/test_data/test_word_text_object/149mode.txt             |    1 
crates/vim/test_data/test_word_text_object/14mode.txt              |    1 
crates/vim/test_data/test_word_text_object/150text.txt             |    9 
crates/vim/test_data/test_word_text_object/151head.txt             |    1 
crates/vim/test_data/test_word_text_object/152mode.txt             |    1 
crates/vim/test_data/test_word_text_object/153text.txt             |    9 
crates/vim/test_data/test_word_text_object/154head.txt             |    1 
crates/vim/test_data/test_word_text_object/155mode.txt             |    1 
crates/vim/test_data/test_word_text_object/156text.txt             |    9 
crates/vim/test_data/test_word_text_object/157head.txt             |    1 
crates/vim/test_data/test_word_text_object/158mode.txt             |    1 
crates/vim/test_data/test_word_text_object/159text.txt             |    9 
crates/vim/test_data/test_word_text_object/15text.txt              |    9 
crates/vim/test_data/test_word_text_object/160head.txt             |    1 
crates/vim/test_data/test_word_text_object/161mode.txt             |    1 
crates/vim/test_data/test_word_text_object/162text.txt             |    8 
crates/vim/test_data/test_word_text_object/163head.txt             |    1 
crates/vim/test_data/test_word_text_object/164mode.txt             |    1 
crates/vim/test_data/test_word_text_object/165text.txt             |    9 
crates/vim/test_data/test_word_text_object/166head.txt             |    1 
crates/vim/test_data/test_word_text_object/167mode.txt             |    1 
crates/vim/test_data/test_word_text_object/168text.txt             |    9 
crates/vim/test_data/test_word_text_object/169head.txt             |    1 
crates/vim/test_data/test_word_text_object/16head.txt              |    1 
crates/vim/test_data/test_word_text_object/170mode.txt             |    1 
crates/vim/test_data/test_word_text_object/171text.txt             |    9 
crates/vim/test_data/test_word_text_object/172head.txt             |    1 
crates/vim/test_data/test_word_text_object/173mode.txt             |    1 
crates/vim/test_data/test_word_text_object/174text.txt             |    9 
crates/vim/test_data/test_word_text_object/175head.txt             |    1 
crates/vim/test_data/test_word_text_object/176mode.txt             |    1 
crates/vim/test_data/test_word_text_object/177text.txt             |    8 
crates/vim/test_data/test_word_text_object/178head.txt             |    1 
crates/vim/test_data/test_word_text_object/179mode.txt             |    1 
crates/vim/test_data/test_word_text_object/17mode.txt              |    1 
crates/vim/test_data/test_word_text_object/180text.txt             |    9 
crates/vim/test_data/test_word_text_object/181head.txt             |    1 
crates/vim/test_data/test_word_text_object/182mode.txt             |    1 
crates/vim/test_data/test_word_text_object/183text.txt             |    9 
crates/vim/test_data/test_word_text_object/184head.txt             |    1 
crates/vim/test_data/test_word_text_object/185mode.txt             |    1 
crates/vim/test_data/test_word_text_object/186text.txt             |    9 
crates/vim/test_data/test_word_text_object/187head.txt             |    1 
crates/vim/test_data/test_word_text_object/188mode.txt             |    1 
crates/vim/test_data/test_word_text_object/189text.txt             |    8 
crates/vim/test_data/test_word_text_object/18text.txt              |    9 
crates/vim/test_data/test_word_text_object/190head.txt             |    1 
crates/vim/test_data/test_word_text_object/191mode.txt             |    1 
crates/vim/test_data/test_word_text_object/192text.txt             |    8 
crates/vim/test_data/test_word_text_object/193head.txt             |    1 
crates/vim/test_data/test_word_text_object/194mode.txt             |    1 
crates/vim/test_data/test_word_text_object/195text.txt             |    8 
crates/vim/test_data/test_word_text_object/196head.txt             |    1 
crates/vim/test_data/test_word_text_object/197mode.txt             |    1 
crates/vim/test_data/test_word_text_object/198text.txt             |    8 
crates/vim/test_data/test_word_text_object/199head.txt             |    1 
crates/vim/test_data/test_word_text_object/19head.txt              |    1 
crates/vim/test_data/test_word_text_object/1head.txt               |    1 
crates/vim/test_data/test_word_text_object/200mode.txt             |    1 
crates/vim/test_data/test_word_text_object/201text.txt             |    9 
crates/vim/test_data/test_word_text_object/202head.txt             |    1 
crates/vim/test_data/test_word_text_object/203mode.txt             |    1 
crates/vim/test_data/test_word_text_object/204text.txt             |    9 
crates/vim/test_data/test_word_text_object/205head.txt             |    1 
crates/vim/test_data/test_word_text_object/206mode.txt             |    1 
crates/vim/test_data/test_word_text_object/207text.txt             |    9 
crates/vim/test_data/test_word_text_object/208head.txt             |    1 
crates/vim/test_data/test_word_text_object/209mode.txt             |    1 
crates/vim/test_data/test_word_text_object/20mode.txt              |    1 
crates/vim/test_data/test_word_text_object/210text.txt             |    9 
crates/vim/test_data/test_word_text_object/211head.txt             |    1 
crates/vim/test_data/test_word_text_object/212mode.txt             |    1 
crates/vim/test_data/test_word_text_object/213text.txt             |    9 
crates/vim/test_data/test_word_text_object/214head.txt             |    1 
crates/vim/test_data/test_word_text_object/215mode.txt             |    1 
crates/vim/test_data/test_word_text_object/216text.txt             |    9 
crates/vim/test_data/test_word_text_object/217head.txt             |    1 
crates/vim/test_data/test_word_text_object/218mode.txt             |    1 
crates/vim/test_data/test_word_text_object/219text.txt             |    8 
crates/vim/test_data/test_word_text_object/21text.txt              |    9 
crates/vim/test_data/test_word_text_object/220head.txt             |    1 
crates/vim/test_data/test_word_text_object/221mode.txt             |    1 
crates/vim/test_data/test_word_text_object/222text.txt             |    9 
crates/vim/test_data/test_word_text_object/223head.txt             |    1 
crates/vim/test_data/test_word_text_object/224mode.txt             |    1 
crates/vim/test_data/test_word_text_object/225text.txt             |    9 
crates/vim/test_data/test_word_text_object/226head.txt             |    1 
crates/vim/test_data/test_word_text_object/227mode.txt             |    1 
crates/vim/test_data/test_word_text_object/228text.txt             |    9 
crates/vim/test_data/test_word_text_object/229head.txt             |    1 
crates/vim/test_data/test_word_text_object/22head.txt              |    1 
crates/vim/test_data/test_word_text_object/230mode.txt             |    1 
crates/vim/test_data/test_word_text_object/231text.txt             |    9 
crates/vim/test_data/test_word_text_object/23mode.txt              |    1 
crates/vim/test_data/test_word_text_object/24text.txt              |    9 
crates/vim/test_data/test_word_text_object/25head.txt              |    1 
crates/vim/test_data/test_word_text_object/26mode.txt              |    1 
crates/vim/test_data/test_word_text_object/27text.txt              |    9 
crates/vim/test_data/test_word_text_object/28head.txt              |    1 
crates/vim/test_data/test_word_text_object/29mode.txt              |    1 
crates/vim/test_data/test_word_text_object/2mode.txt               |    1 
crates/vim/test_data/test_word_text_object/30text.txt              |    9 
crates/vim/test_data/test_word_text_object/31head.txt              |    1 
crates/vim/test_data/test_word_text_object/32mode.txt              |    1 
crates/vim/test_data/test_word_text_object/33text.txt              |    9 
crates/vim/test_data/test_word_text_object/34head.txt              |    1 
crates/vim/test_data/test_word_text_object/35mode.txt              |    1 
crates/vim/test_data/test_word_text_object/36text.txt              |    9 
crates/vim/test_data/test_word_text_object/37head.txt              |    1 
crates/vim/test_data/test_word_text_object/38mode.txt              |    1 
crates/vim/test_data/test_word_text_object/39text.txt              |    9 
crates/vim/test_data/test_word_text_object/3text.txt               |    9 
crates/vim/test_data/test_word_text_object/40head.txt              |    1 
crates/vim/test_data/test_word_text_object/41mode.txt              |    1 
crates/vim/test_data/test_word_text_object/42text.txt              |    9 
crates/vim/test_data/test_word_text_object/43head.txt              |    1 
crates/vim/test_data/test_word_text_object/44mode.txt              |    1 
crates/vim/test_data/test_word_text_object/45text.txt              |    9 
crates/vim/test_data/test_word_text_object/46head.txt              |    1 
crates/vim/test_data/test_word_text_object/47mode.txt              |    1 
crates/vim/test_data/test_word_text_object/48text.txt              |    9 
crates/vim/test_data/test_word_text_object/49head.txt              |    1 
crates/vim/test_data/test_word_text_object/4head.txt               |    1 
crates/vim/test_data/test_word_text_object/50mode.txt              |    1 
crates/vim/test_data/test_word_text_object/51text.txt              |    9 
crates/vim/test_data/test_word_text_object/52head.txt              |    1 
crates/vim/test_data/test_word_text_object/53mode.txt              |    1 
crates/vim/test_data/test_word_text_object/54text.txt              |    9 
crates/vim/test_data/test_word_text_object/55head.txt              |    1 
crates/vim/test_data/test_word_text_object/56mode.txt              |    1 
crates/vim/test_data/test_word_text_object/57text.txt              |    9 
crates/vim/test_data/test_word_text_object/58head.txt              |    1 
crates/vim/test_data/test_word_text_object/59mode.txt              |    1 
crates/vim/test_data/test_word_text_object/5mode.txt               |    1 
crates/vim/test_data/test_word_text_object/60text.txt              |    9 
crates/vim/test_data/test_word_text_object/61head.txt              |    1 
crates/vim/test_data/test_word_text_object/62mode.txt              |    1 
crates/vim/test_data/test_word_text_object/63text.txt              |    9 
crates/vim/test_data/test_word_text_object/64head.txt              |    1 
crates/vim/test_data/test_word_text_object/65mode.txt              |    1 
crates/vim/test_data/test_word_text_object/66text.txt              |    9 
crates/vim/test_data/test_word_text_object/67head.txt              |    1 
crates/vim/test_data/test_word_text_object/68mode.txt              |    1 
crates/vim/test_data/test_word_text_object/69text.txt              |    9 
crates/vim/test_data/test_word_text_object/6text.txt               |    9 
crates/vim/test_data/test_word_text_object/70head.txt              |    1 
crates/vim/test_data/test_word_text_object/71mode.txt              |    1 
crates/vim/test_data/test_word_text_object/72text.txt              |    9 
crates/vim/test_data/test_word_text_object/73head.txt              |    1 
crates/vim/test_data/test_word_text_object/74mode.txt              |    1 
crates/vim/test_data/test_word_text_object/75text.txt              |    9 
crates/vim/test_data/test_word_text_object/76head.txt              |    1 
crates/vim/test_data/test_word_text_object/77mode.txt              |    1 
crates/vim/test_data/test_word_text_object/78text.txt              |    9 
crates/vim/test_data/test_word_text_object/79head.txt              |    1 
crates/vim/test_data/test_word_text_object/7head.txt               |    1 
crates/vim/test_data/test_word_text_object/80mode.txt              |    1 
crates/vim/test_data/test_word_text_object/81text.txt              |    9 
crates/vim/test_data/test_word_text_object/82head.txt              |    1 
crates/vim/test_data/test_word_text_object/83mode.txt              |    1 
crates/vim/test_data/test_word_text_object/84text.txt              |    9 
crates/vim/test_data/test_word_text_object/85head.txt              |    1 
crates/vim/test_data/test_word_text_object/86mode.txt              |    1 
crates/vim/test_data/test_word_text_object/87text.txt              |    9 
crates/vim/test_data/test_word_text_object/88head.txt              |    1 
crates/vim/test_data/test_word_text_object/89mode.txt              |    1 
crates/vim/test_data/test_word_text_object/8mode.txt               |    1 
crates/vim/test_data/test_word_text_object/90text.txt              |    9 
crates/vim/test_data/test_word_text_object/91head.txt              |    1 
crates/vim/test_data/test_word_text_object/92mode.txt              |    1 
crates/vim/test_data/test_word_text_object/93text.txt              |    9 
crates/vim/test_data/test_word_text_object/94head.txt              |    1 
crates/vim/test_data/test_word_text_object/95mode.txt              |    1 
crates/vim/test_data/test_word_text_object/96text.txt              |    9 
crates/vim/test_data/test_word_text_object/97head.txt              |    1 
crates/vim/test_data/test_word_text_object/98mode.txt              |    1 
crates/vim/test_data/test_word_text_object/99text.txt              |    9 
crates/vim/test_data/test_word_text_object/9text.txt               |    9 
971 files changed, 818 insertions(+), 11,893 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -1,7629 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "activity_indicator"
-version = "0.1.0"
-dependencies = [
- "auto_update",
- "editor",
- "futures 0.3.24",
- "gpui",
- "language",
- "project",
- "settings",
- "smallvec",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "addr2line"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b"
-dependencies = [
- "gimli",
-]
-
-[[package]]
-name = "adler"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-
-[[package]]
-name = "adler32"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
-
-[[package]]
-name = "ahash"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
-dependencies = [
- "getrandom 0.2.7",
- "once_cell",
- "version_check",
-]
-
-[[package]]
-name = "aho-corasick"
-version = "0.7.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "alacritty_config"
-version = "0.1.1-dev"
-source = "git+https://github.com/zed-industries/alacritty?rev=a51dbe25d67e84d6ed4261e640d3954fbdd9be45#a51dbe25d67e84d6ed4261e640d3954fbdd9be45"
-dependencies = [
- "log",
- "serde",
- "serde_yaml",
-]
-
-[[package]]
-name = "alacritty_config_derive"
-version = "0.2.1-dev"
-source = "git+https://github.com/zed-industries/alacritty?rev=a51dbe25d67e84d6ed4261e640d3954fbdd9be45#a51dbe25d67e84d6ed4261e640d3954fbdd9be45"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "alacritty_terminal"
-version = "0.17.1-dev"
-source = "git+https://github.com/zed-industries/alacritty?rev=a51dbe25d67e84d6ed4261e640d3954fbdd9be45#a51dbe25d67e84d6ed4261e640d3954fbdd9be45"
-dependencies = [
- "alacritty_config",
- "alacritty_config_derive",
- "base64",
- "bitflags",
- "dirs 4.0.0",
- "libc",
- "log",
- "mio 0.6.23",
- "mio-anonymous-pipes",
- "mio-extras",
- "miow 0.3.7",
- "nix",
- "parking_lot 0.12.1",
- "regex-automata",
- "serde",
- "serde_yaml",
- "signal-hook",
- "signal-hook-mio",
- "unicode-width",
- "vte",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "ambient-authority"
-version = "0.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec8ad6edb4840b78c5c3d88de606b22252d552b55f3a4699fbb10fc070ec3049"
-
-[[package]]
-name = "android_system_properties"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "ansi_term"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
-dependencies = [
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.65"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602"
-
-[[package]]
-name = "arrayref"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
-
-[[package]]
-name = "arrayvec"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
-
-[[package]]
-name = "arrayvec"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
-
-[[package]]
-name = "ascii"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"
-
-[[package]]
-name = "assets"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "gpui",
- "rust-embed",
-]
-
-[[package]]
-name = "async-broadcast"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90622698a1218e0b2fb846c97b5f19a0831f6baddee73d9454156365ccfa473b"
-dependencies = [
- "easy-parallel",
- "event-listener",
- "futures-core",
-]
-
-[[package]]
-name = "async-channel"
-version = "1.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e14485364214912d3b19cc3435dde4df66065127f05fa0d75c712f36f12c2f28"
-dependencies = [
- "concurrent-queue",
- "event-listener",
- "futures-core",
-]
-
-[[package]]
-name = "async-compat"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b48b4ff0c2026db683dea961cd8ea874737f56cffca86fa84415eaddc51c00d"
-dependencies = [
- "futures-core",
- "futures-io",
- "once_cell",
- "pin-project-lite 0.2.9",
- "tokio",
-]
-
-[[package]]
-name = "async-compression"
-version = "0.3.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a"
-dependencies = [
- "flate2",
- "futures-core",
- "futures-io",
- "memchr",
- "pin-project-lite 0.2.9",
-]
-
-[[package]]
-name = "async-executor"
-version = "1.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965"
-dependencies = [
- "async-task",
- "concurrent-queue",
- "fastrand",
- "futures-lite",
- "once_cell",
- "slab",
-]
-
-[[package]]
-name = "async-fs"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06"
-dependencies = [
- "async-lock",
- "autocfg 1.1.0",
- "blocking",
- "futures-lite",
-]
-
-[[package]]
-name = "async-io"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83e21f3a490c72b3b0cf44962180e60045de2925d8dff97918f7ee43c8f637c7"
-dependencies = [
- "autocfg 1.1.0",
- "concurrent-queue",
- "futures-lite",
- "libc",
- "log",
- "once_cell",
- "parking",
- "polling",
- "slab",
- "socket2",
- "waker-fn",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "async-lock"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6"
-dependencies = [
- "event-listener",
-]
-
-[[package]]
-name = "async-net"
-version = "1.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4051e67316bc7eff608fe723df5d32ed639946adcd69e07df41fd42a7b411f1f"
-dependencies = [
- "async-io",
- "autocfg 1.1.0",
- "blocking",
- "futures-lite",
-]
-
-[[package]]
-name = "async-pipe"
-version = "0.1.3"
-source = "git+https://github.com/zed-industries/async-pipe-rs?rev=82d00a04211cf4e1236029aa03e6b6ce2a74c553#82d00a04211cf4e1236029aa03e6b6ce2a74c553"
-dependencies = [
- "futures 0.3.24",
- "log",
-]
-
-[[package]]
-name = "async-process"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02111fd8655a613c25069ea89fc8d9bb89331fa77486eb3bc059ee757cfa481c"
-dependencies = [
- "async-io",
- "autocfg 1.1.0",
- "blocking",
- "cfg-if 1.0.0",
- "event-listener",
- "futures-lite",
- "libc",
- "once_cell",
- "signal-hook",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "async-recursion"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7d78656ba01f1b93024b7c3a0467f1608e4be67d725749fdcd7d2c7678fd7a2"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "async-stream"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e"
-dependencies = [
- "async-stream-impl",
- "futures-core",
-]
-
-[[package]]
-name = "async-stream-impl"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "async-task"
-version = "4.0.3"
-source = "git+https://github.com/zed-industries/async-task?rev=341b57d6de98cdfd7b418567b8de2022ca993a6e#341b57d6de98cdfd7b418567b8de2022ca993a6e"
-
-[[package]]
-name = "async-tls"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f23d769dbf1838d5df5156e7b1ad404f4c463d1ac2c6aeb6cd943630f8a8400"
-dependencies = [
- "futures-core",
- "futures-io",
- "rustls 0.19.1",
- "webpki 0.21.4",
- "webpki-roots 0.21.1",
-]
-
-[[package]]
-name = "async-trait"
-version = "0.1.57"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "async-tungstenite"
-version = "0.16.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5682ea0913e5c20780fe5785abacb85a411e7437bf52a1bedb93ddb3972cb8dd"
-dependencies = [
- "async-tls",
- "futures-io",
- "futures-util",
- "log",
- "pin-project-lite 0.2.9",
- "tungstenite 0.16.0",
-]
-
-[[package]]
-name = "atoi"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "atomic"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c"
-dependencies = [
- "autocfg 1.1.0",
-]
-
-[[package]]
-name = "atomic-waker"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a"
-
-[[package]]
-name = "atty"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
-dependencies = [
- "hermit-abi 0.1.19",
- "libc",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "auto_update"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "client",
- "gpui",
- "isahc",
- "lazy_static",
- "log",
- "menu",
- "project",
- "serde",
- "serde_json",
- "settings",
- "smol",
- "tempdir",
- "theme",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "autocfg"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78"
-dependencies = [
- "autocfg 1.1.0",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "axum"
-version = "0.5.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9e3356844c4d6a6d6467b8da2cffb4a2820be256f50a3a386c9d152bab31043"
-dependencies = [
- "async-trait",
- "axum-core",
- "base64",
- "bitflags",
- "bytes 1.2.1",
- "futures-util",
- "headers",
- "http",
- "http-body",
- "hyper",
- "itoa",
- "matchit",
- "memchr",
- "mime",
- "percent-encoding",
- "pin-project-lite 0.2.9",
- "serde",
- "serde_json",
- "serde_urlencoded",
- "sha-1 0.10.0",
- "sync_wrapper",
- "tokio",
- "tokio-tungstenite",
- "tower",
- "tower-http",
- "tower-layer",
- "tower-service",
-]
-
-[[package]]
-name = "axum-core"
-version = "0.2.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9f0c0a60006f2a293d82d571f635042a72edf927539b7685bd62d361963839b"
-dependencies = [
- "async-trait",
- "bytes 1.2.1",
- "futures-util",
- "http",
- "http-body",
- "mime",
- "tower-layer",
- "tower-service",
-]
-
-[[package]]
-name = "axum-extra"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69034b3b0fd97923eee2ce8a47540edb21e07f48f87f67d44bb4271cec622bdb"
-dependencies = [
- "axum",
- "bytes 1.2.1",
- "futures-util",
- "http",
- "mime",
- "pin-project-lite 0.2.9",
- "serde",
- "serde_json",
- "tokio",
- "tower",
- "tower-http",
- "tower-layer",
- "tower-service",
-]
-
-[[package]]
-name = "backtrace"
-version = "0.3.66"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7"
-dependencies = [
- "addr2line",
- "cc",
- "cfg-if 1.0.0",
- "libc",
- "miniz_oxide 0.5.4",
- "object 0.29.0",
- "rustc-demangle",
-]
-
-[[package]]
-name = "base64"
-version = "0.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
-
-[[package]]
-name = "base64ct"
-version = "1.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea2b2456fd614d856680dcd9fcc660a51a820fa09daef2e49772b56a193c8474"
-
-[[package]]
-name = "bincode"
-version = "1.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "bindgen"
-version = "0.59.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8"
-dependencies = [
- "bitflags",
- "cexpr",
- "clang-sys",
- "clap 2.34.0",
- "env_logger",
- "lazy_static",
- "lazycell",
- "log",
- "peeking_take_while",
- "proc-macro2",
- "quote",
- "regex",
- "rustc-hash",
- "shlex",
- "which",
-]
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "block"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
-
-[[package]]
-name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "block-buffer"
-version = "0.10.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "blocking"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6ccb65d468978a086b69884437ded69a90faab3bbe6e67f242173ea728acccc"
-dependencies = [
- "async-channel",
- "async-task",
- "atomic-waker",
- "fastrand",
- "futures-lite",
- "once_cell",
-]
-
-[[package]]
-name = "breadcrumbs"
-version = "0.1.0"
-dependencies = [
- "collections",
- "editor",
- "gpui",
- "itertools",
- "language",
- "project",
- "search",
- "settings",
- "theme",
- "workspace",
-]
-
-[[package]]
-name = "bromberg_sl2"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ed88064f69518b7e3ea50ecfc1b61d43f19248618a377b95ae5c8b611134d4d"
-dependencies = [
- "digest 0.9.0",
- "lazy_static",
- "rayon",
- "seq-macro",
-]
-
-[[package]]
-name = "bstr"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "bumpalo"
-version = "3.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d"
-
-[[package]]
-name = "bytemuck"
-version = "1.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da"
-
-[[package]]
-name = "byteorder"
-version = "1.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
-
-[[package]]
-name = "bytes"
-version = "0.4.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c"
-dependencies = [
- "byteorder",
- "iovec",
-]
-
-[[package]]
-name = "bytes"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db"
-
-[[package]]
-name = "bzip2-sys"
-version = "0.1.11+1.0.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
-]
-
-[[package]]
-name = "cache-padded"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c"
-
-[[package]]
-name = "cap-fs-ext"
-version = "0.24.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e54b86398b5852ddd45784b1d9b196b98beb39171821bad4b8b44534a1e87927"
-dependencies = [
- "cap-primitives",
- "cap-std",
- "io-lifetimes",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "cap-primitives"
-version = "0.24.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb8fca3e81fae1d91a36e9784ca22a39ef623702b5f7904d89dc31f10184a178"
-dependencies = [
- "ambient-authority",
- "errno",
- "fs-set-times",
- "io-extras",
- "io-lifetimes",
- "ipnet",
- "maybe-owned",
- "rustix",
- "winapi 0.3.9",
- "winapi-util",
- "winx",
-]
-
-[[package]]
-name = "cap-rand"
-version = "0.24.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3b27294116983d706f4c8168f6d10c84f9f5daed0c28bc7d0296cf16bcf971"
-dependencies = [
- "ambient-authority",
- "rand 0.8.5",
-]
-
-[[package]]
-name = "cap-std"
-version = "0.24.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2247568946095c7765ad2b441a56caffc08027734c634a6d5edda648f04e32eb"
-dependencies = [
- "cap-primitives",
- "io-extras",
- "io-lifetimes",
- "ipnet",
- "rustix",
-]
-
-[[package]]
-name = "cap-time-ext"
-version = "0.24.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c50472b6ebc302af0401fa3fb939694cd8ff00e0d4c9182001e434fc822ab83a"
-dependencies = [
- "cap-primitives",
- "once_cell",
- "rustix",
- "winx",
-]
-
-[[package]]
-name = "capture"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "bindgen",
- "block",
- "byteorder",
- "bytes 1.2.1",
- "cocoa",
- "core-foundation",
- "core-graphics",
- "foreign-types",
- "futures 0.3.24",
- "gpui",
- "hmac 0.12.1",
- "jwt",
- "live_kit",
- "log",
- "media",
- "objc",
- "parking_lot 0.11.2",
- "postage",
- "serde",
- "sha2 0.10.6",
- "simplelog",
-]
-
-[[package]]
-name = "castaway"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6"
-
-[[package]]
-name = "cc"
-version = "1.0.73"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
-dependencies = [
- "jobserver",
-]
-
-[[package]]
-name = "cexpr"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
-dependencies = [
- "nom",
-]
-
-[[package]]
-name = "cfg-if"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "chat_panel"
-version = "0.1.0"
-dependencies = [
- "client",
- "editor",
- "gpui",
- "menu",
- "postage",
- "settings",
- "theme",
- "time 0.3.15",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "chrono"
-version = "0.4.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1"
-dependencies = [
- "iana-time-zone",
- "js-sys",
- "num-integer",
- "num-traits",
- "time 0.1.44",
- "wasm-bindgen",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "chunked_transfer"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e"
-
-[[package]]
-name = "cipher"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "clang-sys"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3"
-dependencies = [
- "glob",
- "libc",
- "libloading",
-]
-
-[[package]]
-name = "clap"
-version = "2.34.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
-dependencies = [
- "ansi_term",
- "atty",
- "bitflags",
- "strsim 0.8.0",
- "textwrap 0.11.0",
- "unicode-width",
- "vec_map",
-]
-
-[[package]]
-name = "clap"
-version = "3.2.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750"
-dependencies = [
- "atty",
- "bitflags",
- "clap_derive",
- "clap_lex",
- "indexmap",
- "once_cell",
- "strsim 0.10.0",
- "termcolor",
- "textwrap 0.15.1",
-]
-
-[[package]]
-name = "clap_derive"
-version = "3.2.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65"
-dependencies = [
- "heck 0.4.0",
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "clap_lex"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
-dependencies = [
- "os_str_bytes",
-]
-
-[[package]]
-name = "cli"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "clap 3.2.22",
- "core-foundation",
- "core-services",
- "dirs 3.0.2",
- "ipc-channel",
- "plist",
- "serde",
-]
-
-[[package]]
-name = "client"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "async-recursion",
- "async-tungstenite",
- "collections",
- "db",
- "futures 0.3.24",
- "gpui",
- "image",
- "isahc",
- "lazy_static",
- "log",
- "parking_lot 0.11.2",
- "postage",
- "rand 0.8.5",
- "rpc",
- "serde",
- "smol",
- "sum_tree",
- "tempfile",
- "thiserror",
- "time 0.3.15",
- "tiny_http",
- "url",
- "util",
- "uuid 1.2.1",
-]
-
-[[package]]
-name = "clock"
-version = "0.1.0"
-dependencies = [
- "smallvec",
-]
-
-[[package]]
-name = "cmake"
-version = "0.1.48"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "cocoa"
-version = "0.24.0"
-source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85"
-dependencies = [
- "bitflags",
- "block",
- "cocoa-foundation",
- "core-foundation",
- "core-graphics",
- "foreign-types",
- "libc",
- "objc",
-]
-
-[[package]]
-name = "cocoa-foundation"
-version = "0.1.1"
-source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85"
-dependencies = [
- "bitflags",
- "block",
- "core-foundation",
- "core-graphics-types",
- "foreign-types",
- "libc",
- "objc",
-]
-
-[[package]]
-name = "codespan-reporting"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
-dependencies = [
- "termcolor",
- "unicode-width",
-]
-
-[[package]]
-name = "collab"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "async-trait",
- "async-tungstenite",
- "axum",
- "axum-extra",
- "base64",
- "clap 3.2.22",
- "client",
- "collections",
- "ctor",
- "editor",
- "env_logger",
- "envy",
- "futures 0.3.24",
- "git",
- "gpui",
- "hyper",
- "language",
- "lazy_static",
- "lipsum",
- "log",
- "lsp",
- "nanoid",
- "parking_lot 0.11.2",
- "project",
- "prometheus",
- "rand 0.8.5",
- "reqwest",
- "rpc",
- "scrypt",
- "serde",
- "serde_json",
- "settings",
- "sha-1 0.9.8",
- "sqlx",
- "theme",
- "time 0.3.15",
- "tokio",
- "tokio-tungstenite",
- "toml",
- "tonic",
- "tower",
- "tracing",
- "tracing-log",
- "tracing-subscriber",
- "unindent",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "collections"
-version = "0.1.0"
-dependencies = [
- "seahash",
-]
-
-[[package]]
-name = "color_quant"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
-
-[[package]]
-name = "command_palette"
-version = "0.1.0"
-dependencies = [
- "collections",
- "ctor",
- "editor",
- "env_logger",
- "fuzzy",
- "gpui",
- "picker",
- "project",
- "serde_json",
- "settings",
- "theme",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "concurrent-queue"
-version = "1.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af4780a44ab5696ea9e28294517f1fffb421a83a25af521333c838635509db9c"
-dependencies = [
- "cache-padded",
-]
-
-[[package]]
-name = "contacts_panel"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "client",
- "collections",
- "editor",
- "futures 0.3.24",
- "fuzzy",
- "gpui",
- "language",
- "log",
- "menu",
- "picker",
- "postage",
- "project",
- "serde",
- "settings",
- "theme",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "contacts_status_item"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "client",
- "collections",
- "editor",
- "futures 0.3.24",
- "fuzzy",
- "gpui",
- "language",
- "log",
- "menu",
- "picker",
- "postage",
- "project",
- "serde",
- "settings",
- "theme",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "context_menu"
-version = "0.1.0"
-dependencies = [
- "gpui",
- "menu",
- "settings",
- "smallvec",
- "theme",
-]
-
-[[package]]
-name = "core-foundation"
-version = "0.9.3"
-source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "core-foundation-sys"
-version = "0.8.3"
-source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85"
-
-[[package]]
-name = "core-graphics"
-version = "0.22.3"
-source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85"
-dependencies = [
- "bitflags",
- "core-foundation",
- "core-graphics-types",
- "foreign-types",
- "libc",
-]
-
-[[package]]
-name = "core-graphics-types"
-version = "0.1.1"
-source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85"
-dependencies = [
- "bitflags",
- "core-foundation",
- "foreign-types",
- "libc",
-]
-
-[[package]]
-name = "core-services"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51b344b958cae90858bf6086f49599ecc5ec8698eacad0ea155509ba11fab347"
-dependencies = [
- "core-foundation",
-]
-
-[[package]]
-name = "core-text"
-version = "19.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99d74ada66e07c1cefa18f8abfba765b486f250de2e4a999e5727fc0dd4b4a25"
-dependencies = [
- "core-foundation",
- "core-graphics",
- "foreign-types",
- "libc",
-]
-
-[[package]]
-name = "cpp_demangle"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f"
-dependencies = [
- "cfg-if 1.0.0",
-]
-
-[[package]]
-name = "cpufeatures"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "cranelift-bforest"
-version = "0.85.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "749d0d6022c9038dccf480bdde2a38d435937335bf2bb0f14e815d94517cdce8"
-dependencies = [
- "cranelift-entity",
-]
-
-[[package]]
-name = "cranelift-codegen"
-version = "0.85.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e94370cc7b37bf652ccd8bb8f09bd900997f7ccf97520edfc75554bb5c4abbea"
-dependencies = [
- "cranelift-bforest",
- "cranelift-codegen-meta",
- "cranelift-codegen-shared",
- "cranelift-entity",
- "cranelift-isle",
- "gimli",
- "log",
- "regalloc2",
- "smallvec",
- "target-lexicon",
-]
-
-[[package]]
-name = "cranelift-codegen-meta"
-version = "0.85.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0a3cea8fdab90e44018c5b9a1dfd460d8ee265ac354337150222a354628bdb6"
-dependencies = [
- "cranelift-codegen-shared",
-]
-
-[[package]]
-name = "cranelift-codegen-shared"
-version = "0.85.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ac72f76f2698598951ab26d8c96eaa854810e693e7dd52523958b5909fde6b2"
-
-[[package]]
-name = "cranelift-entity"
-version = "0.85.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09eaeacfcd2356fe0e66b295e8f9d59fdd1ac3ace53ba50de14d628ec902f72d"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "cranelift-frontend"
-version = "0.85.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dba69c9980d5ffd62c18a2bde927855fcd7c8dc92f29feaf8636052662cbd99c"
-dependencies = [
- "cranelift-codegen",
- "log",
- "smallvec",
- "target-lexicon",
-]
-
-[[package]]
-name = "cranelift-isle"
-version = "0.85.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2920dc1e05cac40304456ed3301fde2c09bd6a9b0210bcfa2f101398d628d5b"
-
-[[package]]
-name = "cranelift-native"
-version = "0.85.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f04dfa45f9b2a6f587c564d6b63388e00cd6589d2df6ea2758cf79e1a13285e6"
-dependencies = [
- "cranelift-codegen",
- "libc",
- "target-lexicon",
-]
-
-[[package]]
-name = "cranelift-wasm"
-version = "0.85.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31a46513ae6f26f3f267d8d75b5373d555fbbd1e68681f348d99df43f747ec54"
-dependencies = [
- "cranelift-codegen",
- "cranelift-entity",
- "cranelift-frontend",
- "itertools",
- "log",
- "smallvec",
- "wasmparser",
- "wasmtime-types",
-]
-
-[[package]]
-name = "crc"
-version = "3.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3"
-dependencies = [
- "crc-catalog",
-]
-
-[[package]]
-name = "crc-catalog"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d0165d2900ae6778e36e80bbc4da3b5eefccee9ba939761f9c2882a5d9af3ff"
-
-[[package]]
-name = "crc32fast"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
-dependencies = [
- "cfg-if 1.0.0",
-]
-
-[[package]]
-name = "crossbeam-channel"
-version = "0.4.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87"
-dependencies = [
- "crossbeam-utils 0.7.2",
- "maybe-uninit",
-]
-
-[[package]]
-name = "crossbeam-channel"
-version = "0.5.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
-dependencies = [
- "cfg-if 1.0.0",
- "crossbeam-utils 0.8.12",
-]
-
-[[package]]
-name = "crossbeam-deque"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
-dependencies = [
- "cfg-if 1.0.0",
- "crossbeam-epoch",
- "crossbeam-utils 0.8.12",
-]
-
-[[package]]
-name = "crossbeam-epoch"
-version = "0.9.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348"
-dependencies = [
- "autocfg 1.1.0",
- "cfg-if 1.0.0",
- "crossbeam-utils 0.8.12",
- "memoffset",
- "scopeguard",
-]
-
-[[package]]
-name = "crossbeam-queue"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7"
-dependencies = [
- "cfg-if 1.0.0",
- "crossbeam-utils 0.8.12",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
-dependencies = [
- "autocfg 1.1.0",
- "cfg-if 0.1.10",
- "lazy_static",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.8.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac"
-dependencies = [
- "cfg-if 1.0.0",
-]
-
-[[package]]
-name = "crypto-common"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
-dependencies = [
- "generic-array",
- "typenum",
-]
-
-[[package]]
-name = "crypto-mac"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714"
-dependencies = [
- "generic-array",
- "subtle",
-]
-
-[[package]]
-name = "ctor"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdffe87e1d521a10f9696f833fe502293ea446d7f256c06128293a4119bdf4cb"
-dependencies = [
- "quote",
- "syn",
-]
-
-[[package]]
-name = "curl"
-version = "0.4.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22"
-dependencies = [
- "curl-sys",
- "libc",
- "openssl-probe",
- "openssl-sys",
- "schannel",
- "socket2",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "curl-sys"
-version = "0.4.56+curl-7.83.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6093e169dd4de29e468fa649fbae11cdcd5551c81fe5bf1b0677adad7ef3d26f"
-dependencies = [
- "cc",
- "libc",
- "libnghttp2-sys",
- "libz-sys",
- "openssl-sys",
- "pkg-config",
- "vcpkg",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "cxx"
-version = "1.0.78"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19f39818dcfc97d45b03953c1292efc4e80954e1583c4aa770bac1383e2310a4"
-dependencies = [
- "cc",
- "cxxbridge-flags",
- "cxxbridge-macro",
- "link-cplusplus",
-]
-
-[[package]]
-name = "cxx-build"
-version = "1.0.78"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e580d70777c116df50c390d1211993f62d40302881e54d4b79727acb83d0199"
-dependencies = [
- "cc",
- "codespan-reporting",
- "once_cell",
- "proc-macro2",
- "quote",
- "scratch",
- "syn",
-]
-
-[[package]]
-name = "cxxbridge-flags"
-version = "1.0.78"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56a46460b88d1cec95112c8c363f0e2c39afdb237f60583b0b36343bf627ea9c"
-
-[[package]]
-name = "cxxbridge-macro"
-version = "1.0.78"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "747b608fecf06b0d72d440f27acc99288207324b793be2c17991839f3d4995ea"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "data-url"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193"
-dependencies = [
- "matches",
-]
-
-[[package]]
-name = "db"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "async-trait",
- "collections",
- "gpui",
- "parking_lot 0.11.2",
- "rocksdb",
- "tempdir",
-]
-
-[[package]]
-name = "deflate"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
-dependencies = [
- "adler32",
- "byteorder",
-]
-
-[[package]]
-name = "dhat"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0684eaa19a59be283a6f99369917b679bd4d1d06604b2eb2e2f87b4bbd67668d"
-dependencies = [
- "backtrace",
- "lazy_static",
- "parking_lot 0.12.1",
- "rustc-hash",
- "serde",
- "serde_json",
- "thousands",
-]
-
-[[package]]
-name = "diagnostics"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "client",
- "collections",
- "editor",
- "gpui",
- "language",
- "postage",
- "project",
- "serde_json",
- "settings",
- "smallvec",
- "theme",
- "unindent",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "digest"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "digest"
-version = "0.10.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c"
-dependencies = [
- "block-buffer 0.10.3",
- "crypto-common",
- "subtle",
-]
-
-[[package]]
-name = "directories-next"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc"
-dependencies = [
- "cfg-if 1.0.0",
- "dirs-sys-next",
-]
-
-[[package]]
-name = "dirs"
-version = "3.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309"
-dependencies = [
- "dirs-sys",
-]
-
-[[package]]
-name = "dirs"
-version = "4.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
-dependencies = [
- "dirs-sys",
-]
-
-[[package]]
-name = "dirs-next"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
-dependencies = [
- "cfg-if 1.0.0",
- "dirs-sys-next",
-]
-
-[[package]]
-name = "dirs-sys"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
-dependencies = [
- "libc",
- "redox_users",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "dirs-sys-next"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
-dependencies = [
- "libc",
- "redox_users",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "dotenvy"
-version = "0.15.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed9155c8f4dc55c7470ae9da3f63c6785245093b3f6aeb0f5bf2e968efbba314"
-dependencies = [
- "dirs 4.0.0",
-]
-
-[[package]]
-name = "drag_and_drop"
-version = "0.1.0"
-dependencies = [
- "collections",
- "gpui",
-]
-
-[[package]]
-name = "dwrote"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "439a1c2ba5611ad3ed731280541d36d2e9c4ac5e7fb818a27b604bdc5a6aa65b"
-dependencies = [
- "lazy_static",
- "libc",
- "winapi 0.3.9",
- "wio",
-]
-
-[[package]]
-name = "dyn-clone"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f94fa09c2aeea5b8839e414b7b841bf429fd25b9c522116ac97ee87856d88b2"
-
-[[package]]
-name = "easy-parallel"
-version = "3.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6907e25393cdcc1f4f3f513d9aac1e840eb1cc341a0fccb01171f7d14d10b946"
-
-[[package]]
-name = "editor"
-version = "0.1.0"
-dependencies = [
- "aho-corasick",
- "anyhow",
- "clock",
- "collections",
- "context_menu",
- "ctor",
- "env_logger",
- "futures 0.3.24",
- "fuzzy",
- "git",
- "gpui",
- "indoc",
- "itertools",
- "language",
- "lazy_static",
- "log",
- "lsp",
- "ordered-float",
- "parking_lot 0.11.2",
- "postage",
- "project",
- "rand 0.8.5",
- "rpc",
- "serde",
- "settings",
- "smallvec",
- "smol",
- "snippet",
- "sum_tree",
- "text",
- "theme",
- "tree-sitter",
- "tree-sitter-html",
- "tree-sitter-javascript",
- "tree-sitter-rust",
- "unindent",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "either"
-version = "1.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
-
-[[package]]
-name = "encoding_rs"
-version = "0.8.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b"
-dependencies = [
- "cfg-if 1.0.0",
-]
-
-[[package]]
-name = "env_logger"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c90bf5f19754d10198ccb95b70664fc925bd1fc090a0fd9a6ebc54acc8cd6272"
-dependencies = [
- "atty",
- "humantime",
- "log",
- "regex",
- "termcolor",
-]
-
-[[package]]
-name = "envy"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f47e0157f2cb54f5ae1bd371b30a2ae4311e1c028f575cd4e81de7353215965"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "erased-serde"
-version = "0.3.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54558e0ba96fbe24280072642eceb9d7d442e32c7ec0ea9e7ecd7b4ea2cf4e11"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "errno"
-version = "0.2.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
-dependencies = [
- "errno-dragonfly",
- "libc",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "errno-dragonfly"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
-dependencies = [
- "cc",
- "libc",
-]
-
-[[package]]
-name = "etagere"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6301151a318f367f392c31395beb1cfba5ccd9abc44d1db0db3a4b27b9601c89"
-dependencies = [
- "euclid",
- "svg_fmt",
-]
-
-[[package]]
-name = "euclid"
-version = "0.22.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b52c2ef4a78da0ba68fbe1fd920627411096d2ac478f7f4c9f3a54ba6705bade"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "event-listener"
-version = "2.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
-
-[[package]]
-name = "expat-sys"
-version = "2.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "658f19728920138342f68408b7cf7644d90d4784353d8ebc32e7e8663dbe45fa"
-dependencies = [
- "cmake",
- "pkg-config",
-]
-
-[[package]]
-name = "fallible-iterator"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
-
-[[package]]
-name = "fastrand"
-version = "1.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
-dependencies = [
- "instant",
-]
-
-[[package]]
-name = "file-per-thread-logger"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21e16290574b39ee41c71aeb90ae960c504ebaf1e2a1c87bd52aa56ed6e1a02f"
-dependencies = [
- "env_logger",
- "log",
-]
-
-[[package]]
-name = "file_finder"
-version = "0.1.0"
-dependencies = [
- "ctor",
- "editor",
- "env_logger",
- "fuzzy",
- "gpui",
- "menu",
- "picker",
- "postage",
- "project",
- "serde_json",
- "settings",
- "theme",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "fixedbitset"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
-
-[[package]]
-name = "flate2"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6"
-dependencies = [
- "crc32fast",
- "miniz_oxide 0.5.4",
-]
-
-[[package]]
-name = "float-cmp"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75224bec9bfe1a65e2d34132933f2de7fe79900c96a0174307554244ece8150e"
-
-[[package]]
-name = "float-ord"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bad48618fdb549078c333a7a8528acb57af271d0433bdecd523eb620628364e"
-
-[[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
-[[package]]
-name = "font-kit"
-version = "0.10.0"
-source = "git+https://github.com/zed-industries/font-kit?rev=8eaf7a918eafa28b0a37dc759e2e0e7683fa24f1#8eaf7a918eafa28b0a37dc759e2e0e7683fa24f1"
-dependencies = [
- "bitflags",
- "byteorder",
- "core-foundation",
- "core-graphics",
- "core-text",
- "dirs-next",
- "dwrote",
- "float-ord",
- "freetype",
- "lazy_static",
- "libc",
- "log",
- "pathfinder_geometry",
- "pathfinder_simd",
- "servo-fontconfig",
- "walkdir",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "fontdb"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e58903f4f8d5b58c7d300908e4ebe5289c1bfdf5587964330f12023b8ff17fd1"
-dependencies = [
- "log",
- "memmap2",
- "ttf-parser 0.12.3",
-]
-
-[[package]]
-name = "foreign-types"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
-dependencies = [
- "foreign-types-shared",
-]
-
-[[package]]
-name = "foreign-types-shared"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
-
-[[package]]
-name = "form_urlencoded"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
-dependencies = [
- "percent-encoding",
-]
-
-[[package]]
-name = "freetype"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bee38378a9e3db1cc693b4f88d166ae375338a0ff75cb8263e1c601d51f35dc6"
-dependencies = [
- "freetype-sys",
- "libc",
-]
-
-[[package]]
-name = "freetype-sys"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a37d4011c0cc628dfa766fcc195454f4b068d7afdc2adfd28861191d866e731a"
-dependencies = [
- "cmake",
- "libc",
- "pkg-config",
-]
-
-[[package]]
-name = "fs-set-times"
-version = "0.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7df62ee66ee2d532ea8d567b5a3f0d03ecd64636b98bad5be1e93dcc918b92aa"
-dependencies = [
- "io-lifetimes",
- "rustix",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "fsevent"
-version = "2.0.2"
-dependencies = [
- "bitflags",
- "fsevent-sys",
- "parking_lot 0.11.2",
- "tempdir",
-]
-
-[[package]]
-name = "fsevent-sys"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca6f5e6817058771c10f0eb0f05ddf1e35844266f972004fe8e4b21fda295bd5"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "fuchsia-cprng"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
-
-[[package]]
-name = "fuchsia-zircon"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
-dependencies = [
- "bitflags",
- "fuchsia-zircon-sys",
-]
-
-[[package]]
-name = "fuchsia-zircon-sys"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
-
-[[package]]
-name = "futures"
-version = "0.1.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678"
-
-[[package]]
-name = "futures"
-version = "0.3.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-io",
- "futures-sink",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-channel"
-version = "0.3.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050"
-dependencies = [
- "futures-core",
- "futures-sink",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf"
-
-[[package]]
-name = "futures-executor"
-version = "0.3.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab"
-dependencies = [
- "futures-core",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-intrusive"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e"
-dependencies = [
- "futures-core",
- "lock_api",
- "parking_lot 0.11.2",
-]
-
-[[package]]
-name = "futures-io"
-version = "0.3.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68"
-
-[[package]]
-name = "futures-lite"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48"
-dependencies = [
- "fastrand",
- "futures-core",
- "futures-io",
- "memchr",
- "parking",
- "pin-project-lite 0.2.9",
- "waker-fn",
-]
-
-[[package]]
-name = "futures-macro"
-version = "0.3.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "futures-sink"
-version = "0.3.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56"
-
-[[package]]
-name = "futures-task"
-version = "0.3.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1"
-
-[[package]]
-name = "futures-util"
-version = "0.3.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90"
-dependencies = [
- "futures 0.1.31",
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-macro",
- "futures-sink",
- "futures-task",
- "memchr",
- "pin-project-lite 0.2.9",
- "pin-utils",
- "slab",
- "tokio-io",
-]
-
-[[package]]
-name = "fuzzy"
-version = "0.1.0"
-dependencies = [
- "gpui",
- "util",
-]
-
-[[package]]
-name = "fxhash"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
-dependencies = [
- "byteorder",
-]
-
-[[package]]
-name = "generic-array"
-version = "0.14.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
-dependencies = [
- "typenum",
- "version_check",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.1.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
-dependencies = [
- "cfg-if 1.0.0",
- "libc",
- "wasi 0.9.0+wasi-snapshot-preview1",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6"
-dependencies = [
- "cfg-if 1.0.0",
- "libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
-]
-
-[[package]]
-name = "gif"
-version = "0.11.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06"
-dependencies = [
- "color_quant",
- "weezl",
-]
-
-[[package]]
-name = "gimli"
-version = "0.26.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d"
-dependencies = [
- "fallible-iterator",
- "indexmap",
- "stable_deref_trait",
-]
-
-[[package]]
-name = "git"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "async-trait",
- "clock",
- "collections",
- "futures 0.3.24",
- "git2",
- "lazy_static",
- "log",
- "parking_lot 0.11.2",
- "smol",
- "sum_tree",
- "text",
- "unindent",
- "util",
-]
-
-[[package]]
-name = "git2"
-version = "0.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2994bee4a3a6a51eb90c218523be382fd7ea09b16380b9312e9dbe955ff7c7d1"
-dependencies = [
- "bitflags",
- "libc",
- "libgit2-sys",
- "log",
- "url",
-]
-
-[[package]]
-name = "glob"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
-
-[[package]]
-name = "globset"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a"
-dependencies = [
- "aho-corasick",
- "bstr",
- "fnv",
- "log",
- "regex",
-]
-
-[[package]]
-name = "go_to_line"
-version = "0.1.0"
-dependencies = [
- "editor",
- "gpui",
- "menu",
- "postage",
- "settings",
- "text",
- "workspace",
-]
-
-[[package]]
-name = "gpui"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "async-task",
- "backtrace",
- "bindgen",
- "block",
- "cc",
- "cocoa",
- "collections",
- "core-foundation",
- "core-graphics",
- "core-text",
- "ctor",
- "dhat",
- "env_logger",
- "etagere",
- "font-kit",
- "foreign-types",
- "futures 0.3.24",
- "gpui_macros",
- "image",
- "lazy_static",
- "log",
- "media",
- "metal",
- "num_cpus",
- "objc",
- "ordered-float",
- "parking",
- "parking_lot 0.11.2",
- "pathfinder_color",
- "pathfinder_geometry",
- "png",
- "postage",
- "rand 0.8.5",
- "resvg",
- "seahash",
- "serde",
- "serde_json",
- "simplelog",
- "smallvec",
- "smol",
- "sum_tree",
- "time 0.3.15",
- "tiny-skia",
- "tree-sitter",
- "usvg",
- "util",
- "waker-fn",
-]
-
-[[package]]
-name = "gpui_macros"
-version = "0.1.0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "h2"
-version = "0.3.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be"
-dependencies = [
- "bytes 1.2.1",
- "fnv",
- "futures-core",
- "futures-sink",
- "futures-util",
- "http",
- "indexmap",
- "slab",
- "tokio",
- "tokio-util 0.7.4",
- "tracing",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
-dependencies = [
- "ahash",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
-dependencies = [
- "ahash",
-]
-
-[[package]]
-name = "hashlink"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa"
-dependencies = [
- "hashbrown 0.12.3",
-]
-
-[[package]]
-name = "headers"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584"
-dependencies = [
- "base64",
- "bitflags",
- "bytes 1.2.1",
- "headers-core",
- "http",
- "httpdate",
- "mime",
- "sha1",
-]
-
-[[package]]
-name = "headers-core"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429"
-dependencies = [
- "http",
-]
-
-[[package]]
-name = "heck"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
-dependencies = [
- "unicode-segmentation",
-]
-
-[[package]]
-name = "heck"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
-dependencies = [
- "unicode-segmentation",
-]
-
-[[package]]
-name = "hermit-abi"
-version = "0.1.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "hermit-abi"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "hex"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
-
-[[package]]
-name = "hkdf"
-version = "0.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437"
-dependencies = [
- "hmac 0.12.1",
-]
-
-[[package]]
-name = "hmac"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b"
-dependencies = [
- "crypto-mac",
- "digest 0.9.0",
-]
-
-[[package]]
-name = "hmac"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
-dependencies = [
- "digest 0.10.5",
-]
-
-[[package]]
-name = "http"
-version = "0.2.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399"
-dependencies = [
- "bytes 1.2.1",
- "fnv",
- "itoa",
-]
-
-[[package]]
-name = "http-body"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
-dependencies = [
- "bytes 1.2.1",
- "http",
- "pin-project-lite 0.2.9",
-]
-
-[[package]]
-name = "http-range-header"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29"
-
-[[package]]
-name = "httparse"
-version = "1.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
-
-[[package]]
-name = "httpdate"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
-
-[[package]]
-name = "humantime"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
-
-[[package]]
-name = "hyper"
-version = "0.14.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac"
-dependencies = [
- "bytes 1.2.1",
- "futures-channel",
- "futures-core",
- "futures-util",
- "h2",
- "http",
- "http-body",
- "httparse",
- "httpdate",
- "itoa",
- "pin-project-lite 0.2.9",
- "socket2",
- "tokio",
- "tower-service",
- "tracing",
- "want",
-]
-
-[[package]]
-name = "hyper-timeout"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
-dependencies = [
- "hyper",
- "pin-project-lite 0.2.9",
- "tokio",
- "tokio-io-timeout",
-]
-
-[[package]]
-name = "hyper-tls"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
-dependencies = [
- "bytes 1.2.1",
- "hyper",
- "native-tls",
- "tokio",
- "tokio-native-tls",
-]
-
-[[package]]
-name = "iana-time-zone"
-version = "0.1.51"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5a6ef98976b22b3b7f2f3a806f858cb862044cfa66805aa3ad84cb3d3b785ed"
-dependencies = [
- "android_system_properties",
- "core-foundation-sys",
- "iana-time-zone-haiku",
- "js-sys",
- "wasm-bindgen",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "iana-time-zone-haiku"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fde6edd6cef363e9359ed3c98ba64590ba9eecba2293eb5a723ab32aee8926aa"
-dependencies = [
- "cxx",
- "cxx-build",
-]
-
-[[package]]
-name = "idna"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
-dependencies = [
- "unicode-bidi",
- "unicode-normalization",
-]
-
-[[package]]
-name = "ignore"
-version = "0.4.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d"
-dependencies = [
- "crossbeam-utils 0.8.12",
- "globset",
- "lazy_static",
- "log",
- "memchr",
- "regex",
- "same-file",
- "thread_local",
- "walkdir",
- "winapi-util",
-]
-
-[[package]]
-name = "image"
-version = "0.23.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
-dependencies = [
- "bytemuck",
- "byteorder",
- "color_quant",
- "gif",
- "jpeg-decoder",
- "num-iter",
- "num-rational",
- "num-traits",
- "png",
- "scoped_threadpool",
- "tiff",
-]
-
-[[package]]
-name = "indexmap"
-version = "1.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
-dependencies = [
- "autocfg 1.1.0",
- "hashbrown 0.12.3",
- "serde",
-]
-
-[[package]]
-name = "indoc"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adab1eaa3408fb7f0c777a73e7465fd5656136fc93b670eb6df3c88c2c1344e3"
-
-[[package]]
-name = "instant"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
-dependencies = [
- "cfg-if 1.0.0",
-]
-
-[[package]]
-name = "io-extras"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0c937cc9891c12eaa8c63ad347e4a288364b1328b924886970b47a14ab8f8f8"
-dependencies = [
- "io-lifetimes",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "io-lifetimes"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec58677acfea8a15352d42fc87d11d63596ade9239e0a7c9352914417515dbe6"
-dependencies = [
- "libc",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "iovec"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "ipc-channel"
-version = "0.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cb1d9211085f0ea6f1379d944b93c4d07e8207aa3bcf49f37eda12b85081887"
-dependencies = [
- "bincode",
- "crossbeam-channel 0.4.4",
- "fnv",
- "lazy_static",
- "libc",
- "mio 0.6.23",
- "rand 0.7.3",
- "serde",
- "tempfile",
- "uuid 0.8.2",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "ipnet"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b"
-
-[[package]]
-name = "is-terminal"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c89a757e762896bdbdfadf2860d0f8b0cea5e363d8cf3e7bdfeb63d1d976352"
-dependencies = [
- "hermit-abi 0.2.6",
- "io-lifetimes",
- "rustix",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "isahc"
-version = "1.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9"
-dependencies = [
- "async-channel",
- "castaway",
- "crossbeam-utils 0.8.12",
- "curl",
- "curl-sys",
- "encoding_rs",
- "event-listener",
- "futures-lite",
- "http",
- "log",
- "mime",
- "once_cell",
- "polling",
- "slab",
- "sluice",
- "tracing",
- "tracing-futures",
- "url",
- "waker-fn",
-]
-
-[[package]]
-name = "itertools"
-version = "0.10.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
-
-[[package]]
-name = "ittapi-rs"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f712648a1ad72fbfb7adc2772c331e8d90f022f8cf30cbabefba2878dd3172b0"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "jobserver"
-version = "0.1.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "journal"
-version = "0.1.0"
-dependencies = [
- "chrono",
- "dirs 4.0.0",
- "editor",
- "gpui",
- "log",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "jpeg-decoder"
-version = "0.1.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2"
-dependencies = [
- "rayon",
-]
-
-[[package]]
-name = "js-sys"
-version = "0.3.60"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47"
-dependencies = [
- "wasm-bindgen",
-]
-
-[[package]]
-name = "json_comments"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41ee439ee368ba4a77ac70d04f14015415af8600d6c894dc1f11bd79758c57d5"
-
-[[package]]
-name = "jwt"
-version = "0.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6204285f77fe7d9784db3fdc449ecce1a0114927a51d5a41c4c7a292011c015f"
-dependencies = [
- "base64",
- "crypto-common",
- "digest 0.10.5",
- "hmac 0.12.1",
- "serde",
- "serde_json",
- "sha2 0.10.6",
-]
-
-[[package]]
-name = "kernel32-sys"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
-dependencies = [
- "winapi 0.2.8",
- "winapi-build",
-]
-
-[[package]]
-name = "kurbo"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a53776d271cfb873b17c618af0298445c88afc52837f3e948fa3fafd131f449"
-dependencies = [
- "arrayvec 0.7.2",
-]
-
-[[package]]
-name = "language"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "async-broadcast",
- "async-trait",
- "client",
- "clock",
- "collections",
- "ctor",
- "env_logger",
- "futures 0.3.24",
- "fuzzy",
- "git",
- "gpui",
- "lazy_static",
- "log",
- "lsp",
- "parking_lot 0.11.2",
- "postage",
- "rand 0.8.5",
- "regex",
- "rpc",
- "serde",
- "serde_json",
- "settings",
- "similar",
- "smallvec",
- "smol",
- "sum_tree",
- "text",
- "theme",
- "tree-sitter",
- "tree-sitter-html",
- "tree-sitter-javascript",
- "tree-sitter-json 0.19.0",
- "tree-sitter-python",
- "tree-sitter-rust",
- "tree-sitter-typescript",
- "unindent",
- "util",
-]
-
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-dependencies = [
- "spin",
-]
-
-[[package]]
-name = "lazycell"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
-
-[[package]]
-name = "leb128"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
-
-[[package]]
-name = "libc"
-version = "0.2.134"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "329c933548736bc49fd575ee68c89e8be4d260064184389a5b77517cddd99ffb"
-
-[[package]]
-name = "libgit2-sys"
-version = "0.14.0+1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47a00859c70c8a4f7218e6d1cc32875c4b55f6799445b842b0d8ed5e4c3d959b"
-dependencies = [
- "cc",
- "libc",
- "libz-sys",
- "pkg-config",
-]
-
-[[package]]
-name = "libloading"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd"
-dependencies = [
- "cfg-if 1.0.0",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "libm"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "292a948cd991e376cf75541fe5b97a1081d713c618b4f1b9500f8844e49eb565"
-
-[[package]]
-name = "libnghttp2-sys"
-version = "0.1.7+1.45.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57ed28aba195b38d5ff02b9170cbff627e336a20925e43b4945390401c5dc93f"
-dependencies = [
- "cc",
- "libc",
-]
-
-[[package]]
-name = "librocksdb-sys"
-version = "0.7.1+7.3.1"
-source = "git+https://github.com/rust-rocksdb/rust-rocksdb?rev=39dc822dde743b2a26eb160b660e8fbdab079d49#39dc822dde743b2a26eb160b660e8fbdab079d49"
-dependencies = [
- "bindgen",
- "bzip2-sys",
- "cc",
- "glob",
- "libc",
- "libz-sys",
- "zstd-sys",
-]
-
-[[package]]
-name = "libz-sys"
-version = "1.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
- "vcpkg",
-]
-
-[[package]]
-name = "line-wrap"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
-dependencies = [
- "safemem",
-]
-
-[[package]]
-name = "link-cplusplus"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "linked-hash-map"
-version = "0.5.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.0.42"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7"
-
-[[package]]
-name = "lipsum"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8451846f1f337e44486666989fbce40be804da139d5a4477d6b88ece5dc69f4"
-dependencies = [
- "rand 0.8.5",
- "rand_chacha 0.3.1",
-]
-
-[[package]]
-name = "live_kit"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "core-foundation",
- "core-graphics",
- "futures 0.3.24",
- "media",
- "parking_lot 0.11.2",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "lock_api"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
-dependencies = [
- "autocfg 1.1.0",
- "scopeguard",
-]
-
-[[package]]
-name = "log"
-version = "0.4.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
-dependencies = [
- "cfg-if 1.0.0",
- "serde",
- "value-bag",
-]
-
-[[package]]
-name = "lsp"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "async-pipe",
- "collections",
- "ctor",
- "env_logger",
- "futures 0.3.24",
- "gpui",
- "log",
- "lsp-types",
- "parking_lot 0.11.2",
- "postage",
- "serde",
- "serde_json",
- "smol",
- "unindent",
- "util",
-]
-
-[[package]]
-name = "lsp-types"
-version = "0.91.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2368312c59425dd133cb9a327afee65be0a633a8ce471d248e2202a48f8f68ae"
-dependencies = [
- "bitflags",
- "serde",
- "serde_json",
- "serde_repr",
- "url",
-]
-
-[[package]]
-name = "mach"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "malloc_buf"
-version = "0.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "matchers"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
-dependencies = [
- "regex-automata",
-]
-
-[[package]]
-name = "matches"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
-
-[[package]]
-name = "matchit"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb"
-
-[[package]]
-name = "maybe-owned"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4"
-
-[[package]]
-name = "maybe-uninit"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
-
-[[package]]
-name = "md-5"
-version = "0.10.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca"
-dependencies = [
- "digest 0.10.5",
-]
-
-[[package]]
-name = "media"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "bindgen",
- "block",
- "bytes 1.2.1",
- "core-foundation",
- "foreign-types",
- "metal",
- "objc",
-]
-
-[[package]]
-name = "memchr"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
-
-[[package]]
-name = "memfd"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6627dc657574b49d6ad27105ed671822be56e0d2547d413bfbf3e8d8fa92e7a"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "memmap2"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "723e3ebdcdc5c023db1df315364573789f8857c11b631a2fdfad7c00f5c046b4"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "memoffset"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
-dependencies = [
- "autocfg 1.1.0",
-]
-
-[[package]]
-name = "menu"
-version = "0.1.0"
-dependencies = [
- "gpui",
-]
-
-[[package]]
-name = "metal"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4598d719460ade24c7d91f335daf055bf2a7eec030728ce751814c50cdd6a26c"
-dependencies = [
- "bitflags",
- "block",
- "cocoa-foundation",
- "foreign-types",
- "log",
- "objc",
-]
-
-[[package]]
-name = "mime"
-version = "0.3.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
-
-[[package]]
-name = "minimal-lexical"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435"
-dependencies = [
- "adler32",
-]
-
-[[package]]
-name = "miniz_oxide"
-version = "0.4.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
-dependencies = [
- "adler",
- "autocfg 1.1.0",
-]
-
-[[package]]
-name = "miniz_oxide"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34"
-dependencies = [
- "adler",
-]
-
-[[package]]
-name = "mio"
-version = "0.6.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4"
-dependencies = [
- "cfg-if 0.1.10",
- "fuchsia-zircon",
- "fuchsia-zircon-sys",
- "iovec",
- "kernel32-sys",
- "libc",
- "log",
- "miow 0.2.2",
- "net2",
- "slab",
- "winapi 0.2.8",
-]
-
-[[package]]
-name = "mio"
-version = "0.8.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf"
-dependencies = [
- "libc",
- "log",
- "wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys",
-]
-
-[[package]]
-name = "mio-anonymous-pipes"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6bc513025fe5005a3aa561b50fdb2cda5a150b84800ae02acd8aa9ed62ca1a6b"
-dependencies = [
- "mio 0.6.23",
- "miow 0.3.7",
- "parking_lot 0.11.2",
- "spsc-buffer",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "mio-extras"
-version = "2.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19"
-dependencies = [
- "lazycell",
- "log",
- "mio 0.6.23",
- "slab",
-]
-
-[[package]]
-name = "mio-uds"
-version = "0.6.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0"
-dependencies = [
- "iovec",
- "libc",
- "mio 0.6.23",
-]
-
-[[package]]
-name = "miow"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d"
-dependencies = [
- "kernel32-sys",
- "net2",
- "winapi 0.2.8",
- "ws2_32-sys",
-]
-
-[[package]]
-name = "miow"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21"
-dependencies = [
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "more-asserts"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389"
-
-[[package]]
-name = "multimap"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"
-
-[[package]]
-name = "nanoid"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8"
-dependencies = [
- "rand 0.8.5",
-]
-
-[[package]]
-name = "native-tls"
-version = "0.2.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9"
-dependencies = [
- "lazy_static",
- "libc",
- "log",
- "openssl",
- "openssl-probe",
- "openssl-sys",
- "schannel",
- "security-framework",
- "security-framework-sys",
- "tempfile",
-]
-
-[[package]]
-name = "net2"
-version = "0.2.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae"
-dependencies = [
- "cfg-if 0.1.10",
- "libc",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "nix"
-version = "0.24.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc"
-dependencies = [
- "bitflags",
- "cfg-if 1.0.0",
- "libc",
- "memoffset",
-]
-
-[[package]]
-name = "nom"
-version = "7.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36"
-dependencies = [
- "memchr",
- "minimal-lexical",
-]
-
-[[package]]
-name = "ntapi"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f"
-dependencies = [
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "nu-ansi-term"
-version = "0.46.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
-dependencies = [
- "overload",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "num-bigint"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
-dependencies = [
- "autocfg 1.1.0",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-bigint-dig"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4547ee5541c18742396ae2c895d0717d0f886d8823b8399cdaf7b07d63ad0480"
-dependencies = [
- "autocfg 0.1.8",
- "byteorder",
- "lazy_static",
- "libm",
- "num-integer",
- "num-iter",
- "num-traits",
- "rand 0.8.5",
- "smallvec",
- "zeroize",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
-dependencies = [
- "autocfg 1.1.0",
- "num-traits",
-]
-
-[[package]]
-name = "num-iter"
-version = "0.1.43"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
-dependencies = [
- "autocfg 1.1.0",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-rational"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
-dependencies = [
- "autocfg 1.1.0",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
-dependencies = [
- "autocfg 1.1.0",
- "libm",
-]
-
-[[package]]
-name = "num_cpus"
-version = "1.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
-dependencies = [
- "hermit-abi 0.1.19",
- "libc",
-]
-
-[[package]]
-name = "num_threads"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "nvim-rs"
-version = "0.5.0"
-source = "git+https://github.com/KillTheMule/nvim-rs?branch=master#d701c2790dcb2579f8f4d7003ba30e2100a7d25b"
-dependencies = [
- "async-trait",
- "futures 0.3.24",
- "log",
- "parity-tokio-ipc",
- "rmp",
- "rmpv",
- "tokio",
- "tokio-util 0.7.4",
-]
-
-[[package]]
-name = "objc"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
-dependencies = [
- "malloc_buf",
- "objc_exception",
-]
-
-[[package]]
-name = "objc_exception"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "object"
-version = "0.28.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424"
-dependencies = [
- "crc32fast",
- "hashbrown 0.11.2",
- "indexmap",
- "memchr",
-]
-
-[[package]]
-name = "object"
-version = "0.29.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1"
-
-[[package]]
-name = "opaque-debug"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
-
-[[package]]
-name = "openssl"
-version = "0.10.42"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12fc0523e3bd51a692c8850d075d74dc062ccf251c0110668cbd921917118a13"
-dependencies = [
- "bitflags",
- "cfg-if 1.0.0",
- "foreign-types",
- "libc",
- "once_cell",
- "openssl-macros",
- "openssl-sys",
-]
-
-[[package]]
-name = "openssl-macros"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "openssl-probe"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
-
-[[package]]
-name = "openssl-sys"
-version = "0.9.76"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5230151e44c0f05157effb743e8d517472843121cf9243e8b81393edb5acd9ce"
-dependencies = [
- "autocfg 1.1.0",
- "cc",
- "libc",
- "pkg-config",
- "vcpkg",
-]
-
-[[package]]
-name = "ordered-float"
-version = "2.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "os_str_bytes"
-version = "6.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff"
-
-[[package]]
-name = "outline"
-version = "0.1.0"
-dependencies = [
- "editor",
- "fuzzy",
- "gpui",
- "language",
- "ordered-float",
- "picker",
- "postage",
- "settings",
- "smol",
- "text",
- "workspace",
-]
-
-[[package]]
-name = "overload"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
-
-[[package]]
-name = "parity-tokio-ipc"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9981e32fb75e004cc148f5fb70342f393830e0a4aa62e3cc93b50976218d42b6"
-dependencies = [
- "futures 0.3.24",
- "libc",
- "log",
- "rand 0.7.3",
- "tokio",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "parking"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
-
-[[package]]
-name = "parking_lot"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
-dependencies = [
- "instant",
- "lock_api",
- "parking_lot_core 0.8.5",
-]
-
-[[package]]
-name = "parking_lot"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
-dependencies = [
- "lock_api",
- "parking_lot_core 0.9.3",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
-dependencies = [
- "cfg-if 1.0.0",
- "instant",
- "libc",
- "redox_syscall",
- "smallvec",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929"
-dependencies = [
- "cfg-if 1.0.0",
- "libc",
- "redox_syscall",
- "smallvec",
- "windows-sys",
-]
-
-[[package]]
-name = "password-hash"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77e0b28ace46c5a396546bcf443bf422b57049617433d8854227352a4a9b24e7"
-dependencies = [
- "base64ct",
- "rand_core 0.6.4",
- "subtle",
-]
-
-[[package]]
-name = "paste"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1"
-
-[[package]]
-name = "pathfinder_color"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69bdc0d277d559e35e1b374de56df9262a6b71e091ca04a8831a239f8c7f0c62"
-dependencies = [
- "pathfinder_simd",
-]
-
-[[package]]
-name = "pathfinder_geometry"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3"
-dependencies = [
- "log",
- "pathfinder_simd",
-]
-
-[[package]]
-name = "pathfinder_simd"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39fe46acc5503595e5949c17b818714d26fdf9b4920eacf3b2947f0199f4a6ff"
-dependencies = [
- "rustc_version",
-]
-
-[[package]]
-name = "pbkdf2"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa"
-dependencies = [
- "crypto-mac",
-]
-
-[[package]]
-name = "peeking_take_while"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
-
-[[package]]
-name = "pem"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd56cbd21fea48d0c440b41cd69c589faacade08c992d9a54e471b79d0fd13eb"
-dependencies = [
- "base64",
- "once_cell",
- "regex",
-]
-
-[[package]]
-name = "percent-encoding"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
-
-[[package]]
-name = "pest"
-version = "2.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbc7bc69c062e492337d74d59b120c274fd3d261b6bf6d3207d499b4b379c41a"
-dependencies = [
- "thiserror",
- "ucd-trie",
-]
-
-[[package]]
-name = "petgraph"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143"
-dependencies = [
- "fixedbitset",
- "indexmap",
-]
-
-[[package]]
-name = "picker"
-version = "0.1.0"
-dependencies = [
- "ctor",
- "editor",
- "env_logger",
- "gpui",
- "menu",
- "serde_json",
- "settings",
- "theme",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "pico-args"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468"
-
-[[package]]
-name = "pin-project"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc"
-dependencies = [
- "pin-project-internal",
-]
-
-[[package]]
-name = "pin-project-internal"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "pin-project-lite"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777"
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
-
-[[package]]
-name = "pkg-config"
-version = "0.3.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
-
-[[package]]
-name = "plist"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225"
-dependencies = [
- "base64",
- "indexmap",
- "line-wrap",
- "serde",
- "time 0.3.15",
- "xml-rs",
-]
-
-[[package]]
-name = "plugin"
-version = "0.1.0"
-dependencies = [
- "bincode",
- "plugin_macros",
- "serde",
-]
-
-[[package]]
-name = "plugin_macros"
-version = "0.1.0"
-dependencies = [
- "bincode",
- "proc-macro2",
- "quote",
- "serde",
- "syn",
-]
-
-[[package]]
-name = "plugin_runtime"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "bincode",
- "pollster",
- "serde",
- "serde_json",
- "smol",
- "wasi-common",
- "wasmtime",
- "wasmtime-wasi",
-]
-
-[[package]]
-name = "png"
-version = "0.16.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6"
-dependencies = [
- "bitflags",
- "crc32fast",
- "deflate",
- "miniz_oxide 0.3.7",
-]
-
-[[package]]
-name = "polling"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "899b00b9c8ab553c743b3e11e87c5c7d423b2a2de229ba95b24a756344748011"
-dependencies = [
- "autocfg 1.1.0",
- "cfg-if 1.0.0",
- "libc",
- "log",
- "wepoll-ffi",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "pollster"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7"
-
-[[package]]
-name = "postage"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a63d25391d04a097954b76aba742b6b5b74f213dfe3dbaeeb36e8ddc1c657f0b"
-dependencies = [
- "atomic",
- "crossbeam-queue",
- "futures 0.3.24",
- "log",
- "pin-project",
- "pollster",
- "static_assertions",
- "thiserror",
-]
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
-
-[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "procinfo"
-version = "0.1.0"
-source = "git+https://github.com/zed-industries/wezterm?rev=5cd757e5f2eb039ed0c6bb6512223e69d5efc64d#5cd757e5f2eb039ed0c6bb6512223e69d5efc64d"
-dependencies = [
- "libc",
- "log",
- "ntapi",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "project"
-version = "0.1.0"
-dependencies = [
- "aho-corasick",
- "anyhow",
- "async-trait",
- "client",
- "clock",
- "collections",
- "db",
- "fsevent",
- "futures 0.3.24",
- "fuzzy",
- "git",
- "gpui",
- "ignore",
- "language",
- "lazy_static",
- "libc",
- "log",
- "lsp",
- "parking_lot 0.11.2",
- "postage",
- "pulldown-cmark",
- "rand 0.8.5",
- "regex",
- "rocksdb",
- "rpc",
- "serde",
- "serde_json",
- "settings",
- "sha2 0.10.6",
- "similar",
- "smol",
- "sum_tree",
- "tempdir",
- "text",
- "thiserror",
- "toml",
- "unindent",
- "util",
-]
-
-[[package]]
-name = "project_panel"
-version = "0.1.0"
-dependencies = [
- "context_menu",
- "editor",
- "futures 0.3.24",
- "gpui",
- "menu",
- "postage",
- "project",
- "serde_json",
- "settings",
- "theme",
- "unicase",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "project_symbols"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "editor",
- "futures 0.3.24",
- "fuzzy",
- "gpui",
- "language",
- "lsp",
- "ordered-float",
- "picker",
- "postage",
- "project",
- "settings",
- "smol",
- "text",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "prometheus"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45c8babc29389186697fe5a2a4859d697825496b83db5d0b65271cdc0488e88c"
-dependencies = [
- "cfg-if 1.0.0",
- "fnv",
- "lazy_static",
- "memchr",
- "parking_lot 0.12.1",
- "protobuf",
- "thiserror",
-]
-
-[[package]]
-name = "prost"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de5e2533f59d08fcf364fd374ebda0692a70bd6d7e66ef97f306f45c6c5d8020"
-dependencies = [
- "bytes 1.2.1",
- "prost-derive 0.8.0",
-]
-
-[[package]]
-name = "prost"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001"
-dependencies = [
- "bytes 1.2.1",
- "prost-derive 0.9.0",
-]
-
-[[package]]
-name = "prost-build"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5"
-dependencies = [
- "bytes 1.2.1",
- "heck 0.3.3",
- "itertools",
- "lazy_static",
- "log",
- "multimap",
- "petgraph",
- "prost 0.9.0",
- "prost-types",
- "regex",
- "tempfile",
- "which",
-]
-
-[[package]]
-name = "prost-derive"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "600d2f334aa05acb02a755e217ef1ab6dea4d51b58b7846588b747edec04efba"
-dependencies = [
- "anyhow",
- "itertools",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "prost-derive"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe"
-dependencies = [
- "anyhow",
- "itertools",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "prost-types"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a"
-dependencies = [
- "bytes 1.2.1",
- "prost 0.9.0",
-]
-
-[[package]]
-name = "protobuf"
-version = "2.28.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
-
-[[package]]
-name = "psm"
-version = "0.1.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "pulldown-cmark"
-version = "0.9.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d9cc634bc78768157b5cbfe988ffcd1dcba95cd2b2f03a88316c08c6d00ed63"
-dependencies = [
- "bitflags",
- "memchr",
- "unicase",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "rand"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
-dependencies = [
- "fuchsia-cprng",
- "libc",
- "rand_core 0.3.1",
- "rdrand",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "rand"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
-dependencies = [
- "getrandom 0.1.16",
- "libc",
- "rand_chacha 0.2.2",
- "rand_core 0.5.1",
- "rand_hc",
-]
-
-[[package]]
-name = "rand"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
-dependencies = [
- "libc",
- "rand_chacha 0.3.1",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.5.1",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
-dependencies = [
- "rand_core 0.4.2",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
-
-[[package]]
-name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-dependencies = [
- "getrandom 0.1.16",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-dependencies = [
- "getrandom 0.2.7",
-]
-
-[[package]]
-name = "rand_hc"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
-dependencies = [
- "rand_core 0.5.1",
-]
-
-[[package]]
-name = "rayon"
-version = "1.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d"
-dependencies = [
- "autocfg 1.1.0",
- "crossbeam-deque",
- "either",
- "rayon-core",
-]
-
-[[package]]
-name = "rayon-core"
-version = "1.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f"
-dependencies = [
- "crossbeam-channel 0.5.6",
- "crossbeam-deque",
- "crossbeam-utils 0.8.12",
- "num_cpus",
-]
-
-[[package]]
-name = "rctree"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be9e29cb19c8fe84169fcb07f8f11e66bc9e6e0280efd4715c54818296f8a4a8"
-
-[[package]]
-name = "rdrand"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
-dependencies = [
- "rand_core 0.3.1",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
-name = "redox_users"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
-dependencies = [
- "getrandom 0.2.7",
- "redox_syscall",
- "thiserror",
-]
-
-[[package]]
-name = "regalloc2"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a8d23b35d7177df3b9d31ed8a9ab4bf625c668be77a319d4f5efd4a5257701c"
-dependencies = [
- "fxhash",
- "log",
- "slice-group-by",
- "smallvec",
-]
-
-[[package]]
-name = "regex"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
-dependencies = [
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
-
-[[package]]
-name = "region"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877e54ea2adcd70d80e9179344c97f93ef0dffd6b03e1f4529e6e83ab2fa9ae0"
-dependencies = [
- "bitflags",
- "libc",
- "mach",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "remove_dir_all"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
-dependencies = [
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "reqwest"
-version = "0.11.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "431949c384f4e2ae07605ccaa56d1d9d2ecdb5cadd4f9577ccfab29f2e5149fc"
-dependencies = [
- "base64",
- "bytes 1.2.1",
- "encoding_rs",
- "futures-core",
- "futures-util",
- "h2",
- "http",
- "http-body",
- "hyper",
- "hyper-tls",
- "ipnet",
- "js-sys",
- "log",
- "mime",
- "native-tls",
- "once_cell",
- "percent-encoding",
- "pin-project-lite 0.2.9",
- "serde",
- "serde_json",
- "serde_urlencoded",
- "tokio",
- "tokio-native-tls",
- "tower-service",
- "url",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
- "winreg",
-]
-
-[[package]]
-name = "resvg"
-version = "0.14.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09697862c5c3f940cbaffef91969c62188b5c8ed385b0aef43a5ff01ddc8000f"
-dependencies = [
- "jpeg-decoder",
- "log",
- "pico-args",
- "png",
- "rgb",
- "svgfilters",
- "tiny-skia",
- "usvg",
-]
-
-[[package]]
-name = "rgb"
-version = "0.8.34"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3603b7d71ca82644f79b5a06d1220e9a58ede60bd32255f698cb1af8838b8db3"
-dependencies = [
- "bytemuck",
-]
-
-[[package]]
-name = "ring"
-version = "0.16.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
-dependencies = [
- "cc",
- "libc",
- "once_cell",
- "spin",
- "untrusted",
- "web-sys",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "rmp"
-version = "0.8.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44519172358fd6d58656c86ab8e7fbc9e1490c3e8f14d35ed78ca0dd07403c9f"
-dependencies = [
- "byteorder",
- "num-traits",
- "paste",
-]
-
-[[package]]
-name = "rmpv"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de8813b3a2f95c5138fe5925bfb8784175d88d6bff059ba8ce090aa891319754"
-dependencies = [
- "num-traits",
- "rmp",
-]
-
-[[package]]
-name = "rocksdb"
-version = "0.18.0"
-source = "git+https://github.com/rust-rocksdb/rust-rocksdb?rev=39dc822dde743b2a26eb160b660e8fbdab079d49#39dc822dde743b2a26eb160b660e8fbdab079d49"
-dependencies = [
- "libc",
- "librocksdb-sys",
-]
-
-[[package]]
-name = "roxmltree"
-version = "0.14.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b"
-dependencies = [
- "xmlparser",
-]
-
-[[package]]
-name = "rpc"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "async-lock",
- "async-tungstenite",
- "base64",
- "clock",
- "collections",
- "ctor",
- "env_logger",
- "futures 0.3.24",
- "gpui",
- "parking_lot 0.11.2",
- "prost 0.8.0",
- "prost-build",
- "rand 0.8.5",
- "rsa",
- "serde",
- "smol",
- "smol-timeout",
- "tempdir",
- "tracing",
- "util",
- "zstd",
-]
-
-[[package]]
-name = "rsa"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b0aeddcca1082112a6eeb43bf25fd7820b066aaf6eaef776e19d0a1febe38fe"
-dependencies = [
- "byteorder",
- "digest 0.9.0",
- "lazy_static",
- "num-bigint-dig",
- "num-integer",
- "num-iter",
- "num-traits",
- "pem",
- "rand 0.8.5",
- "simple_asn1",
- "subtle",
- "zeroize",
-]
-
-[[package]]
-name = "rust-embed"
-version = "6.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e26934cd67a1da1165efe61cba4047cc1b4a526019da609fcce13a1000afb5fa"
-dependencies = [
- "rust-embed-impl",
- "rust-embed-utils",
- "walkdir",
-]
-
-[[package]]
-name = "rust-embed-impl"
-version = "6.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e35d7b402e273544cc08e0824aa3404333fab8a90ac43589d3d5b72f4b346e12"
-dependencies = [
- "proc-macro2",
- "quote",
- "rust-embed-utils",
- "syn",
- "walkdir",
-]
-
-[[package]]
-name = "rust-embed-utils"
-version = "7.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1669d81dfabd1b5f8e2856b8bbe146c6192b0ba22162edc738ac0a5de18f054"
-dependencies = [
- "globset",
- "sha2 0.10.6",
- "walkdir",
-]
-
-[[package]]
-name = "rustc-demangle"
-version = "0.1.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
-
-[[package]]
-name = "rustc-hash"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
-
-[[package]]
-name = "rustc_version"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee"
-dependencies = [
- "semver",
-]
-
-[[package]]
-name = "rustix"
-version = "0.33.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "938a344304321a9da4973b9ff4f9f8db9caf4597dfd9dda6a60b523340a0fff0"
-dependencies = [
- "bitflags",
- "errno",
- "io-lifetimes",
- "itoa",
- "libc",
- "linux-raw-sys",
- "once_cell",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "rustls"
-version = "0.19.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7"
-dependencies = [
- "base64",
- "log",
- "ring",
- "sct 0.6.1",
- "webpki 0.21.4",
-]
-
-[[package]]
-name = "rustls"
-version = "0.20.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033"
-dependencies = [
- "log",
- "ring",
- "sct 0.7.0",
- "webpki 0.22.0",
-]
-
-[[package]]
-name = "rustls-pemfile"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55"
-dependencies = [
- "base64",
-]
-
-[[package]]
-name = "rustybuzz"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ab463a295d00f3692e0974a0bfd83c7a9bcd119e27e07c2beecdb1b44a09d10"
-dependencies = [
- "bitflags",
- "bytemuck",
- "smallvec",
- "ttf-parser 0.9.0",
- "unicode-bidi-mirroring",
- "unicode-ccc",
- "unicode-general-category",
- "unicode-script",
-]
-
-[[package]]
-name = "ryu"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
-
-[[package]]
-name = "safe_arch"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1ff3d6d9696af502cc3110dacce942840fb06ff4514cad92236ecc455f2ce05"
-dependencies = [
- "bytemuck",
-]
-
-[[package]]
-name = "safemem"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
-
-[[package]]
-name = "salsa20"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecbd2eb639fd7cab5804a0837fe373cc2172d15437e804c054a9fb885cb923b0"
-dependencies = [
- "cipher",
-]
-
-[[package]]
-name = "same-file"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "schannel"
-version = "0.1.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2"
-dependencies = [
- "lazy_static",
- "windows-sys",
-]
-
-[[package]]
-name = "schemars"
-version = "0.8.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a5fb6c61f29e723026dc8e923d94c694313212abbecbbe5f55a7748eec5b307"
-dependencies = [
- "dyn-clone",
- "schemars_derive",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "schemars_derive"
-version = "0.8.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f188d036977451159430f3b8dc82ec76364a42b7e289c2b18a9a18f4470058e9"
-dependencies = [
- "proc-macro2",
- "quote",
- "serde_derive_internals",
- "syn",
-]
-
-[[package]]
-name = "scoped_threadpool"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
-
-[[package]]
-name = "scopeguard"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
-
-[[package]]
-name = "scratch"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898"
-
-[[package]]
-name = "scrypt"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "879588d8f90906e73302547e20fffefdd240eb3e0e744e142321f5d49dea0518"
-dependencies = [
- "base64ct",
- "hmac 0.11.0",
- "password-hash",
- "pbkdf2",
- "salsa20",
- "sha2 0.9.9",
-]
-
-[[package]]
-name = "sct"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce"
-dependencies = [
- "ring",
- "untrusted",
-]
-
-[[package]]
-name = "sct"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
-dependencies = [
- "ring",
- "untrusted",
-]
-
-[[package]]
-name = "seahash"
-version = "4.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
-
-[[package]]
-name = "search"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "collections",
- "editor",
- "gpui",
- "language",
- "log",
- "menu",
- "postage",
- "project",
- "serde",
- "serde_json",
- "settings",
- "smallvec",
- "theme",
- "unindent",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "security-framework"
-version = "2.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c"
-dependencies = [
- "bitflags",
- "core-foundation",
- "core-foundation-sys",
- "libc",
- "security-framework-sys",
-]
-
-[[package]]
-name = "security-framework-sys"
-version = "2.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "semver"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6"
-dependencies = [
- "semver-parser",
-]
-
-[[package]]
-name = "semver-parser"
-version = "0.10.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7"
-dependencies = [
- "pest",
-]
-
-[[package]]
-name = "seq-macro"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a9f47faea3cad316faa914d013d24f471cd90bfca1a0c70f05a3f42c6441e99"
-
-[[package]]
-name = "serde"
-version = "1.0.145"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.145"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_derive_internals"
-version = "0.26.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_fmt"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2963a69a2b3918c1dc75a45a18bd3fcd1120e31d3f59deb1b2f9b5d5ffb8baa4"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.85"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44"
-dependencies = [
- "indexmap",
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "serde_path_to_error"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "184c643044780f7ceb59104cef98a5a6f12cb2288a7bc701ab93a362b49fd47d"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "serde_repr"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_urlencoded"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
-dependencies = [
- "form_urlencoded",
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "serde_yaml"
-version = "0.8.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b"
-dependencies = [
- "indexmap",
- "ryu",
- "serde",
- "yaml-rust",
-]
-
-[[package]]
-name = "servo-fontconfig"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7e3e22fe5fd73d04ebf0daa049d3efe3eae55369ce38ab16d07ddd9ac5c217c"
-dependencies = [
- "libc",
- "servo-fontconfig-sys",
-]
-
-[[package]]
-name = "servo-fontconfig-sys"
-version = "5.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e36b879db9892dfa40f95da1c38a835d41634b825fbd8c4c418093d53c24b388"
-dependencies = [
- "expat-sys",
- "freetype-sys",
- "pkg-config",
-]
-
-[[package]]
-name = "settings"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "assets",
- "collections",
- "gpui",
- "json_comments",
- "schemars",
- "serde",
- "serde_json",
- "serde_path_to_error",
- "theme",
- "toml",
- "util",
-]
-
-[[package]]
-name = "sha-1"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if 1.0.0",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug",
-]
-
-[[package]]
-name = "sha-1"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f"
-dependencies = [
- "cfg-if 1.0.0",
- "cpufeatures",
- "digest 0.10.5",
-]
-
-[[package]]
-name = "sha1"
-version = "0.10.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
-dependencies = [
- "cfg-if 1.0.0",
- "cpufeatures",
- "digest 0.10.5",
-]
-
-[[package]]
-name = "sha2"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if 1.0.0",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug",
-]
-
-[[package]]
-name = "sha2"
-version = "0.10.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
-dependencies = [
- "cfg-if 1.0.0",
- "cpufeatures",
- "digest 0.10.5",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "shellexpand"
-version = "2.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4"
-dependencies = [
- "dirs 4.0.0",
-]
-
-[[package]]
-name = "shlex"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
-
-[[package]]
-name = "signal-hook"
-version = "0.3.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d"
-dependencies = [
- "libc",
- "signal-hook-registry",
-]
-
-[[package]]
-name = "signal-hook-mio"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af"
-dependencies = [
- "libc",
- "mio 0.6.23",
- "mio-uds",
- "signal-hook",
-]
-
-[[package]]
-name = "signal-hook-registry"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "similar"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad1d488a557b235fc46dae55512ffbfc429d2482b08b4d9435ab07384ca8aec"
-
-[[package]]
-name = "simple_asn1"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eb4ea60fb301dc81dfc113df680571045d375ab7345d171c5dc7d7e13107a80"
-dependencies = [
- "chrono",
- "num-bigint",
- "num-traits",
- "thiserror",
-]
-
-[[package]]
-name = "simplecss"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d"
-dependencies = [
- "log",
-]
-
-[[package]]
-name = "simplelog"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bc0ffd69814a9b251d43afcabf96dad1b29f5028378056257be9e3fecc9f720"
-dependencies = [
- "chrono",
- "log",
- "termcolor",
-]
-
-[[package]]
-name = "siphasher"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac"
-
-[[package]]
-name = "slab"
-version = "0.4.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
-dependencies = [
- "autocfg 1.1.0",
-]
-
-[[package]]
-name = "slice-group-by"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec"
-
-[[package]]
-name = "sluice"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5"
-dependencies = [
- "async-channel",
- "futures-core",
- "futures-io",
-]
-
-[[package]]
-name = "smallvec"
-version = "1.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
-
-[[package]]
-name = "smol"
-version = "1.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85cf3b5351f3e783c1d79ab5fc604eeed8b8ae9abd36b166e8b87a089efd85e4"
-dependencies = [
- "async-channel",
- "async-executor",
- "async-fs",
- "async-io",
- "async-lock",
- "async-net",
- "async-process",
- "blocking",
- "futures-lite",
- "once_cell",
-]
-
-[[package]]
-name = "smol-timeout"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "847d777e2c6c166bad26264479e80a9820f3d364fcb4a0e23cd57bbfa8e94961"
-dependencies = [
- "async-io",
- "pin-project-lite 0.1.12",
-]
-
-[[package]]
-name = "snippet"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "smallvec",
-]
-
-[[package]]
-name = "socket2"
-version = "0.4.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd"
-dependencies = [
- "libc",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "spin"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
-
-[[package]]
-name = "spsc-buffer"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be6c3f39c37a4283ee4b43d1311c828f2e1fb0541e76ea0cb1a2abd9ef2f5b3b"
-
-[[package]]
-name = "sqlformat"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f87e292b4291f154971a43c3774364e2cbcaec599d3f5bf6fa9d122885dbc38a"
-dependencies = [
- "itertools",
- "nom",
- "unicode_categories",
-]
-
-[[package]]
-name = "sqlx"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9249290c05928352f71c077cc44a464d880c63f26f7534728cca008e135c0428"
-dependencies = [
- "sqlx-core",
- "sqlx-macros",
-]
-
-[[package]]
-name = "sqlx-core"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcbc16ddba161afc99e14d1713a453747a2b07fc097d2009f4c300ec99286105"
-dependencies = [
- "ahash",
- "atoi",
- "base64",
- "bitflags",
- "byteorder",
- "bytes 1.2.1",
- "crc",
- "crossbeam-queue",
- "dirs 4.0.0",
- "dotenvy",
- "either",
- "event-listener",
- "futures-channel",
- "futures-core",
- "futures-intrusive",
- "futures-util",
- "hashlink",
- "hex",
- "hkdf",
- "hmac 0.12.1",
- "indexmap",
- "itoa",
- "libc",
- "log",
- "md-5",
- "memchr",
- "once_cell",
- "paste",
- "percent-encoding",
- "rand 0.8.5",
- "rustls 0.20.6",
- "rustls-pemfile",
- "serde",
- "serde_json",
- "sha1",
- "sha2 0.10.6",
- "smallvec",
- "sqlformat",
- "sqlx-rt",
- "stringprep",
- "thiserror",
- "time 0.3.15",
- "tokio-stream",
- "url",
- "uuid 1.2.1",
- "webpki-roots 0.22.5",
- "whoami",
-]
-
-[[package]]
-name = "sqlx-macros"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9"
-dependencies = [
- "dotenvy",
- "either",
- "heck 0.4.0",
- "once_cell",
- "proc-macro2",
- "quote",
- "sha2 0.10.6",
- "sqlx-core",
- "sqlx-rt",
- "syn",
- "url",
-]
-
-[[package]]
-name = "sqlx-rt"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24c5b2d25fa654cc5f841750b8e1cdedbe21189bf9a9382ee90bfa9dd3562396"
-dependencies = [
- "once_cell",
- "tokio",
- "tokio-rustls",
-]
-
-[[package]]
-name = "stable_deref_trait"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
-
-[[package]]
-name = "static_assertions"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
-
-[[package]]
-name = "stringprep"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1"
-dependencies = [
- "unicode-bidi",
- "unicode-normalization",
-]
-
-[[package]]
-name = "strsim"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
-
-[[package]]
-name = "strsim"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
-
-[[package]]
-name = "subtle"
-version = "2.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
-
-[[package]]
-name = "sum_tree"
-version = "0.1.0"
-dependencies = [
- "arrayvec 0.7.2",
- "ctor",
- "env_logger",
- "log",
- "rand 0.8.5",
-]
-
-[[package]]
-name = "sval"
-version = "1.0.0-alpha.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45f6ee7c7b87caf59549e9fe45d6a69c75c8019e79e212a835c5da0e92f0ba08"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "svg_fmt"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2"
-
-[[package]]
-name = "svgfilters"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb0dce2fee79ac40c21dafba48565ff7a5fa275e23ffe9ce047a40c9574ba34e"
-dependencies = [
- "float-cmp",
- "rgb",
-]
-
-[[package]]
-name = "svgtypes"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c536faaff1a10837cfe373142583f6e27d81e96beba339147e77b67c9f260ff"
-dependencies = [
- "float-cmp",
- "siphasher",
-]
-
-[[package]]
-name = "syn"
-version = "1.0.102"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "sync_wrapper"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8"
-
-[[package]]
-name = "synstructure"
-version = "0.12.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "unicode-xid",
-]
-
-[[package]]
-name = "system-interface"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e09bb3fb4e02ec4b87e182ea9718fadbc0fa3e50085b40a9af9690572b67f9e"
-dependencies = [
- "atty",
- "bitflags",
- "cap-fs-ext",
- "cap-std",
- "io-lifetimes",
- "rustix",
- "winapi 0.3.9",
- "winx",
-]
-
-[[package]]
-name = "target-lexicon"
-version = "0.12.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1"
-
-[[package]]
-name = "tempdir"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
-dependencies = [
- "rand 0.4.6",
- "remove_dir_all",
-]
-
-[[package]]
-name = "tempfile"
-version = "3.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
-dependencies = [
- "cfg-if 1.0.0",
- "fastrand",
- "libc",
- "redox_syscall",
- "remove_dir_all",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "termcolor"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "terminal"
-version = "0.1.0"
-dependencies = [
- "alacritty_terminal",
- "anyhow",
- "client",
- "context_menu",
- "dirs 4.0.0",
- "editor",
- "futures 0.3.24",
- "gpui",
- "itertools",
- "lazy_static",
- "libc",
- "mio-extras",
- "ordered-float",
- "procinfo",
- "project",
- "rand 0.8.5",
- "serde",
- "settings",
- "shellexpand",
- "smallvec",
- "smol",
- "theme",
- "thiserror",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "text"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "arrayvec 0.7.2",
- "bromberg_sl2",
- "clock",
- "collections",
- "ctor",
- "digest 0.9.0",
- "env_logger",
- "gpui",
- "lazy_static",
- "log",
- "parking_lot 0.11.2",
- "postage",
- "rand 0.8.5",
- "regex",
- "smallvec",
- "sum_tree",
- "util",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
-dependencies = [
- "unicode-width",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16"
-
-[[package]]
-name = "theme"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "gpui",
- "indexmap",
- "parking_lot 0.11.2",
- "serde",
- "serde_json",
- "serde_path_to_error",
- "toml",
-]
-
-[[package]]
-name = "theme_selector"
-version = "0.1.0"
-dependencies = [
- "editor",
- "fuzzy",
- "gpui",
- "log",
- "parking_lot 0.11.2",
- "picker",
- "postage",
- "settings",
- "smol",
- "theme",
- "workspace",
-]
-
-[[package]]
-name = "thiserror"
-version = "1.0.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e"
-dependencies = [
- "thiserror-impl",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "1.0.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "thousands"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820"
-
-[[package]]
-name = "thread_local"
-version = "1.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180"
-dependencies = [
- "once_cell",
-]
-
-[[package]]
-name = "tiff"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437"
-dependencies = [
- "jpeg-decoder",
- "miniz_oxide 0.4.4",
- "weezl",
-]
-
-[[package]]
-name = "time"
-version = "0.1.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
-dependencies = [
- "libc",
- "wasi 0.10.0+wasi-snapshot-preview1",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "time"
-version = "0.3.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d634a985c4d4238ec39cacaed2e7ae552fbd3c476b552c1deac3021b7d7eaf0c"
-dependencies = [
- "itoa",
- "libc",
- "num_threads",
- "serde",
- "time-macros",
-]
-
-[[package]]
-name = "time-macros"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792"
-
-[[package]]
-name = "tiny-skia"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bf81f2900d2e235220e6f31ec9f63ade6a7f59090c556d74fe949bb3b15e9fe"
-dependencies = [
- "arrayref",
- "arrayvec 0.5.2",
- "bytemuck",
- "cfg-if 1.0.0",
- "png",
- "safe_arch",
-]
-
-[[package]]
-name = "tiny_http"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce51b50006056f590c9b7c3808c3bd70f0d1101666629713866c227d6e58d39"
-dependencies = [
- "ascii",
- "chrono",
- "chunked_transfer",
- "log",
- "url",
-]
-
-[[package]]
-name = "tinyvec"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
-dependencies = [
- "tinyvec_macros",
-]
-
-[[package]]
-name = "tinyvec_macros"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
-
-[[package]]
-name = "tokio"
-version = "1.21.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099"
-dependencies = [
- "autocfg 1.1.0",
- "bytes 1.2.1",
- "libc",
- "memchr",
- "mio 0.8.4",
- "num_cpus",
- "parking_lot 0.12.1",
- "pin-project-lite 0.2.9",
- "signal-hook-registry",
- "socket2",
- "tokio-macros",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "tokio-io"
-version = "0.1.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674"
-dependencies = [
- "bytes 0.4.12",
- "futures 0.1.31",
- "log",
-]
-
-[[package]]
-name = "tokio-io-timeout"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"
-dependencies = [
- "pin-project-lite 0.2.9",
- "tokio",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "1.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tokio-native-tls"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b"
-dependencies = [
- "native-tls",
- "tokio",
-]
-
-[[package]]
-name = "tokio-rustls"
-version = "0.23.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
-dependencies = [
- "rustls 0.20.6",
- "tokio",
- "webpki 0.22.0",
-]
-
-[[package]]
-name = "tokio-stream"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6edf2d6bc038a43d31353570e27270603f4648d18f5ed10c0e179abe43255af"
-dependencies = [
- "futures-core",
- "pin-project-lite 0.2.9",
- "tokio",
-]
-
-[[package]]
-name = "tokio-tungstenite"
-version = "0.17.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181"
-dependencies = [
- "futures-util",
- "log",
- "tokio",
- "tungstenite 0.17.3",
-]
-
-[[package]]
-name = "tokio-util"
-version = "0.6.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507"
-dependencies = [
- "bytes 1.2.1",
- "futures-core",
- "futures-sink",
- "log",
- "pin-project-lite 0.2.9",
- "tokio",
-]
-
-[[package]]
-name = "tokio-util"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740"
-dependencies = [
- "bytes 1.2.1",
- "futures-core",
- "futures-io",
- "futures-sink",
- "pin-project-lite 0.2.9",
- "tokio",
- "tracing",
-]
-
-[[package]]
-name = "toml"
-version = "0.5.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "tonic"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff08f4649d10a70ffa3522ca559031285d8e421d727ac85c60825761818f5d0a"
-dependencies = [
- "async-stream",
- "async-trait",
- "base64",
- "bytes 1.2.1",
- "futures-core",
- "futures-util",
- "h2",
- "http",
- "http-body",
- "hyper",
- "hyper-timeout",
- "percent-encoding",
- "pin-project",
- "prost 0.9.0",
- "prost-derive 0.9.0",
- "tokio",
- "tokio-stream",
- "tokio-util 0.6.10",
- "tower",
- "tower-layer",
- "tower-service",
- "tracing",
- "tracing-futures",
-]
-
-[[package]]
-name = "tower"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
-dependencies = [
- "futures-core",
- "futures-util",
- "indexmap",
- "pin-project",
- "pin-project-lite 0.2.9",
- "rand 0.8.5",
- "slab",
- "tokio",
- "tokio-util 0.7.4",
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
-[[package]]
-name = "tower-http"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba"
-dependencies = [
- "bitflags",
- "bytes 1.2.1",
- "futures-core",
- "futures-util",
- "http",
- "http-body",
- "http-range-header",
- "pin-project-lite 0.2.9",
- "tower",
- "tower-layer",
- "tower-service",
-]
-
-[[package]]
-name = "tower-layer"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62"
-
-[[package]]
-name = "tower-service"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
-
-[[package]]
-name = "tracing"
-version = "0.1.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
-dependencies = [
- "cfg-if 1.0.0",
- "log",
- "pin-project-lite 0.2.9",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
-dependencies = [
- "once_cell",
- "valuable",
-]
-
-[[package]]
-name = "tracing-futures"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
-dependencies = [
- "pin-project",
- "tracing",
-]
-
-[[package]]
-name = "tracing-log"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
-dependencies = [
- "lazy_static",
- "log",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-serde"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1"
-dependencies = [
- "serde",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
-dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex",
- "serde",
- "serde_json",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
- "tracing-serde",
-]
-
-[[package]]
-name = "tree-sitter"
-version = "0.20.8"
-source = "git+https://github.com/tree-sitter/tree-sitter?rev=366210ae925d7ea0891bc7a0c738f60c77c04d7b#366210ae925d7ea0891bc7a0c738f60c77c04d7b"
-dependencies = [
- "cc",
- "regex",
-]
-
-[[package]]
-name = "tree-sitter-c"
-version = "0.20.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cca211f4827d4b4dc79f388bf67b6fa3bc8a8cfa642161ef24f99f371ba34c7b"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-cpp"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a869e3c5cef4e5db4e9ab16a8dc84d73010e60ada14cdc60d2f6d8aed17779d"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-css"
-version = "0.19.0"
-source = "git+https://github.com/tree-sitter/tree-sitter-css?rev=769203d0f9abe1a9a691ac2b9fe4bb4397a73c51#769203d0f9abe1a9a691ac2b9fe4bb4397a73c51"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-elixir"
-version = "0.19.0"
-source = "git+https://github.com/elixir-lang/tree-sitter-elixir?rev=05e3631c6a0701c1fa518b0fee7be95a2ceef5e2#05e3631c6a0701c1fa518b0fee7be95a2ceef5e2"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-go"
-version = "0.19.1"
-source = "git+https://github.com/tree-sitter/tree-sitter-go?rev=aeb2f33b366fd78d5789ff104956ce23508b85db#aeb2f33b366fd78d5789ff104956ce23508b85db"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-html"
-version = "0.19.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "184e6b77953a354303dc87bf5fe36558c83569ce92606e7b382a0dc1b7443443"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-javascript"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2490fab08630b2c8943c320f7b63473cbf65511c8d83aec551beb9b4375906ed"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-json"
-version = "0.19.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90b04c4e1a92139535eb9fca4ec8fa9666cc96b618005d3ae35f3c957fa92f92"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-json"
-version = "0.20.0"
-source = "git+https://github.com/tree-sitter/tree-sitter-json?rev=137e1ce6a02698fc246cdb9c6b886ed1de9a1ed8#137e1ce6a02698fc246cdb9c6b886ed1de9a1ed8"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-markdown"
-version = "0.0.1"
-source = "git+https://github.com/MDeiml/tree-sitter-markdown?rev=330ecab87a3e3a7211ac69bbadc19eabecdb1cca#330ecab87a3e3a7211ac69bbadc19eabecdb1cca"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-python"
-version = "0.20.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dda114f58048f5059dcf158aff691dffb8e113e6d2b50d94263fd68711975287"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-rust"
-version = "0.20.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13470fafb7327a3acf96f5bc1013b5539a899a182f01c59b5af53f6b93195717"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-toml"
-version = "0.5.1"
-source = "git+https://github.com/tree-sitter/tree-sitter-toml?rev=342d9be207c2dba869b9967124c679b5e6fd0ebe#342d9be207c2dba869b9967124c679b5e6fd0ebe"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "tree-sitter-typescript"
-version = "0.20.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e8ed0ecb931cdff13c6a13f45ccd615156e2779d9ffb0395864e05505e6e86d"
-dependencies = [
- "cc",
- "tree-sitter",
-]
-
-[[package]]
-name = "try-lock"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
-
-[[package]]
-name = "ttf-parser"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62ddb402ac6c2af6f7a2844243887631c4e94b51585b229fcfddb43958cd55ca"
-
-[[package]]
-name = "ttf-parser"
-version = "0.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ae2f58a822f08abdaf668897e96a5656fe72f5a9ce66422423e8849384872e6"
-
-[[package]]
-name = "tungstenite"
-version = "0.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ad3713a14ae247f22a728a0456a545df14acf3867f905adff84be99e23b3ad1"
-dependencies = [
- "base64",
- "byteorder",
- "bytes 1.2.1",
- "http",
- "httparse",
- "log",
- "rand 0.8.5",
- "sha-1 0.9.8",
- "thiserror",
- "url",
- "utf-8",
-]
-
-[[package]]
-name = "tungstenite"
-version = "0.17.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0"
-dependencies = [
- "base64",
- "byteorder",
- "bytes 1.2.1",
- "http",
- "httparse",
- "log",
- "rand 0.8.5",
- "sha-1 0.10.0",
- "thiserror",
- "url",
- "utf-8",
-]
-
-[[package]]
-name = "typenum"
-version = "1.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
-
-[[package]]
-name = "ucd-trie"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81"
-
-[[package]]
-name = "unicase"
-version = "2.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
-dependencies = [
- "version_check",
-]
-
-[[package]]
-name = "unicode-bidi"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
-
-[[package]]
-name = "unicode-bidi-mirroring"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694"
-
-[[package]]
-name = "unicode-ccc"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1"
-
-[[package]]
-name = "unicode-general-category"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f9af028e052a610d99e066b33304625dea9613170a2563314490a4e6ec5cf7f"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
-
-[[package]]
-name = "unicode-normalization"
-version = "0.1.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
-dependencies = [
- "tinyvec",
-]
-
-[[package]]
-name = "unicode-script"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d817255e1bed6dfd4ca47258685d14d2bdcfbc64fdc9e3819bd5848057b8ecc"
-
-[[package]]
-name = "unicode-segmentation"
-version = "1.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a"
-
-[[package]]
-name = "unicode-vo"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94"
-
-[[package]]
-name = "unicode-width"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
-
-[[package]]
-name = "unicode_categories"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
-
-[[package]]
-name = "unindent"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58ee9362deb4a96cef4d437d1ad49cffc9b9e92d202b6995674e928ce684f112"
-
-[[package]]
-name = "untrusted"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
-
-[[package]]
-name = "url"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
-dependencies = [
- "form_urlencoded",
- "idna",
- "percent-encoding",
- "serde",
-]
-
-[[package]]
-name = "usvg"
-version = "0.14.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef8352f317d8f9a918ba5154797fb2a93e2730244041cf7d5be35148266adfa5"
-dependencies = [
- "base64",
- "data-url",
- "flate2",
- "fontdb",
- "kurbo",
- "log",
- "memmap2",
- "pico-args",
- "rctree",
- "roxmltree",
- "rustybuzz",
- "simplecss",
- "siphasher",
- "svgtypes",
- "ttf-parser 0.12.3",
- "unicode-bidi",
- "unicode-script",
- "unicode-vo",
- "xmlwriter",
-]
-
-[[package]]
-name = "utf-8"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
-
-[[package]]
-name = "utf8parse"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372"
-
-[[package]]
-name = "util"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "futures 0.3.24",
- "git2",
- "lazy_static",
- "log",
- "rand 0.8.5",
- "serde_json",
- "tempdir",
-]
-
-[[package]]
-name = "uuid"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
-dependencies = [
- "getrandom 0.2.7",
-]
-
-[[package]]
-name = "uuid"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "feb41e78f93363bb2df8b0e86a2ca30eed7806ea16ea0c790d757cf93f79be83"
-dependencies = [
- "getrandom 0.2.7",
-]
-
-[[package]]
-name = "valuable"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
-
-[[package]]
-name = "value-bag"
-version = "1.0.0-alpha.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55"
-dependencies = [
- "ctor",
- "erased-serde",
- "serde",
- "serde_fmt",
- "sval",
- "version_check",
-]
-
-[[package]]
-name = "vcpkg"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
-
-[[package]]
-name = "vec_map"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
-
-[[package]]
-name = "version_check"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
-
-[[package]]
-name = "vim"
-version = "0.1.0"
-dependencies = [
- "assets",
- "async-compat",
- "async-trait",
- "collections",
- "command_palette",
- "editor",
- "gpui",
- "indoc",
- "itertools",
- "language",
- "log",
- "nvim-rs",
- "project",
- "search",
- "serde",
- "serde_json",
- "settings",
- "tokio",
- "util",
- "workspace",
-]
-
-[[package]]
-name = "vte"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983"
-dependencies = [
- "utf8parse",
- "vte_generate_state_changes",
-]
-
-[[package]]
-name = "vte_generate_state_changes"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff"
-dependencies = [
- "proc-macro2",
- "quote",
-]
-
-[[package]]
-name = "waker-fn"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
-
-[[package]]
-name = "walkdir"
-version = "2.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
-dependencies = [
- "same-file",
- "winapi 0.3.9",
- "winapi-util",
-]
-
-[[package]]
-name = "want"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
-dependencies = [
- "log",
- "try-lock",
-]
-
-[[package]]
-name = "wasi"
-version = "0.9.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
-
-[[package]]
-name = "wasi"
-version = "0.10.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
-
-[[package]]
-name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
-
-[[package]]
-name = "wasi-cap-std-sync"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f086c5026d2fc3b268d138e65373f46422cc810f46d6e0776859c5027cb18728"
-dependencies = [
- "anyhow",
- "async-trait",
- "cap-fs-ext",
- "cap-rand",
- "cap-std",
- "cap-time-ext",
- "fs-set-times",
- "io-extras",
- "io-lifetimes",
- "is-terminal",
- "lazy_static",
- "rustix",
- "system-interface",
- "tracing",
- "wasi-common",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "wasi-common"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e8844fede1c3787cc08853872f47e8bd91f6c939c7406bc7a5dba496b260c08"
-dependencies = [
- "anyhow",
- "bitflags",
- "cap-rand",
- "cap-std",
- "io-extras",
- "rustix",
- "thiserror",
- "tracing",
- "wiggle",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "wasm-bindgen"
-version = "0.2.83"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268"
-dependencies = [
- "cfg-if 1.0.0",
- "wasm-bindgen-macro",
-]
-
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.83"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142"
-dependencies = [
- "bumpalo",
- "log",
- "once_cell",
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-futures"
-version = "0.4.33"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d"
-dependencies = [
- "cfg-if 1.0.0",
- "js-sys",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "wasm-bindgen-macro"
-version = "0.2.83"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810"
-dependencies = [
- "quote",
- "wasm-bindgen-macro-support",
-]
-
-[[package]]
-name = "wasm-bindgen-macro-support"
-version = "0.2.83"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-backend",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-shared"
-version = "0.2.83"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f"
-
-[[package]]
-name = "wasm-encoder"
-version = "0.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c64ac98d5d61192cc45c701b7e4bd0b9aff91e2edfc7a088406cfe2288581e2c"
-dependencies = [
- "leb128",
-]
-
-[[package]]
-name = "wasmparser"
-version = "0.85.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "570460c58b21e9150d2df0eaaedbb7816c34bcec009ae0dcc976e40ba81463e7"
-dependencies = [
- "indexmap",
-]
-
-[[package]]
-name = "wasmtime"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f50eadf868ab6a04b7b511460233377d0bfbb92e417b2f6a98b98fef2e098f5"
-dependencies = [
- "anyhow",
- "async-trait",
- "backtrace",
- "bincode",
- "cfg-if 1.0.0",
- "indexmap",
- "lazy_static",
- "libc",
- "log",
- "object 0.28.4",
- "once_cell",
- "paste",
- "psm",
- "rayon",
- "region",
- "serde",
- "target-lexicon",
- "wasmparser",
- "wasmtime-cache",
- "wasmtime-cranelift",
- "wasmtime-environ",
- "wasmtime-fiber",
- "wasmtime-jit",
- "wasmtime-runtime",
- "wat",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "wasmtime-cache"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1df23c642e1376892f3b72f311596976979cbf8b85469680cdd3a8a063d12a2"
-dependencies = [
- "anyhow",
- "base64",
- "bincode",
- "directories-next",
- "file-per-thread-logger",
- "log",
- "rustix",
- "serde",
- "sha2 0.9.9",
- "toml",
- "winapi 0.3.9",
- "zstd",
-]
-
-[[package]]
-name = "wasmtime-cranelift"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f264ff6b4df247d15584f2f53d009fbc90032cfdc2605b52b961bffc71b6eccd"
-dependencies = [
- "anyhow",
- "cranelift-codegen",
- "cranelift-entity",
- "cranelift-frontend",
- "cranelift-native",
- "cranelift-wasm",
- "gimli",
- "log",
- "more-asserts",
- "object 0.28.4",
- "target-lexicon",
- "thiserror",
- "wasmparser",
- "wasmtime-environ",
-]
-
-[[package]]
-name = "wasmtime-environ"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "839d2820e4b830f4b9e7aa08d4c0acabf4a5036105d639f6dfa1c6891c73bdc6"
-dependencies = [
- "anyhow",
- "cranelift-entity",
- "gimli",
- "indexmap",
- "log",
- "more-asserts",
- "object 0.28.4",
- "serde",
- "target-lexicon",
- "thiserror",
- "wasmparser",
- "wasmtime-types",
-]
-
-[[package]]
-name = "wasmtime-fiber"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3248be3c4911233535356025f6562193614a40155ee9094bb6a2b43f0dc82803"
-dependencies = [
- "cc",
- "rustix",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "wasmtime-jit"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef0a0bcbfa18b946d890078ba0e1bc76bcc53eccfb40806c0020ec29dcd1bd49"
-dependencies = [
- "addr2line",
- "anyhow",
- "bincode",
- "cfg-if 1.0.0",
- "cpp_demangle",
- "gimli",
- "ittapi-rs",
- "log",
- "object 0.28.4",
- "region",
- "rustc-demangle",
- "rustix",
- "serde",
- "target-lexicon",
- "thiserror",
- "wasmtime-environ",
- "wasmtime-jit-debug",
- "wasmtime-runtime",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "wasmtime-jit-debug"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f4779d976206c458edd643d1ac622b6c37e4a0800a8b1d25dfbf245ac2f2cac"
-dependencies = [
- "lazy_static",
- "object 0.28.4",
- "rustix",
-]
-
-[[package]]
-name = "wasmtime-runtime"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7eb6ffa169eb5dcd18ac9473c817358cd57bc62c244622210566d473397954a"
-dependencies = [
- "anyhow",
- "backtrace",
- "cc",
- "cfg-if 1.0.0",
- "indexmap",
- "libc",
- "log",
- "mach",
- "memfd",
- "memoffset",
- "more-asserts",
- "rand 0.8.5",
- "region",
- "rustix",
- "thiserror",
- "wasmtime-environ",
- "wasmtime-fiber",
- "wasmtime-jit-debug",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "wasmtime-types"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d932b0ac5336f7308d869703dd225610a6a3aeaa8e968c52b43eed96cefb1c2"
-dependencies = [
- "cranelift-entity",
- "serde",
- "thiserror",
- "wasmparser",
-]
-
-[[package]]
-name = "wasmtime-wasi"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b68b7d77fb6f2975a6fe6cc4d0015d6b0cebb65c39fce1dd4cc00880dbf7789c"
-dependencies = [
- "anyhow",
- "wasi-cap-std-sync",
- "wasi-common",
- "wasmtime",
- "wiggle",
-]
-
-[[package]]
-name = "wast"
-version = "35.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68"
-dependencies = [
- "leb128",
-]
-
-[[package]]
-name = "wast"
-version = "47.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02b98502f3978adea49551e801a6687678e6015317d7d9470a67fe813393f2a8"
-dependencies = [
- "leb128",
- "memchr",
- "unicode-width",
- "wasm-encoder",
-]
-
-[[package]]
-name = "wat"
-version = "1.0.49"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7aab4e20c60429fbba9670a6cae0fff9520046ba0aa3e6d0b1cd2653bea14898"
-dependencies = [
- "wast 47.0.1",
-]
-
-[[package]]
-name = "web-sys"
-version = "0.3.60"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "webpki"
-version = "0.21.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea"
-dependencies = [
- "ring",
- "untrusted",
-]
-
-[[package]]
-name = "webpki"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd"
-dependencies = [
- "ring",
- "untrusted",
-]
-
-[[package]]
-name = "webpki-roots"
-version = "0.21.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940"
-dependencies = [
- "webpki 0.21.4",
-]
-
-[[package]]
-name = "webpki-roots"
-version = "0.22.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "368bfe657969fb01238bb756d351dcade285e0f6fcbd36dcb23359a5169975be"
-dependencies = [
- "webpki 0.22.0",
-]
-
-[[package]]
-name = "weezl"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
-
-[[package]]
-name = "wepoll-ffi"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "which"
-version = "4.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b"
-dependencies = [
- "either",
- "libc",
- "once_cell",
-]
-
-[[package]]
-name = "whoami"
-version = "1.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6631b6a2fd59b1841b622e8f1a7ad241ef0a46f2d580464ce8140ac94cbd571"
-dependencies = [
- "bumpalo",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "wiggle"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67dadac11343d2aabc8a906a0db0aaf7cb5046ec3d6fffccdaf2847dccdef8d6"
-dependencies = [
- "anyhow",
- "async-trait",
- "bitflags",
- "thiserror",
- "tracing",
- "wasmtime",
- "wiggle-macro",
-]
-
-[[package]]
-name = "wiggle-generate"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63a1dccd6b3fbd9a27417f5d30ce9aa3ee9cf529aad453abbf88a49c5d605b79"
-dependencies = [
- "anyhow",
- "heck 0.4.0",
- "proc-macro2",
- "quote",
- "shellexpand",
- "syn",
- "witx",
-]
-
-[[package]]
-name = "wiggle-macro"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1c368d57d9560c34deaa67e06b0953ccf65edb906c525e5a2c866c849b48ec2"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "wiggle-generate",
-]
-
-[[package]]
-name = "winapi"
-version = "0.2.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-build"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-util"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
-dependencies = [
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows-sys"
-version = "0.36.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
-dependencies = [
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_msvc",
-]
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.36.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.36.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.36.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.36.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.36.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
-
-[[package]]
-name = "winreg"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
-dependencies = [
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "winx"
-version = "0.31.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08d5973cb8cd94a77d03ad7e23bbe14889cb29805da1cec0e4aff75e21aebded"
-dependencies = [
- "bitflags",
- "io-lifetimes",
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "wio"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5"
-dependencies = [
- "winapi 0.3.9",
-]
-
-[[package]]
-name = "witx"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b"
-dependencies = [
- "anyhow",
- "log",
- "thiserror",
- "wast 35.0.2",
-]
-
-[[package]]
-name = "workspace"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "client",
- "clock",
- "collections",
- "context_menu",
- "drag_and_drop",
- "futures 0.3.24",
- "gpui",
- "language",
- "log",
- "menu",
- "parking_lot 0.11.2",
- "postage",
- "project",
- "serde",
- "serde_json",
- "settings",
- "smallvec",
- "theme",
- "util",
-]
-
-[[package]]
-name = "ws2_32-sys"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
-dependencies = [
- "winapi 0.2.8",
- "winapi-build",
-]
-
-[[package]]
-name = "xml-rs"
-version = "0.8.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
-
-[[package]]
-name = "xmlparser"
-version = "0.13.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8"
-
-[[package]]
-name = "xmlwriter"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9"
-
-[[package]]
-name = "yaml-rust"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
-dependencies = [
- "linked-hash-map",
-]
-
-[[package]]
-name = "zed"
-version = "0.59.0"
-dependencies = [
- "activity_indicator",
- "anyhow",
- "assets",
- "async-compression",
- "async-recursion",
- "async-trait",
- "auto_update",
- "backtrace",
- "breadcrumbs",
- "chat_panel",
- "chrono",
- "cli",
- "client",
- "clock",
- "collections",
- "command_palette",
- "contacts_panel",
- "contacts_status_item",
- "context_menu",
- "ctor",
- "diagnostics",
- "dirs 3.0.2",
- "easy-parallel",
- "editor",
- "env_logger",
- "file_finder",
- "fsevent",
- "futures 0.3.24",
- "fuzzy",
- "go_to_line",
- "gpui",
- "ignore",
- "image",
- "indexmap",
- "isahc",
- "journal",
- "language",
- "lazy_static",
- "libc",
- "log",
- "lsp",
- "num_cpus",
- "outline",
- "parking_lot 0.11.2",
- "plugin_runtime",
- "postage",
- "project",
- "project_panel",
- "project_symbols",
- "rand 0.8.5",
- "regex",
- "rpc",
- "rsa",
- "rust-embed",
- "search",
- "serde",
- "serde_json",
- "serde_path_to_error",
- "settings",
- "simplelog",
- "smallvec",
- "smol",
- "sum_tree",
- "tempdir",
- "terminal",
- "text",
- "theme",
- "theme_selector",
- "thiserror",
- "tiny_http",
- "toml",
- "tree-sitter",
- "tree-sitter-c",
- "tree-sitter-cpp",
- "tree-sitter-css",
- "tree-sitter-elixir",
- "tree-sitter-go",
- "tree-sitter-html",
- "tree-sitter-json 0.20.0",
- "tree-sitter-markdown",
- "tree-sitter-python",
- "tree-sitter-rust",
- "tree-sitter-toml",
- "tree-sitter-typescript",
- "unindent",
- "url",
- "util",
- "vim",
- "workspace",
-]
-
-[[package]]
-name = "zeroize"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd"
-dependencies = [
- "zeroize_derive",
-]
-
-[[package]]
-name = "zeroize_derive"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "synstructure",
-]
-
-[[package]]
-name = "zstd"
-version = "0.11.2+zstd.1.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4"
-dependencies = [
- "zstd-safe",
-]
-
-[[package]]
-name = "zstd-safe"
-version = "5.0.2+zstd.1.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db"
-dependencies = [
- "libc",
- "zstd-sys",
-]
-
-[[package]]
-name = "zstd-sys"
-version = "2.0.1+zstd.1.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fd07cbbc53846d9145dbffdf6dd09a7a0aa52be46741825f5c97bdd4f73f12b"
-dependencies = [
- "cc",
- "libc",
-]

assets/keymaps/vim.json 🔗

@@ -9,11 +9,10 @@
                 }
             ],
             "h": "vim::Left",
-            "backspace": "vim::Left",
+            "backspace": "vim::Backspace",
             "j": "vim::Down",
             "k": "vim::Up",
             "l": "vim::Right",
-            "0": "vim::StartOfLine",
             "$": "vim::EndOfLine",
             "shift-g": "vim::EndOfDocument",
             "w": "vim::NextWordStart",
@@ -54,6 +53,43 @@
                         "around": true
                     }
                 }
+            ],
+            "0": "vim::StartOfLine", // When no number operator present, use start of line motion
+            "1": [
+                "vim::Number",
+                1
+            ],
+            "2": [
+                "vim::Number",
+                2
+            ],
+            "3": [
+                "vim::Number",
+                3
+            ],
+            "4": [
+                "vim::Number",
+                4
+            ],
+            "5": [
+                "vim::Number",
+                5
+            ],
+            "6": [
+                "vim::Number",
+                6
+            ],
+            "7": [
+                "vim::Number",
+                7
+            ],
+            "8": [
+                "vim::Number",
+                8
+            ],
+            "9": [
+                "vim::Number",
+                9
             ]
         }
     },
@@ -114,6 +150,15 @@
             ]
         }
     },
+    {
+        "context": "Editor && vim_operator == n",
+        "bindings": {
+            "0": [
+                "vim::Number",
+                0
+            ]
+        }
+    },
     {
         "context": "Editor && vim_operator == g",
         "bindings": {
@@ -128,13 +173,6 @@
     {
         "context": "Editor && vim_operator == c",
         "bindings": {
-            "w": "vim::ChangeWord",
-            "shift-w": [
-                "vim::ChangeWord",
-                {
-                    "ignorePunctuation": true
-                }
-            ],
             "c": "vim::CurrentLine"
         }
     },
@@ -160,8 +198,7 @@
                     "ignorePunctuation": true
                 }
             ],
-            "s": "vim::Sentence",
-            "p": "vim::Paragraph"
+            "s": "vim::Sentence"
         }
     },
     {

crates/collab/src/integration_tests.rs 🔗

@@ -4961,6 +4961,7 @@ async fn test_random_collaboration(
         cx.font_cache(),
         cx.leak_detector(),
         next_entity_id,
+        cx.function_name.clone(),
     );
     let host = server.create_client(&mut host_cx, "host").await;
     let host_project = host_cx.update(|cx| {
@@ -5194,6 +5195,7 @@ async fn test_random_collaboration(
                     cx.font_cache(),
                     cx.leak_detector(),
                     next_entity_id,
+                    cx.function_name.clone(),
                 );
 
                 deterministic.start_waiting();

crates/editor/src/test.rs 🔗

@@ -4,19 +4,25 @@ use crate::{
     AnchorRangeExt, Autoscroll, DisplayPoint, Editor, EditorMode, MultiBuffer, ToPoint,
 };
 use anyhow::Result;
+use collections::BTreeMap;
 use futures::{Future, StreamExt};
 use gpui::{
     json, keymap::Keystroke, AppContext, ModelContext, ModelHandle, ViewContext, ViewHandle,
 };
 use indoc::indoc;
+use itertools::Itertools;
 use language::{point_to_lsp, Buffer, BufferSnapshot, FakeLspAdapter, Language, LanguageConfig};
 use lsp::{notification, request};
+use parking_lot::RwLock;
 use project::Project;
 use settings::Settings;
 use std::{
     any::TypeId,
     ops::{Deref, DerefMut, Range},
-    sync::Arc,
+    sync::{
+        atomic::{AtomicUsize, Ordering},
+        Arc,
+    },
 };
 use util::{
     assert_set_eq, set_eq,
@@ -85,6 +91,7 @@ pub struct EditorTestContext<'a> {
     pub cx: &'a mut gpui::TestAppContext,
     pub window_id: usize,
     pub editor: ViewHandle<Editor>,
+    pub assertion_context: AssertionContextManager,
 }
 
 impl<'a> EditorTestContext<'a> {
@@ -106,9 +113,14 @@ impl<'a> EditorTestContext<'a> {
             cx,
             window_id,
             editor,
+            assertion_context: AssertionContextManager::new(),
         }
     }
 
+    pub fn add_assertion_context(&self, context: String) -> ContextHandle {
+        self.assertion_context.add_context(context)
+    }
+
     pub fn condition(
         &self,
         predicate: impl FnMut(&Editor, &AppContext) -> bool,
@@ -394,6 +406,7 @@ impl<'a> EditorLspTestContext<'a> {
                 cx,
                 window_id,
                 editor,
+                assertion_context: AssertionContextManager::new(),
             },
             lsp,
             workspace,
@@ -507,3 +520,45 @@ impl<'a> DerefMut for EditorLspTestContext<'a> {
         &mut self.cx
     }
 }
+
+#[derive(Clone)]
+pub struct AssertionContextManager {
+    id: Arc<AtomicUsize>,
+    contexts: Arc<RwLock<BTreeMap<usize, String>>>,
+}
+
+impl AssertionContextManager {
+    pub fn new() -> Self {
+        Self {
+            id: Arc::new(AtomicUsize::new(0)),
+            contexts: Arc::new(RwLock::new(BTreeMap::new())),
+        }
+    }
+
+    pub fn add_context(&self, context: String) -> ContextHandle {
+        let id = self.id.fetch_add(1, Ordering::Relaxed);
+        let mut contexts = self.contexts.write();
+        contexts.insert(id, context);
+        ContextHandle {
+            id,
+            manager: self.clone(),
+        }
+    }
+
+    pub fn context(&self) -> String {
+        let contexts = self.contexts.read();
+        format!("\n{}\n", contexts.values().join("\n"))
+    }
+}
+
+pub struct ContextHandle {
+    id: usize,
+    manager: AssertionContextManager,
+}
+
+impl Drop for ContextHandle {
+    fn drop(&mut self) {
+        let mut contexts = self.manager.contexts.write();
+        contexts.remove(&self.id);
+    }
+}

crates/gpui/src/app.rs 🔗

@@ -182,6 +182,7 @@ pub struct TestAppContext {
     cx: Rc<RefCell<MutableAppContext>>,
     foreground_platform: Rc<platform::test::ForegroundPlatform>,
     condition_duration: Option<Duration>,
+    pub function_name: String,
 }
 
 pub struct WindowInputHandler {
@@ -437,6 +438,7 @@ impl TestAppContext {
         font_cache: Arc<FontCache>,
         leak_detector: Arc<Mutex<LeakDetector>>,
         first_entity_id: usize,
+        function_name: String,
     ) -> Self {
         let mut cx = MutableAppContext::new(
             foreground,
@@ -456,6 +458,7 @@ impl TestAppContext {
             cx: Rc::new(RefCell::new(cx)),
             foreground_platform,
             condition_duration: None,
+            function_name,
         };
         cx.cx.borrow_mut().weak_self = Some(Rc::downgrade(&cx.cx));
         cx

crates/gpui/src/test.rs 🔗

@@ -37,6 +37,7 @@ pub fn run_test(
         u64,
         bool,
     )),
+    fn_name: String,
 ) {
     // let _profiler = dhat::Profiler::new_heap();
 
@@ -78,6 +79,7 @@ pub fn run_test(
                     font_cache.clone(),
                     leak_detector.clone(),
                     0,
+                    fn_name.clone(),
                 );
                 cx.update(|cx| {
                     test_fn(

crates/gpui_macros/src/gpui_macros.rs 🔗

@@ -117,6 +117,7 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
                                     cx.font_cache().clone(),
                                     cx.leak_detector(),
                                     #first_entity_id,
+                                    stringify!(#outer_fn_name).to_string(),
                                 );
                             ));
                             cx_teardowns.extend(quote!(
@@ -149,7 +150,8 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
                         #cx_vars
                         cx.foreground().run(#inner_fn_name(#inner_fn_args));
                         #cx_teardowns
-                    }
+                    },
+                    stringify!(#outer_fn_name).to_string(),
                 );
             }
         }
@@ -187,7 +189,8 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
                     #num_iterations as u64,
                     #starting_seed as u64,
                     #max_retries,
-                    &mut |cx, _, _, seed, is_last_iteration| #inner_fn_name(#inner_fn_args)
+                    &mut |cx, _, _, seed, is_last_iteration| #inner_fn_name(#inner_fn_args),
+                    stringify!(#outer_fn_name).to_string(),
                 );
             }
         }

crates/vim/Cargo.toml 🔗

@@ -33,6 +33,7 @@ workspace = { path = "../workspace" }
 
 [dev-dependencies]
 indoc = "1.0.4"
+parking_lot = "0.11.1"
 
 editor = { path = "../editor", features = ["test-support"] }
 gpui = { path = "../gpui", features = ["test-support"] }

crates/vim/src/motion.rs 🔗

@@ -18,6 +18,7 @@ use crate::{
 #[derive(Copy, Clone, Debug)]
 pub enum Motion {
     Left,
+    Backspace,
     Down,
     Up,
     Right,
@@ -58,6 +59,7 @@ actions!(
     vim,
     [
         Left,
+        Backspace,
         Down,
         Up,
         Right,
@@ -74,6 +76,7 @@ impl_actions!(vim, [NextWordStart, NextWordEnd, PreviousWordStart]);
 
 pub fn init(cx: &mut MutableAppContext) {
     cx.add_action(|_: &mut Workspace, _: &Left, cx: _| motion(Motion::Left, cx));
+    cx.add_action(|_: &mut Workspace, _: &Backspace, cx: _| motion(Motion::Backspace, cx));
     cx.add_action(|_: &mut Workspace, _: &Down, cx: _| motion(Motion::Down, cx));
     cx.add_action(|_: &mut Workspace, _: &Up, cx: _| motion(Motion::Up, cx));
     cx.add_action(|_: &mut Workspace, _: &Right, cx: _| motion(Motion::Right, cx));
@@ -106,19 +109,21 @@ pub fn init(cx: &mut MutableAppContext) {
     );
 }
 
-fn motion(motion: Motion, cx: &mut MutableAppContext) {
-    Vim::update(cx, |vim, cx| {
-        if let Some(Operator::Namespace(_)) = vim.active_operator() {
-            vim.pop_operator(cx);
-        }
-    });
+pub(crate) fn motion(motion: Motion, cx: &mut MutableAppContext) {
+    if let Some(Operator::Namespace(_)) = Vim::read(cx).active_operator() {
+        Vim::update(cx, |vim, cx| vim.pop_operator(cx));
+    }
+
+    let times = Vim::update(cx, |vim, cx| vim.pop_number_operator(cx));
+    let operator = Vim::read(cx).active_operator();
     match Vim::read(cx).state.mode {
-        Mode::Normal => normal_motion(motion, cx),
-        Mode::Visual { .. } => visual_motion(motion, cx),
+        Mode::Normal => normal_motion(motion, operator, times, cx),
+        Mode::Visual { .. } => visual_motion(motion, times, cx),
         Mode::Insert => {
             // Shouldn't execute a motion in insert mode. Ignoring
         }
     }
+    Vim::update(cx, |vim, cx| vim.clear_operator(cx));
 }
 
 // Motion handling is specified here:
@@ -154,6 +159,7 @@ impl Motion {
         use Motion::*;
         match self {
             Left => (left(map, point), SelectionGoal::None),
+            Backspace => (movement::left(map, point), SelectionGoal::None),
             Down => movement::down(map, point, goal, true),
             Up => movement::up(map, point, goal, true),
             Right => (right(map, point), SelectionGoal::None),
@@ -184,10 +190,13 @@ impl Motion {
         self,
         map: &DisplaySnapshot,
         selection: &mut Selection<DisplayPoint>,
+        times: usize,
         expand_to_surrounding_newline: bool,
     ) {
-        let (head, goal) = self.move_point(map, selection.head(), selection.goal);
-        selection.set_head(head, goal);
+        for _ in 0..times {
+            let (head, goal) = self.move_point(map, selection.head(), selection.goal);
+            selection.set_head(head, goal);
+        }
 
         if self.linewise() {
             selection.start = map.prev_line_boundary(selection.start.to_point(map)).1;
@@ -272,17 +281,13 @@ fn next_word_end(
     ignore_punctuation: bool,
 ) -> DisplayPoint {
     *point.column_mut() += 1;
-    dbg!(point);
     point = movement::find_boundary(map, point, |left, right| {
-        dbg!(left);
         let left_kind = char_kind(left).coerce_punctuation(ignore_punctuation);
         let right_kind = char_kind(right).coerce_punctuation(ignore_punctuation);
 
         left_kind != right_kind && left_kind != CharKind::Whitespace
     });
 
-    dbg!(point);
-
     // find_boundary clips, so if the character after the next character is a newline or at the end of the document, we know
     // we have backtraced already
     if !map
@@ -293,7 +298,7 @@ fn next_word_end(
     {
         *point.column_mut() = point.column().saturating_sub(1);
     }
-    dbg!(map.clip_point(point, Bias::Left))
+    map.clip_point(point, Bias::Left)
 }
 
 fn previous_word_start(

crates/vim/src/normal.rs 🔗

@@ -10,7 +10,6 @@ use crate::{
     state::{Mode, Operator},
     Vim,
 };
-use change::init as change_init;
 use collections::HashSet;
 use editor::{Autoscroll, Bias, ClipboardSelection, DisplayPoint};
 use gpui::{actions, MutableAppContext, ViewContext};
@@ -48,41 +47,47 @@ pub fn init(cx: &mut MutableAppContext) {
     cx.add_action(insert_line_below);
     cx.add_action(|_: &mut Workspace, _: &DeleteLeft, cx| {
         Vim::update(cx, |vim, cx| {
-            delete_motion(vim, Motion::Left, cx);
+            let times = vim.pop_number_operator(cx);
+            delete_motion(vim, Motion::Left, times, cx);
         })
     });
     cx.add_action(|_: &mut Workspace, _: &DeleteRight, cx| {
         Vim::update(cx, |vim, cx| {
-            delete_motion(vim, Motion::Right, cx);
+            let times = vim.pop_number_operator(cx);
+            delete_motion(vim, Motion::Right, times, cx);
         })
     });
     cx.add_action(|_: &mut Workspace, _: &ChangeToEndOfLine, cx| {
         Vim::update(cx, |vim, cx| {
-            change_motion(vim, Motion::EndOfLine, cx);
+            let times = vim.pop_number_operator(cx);
+            change_motion(vim, Motion::EndOfLine, times, cx);
         })
     });
     cx.add_action(|_: &mut Workspace, _: &DeleteToEndOfLine, cx| {
         Vim::update(cx, |vim, cx| {
-            delete_motion(vim, Motion::EndOfLine, cx);
+            let times = vim.pop_number_operator(cx);
+            delete_motion(vim, Motion::EndOfLine, times, cx);
         })
     });
     cx.add_action(paste);
-
-    change_init(cx);
 }
 
-pub fn normal_motion(motion: Motion, cx: &mut MutableAppContext) {
+pub fn normal_motion(
+    motion: Motion,
+    operator: Option<Operator>,
+    times: usize,
+    cx: &mut MutableAppContext,
+) {
     Vim::update(cx, |vim, cx| {
-        match vim.state.operator_stack.pop() {
-            None => move_cursor(vim, motion, cx),
-            Some(Operator::Change) => change_motion(vim, motion, cx),
-            Some(Operator::Delete) => delete_motion(vim, motion, cx),
-            Some(Operator::Yank) => yank_motion(vim, motion, cx),
+        match operator {
+            None => move_cursor(vim, motion, times, cx),
+            Some(Operator::Change) => change_motion(vim, motion, times, cx),
+            Some(Operator::Delete) => delete_motion(vim, motion, times, cx),
+            Some(Operator::Yank) => yank_motion(vim, motion, times, cx),
             _ => {
                 // Can't do anything for text objects or namespace operators. Ignoring
             }
         }
-        vim.clear_operator(cx);
     });
 }
 
@@ -105,10 +110,16 @@ pub fn normal_object(object: Object, cx: &mut MutableAppContext) {
     })
 }
 
-fn move_cursor(vim: &mut Vim, motion: Motion, cx: &mut MutableAppContext) {
+fn move_cursor(vim: &mut Vim, motion: Motion, times: usize, cx: &mut MutableAppContext) {
     vim.update_active_editor(cx, |editor, cx| {
         editor.change_selections(Some(Autoscroll::Fit), cx, |s| {
-            s.move_cursors_with(|map, cursor, goal| motion.move_point(map, cursor, goal))
+            s.move_cursors_with(|map, cursor, goal| {
+                let mut result = (cursor, goal);
+                for _ in 0..times {
+                    result = motion.move_point(map, result.0, result.1);
+                }
+                result
+            })
         })
     });
 }
@@ -328,311 +339,139 @@ mod test {
             Mode::{self, *},
             Namespace, Operator,
         },
-        test_contexts::VimTestContext,
+        test_contexts::{NeovimBackedTestContext, VimTestContext},
     };
 
     #[gpui::test]
     async fn test_h(cx: &mut gpui::TestAppContext) {
-        let cx = VimTestContext::new(cx, true).await;
-        let mut cx = cx.binding(["h"]);
-        cx.assert("The qˇuick", "The ˇquick");
-        cx.assert("ˇThe quick", "ˇThe quick");
-        cx.assert(
-            indoc! {"
-                The quick
-                ˇbrown"},
-            indoc! {"
-                The quick
-                ˇbrown"},
-        );
+        let mut cx = NeovimBackedTestContext::new(cx).await.binding(["h"]);
+        cx.assert_all(indoc! {"
+            ˇThe qˇuick
+            ˇbrown"
+        })
+        .await;
     }
 
     #[gpui::test]
     async fn test_backspace(cx: &mut gpui::TestAppContext) {
-        let cx = VimTestContext::new(cx, true).await;
-        let mut cx = cx.binding(["backspace"]);
-        cx.assert("The qˇuick", "The ˇquick");
-        cx.assert("ˇThe quick", "ˇThe quick");
-        cx.assert(
-            indoc! {"
-                The quick
-                ˇbrown"},
-            indoc! {"
-                The quick
-                ˇbrown"},
-        );
+        let mut cx = NeovimBackedTestContext::new(cx)
+            .await
+            .binding(["backspace"]);
+        cx.assert_all(indoc! {"
+            ˇThe qˇuick
+            ˇbrown"
+        })
+        .await;
     }
 
     #[gpui::test]
     async fn test_j(cx: &mut gpui::TestAppContext) {
-        let cx = VimTestContext::new(cx, true).await;
-        let mut cx = cx.binding(["j"]);
-        cx.assert(
-            indoc! {"
-                The ˇquick
-                brown fox"},
-            indoc! {"
-                The quick
-                browˇn fox"},
-        );
-        cx.assert(
-            indoc! {"
-                The quick
-                browˇn fox"},
-            indoc! {"
-                The quick
-                browˇn fox"},
-        );
-        cx.assert(
-            indoc! {"
-                The quicˇk
-                brown"},
-            indoc! {"
-                The quick
-                browˇn"},
-        );
-        cx.assert(
-            indoc! {"
-                The quick
-                ˇbrown"},
-            indoc! {"
-                The quick
-                ˇbrown"},
-        );
+        let mut cx = NeovimBackedTestContext::new(cx).await.binding(["j"]);
+        cx.assert_all(indoc! {"
+            ˇThe qˇuick broˇwn
+            ˇfox jumps"
+        })
+        .await;
     }
 
     #[gpui::test]
     async fn test_k(cx: &mut gpui::TestAppContext) {
-        let cx = VimTestContext::new(cx, true).await;
-        let mut cx = cx.binding(["k"]);
-        cx.assert(
-            indoc! {"
-                The ˇquick
-                brown fox"},
-            indoc! {"
-                The ˇquick
-                brown fox"},
-        );
-        cx.assert(
-            indoc! {"
-                The quick
-                browˇn fox"},
-            indoc! {"
-                The ˇquick
-                brown fox"},
-        );
-        cx.assert(
-            indoc! {"
-                The
-                quicˇk"},
-            indoc! {"
-                Thˇe
-                quick"},
-        );
+        let mut cx = NeovimBackedTestContext::new(cx).await.binding(["k"]);
+        cx.assert_all(indoc! {"
+            ˇThe qˇuick
+            ˇbrown fˇox jumˇps"
+        })
+        .await;
     }
 
     #[gpui::test]
     async fn test_l(cx: &mut gpui::TestAppContext) {
-        let cx = VimTestContext::new(cx, true).await;
-        let mut cx = cx.binding(["l"]);
-        cx.assert("The qˇuick", "The quˇick");
-        cx.assert("The quicˇk", "The quicˇk");
-        cx.assert(
-            indoc! {"
-                The quicˇk
-                brown"},
-            indoc! {"
-                The quicˇk
-                brown"},
-        );
+        let mut cx = NeovimBackedTestContext::new(cx).await.binding(["l"]);
+        cx.assert_all(indoc! {"
+            ˇThe qˇuicˇk
+            ˇbrowˇn"})
+            .await;
     }
 
     #[gpui::test]
     async fn test_jump_to_line_boundaries(cx: &mut gpui::TestAppContext) {
-        let cx = VimTestContext::new(cx, true).await;
-        let mut cx = cx.binding(["$"]);
-        cx.assert("Tˇest test", "Test tesˇt");
-        cx.assert("Test tesˇt", "Test tesˇt");
-        cx.assert(
-            indoc! {"
-                The ˇquick
-                brown"},
-            indoc! {"
-                The quicˇk
-                brown"},
-        );
-        cx.assert(
-            indoc! {"
-                The quicˇk
-                brown"},
-            indoc! {"
-                The quicˇk
-                brown"},
-        );
-
-        let mut cx = cx.binding(["0"]);
-        cx.assert("Test ˇtest", "ˇTest test");
-        cx.assert("ˇTest test", "ˇTest test");
-        cx.assert(
-            indoc! {"
-                The ˇquick
-                brown"},
-            indoc! {"
-                ˇThe quick
-                brown"},
-        );
-        cx.assert(
-            indoc! {"
-                ˇThe quick
-                brown"},
-            indoc! {"
-                ˇThe quick
-                brown"},
-        );
+        let mut cx = NeovimBackedTestContext::new(cx).await;
+        cx.assert_binding_matches_all(
+            ["$"],
+            indoc! {"
+            ˇThe qˇuicˇk
+            ˇbrowˇn"},
+        )
+        .await;
+        cx.assert_binding_matches_all(
+            ["0"],
+            indoc! {"
+                ˇThe qˇuicˇk
+                ˇbrowˇn"},
+        )
+        .await;
     }
 
     #[gpui::test]
     async fn test_jump_to_end(cx: &mut gpui::TestAppContext) {
-        let cx = VimTestContext::new(cx, true).await;
-        let mut cx = cx.binding(["shift-g"]);
+        let mut cx = NeovimBackedTestContext::new(cx).await.binding(["shift-g"]);
 
-        cx.assert(
-            indoc! {"
+        cx.assert_all(indoc! {"
                 The ˇquick
                 
                 brown fox jumps
-                over the lazy dog"},
-            indoc! {"
-                The quick
-                
-                brown fox jumps
-                overˇ the lazy dog"},
-        );
-        cx.assert(
-            indoc! {"
-                The quick
-                
-                brown fox jumps
-                overˇ the lazy dog"},
-            indoc! {"
-                The quick
-                
-                brown fox jumps
-                overˇ the lazy dog"},
-        );
-        cx.assert(
-            indoc! {"
+                overˇ the lazy doˇg"})
+            .await;
+        cx.assert(indoc! {"
             The quiˇck
             
-            brown"},
-            indoc! {"
-            The quick
-            
-            browˇn"},
-        );
-        cx.assert(
-            indoc! {"
+            brown"})
+            .await;
+        cx.assert(indoc! {"
             The quiˇck
             
-            "},
-            indoc! {"
-            The quick
-            
-            ˇ"},
-        );
+            "})
+            .await;
     }
 
     #[gpui::test]
     async fn test_w(cx: &mut gpui::TestAppContext) {
-        let mut cx = VimTestContext::new(cx, true).await;
-        let (_, cursor_offsets) = marked_text_offsets(indoc! {"
+        let mut cx = NeovimBackedTestContext::new(cx).await.binding(["w"]);
+        cx.assert_all(indoc! {"
             The ˇquickˇ-ˇbrown
             ˇ
             ˇ
             ˇfox_jumps ˇover
-            ˇthˇˇe"});
-        cx.set_state(
-            indoc! {"
-            ˇThe quick-brown
-            
-            
-            fox_jumps over
-            the"},
-            Mode::Normal,
-        );
-
-        for cursor_offset in cursor_offsets {
-            cx.simulate_keystroke("w");
-            cx.assert_editor_selections(vec![cursor_offset..cursor_offset]);
-        }
-
-        // Reset and test ignoring punctuation
-        let (_, cursor_offsets) = marked_text_offsets(indoc! {"
-            The ˇquick-brown
+            ˇthˇe"})
+            .await;
+        let mut cx = cx.binding(["shift-w"]);
+        cx.assert_all(indoc! {"
+            The ˇquickˇ-ˇbrown
             ˇ
             ˇ
             ˇfox_jumps ˇover
-            ˇthˇˇe"});
-        cx.set_state(
-            indoc! {"
-            ˇThe quick-brown
-            
-            
-            fox_jumps over
-            the"},
-            Mode::Normal,
-        );
-
-        for cursor_offset in cursor_offsets {
-            cx.simulate_keystroke("shift-w");
-            cx.assert_editor_selections(vec![cursor_offset..cursor_offset]);
-        }
+            ˇthˇe"})
+            .await;
     }
 
     #[gpui::test]
     async fn test_e(cx: &mut gpui::TestAppContext) {
-        let mut cx = VimTestContext::new(cx, true).await;
-        let (_, cursor_offsets) = marked_text_offsets(indoc! {"
+        let mut cx = NeovimBackedTestContext::new(cx).await.binding(["e"]);
+        cx.assert_all(indoc! {"
             Thˇe quicˇkˇ-browˇn
             
             
             fox_jumpˇs oveˇr
-            thˇe"});
-        cx.set_state(
-            indoc! {"
-            ˇThe quick-brown
-            
-            
-            fox_jumps over
-            the"},
-            Mode::Normal,
-        );
-
-        for cursor_offset in cursor_offsets {
-            cx.simulate_keystroke("e");
-            cx.assert_editor_selections(vec![cursor_offset..cursor_offset]);
-        }
-
-        // Reset and test ignoring punctuation
-        let (_, cursor_offsets) = marked_text_offsets(indoc! {"
-            Thˇe quick-browˇn
+            thˇe"})
+            .await;
+        let mut cx = cx.binding(["shift-e"]);
+        cx.assert_all(indoc! {"
+            Thˇe quicˇkˇ-browˇn
             
             
             fox_jumpˇs oveˇr
-            thˇˇe"});
-        cx.set_state(
-            indoc! {"
-            ˇThe quick-brown
-            
-            
-            fox_jumps over
-            the"},
-            Mode::Normal,
-        );
-        for cursor_offset in cursor_offsets {
-            cx.simulate_keystroke("shift-e");
-            cx.assert_editor_selections(vec![cursor_offset..cursor_offset]);
-        }
+            thˇe"})
+            .await;
     }
 
     #[gpui::test]
@@ -699,90 +538,35 @@ mod test {
 
     #[gpui::test]
     async fn test_gg(cx: &mut gpui::TestAppContext) {
-        let cx = VimTestContext::new(cx, true).await;
-        let mut cx = cx.binding(["g", "g"]);
-        cx.assert(
-            indoc! {"
-                The quick
-            
-                brown fox jumps
-                over ˇthe lazy dog"},
-            indoc! {"
-                The qˇuick
-            
-                brown fox jumps
-                over the lazy dog"},
-        );
-        cx.assert(
-            indoc! {"
-                The qˇuick
+        let mut cx = NeovimBackedTestContext::new(cx).await.binding(["g", "g"]);
+        cx.assert_all(indoc! {"
+            The qˇuick
+        
+            brown fox jumps
+            over ˇthe laˇzy dog"})
+            .await;
+        cx.assert(indoc! {"
             
-                brown fox jumps
-                over the lazy dog"},
-            indoc! {"
-                The qˇuick
-            
-                brown fox jumps
-                over the lazy dog"},
-        );
-        cx.assert(
-            indoc! {"
-                The quick
-            
-                brown fox jumps
-                over the laˇzy dog"},
-            indoc! {"
-                The quicˇk
-            
-                brown fox jumps
-                over the lazy dog"},
-        );
-        cx.assert(
-            indoc! {"
-                
-            
-                brown fox jumps
-                over the laˇzy dog"},
-            indoc! {"
-                ˇ
-            
-                brown fox jumps
-                over the lazy dog"},
-        );
+        
+            brown fox jumps
+            over the laˇzy dog"})
+            .await;
     }
 
     #[gpui::test]
     async fn test_a(cx: &mut gpui::TestAppContext) {
-        let cx = VimTestContext::new(cx, true).await;
-        let mut cx = cx.binding(["a"]).mode_after(Mode::Insert);
-
-        cx.assert("The qˇuick", "The quˇick");
-        cx.assert("The quicˇk", "The quickˇ");
+        let mut cx = NeovimBackedTestContext::new(cx).await.binding(["a"]);
+        cx.assert_all("The qˇuicˇk").await;
     }
 
     #[gpui::test]
     async fn test_insert_end_of_line(cx: &mut gpui::TestAppContext) {
-        let cx = VimTestContext::new(cx, true).await;
-        let mut cx = cx.binding(["shift-a"]).mode_after(Mode::Insert);
-        cx.assert("The qˇuick", "The quickˇ");
-        cx.assert("The qˇuick ", "The quick ˇ");
-        cx.assert("ˇ", "ˇ");
-        cx.assert(
-            indoc! {"
-                The qˇuick
-                brown fox"},
-            indoc! {"
-                The quickˇ
-                brown fox"},
-        );
-        cx.assert(
-            indoc! {"
-                ˇ
-                The quick"},
-            indoc! {"
-                ˇ
-                The quick"},
-        );
+        let mut cx = NeovimBackedTestContext::new(cx).await.binding(["shift-a"]);
+        cx.assert_all(indoc! {"
+            ˇ
+            The qˇuick
+            brown ˇfox "})
+            .await;
     }
 
     #[gpui::test]
@@ -984,84 +768,45 @@ mod test {
 
     #[gpui::test]
     async fn test_insert_line_above(cx: &mut gpui::TestAppContext) {
-        let cx = VimTestContext::new(cx, true).await;
-        let mut cx = cx.binding(["shift-o"]).mode_after(Mode::Insert);
+        let cx = NeovimBackedTestContext::new(cx).await;
+        let mut cx = cx.binding(["shift-o"]);
+        cx.assert("ˇ").await;
+        cx.assert("The ˇquick").await;
+        cx.assert_all(indoc! {"
+            The qˇuick
+            brown ˇfox
+            jumps ˇover"})
+            .await;
+        cx.assert(indoc! {"
+            The quick
+            ˇ
+            brown fox"})
+            .await;
 
-        cx.assert(
-            "ˇ",
-            indoc! {"
-                ˇ
-                "},
-        );
-        cx.assert(
-            "The ˇquick",
-            indoc! {"
-                ˇ
-                The quick"},
-        );
-        cx.assert(
-            indoc! {"
-                The quick
-                brown ˇfox
-                jumps over"},
-            indoc! {"
-                The quick
-                ˇ
-                brown fox
-                jumps over"},
-        );
-        cx.assert(
-            indoc! {"
-                The quick
-                brown fox
-                jumps ˇover"},
-            indoc! {"
-                The quick
-                brown fox
-                ˇ
-                jumps over"},
-        );
-        cx.assert(
-            indoc! {"
-                The qˇuick
-                brown fox
-                jumps over"},
-            indoc! {"
-                ˇ
-                The quick
-                brown fox
-                jumps over"},
-        );
-        cx.assert(
-            indoc! {"
-                The quick
-                ˇ
-                brown fox"},
-            indoc! {"
-                The quick
-                ˇ
-                
-                brown fox"},
-        );
-        cx.assert(
+        // Our indentation is smarter than vims. So we don't match here
+        cx.assert_manual(
             indoc! {"
                 fn test()
                     println!(ˇ);"},
+            Mode::Normal,
             indoc! {"
                 fn test()
                     ˇ
                     println!();"},
+            Mode::Insert,
         );
-        cx.assert(
+        cx.assert_manual(
             indoc! {"
                 fn test(ˇ) {
                     println!();
                 }"},
+            Mode::Normal,
             indoc! {"
                 ˇ
                 fn test() {
                     println!();
                 }"},
+            Mode::Insert,
         );
     }
 
@@ -1208,4 +953,22 @@ mod test {
             Mode::Normal,
         );
     }
+
+    #[gpui::test]
+    async fn test_repeated_word(cx: &mut gpui::TestAppContext) {
+        let mut cx = NeovimBackedTestContext::new(cx).await;
+
+        for count in 1..=5 {
+            cx.assert_binding_matches_all(
+                [&count.to_string(), "w"],
+                indoc! {"
+                    ˇThe quˇickˇ browˇn
+                    ˇ
+                    ˇfox ˇjumpsˇ-ˇoˇver
+                    ˇthe lazy dog
+                "},
+            )
+            .await;
+        }
+    }
 }

crates/vim/src/normal/change.rs 🔗

@@ -1,30 +1,20 @@
 use crate::{motion::Motion, object::Object, state::Mode, utils::copy_selections_content, Vim};
-use editor::{char_kind, movement, Autoscroll};
-use gpui::{impl_actions, MutableAppContext, ViewContext};
-use serde::Deserialize;
-use workspace::Workspace;
+use editor::{char_kind, display_map::DisplaySnapshot, movement, Autoscroll, DisplayPoint};
+use gpui::MutableAppContext;
+use language::Selection;
 
-#[derive(Clone, Deserialize, PartialEq)]
-#[serde(rename_all = "camelCase")]
-struct ChangeWord {
-    #[serde(default)]
-    ignore_punctuation: bool,
-}
-
-impl_actions!(vim, [ChangeWord]);
-
-pub fn init(cx: &mut MutableAppContext) {
-    cx.add_action(change_word);
-}
-
-pub fn change_motion(vim: &mut Vim, motion: Motion, cx: &mut MutableAppContext) {
+pub fn change_motion(vim: &mut Vim, motion: Motion, times: usize, cx: &mut MutableAppContext) {
     vim.update_active_editor(cx, |editor, cx| {
         editor.transact(cx, |editor, cx| {
             // We are swapping to insert mode anyway. Just set the line end clipping behavior now
             editor.set_clip_at_line_ends(false, cx);
             editor.change_selections(Some(Autoscroll::Fit), cx, |s| {
                 s.move_with(|map, selection| {
-                    motion.expand_selection(map, selection, false);
+                    if let Motion::NextWordStart { ignore_punctuation } = motion {
+                        expand_changed_word_selection(map, selection, times, ignore_punctuation);
+                    } else {
+                        motion.expand_selection(map, selection, times, false);
+                    }
                 });
             });
             copy_selections_content(editor, motion.linewise(), cx);
@@ -56,38 +46,30 @@ pub fn change_object(vim: &mut Vim, object: Object, around: bool, cx: &mut Mutab
 // white space after a word, they only change up to the end of the word. This is
 // because Vim interprets "cw" as change-word, and a word does not include the
 // following white space.
-fn change_word(
-    _: &mut Workspace,
-    &ChangeWord { ignore_punctuation }: &ChangeWord,
-    cx: &mut ViewContext<Workspace>,
+fn expand_changed_word_selection(
+    map: &DisplaySnapshot,
+    selection: &mut Selection<DisplayPoint>,
+    times: usize,
+    ignore_punctuation: bool,
 ) {
-    Vim::update(cx, |vim, cx| {
-        vim.update_active_editor(cx, |editor, cx| {
-            editor.transact(cx, |editor, cx| {
-                // We are swapping to insert mode anyway. Just set the line end clipping behavior now
-                editor.set_clip_at_line_ends(false, cx);
-                editor.change_selections(Some(Autoscroll::Fit), cx, |s| {
-                    s.move_with(|map, selection| {
-                        if selection.end.column() == map.line_len(selection.end.row()) {
-                            return;
-                        }
+    if times > 1 {
+        Motion::NextWordStart { ignore_punctuation }.expand_selection(
+            map,
+            selection,
+            times - 1,
+            false,
+        );
+    }
 
-                        selection.end =
-                            movement::find_boundary(map, selection.end, |left, right| {
-                                let left_kind =
-                                    char_kind(left).coerce_punctuation(ignore_punctuation);
-                                let right_kind =
-                                    char_kind(right).coerce_punctuation(ignore_punctuation);
+    if times == 1 && selection.end.column() == map.line_len(selection.end.row()) {
+        return;
+    }
 
-                                left_kind != right_kind || left == '\n' || right == '\n'
-                            });
-                    });
-                });
-                copy_selections_content(editor, false, cx);
-                editor.insert("", cx);
-            });
-        });
-        vim.switch_mode(Mode::Insert, false, cx);
+    selection.end = movement::find_boundary(map, selection.end, |left, right| {
+        let left_kind = char_kind(left).coerce_punctuation(ignore_punctuation);
+        let right_kind = char_kind(right).coerce_punctuation(ignore_punctuation);
+
+        left_kind != right_kind || left == '\n' || right == '\n'
     });
 }
 
@@ -95,7 +77,10 @@ fn change_word(
 mod test {
     use indoc::indoc;
 
-    use crate::{state::Mode, test_contexts::VimTestContext};
+    use crate::{
+        state::Mode,
+        test_contexts::{NeovimBackedTestContext, VimTestContext},
+    };
 
     #[gpui::test]
     async fn test_change_h(cx: &mut gpui::TestAppContext) {
@@ -459,4 +444,85 @@ mod test {
                 the lazy"},
         );
     }
+
+    #[gpui::test]
+    async fn test_repeated_cj(cx: &mut gpui::TestAppContext) {
+        let mut cx = NeovimBackedTestContext::new(cx).await;
+
+        for count in 1..=5 {
+            cx.assert_binding_matches_all(
+                ["c", &count.to_string(), "j"],
+                indoc! {"
+                    ˇThe quˇickˇ browˇn
+                    ˇ
+                    ˇfox ˇjumpsˇ-ˇoˇver
+                    ˇthe lazy dog
+                    "},
+            )
+            .await;
+        }
+    }
+
+    #[gpui::test]
+    async fn test_repeated_cl(cx: &mut gpui::TestAppContext) {
+        let mut cx = NeovimBackedTestContext::new(cx).await;
+
+        for count in 1..=5 {
+            cx.assert_binding_matches_all(
+                ["c", &count.to_string(), "l"],
+                indoc! {"
+                    ˇThe quˇickˇ browˇn
+                    ˇ
+                    ˇfox ˇjumpsˇ-ˇoˇver
+                    ˇthe lazy dog
+                    "},
+            )
+            .await;
+        }
+    }
+
+    #[gpui::test]
+    async fn test_repeated_cb(cx: &mut gpui::TestAppContext) {
+        let mut cx = NeovimBackedTestContext::new(cx).await;
+
+        // Changing back any number of times from the start of the file doesn't
+        // switch to insert mode in vim. This is weird and painful to implement
+        cx.add_initial_state_exemption(indoc! {"
+            ˇThe quick brown
+            
+            fox jumps-over
+            the lazy dog
+            "});
+
+        for count in 1..=5 {
+            cx.assert_binding_matches_all(
+                ["c", &count.to_string(), "b"],
+                indoc! {"
+                    ˇThe quˇickˇ browˇn
+                    ˇ
+                    ˇfox ˇjumpsˇ-ˇoˇver
+                    ˇthe lazy dog
+                    "},
+            )
+            .await;
+        }
+    }
+
+    #[gpui::test]
+    async fn test_repeated_ce(cx: &mut gpui::TestAppContext) {
+        let mut cx = NeovimBackedTestContext::new(cx).await;
+
+        for count in 1..=5 {
+            cx.assert_binding_matches_all(
+                ["c", &count.to_string(), "e"],
+                indoc! {"
+                    ˇThe quˇickˇ browˇn
+                    ˇ
+                    ˇfox ˇjumpsˇ-ˇoˇver
+                    ˇthe lazy dog
+                    "},
+            )
+            .await;
+        }
+    }
 }

crates/vim/src/normal/delete.rs 🔗

@@ -3,7 +3,7 @@ use collections::{HashMap, HashSet};
 use editor::{display_map::ToDisplayPoint, Autoscroll, Bias};
 use gpui::MutableAppContext;
 
-pub fn delete_motion(vim: &mut Vim, motion: Motion, cx: &mut MutableAppContext) {
+pub fn delete_motion(vim: &mut Vim, motion: Motion, times: usize, cx: &mut MutableAppContext) {
     vim.update_active_editor(cx, |editor, cx| {
         editor.transact(cx, |editor, cx| {
             editor.set_clip_at_line_ends(false, cx);
@@ -11,8 +11,8 @@ pub fn delete_motion(vim: &mut Vim, motion: Motion, cx: &mut MutableAppContext)
             editor.change_selections(Some(Autoscroll::Fit), cx, |s| {
                 s.move_with(|map, selection| {
                     let original_head = selection.head();
-                    motion.expand_selection(map, selection, true);
                     original_columns.insert(selection.id, original_head.column());
+                    motion.expand_selection(map, selection, times, true);
                 });
             });
             copy_selections_content(editor, motion.linewise(), cx);

crates/vim/src/normal/yank.rs 🔗

@@ -2,7 +2,7 @@ use crate::{motion::Motion, object::Object, utils::copy_selections_content, Vim}
 use collections::HashMap;
 use gpui::MutableAppContext;
 
-pub fn yank_motion(vim: &mut Vim, motion: Motion, cx: &mut MutableAppContext) {
+pub fn yank_motion(vim: &mut Vim, motion: Motion, times: usize, cx: &mut MutableAppContext) {
     vim.update_active_editor(cx, |editor, cx| {
         editor.transact(cx, |editor, cx| {
             editor.set_clip_at_line_ends(false, cx);
@@ -10,8 +10,8 @@ pub fn yank_motion(vim: &mut Vim, motion: Motion, cx: &mut MutableAppContext) {
             editor.change_selections(None, cx, |s| {
                 s.move_with(|map, selection| {
                     let original_position = (selection.head(), selection.goal);
-                    motion.expand_selection(map, selection, true);
                     original_positions.insert(selection.id, original_position);
+                    motion.expand_selection(map, selection, times, true);
                 });
             });
             copy_selections_content(editor, motion.linewise(), cx);

crates/vim/src/object.rs 🔗

@@ -12,7 +12,6 @@ use crate::{motion, normal::normal_object, state::Mode, visual::visual_object, V
 pub enum Object {
     Word { ignore_punctuation: bool },
     Sentence,
-    Paragraph,
 }
 
 #[derive(Clone, Deserialize, PartialEq)]
@@ -22,7 +21,7 @@ struct Word {
     ignore_punctuation: bool,
 }
 
-actions!(vim, [Sentence, Paragraph]);
+actions!(vim, [Sentence]);
 impl_actions!(vim, [Word]);
 
 pub fn init(cx: &mut MutableAppContext) {
@@ -32,7 +31,6 @@ pub fn init(cx: &mut MutableAppContext) {
         },
     );
     cx.add_action(|_: &mut Workspace, _: &Sentence, cx: _| object(Object::Sentence, cx));
-    cx.add_action(|_: &mut Workspace, _: &Paragraph, cx: _| object(Object::Paragraph, cx));
 }
 
 fn object(object: Object, cx: &mut MutableAppContext) {
@@ -61,7 +59,6 @@ impl Object {
                 }
             }
             Object::Sentence => sentence(map, relative_to, around),
-            _ => relative_to..relative_to,
         }
     }
 
@@ -172,71 +169,19 @@ fn around_next_word(
     start..end
 }
 
-// /// Return the range containing a sentence.
-// fn sentence(map: &DisplaySnapshot, relative_to: DisplayPoint, around: bool) -> Range<DisplayPoint> {
-//     let mut previous_end = relative_to;
-//     let mut start = None;
-
-//     // Seek backwards to find a period or double newline. Record the last non whitespace character as the
-//     // possible start of the sentence. Alternatively if two newlines are found right after each other, return that.
-//     let mut rev_chars = map.reverse_chars_at(relative_to).peekable();
-//     while let Some((char, point)) = rev_chars.next() {
-//         dbg!(char, point);
-//         if char == '.' {
-//             break;
-//         }
-
-//         if char == '\n'
-//             && (rev_chars.peek().map(|(c, _)| c == &'\n').unwrap_or(false) || start.is_none())
-//         {
-//             break;
-//         }
-
-//         if !char.is_whitespace() {
-//             start = Some(point);
-//         }
-
-//         previous_end = point;
-//     }
-
-//     let mut end = relative_to;
-//     let mut chars = map.chars_at(relative_to).peekable();
-//     while let Some((char, point)) = chars.next() {
-//         if !char.is_whitespace() {
-//             if start.is_none() {
-//                 start = Some(point);
-//             }
-
-//             // Set the end to the point after the current non whitespace character
-//             end = point;
-//             *end.column_mut() += char.len_utf8() as u32;
-//         }
-
-//         if char == '.' {
-//             break;
-//         }
-
-//         if char == '\n' {
-//             if start.is_none() {
-//                 if let Some((_, next_point)) = chars.peek() {
-//                     end = *next_point;
-//                 }
-//                 break;
-
-//             if chars.peek().map(|(c, _)| c == &'\n').unwrap_or(false) {
-//                 break;
-//             }
-//         }
-//     }
-
-//     start.unwrap_or(previous_end)..end
-// }
-
 fn sentence(map: &DisplaySnapshot, relative_to: DisplayPoint, around: bool) -> Range<DisplayPoint> {
     let mut start = None;
     let mut previous_end = relative_to;
 
-    for (char, point) in map.reverse_chars_at(relative_to) {
+    let mut chars = map.chars_at(relative_to).peekable();
+
+    // Search backwards for the previous sentence end or current sentence start. Include the character under relative_to
+    for (char, point) in chars
+        .peek()
+        .cloned()
+        .into_iter()
+        .chain(map.reverse_chars_at(relative_to))
+    {
         if is_sentence_end(map, point) {
             break;
         }
@@ -248,36 +193,26 @@ fn sentence(map: &DisplaySnapshot, relative_to: DisplayPoint, around: bool) -> R
         previous_end = point;
     }
 
-    // Handle case where cursor was before the sentence start
-    let mut chars = map.chars_at(relative_to).peekable();
-    if start.is_none() {
-        if let Some((char, point)) = chars.peek() {
-            if is_possible_sentence_start(*char) {
-                start = Some(*point);
-            }
-        }
-    }
-
+    // Search forward for the end of the current sentence or if we are between sentences, the start of the next one
     let mut end = relative_to;
     for (char, point) in chars {
-        if start.is_some() {
-            if !char.is_whitespace() {
-                end = point;
-                *end.column_mut() += char.len_utf8() as u32;
-                end = map.clip_point(end, Bias::Left);
-            }
-
-            if is_sentence_end(map, point) {
-                break;
-            }
-        } else if is_possible_sentence_start(char) {
+        if start.is_none() && is_possible_sentence_start(char) {
             if around {
                 start = Some(point);
+                continue;
             } else {
                 end = point;
                 break;
             }
         }
+
+        end = point;
+        *end.column_mut() += char.len_utf8() as u32;
+        end = map.clip_point(end, Bias::Left);
+
+        if is_sentence_end(map, end) {
+            break;
+        }
     }
 
     let mut range = start.unwrap_or(previous_end)..end;
@@ -296,22 +231,21 @@ const SENTENCE_END_PUNCTUATION: &[char] = &['.', '!', '?'];
 const SENTENCE_END_FILLERS: &[char] = &[')', ']', '"', '\''];
 const SENTENCE_END_WHITESPACE: &[char] = &[' ', '\t', '\n'];
 fn is_sentence_end(map: &DisplaySnapshot, point: DisplayPoint) -> bool {
-    let mut chars = map.chars_at(point).peekable();
-
-    if let Some((char, _)) = chars.next() {
-        if char == '\n' && chars.peek().map(|(c, _)| c == &'\n').unwrap_or(false) {
+    let mut next_chars = map.chars_at(point).peekable();
+    if let Some((char, _)) = next_chars.next() {
+        // We are at a double newline. This position is a sentence end.
+        if char == '\n' && next_chars.peek().map(|(c, _)| c == &'\n').unwrap_or(false) {
             return true;
         }
 
-        if !SENTENCE_END_PUNCTUATION.contains(&char) {
+        // The next text is not a valid whitespace. This is not a sentence end
+        if !SENTENCE_END_WHITESPACE.contains(&char) {
             return false;
         }
-    } else {
-        return false;
     }
 
-    for (char, _) in chars {
-        if SENTENCE_END_WHITESPACE.contains(&char) {
+    for (char, _) in map.reverse_chars_at(point) {
+        if SENTENCE_END_PUNCTUATION.contains(&char) {
             return true;
         }
 
@@ -320,7 +254,7 @@ fn is_sentence_end(map: &DisplaySnapshot, point: DisplayPoint) -> bool {
         }
     }
 
-    return true;
+    return false;
 }
 
 /// Expands the passed range to include whitespace on one side or the other in a line. Attempts to add the
@@ -331,16 +265,26 @@ fn expand_to_include_whitespace(
     stop_at_newline: bool,
 ) -> Range<DisplayPoint> {
     let mut whitespace_included = false;
-    for (char, point) in map.chars_at(range.end) {
-        range.end = point;
 
+    let mut chars = map.chars_at(range.end).peekable();
+    while let Some((char, point)) = chars.next() {
         if char == '\n' && stop_at_newline {
             break;
         }
 
         if char.is_whitespace() {
-            whitespace_included = true;
+            // Set end to the next display_point or the character position after the current display_point
+            range.end = chars.peek().map(|(_, point)| *point).unwrap_or_else(|| {
+                let mut end = point;
+                *end.column_mut() += char.len_utf8() as u32;
+                map.clip_point(end, Bias::Left)
+            });
+
+            if char != '\n' {
+                whitespace_included = true;
+            }
         } else {
+            // Found non whitespace. Quit out.
             break;
         }
     }
@@ -385,7 +329,7 @@ mod test {
 
     #[gpui::test]
     async fn test_change_in_word(cx: &mut gpui::TestAppContext) {
-        let mut cx = NeovimBackedTestContext::new("test_change_in_word", cx)
+        let mut cx = NeovimBackedTestContext::new(cx)
             .await
             .binding(["c", "i", "w"]);
         cx.assert_all(WORD_LOCATIONS).await;
@@ -395,7 +339,7 @@ mod test {
 
     #[gpui::test]
     async fn test_delete_in_word(cx: &mut gpui::TestAppContext) {
-        let mut cx = NeovimBackedTestContext::new("test_delete_in_word", cx)
+        let mut cx = NeovimBackedTestContext::new(cx)
             .await
             .binding(["d", "i", "w"]);
         cx.assert_all(WORD_LOCATIONS).await;
@@ -405,7 +349,7 @@ mod test {
 
     #[gpui::test]
     async fn test_change_around_word(cx: &mut gpui::TestAppContext) {
-        let mut cx = NeovimBackedTestContext::new("test_change_around_word", cx)
+        let mut cx = NeovimBackedTestContext::new(cx)
             .await
             .binding(["c", "a", "w"]);
         cx.assert_all(WORD_LOCATIONS).await;
@@ -415,7 +359,7 @@ mod test {
 
     #[gpui::test]
     async fn test_delete_around_word(cx: &mut gpui::TestAppContext) {
-        let mut cx = NeovimBackedTestContext::new("test_delete_around_word", cx)
+        let mut cx = NeovimBackedTestContext::new(cx)
             .await
             .binding(["d", "a", "w"]);
         cx.assert_all(WORD_LOCATIONS).await;
@@ -431,7 +375,8 @@ mod test {
             the lazy doˇgˇ.ˇ ˇThe quick ˇ
             brown fox jumps over
         "},
-        // Double newlines are broken currently
+        // Position of the cursor after deletion between lines isn't quite right.
+        // Deletion in a sentence at the start of a line with whitespace is incorrect.
         // indoc! {"
         //     The quick brown fox jumps.
         //     Over the lazy dog
@@ -441,12 +386,12 @@ mod test {
         //     the lazy dog.ˇ
         //     ˇ
         // "},
-        r#"The quick brown.)]'" Brown fox jumps."#,
+        r#"ˇThe ˇquick brownˇ.)ˇ]ˇ'ˇ" Brown ˇfox jumpsˇ.ˇ "#,
     ];
 
     #[gpui::test]
     async fn test_change_in_sentence(cx: &mut gpui::TestAppContext) {
-        let mut cx = NeovimBackedTestContext::new("test_change_in_sentence", cx)
+        let mut cx = NeovimBackedTestContext::new(cx)
             .await
             .binding(["c", "i", "s"]);
         for sentence_example in SENTENCE_EXAMPLES {
@@ -456,31 +401,42 @@ mod test {
 
     #[gpui::test]
     async fn test_delete_in_sentence(cx: &mut gpui::TestAppContext) {
-        let mut cx = NeovimBackedTestContext::new("test_delete_in_sentence", cx)
+        let mut cx = NeovimBackedTestContext::new(cx)
             .await
             .binding(["d", "i", "s"]);
+
         for sentence_example in SENTENCE_EXAMPLES {
             cx.assert_all(sentence_example).await;
         }
     }
 
     #[gpui::test]
-    #[ignore] // End cursor position is incorrect
     async fn test_change_around_sentence(cx: &mut gpui::TestAppContext) {
-        let mut cx = NeovimBackedTestContext::new("test_change_around_sentence", cx)
+        let mut cx = NeovimBackedTestContext::new(cx)
             .await
             .binding(["c", "a", "s"]);
+
+        // Resulting position is slightly incorrect for unintuitive reasons.
+        cx.add_initial_state_exemption("The quick brown?ˇ Fox Jumps! Over the lazy.");
+        // Changing around the sentence at the end of the line doesn't remove whitespace.'
+        cx.add_initial_state_exemption("The quick brown.)]\'\" Brown fox jumps.ˇ ");
+
         for sentence_example in SENTENCE_EXAMPLES {
             cx.assert_all(sentence_example).await;
         }
     }
 
     #[gpui::test]
-    #[ignore] // End cursor position is incorrect
     async fn test_delete_around_sentence(cx: &mut gpui::TestAppContext) {
-        let mut cx = NeovimBackedTestContext::new("test_delete_around_sentence", cx)
+        let mut cx = NeovimBackedTestContext::new(cx)
             .await
             .binding(["d", "a", "s"]);
+
+        // Resulting position is slightly incorrect for unintuitive reasons.
+        cx.add_initial_state_exemption("The quick brown?ˇ Fox Jumps! Over the lazy.");
+        // Changing around the sentence at the end of the line doesn't remove whitespace.'
+        cx.add_initial_state_exemption("The quick brown.)]\'\" Brown fox jumps.ˇ ");
+
         for sentence_example in SENTENCE_EXAMPLES {
             cx.assert_all(sentence_example).await;
         }

crates/vim/src/state.rs 🔗

@@ -22,6 +22,7 @@ pub enum Namespace {
 
 #[derive(Copy, Clone, Debug, PartialEq, Eq, Deserialize)]
 pub enum Operator {
+    Number(usize),
     Namespace(Namespace),
     Change,
     Delete,
@@ -92,12 +93,14 @@ impl VimState {
 impl Operator {
     pub fn set_context(operator: Option<&Operator>, context: &mut Context) {
         let operator_context = match operator {
+            Some(Operator::Number(_)) => "n",
             Some(Operator::Namespace(Namespace::G)) => "g",
             Some(Operator::Object { around: false }) => "i",
             Some(Operator::Object { around: true }) => "a",
             Some(Operator::Change) => "c",
             Some(Operator::Delete) => "d",
             Some(Operator::Yank) => "y",
+
             None => "none",
         }
         .to_owned();

crates/vim/src/test_contexts/neovim_backed_binding_test_context.rs 🔗

@@ -1,6 +1,6 @@
 use std::ops::{Deref, DerefMut};
 
-use util::test::marked_text_offsets;
+use crate::state::Mode;
 
 use super::NeovimBackedTestContext;
 
@@ -24,20 +24,39 @@ impl<'a, const COUNT: usize> NeovimBackedBindingTestContext<'a, COUNT> {
         self.cx
     }
 
-    pub async fn assert(&mut self, initial_state: &str) {
+    pub fn binding<const NEW_COUNT: usize>(
+        self,
+        keystrokes: [&'static str; NEW_COUNT],
+    ) -> NeovimBackedBindingTestContext<'a, NEW_COUNT> {
+        self.consume().binding(keystrokes)
+    }
+
+    pub async fn assert(&mut self, marked_positions: &str) {
         self.cx
-            .assert_binding_matches(self.keystrokes_under_test, initial_state)
+            .assert_binding_matches(self.keystrokes_under_test, marked_positions)
             .await
     }
 
-    pub async fn assert_all(&mut self, marked_positions: &str) {
-        let (unmarked_text, cursor_offsets) = marked_text_offsets(marked_positions);
+    pub fn assert_manual(
+        &mut self,
+        initial_state: &str,
+        mode_before: Mode,
+        state_after: &str,
+        mode_after: Mode,
+    ) {
+        self.cx.assert_binding(
+            self.keystrokes_under_test,
+            initial_state,
+            mode_before,
+            state_after,
+            mode_after,
+        );
+    }
 
-        for cursor_offset in cursor_offsets.iter() {
-            let mut marked_text = unmarked_text.clone();
-            marked_text.insert(*cursor_offset, 'ˇ');
-            self.assert(&marked_text).await;
-        }
+    pub async fn assert_all(&mut self, marked_positions: &str) {
+        self.cx
+            .assert_binding_matches_all(self.keystrokes_under_test, marked_positions)
+            .await
     }
 }
 

crates/vim/src/test_contexts/neovim_backed_test_context.rs 🔗

@@ -3,6 +3,7 @@ use std::{
     path::PathBuf,
 };
 
+use collections::{HashMap, HashSet, VecDeque};
 use editor::DisplayPoint;
 use gpui::keymap::Keystroke;
 
@@ -14,11 +15,13 @@ use async_trait::async_trait;
 use nvim_rs::{
     create::tokio::new_child_cmd, error::LoopError, Handler, Neovim, UiAttachOptions, Value,
 };
+use serde::{Deserialize, Serialize};
 #[cfg(feature = "neovim")]
 use tokio::{
     process::{Child, ChildStdin, Command},
     task::JoinHandle,
 };
+use util::test::marked_text_offsets;
 
 use crate::state::Mode;
 
@@ -26,60 +29,43 @@ use super::{NeovimBackedBindingTestContext, VimTestContext};
 
 pub struct NeovimBackedTestContext<'a> {
     cx: VimTestContext<'a>,
-    test_case_id: &'static str,
-    data_counter: usize,
-    #[cfg(feature = "neovim")]
-    nvim: Neovim<nvim_rs::compat::tokio::Compat<ChildStdin>>,
-    #[cfg(feature = "neovim")]
-    _join_handle: JoinHandle<Result<(), Box<LoopError>>>,
-    #[cfg(feature = "neovim")]
-    _child: Child,
+    // Lookup for exempted assertions. Keyed by the insertion text, and with a value indicating which
+    // bindings are exempted. If None, all bindings are ignored for that insertion text.
+    exemptions: HashMap<String, Option<HashSet<String>>>,
+    neovim: NeovimConnection,
 }
 
 impl<'a> NeovimBackedTestContext<'a> {
-    pub async fn new(
-        test_case_id: &'static str,
-        cx: &'a mut gpui::TestAppContext,
-    ) -> NeovimBackedTestContext<'a> {
+    pub async fn new(cx: &'a mut gpui::TestAppContext) -> NeovimBackedTestContext<'a> {
+        let function_name = cx.function_name.clone();
         let cx = VimTestContext::new(cx, true).await;
-
-        #[cfg(feature = "neovim")]
-        let handler = NvimHandler {};
-        #[cfg(feature = "neovim")]
-        let (nvim, join_handle, child) = Compat::new(async {
-            let (nvim, join_handle, child) = new_child_cmd(
-                &mut Command::new("nvim").arg("--embed").arg("--clean"),
-                handler,
-            )
-            .await
-            .expect("Could not connect to neovim process");
-
-            nvim.ui_attach(100, 100, &UiAttachOptions::default())
-                .await
-                .expect("Could not attach to ui");
-
-            (nvim, join_handle, child)
-        })
-        .await;
-
-        let result = Self {
+        Self {
             cx,
-            test_case_id,
-            data_counter: 0,
-            #[cfg(feature = "neovim")]
-            nvim,
-            #[cfg(feature = "neovim")]
-            _join_handle: join_handle,
-            #[cfg(feature = "neovim")]
-            _child: child,
-        };
-
-        #[cfg(feature = "neovim")]
-        {
-            result.clear_test_data()
+            exemptions: Default::default(),
+            neovim: NeovimConnection::new(function_name).await,
         }
+    }
 
-        result
+    pub fn add_initial_state_exemption(&mut self, initial_state: &str) {
+        let initial_state = initial_state.to_string();
+        // None represents all keybindings being exempted for that initial state
+        self.exemptions.insert(initial_state, None);
+    }
+
+    pub fn add_keybinding_exemption<const COUNT: usize>(
+        &mut self,
+        keybinding: [&str; COUNT],
+        initial_state: &str,
+    ) {
+        let initial_state = initial_state.to_string();
+        let exempted_keybindings = self
+            .exemptions
+            .entry(initial_state)
+            .or_insert(Some(Default::default()));
+
+        if let Some(exempted_bindings) = exempted_keybindings.as_mut() {
+            exempted_bindings.insert(format!("{keybinding:?}"));
+        }
     }
 
     pub async fn simulate_shared_keystroke(&mut self, keystroke_text: &str) {
@@ -101,7 +87,7 @@ impl<'a> NeovimBackedTestContext<'a> {
 
             let key = format!("{start}{shift}{ctrl}{alt}{cmd}{}{end}", keystroke.key);
 
-            self.nvim
+            self.neovim
                 .input(&key)
                 .await
                 .expect("Could not input keystroke");
@@ -128,37 +114,32 @@ impl<'a> NeovimBackedTestContext<'a> {
             let cursor_point =
                 self.editor(|editor, cx| editor.selections.newest::<language::Point>(cx));
             let nvim_buffer = self
-                .nvim
+                .neovim
                 .get_current_buf()
                 .await
                 .expect("Could not get neovim buffer");
             let mut lines = self
                 .buffer_text()
-                .lines()
+                .split('\n')
                 .map(|line| line.to_string())
                 .collect::<Vec<_>>();
 
-            if lines.len() > 1 {
-                // Add final newline which is missing from buffer_text
-                lines.push("".to_string());
-            }
-
             nvim_buffer
                 .set_lines(0, -1, false, lines)
                 .await
                 .expect("Could not set nvim buffer text");
 
-            self.nvim
+            self.neovim
                 .input("<escape>")
                 .await
                 .expect("Could not send escape to nvim");
-            self.nvim
+            self.neovim
                 .input("<escape>")
                 .await
                 .expect("Could not send escape to nvim");
 
             let nvim_window = self
-                .nvim
+                .neovim
                 .get_current_win()
                 .await
                 .expect("Could not get neovim window");
@@ -173,18 +154,161 @@ impl<'a> NeovimBackedTestContext<'a> {
     }
 
     pub async fn assert_state_matches(&mut self) {
-        assert_eq!(self.neovim_text().await, self.buffer_text());
+        assert_eq!(
+            self.neovim.text().await,
+            self.buffer_text(),
+            "{}",
+            self.assertion_context.context()
+        );
 
         let zed_head = self.update_editor(|editor, cx| editor.selections.newest_display(cx).head());
-        assert_eq!(self.neovim_head().await, zed_head);
+        assert_eq!(
+            self.neovim.head().await,
+            zed_head,
+            "{}",
+            self.assertion_context.context()
+        );
+
+        if let Some(neovim_mode) = self.neovim.mode().await {
+            assert_eq!(
+                neovim_mode,
+                self.mode(),
+                "{}",
+                self.assertion_context.context()
+            );
+        }
+    }
 
-        if let Some(neovim_mode) = self.neovim_mode().await {
-            assert_eq!(neovim_mode, self.mode());
+    pub async fn assert_binding_matches<const COUNT: usize>(
+        &mut self,
+        keystrokes: [&str; COUNT],
+        initial_state: &str,
+    ) {
+        if let Some(possible_exempted_keystrokes) = self.exemptions.get(initial_state) {
+            match possible_exempted_keystrokes {
+                Some(exempted_keystrokes) => {
+                    if exempted_keystrokes.contains(&format!("{keystrokes:?}")) {
+                        // This keystroke was exempted for this insertion text
+                        return;
+                    }
+                }
+                None => {
+                    // All keystrokes for this insertion text are exempted
+                    return;
+                }
+            }
         }
+
+        let _keybinding_context_handle =
+            self.add_assertion_context(format!("Key Binding Under Test: {:?}", keystrokes));
+        let _initial_state_context_handle = self.add_assertion_context(format!(
+            "Initial State: \"{}\"",
+            initial_state.escape_debug().to_string()
+        ));
+        self.set_shared_state(initial_state).await;
+        self.simulate_shared_keystrokes(keystrokes).await;
+        self.assert_state_matches().await;
+    }
+
+    pub async fn assert_binding_matches_all<const COUNT: usize>(
+        &mut self,
+        keystrokes: [&str; COUNT],
+        marked_positions: &str,
+    ) {
+        let (unmarked_text, cursor_offsets) = marked_text_offsets(marked_positions);
+
+        for cursor_offset in cursor_offsets.iter() {
+            let mut marked_text = unmarked_text.clone();
+            marked_text.insert(*cursor_offset, 'ˇ');
+
+            self.assert_binding_matches(keystrokes, &marked_text).await;
+        }
+    }
+
+    pub fn binding<const COUNT: usize>(
+        self,
+        keystrokes: [&'static str; COUNT],
+    ) -> NeovimBackedBindingTestContext<'a, COUNT> {
+        NeovimBackedBindingTestContext::new(keystrokes, self)
     }
+}
+
+impl<'a> Deref for NeovimBackedTestContext<'a> {
+    type Target = VimTestContext<'a>;
+
+    fn deref(&self) -> &Self::Target {
+        &self.cx
+    }
+}
+
+impl<'a> DerefMut for NeovimBackedTestContext<'a> {
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        &mut self.cx
+    }
+}
+
+#[derive(Serialize, Deserialize)]
+pub enum NeovimData {
+    Text(String),
+    Head { row: u32, column: u32 },
+    Mode(Option<Mode>),
+}
 
+struct NeovimConnection {
+    data: VecDeque<NeovimData>,
     #[cfg(feature = "neovim")]
-    pub async fn neovim_text(&mut self) -> String {
+    test_case_id: String,
+    #[cfg(feature = "neovim")]
+    nvim: Neovim<nvim_rs::compat::tokio::Compat<ChildStdin>>,
+    #[cfg(feature = "neovim")]
+    _join_handle: JoinHandle<Result<(), Box<LoopError>>>,
+    #[cfg(feature = "neovim")]
+    _child: Child,
+}
+
+impl NeovimConnection {
+    async fn new(test_case_id: String) -> Self {
+        #[cfg(feature = "neovim")]
+        let handler = NvimHandler {};
+        #[cfg(feature = "neovim")]
+        let (nvim, join_handle, child) = Compat::new(async {
+            let (nvim, join_handle, child) = new_child_cmd(
+                &mut Command::new("nvim").arg("--embed").arg("--clean"),
+                handler,
+            )
+            .await
+            .expect("Could not connect to neovim process");
+
+            nvim.ui_attach(100, 100, &UiAttachOptions::default())
+                .await
+                .expect("Could not attach to ui");
+
+            nvim.set_option("smartindent", nvim_rs::Value::Boolean(true))
+                .await
+                .expect("Could not set smartindent on startup");
+
+            (nvim, join_handle, child)
+        })
+        .await;
+
+        Self {
+            #[cfg(feature = "neovim")]
+            data: Default::default(),
+            #[cfg(not(feature = "neovim"))]
+            data: Self::read_test_data(&test_case_id),
+            #[cfg(feature = "neovim")]
+            test_case_id,
+            #[cfg(feature = "neovim")]
+            nvim,
+            #[cfg(feature = "neovim")]
+            _join_handle: join_handle,
+            #[cfg(feature = "neovim")]
+            _child: child,
+        }
+    }
+
+    #[cfg(feature = "neovim")]
+    pub async fn text(&mut self) -> String {
         let nvim_buffer = self
             .nvim
             .get_current_buf()
@@ -196,17 +320,22 @@ impl<'a> NeovimBackedTestContext<'a> {
             .expect("Could not get buffer text")
             .join("\n");
 
-        self.write_test_data(text.clone(), "text");
+        self.data.push_back(NeovimData::Text(text.clone()));
+
         text
     }
 
     #[cfg(not(feature = "neovim"))]
-    pub async fn neovim_text(&mut self) -> String {
-        self.read_test_data("text")
+    pub async fn text(&mut self) -> String {
+        if let Some(NeovimData::Text(text)) = self.data.pop_front() {
+            text
+        } else {
+            panic!("Invalid test data. Is test deterministic? Try running with '--features neovim' to regenerate");
+        }
     }
 
     #[cfg(feature = "neovim")]
-    pub async fn neovim_head(&mut self) -> DisplayPoint {
+    pub async fn head(&mut self) -> DisplayPoint {
         let nvim_row: u32 = self
             .nvim
             .command_output("echo line('.')")
@@ -224,24 +353,25 @@ impl<'a> NeovimBackedTestContext<'a> {
             .unwrap()
             - 1; // Neovim columns start at 1
 
-        let serialized = format!("{},{}", nvim_row.to_string(), nvim_column.to_string());
-        self.write_test_data(serialized, "head");
+        self.data.push_back(NeovimData::Head {
+            row: nvim_row,
+            column: nvim_column,
+        });
 
         DisplayPoint::new(nvim_row, nvim_column)
     }
 
     #[cfg(not(feature = "neovim"))]
-    pub async fn neovim_head(&mut self) -> DisplayPoint {
-        let serialized = self.read_test_data("head");
-        let mut components = serialized.split(',');
-        let nvim_row = components.next().unwrap().parse::<u32>().unwrap();
-        let nvim_column = components.next().unwrap().parse::<u32>().unwrap();
-
-        DisplayPoint::new(nvim_row, nvim_column)
+    pub async fn head(&mut self) -> DisplayPoint {
+        if let Some(NeovimData::Head { row, column }) = self.data.pop_front() {
+            DisplayPoint::new(row, column)
+        } else {
+            panic!("Invalid test data. Is test deterministic? Try running with '--features neovim' to regenerate");
+        }
     }
 
     #[cfg(feature = "neovim")]
-    pub async fn neovim_mode(&mut self) -> Option<Mode> {
+    pub async fn mode(&mut self) -> Option<Mode> {
         let nvim_mode_text = self
             .nvim
             .get_mode()
@@ -265,74 +395,67 @@ impl<'a> NeovimBackedTestContext<'a> {
             _ => None,
         };
 
-        let serialized = serde_json::to_string(&mode).expect("Could not serialize mode");
-
-        self.write_test_data(serialized, "mode");
+        self.data.push_back(NeovimData::Mode(mode.clone()));
 
         mode
     }
 
     #[cfg(not(feature = "neovim"))]
-    pub async fn neovim_mode(&mut self) -> Option<Mode> {
-        let serialized = self.read_test_data("mode");
-        serde_json::from_str(&serialized).expect("Could not deserialize test data")
+    pub async fn mode(&mut self) -> Option<Mode> {
+        if let Some(NeovimData::Mode(mode)) = self.data.pop_front() {
+            mode
+        } else {
+            panic!("Invalid test data. Is test deterministic? Try running with '--features neovim' to regenerate");
+        }
     }
 
-    fn test_data_directory(&self) -> PathBuf {
+    fn test_data_path(test_case_id: &str) -> PathBuf {
         let mut data_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
         data_path.push("test_data");
-        data_path.push(self.test_case_id);
-        data_path
-    }
-
-    fn next_data_path(&mut self, kind: &str) -> PathBuf {
-        let mut data_path = self.test_data_directory();
-        data_path.push(format!("{}{}.txt", self.data_counter, kind));
-        self.data_counter += 1;
+        data_path.push(format!("{}.json", test_case_id));
         data_path
     }
 
     #[cfg(not(feature = "neovim"))]
-    fn read_test_data(&mut self, kind: &str) -> String {
-        let path = self.next_data_path(kind);
-        std::fs::read_to_string(path).expect(
+    fn read_test_data(test_case_id: &str) -> VecDeque<NeovimData> {
+        let path = Self::test_data_path(test_case_id);
+        let json = std::fs::read_to_string(path).expect(
             "Could not read test data. Is it generated? Try running test with '--features neovim'",
-        )
-    }
+        );
 
-    #[cfg(feature = "neovim")]
-    fn write_test_data(&mut self, data: String, kind: &str) {
-        let path = self.next_data_path(kind);
-        std::fs::create_dir_all(path.parent().unwrap())
-            .expect("Could not create test data directory");
-        std::fs::write(path, data).expect("Could not write out test data");
+        serde_json::from_str(&json)
+            .expect("Test data corrupted. Try regenerating it with '--features neovim'")
     }
+}
 
-    #[cfg(feature = "neovim")]
-    fn clear_test_data(&self) {
-        // If the path does not exist, no biggy, we will create it
-        std::fs::remove_dir_all(self.test_data_directory()).ok();
+#[cfg(feature = "neovim")]
+impl Deref for NeovimConnection {
+    type Target = Neovim<nvim_rs::compat::tokio::Compat<ChildStdin>>;
+
+    fn deref(&self) -> &Self::Target {
+        &self.nvim
     }
+}
 
-    pub async fn assert_binding_matches<const COUNT: usize>(
-        &mut self,
-        keystrokes: [&str; COUNT],
-        initial_state: &str,
-    ) {
-        dbg!(keystrokes, initial_state);
-        self.set_shared_state(initial_state).await;
-        self.simulate_shared_keystrokes(keystrokes).await;
-        self.assert_state_matches().await;
+#[cfg(feature = "neovim")]
+impl DerefMut for NeovimConnection {
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        &mut self.nvim
     }
+}
 
-    pub fn binding<const COUNT: usize>(
-        self,
-        keystrokes: [&'static str; COUNT],
-    ) -> NeovimBackedBindingTestContext<'a, COUNT> {
-        NeovimBackedBindingTestContext::new(keystrokes, self)
+#[cfg(feature = "neovim")]
+impl Drop for NeovimConnection {
+    fn drop(&mut self) {
+        let path = Self::test_data_path(&self.test_case_id);
+        std::fs::create_dir_all(path.parent().unwrap())
+            .expect("Could not create test data directory");
+        let json = serde_json::to_string(&self.data).expect("Could not serialize test data");
+        std::fs::write(path, json).expect("Could not write out test data");
     }
 }
 
+#[cfg(feature = "neovim")]
 #[derive(Clone)]
 struct NvimHandler {}
 
@@ -359,16 +482,17 @@ impl Handler for NvimHandler {
     }
 }
 
-impl<'a> Deref for NeovimBackedTestContext<'a> {
-    type Target = VimTestContext<'a>;
+#[cfg(test)]
+mod test {
+    use gpui::TestAppContext;
 
-    fn deref(&self) -> &Self::Target {
-        &self.cx
-    }
-}
+    use crate::test_contexts::NeovimBackedTestContext;
 
-impl<'a> DerefMut for NeovimBackedTestContext<'a> {
-    fn deref_mut(&mut self) -> &mut Self::Target {
-        &mut self.cx
+    #[gpui::test]
+    async fn neovim_backed_test_context_works(cx: &mut TestAppContext) {
+        let mut cx = NeovimBackedTestContext::new(cx).await;
+        cx.assert_state_matches().await;
+        cx.set_shared_state("This is a tesˇt").await;
+        cx.assert_state_matches().await;
     }
 }

crates/vim/src/test_contexts/vim_test_context.rs 🔗

@@ -1,6 +1,6 @@
 use std::ops::{Deref, DerefMut};
 
-use editor::test::EditorTestContext;
+use editor::test::{AssertionContextManager, EditorTestContext};
 use gpui::{json::json, AppContext, ViewHandle};
 use project::Project;
 use search::{BufferSearchBar, ProjectSearchBar};
@@ -82,6 +82,7 @@ impl<'a> VimTestContext<'a> {
                 cx,
                 window_id,
                 editor,
+                assertion_context: AssertionContextManager::new(),
             },
             workspace,
         }

crates/vim/src/vim.rs 🔗

@@ -26,7 +26,10 @@ pub struct SwitchMode(pub Mode);
 #[derive(Clone, Deserialize, PartialEq)]
 pub struct PushOperator(pub Operator);
 
-impl_actions!(vim, [SwitchMode, PushOperator]);
+#[derive(Clone, Deserialize, PartialEq)]
+struct Number(u8);
+
+impl_actions!(vim, [Number, SwitchMode, PushOperator]);
 
 pub fn init(cx: &mut MutableAppContext) {
     editor_events::init(cx);
@@ -45,6 +48,9 @@ pub fn init(cx: &mut MutableAppContext) {
             Vim::update(cx, |vim, cx| vim.push_operator(operator, cx))
         },
     );
+    cx.add_action(|_: &mut Workspace, n: &Number, cx: _| {
+        Vim::update(cx, |vim, cx| vim.push_number(n, cx));
+    });
 
     // Editor Actions
     cx.add_action(|_: &mut Editor, _: &Cancel, cx| {
@@ -145,6 +151,15 @@ impl Vim {
         self.sync_vim_settings(cx);
     }
 
+    fn push_number(&mut self, Number(number): &Number, cx: &mut MutableAppContext) {
+        if let Some(Operator::Number(current_number)) = self.active_operator() {
+            self.pop_operator(cx);
+            self.push_operator(Operator::Number(current_number * 10 + *number as usize), cx);
+        } else {
+            self.push_operator(Operator::Number(*number as usize), cx);
+        }
+    }
+
     fn pop_operator(&mut self, cx: &mut MutableAppContext) -> Operator {
         let popped_operator = self.state.operator_stack.pop()
             .expect("Operator popped when no operator was on the stack. This likely means there is an invalid keymap config");
@@ -152,6 +167,15 @@ impl Vim {
         popped_operator
     }
 
+    fn pop_number_operator(&mut self, cx: &mut MutableAppContext) -> usize {
+        let mut times = 1;
+        if let Some(Operator::Number(number)) = self.active_operator() {
+            times = number;
+            self.pop_operator(cx);
+        }
+        times
+    }
+
     fn clear_operator(&mut self, cx: &mut MutableAppContext) {
         self.state.operator_stack.clear();
         self.sync_vim_settings(cx);
@@ -227,7 +251,7 @@ mod test {
 
     #[gpui::test]
     async fn test_neovim(cx: &mut gpui::TestAppContext) {
-        let mut cx = NeovimBackedTestContext::new("test_neovim", cx).await;
+        let mut cx = NeovimBackedTestContext::new(cx).await;
 
         cx.simulate_shared_keystroke("i").await;
         cx.simulate_shared_keystrokes([

crates/vim/src/visual.rs 🔗

@@ -17,14 +17,18 @@ pub fn init(cx: &mut MutableAppContext) {
     cx.add_action(paste);
 }
 
-pub fn visual_motion(motion: Motion, cx: &mut MutableAppContext) {
+pub fn visual_motion(motion: Motion, times: usize, cx: &mut MutableAppContext) {
     Vim::update(cx, |vim, cx| {
         vim.update_active_editor(cx, |editor, cx| {
             editor.change_selections(Some(Autoscroll::Fit), cx, |s| {
                 s.move_with(|map, selection| {
-                    let (new_head, goal) = motion.move_point(map, selection.head(), selection.goal);
                     let was_reversed = selection.reversed;
-                    selection.set_head(new_head, goal);
+
+                    for _ in 0..times {
+                        let (new_head, goal) =
+                            motion.move_point(map, selection.head(), selection.goal);
+                        selection.set_head(new_head, goal);
+                    }
 
                     if was_reversed && !selection.reversed {
                         // Head was at the start of the selection, and now is at the end. We need to move the start

crates/vim/test_data/test_a.json 🔗

@@ -0,0 +1 @@
+[{"Text":"The quick"},{"Head":{"row":0,"column":6}},{"Mode":"Insert"},{"Text":"The quick"},{"Head":{"row":0,"column":9}},{"Mode":"Insert"}]

crates/vim/test_data/test_backspace.json 🔗

@@ -0,0 +1 @@
+[{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":0}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":4}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":8}},{"Mode":"Normal"}]

crates/vim/test_data/test_gg.json 🔗

@@ -0,0 +1 @@
+[{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Head":{"row":0,"column":5}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Head":{"row":0,"column":5}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Head":{"row":0,"column":8}},{"Mode":"Normal"},{"Text":"\n\nbrown fox jumps\nover the lazy dog"},{"Head":{"row":0,"column":0}},{"Mode":"Normal"}]

crates/vim/test_data/test_h.json 🔗

@@ -0,0 +1 @@
+[{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":0}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":4}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":1,"column":0}},{"Mode":"Normal"}]

crates/vim/test_data/test_insert_end_of_line.json 🔗

@@ -0,0 +1 @@
+[{"Text":"\nThe quick\nbrown fox "},{"Head":{"row":0,"column":0}},{"Mode":"Insert"},{"Text":"\nThe quick\nbrown fox "},{"Head":{"row":1,"column":9}},{"Mode":"Insert"},{"Text":"\nThe quick\nbrown fox "},{"Head":{"row":2,"column":10}},{"Mode":"Insert"}]

crates/vim/test_data/test_insert_line_above.json 🔗

@@ -0,0 +1 @@
+[{"Text":"\n"},{"Head":{"row":0,"column":0}},{"Mode":"Insert"},{"Text":"\nThe quick"},{"Head":{"row":0,"column":0}},{"Mode":"Insert"},{"Text":"\nThe quick\nbrown fox\njumps over"},{"Head":{"row":0,"column":0}},{"Mode":"Insert"},{"Text":"The quick\n\nbrown fox\njumps over"},{"Head":{"row":1,"column":0}},{"Mode":"Insert"},{"Text":"The quick\nbrown fox\n\njumps over"},{"Head":{"row":2,"column":0}},{"Mode":"Insert"},{"Text":"The quick\n\n\nbrown fox"},{"Head":{"row":1,"column":0}},{"Mode":"Insert"}]

crates/vim/test_data/test_j.json 🔗

@@ -0,0 +1 @@
+[{"Text":"The quick brown\nfox jumps"},{"Head":{"row":1,"column":0}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps"},{"Head":{"row":1,"column":5}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps"},{"Head":{"row":1,"column":8}},{"Mode":"Normal"},{"Text":"The quick brown\nfox jumps"},{"Head":{"row":1,"column":0}},{"Mode":"Normal"}]

crates/vim/test_data/test_jump_to_end.json 🔗

@@ -0,0 +1 @@
+[{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Head":{"row":3,"column":4}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Head":{"row":3,"column":4}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown fox jumps\nover the lazy dog"},{"Head":{"row":3,"column":16}},{"Mode":"Normal"},{"Text":"The quick\n\nbrown"},{"Head":{"row":2,"column":4}},{"Mode":"Normal"},{"Text":"The quick\n\n"},{"Head":{"row":2,"column":0}},{"Mode":"Normal"}]

crates/vim/test_data/test_jump_to_line_boundaries.json 🔗

@@ -0,0 +1 @@
+[{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":8}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":8}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":8}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":1,"column":4}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":1,"column":4}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":0}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":0}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":0}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":1,"column":0}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":1,"column":0}},{"Mode":"Normal"}]

crates/vim/test_data/test_k.json 🔗

@@ -0,0 +1 @@
+[{"Text":"The quick\nbrown fox jumps"},{"Head":{"row":0,"column":0}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox jumps"},{"Head":{"row":0,"column":5}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox jumps"},{"Head":{"row":0,"column":0}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox jumps"},{"Head":{"row":0,"column":7}},{"Mode":"Normal"},{"Text":"The quick\nbrown fox jumps"},{"Head":{"row":0,"column":8}},{"Mode":"Normal"}]

crates/vim/test_data/test_l.json 🔗

@@ -0,0 +1 @@
+[{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":1}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":6}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":0,"column":8}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":1,"column":1}},{"Mode":"Normal"},{"Text":"The quick\nbrown"},{"Head":{"row":1,"column":4}},{"Mode":"Normal"}]