Commit Graph
10859 Commits
Author SHA1 Message Date
Max Brunsfeld a01d973477 More git status optimizations (#2779)
Follow-up to https://github.com/zed-industries/zed/pull/2777
Refs https://github.com/zed-industries/community/issues/1770

In this PR, I reworked the way that git statuses are retrieved. In a
huge repository like `WebKit`, the really slow part of computing a list
of git statuses is the *unstaged* portion of the diff. For the *staged*
diff, `git` can avoid comparing the contents of unchanged directories,
because the index contains hashes of every tree. But for the *unstaged*
portion, Git needs to compare every file in the worktree against the
index. In the common case, when there are no changes, it's enough to
check the `mtime` of every file (because the index stores the mtimes of
files when they are added). But this still requires an `lstat` call to
retrieve each file's metadata.

I realized that this is redundant work, because the worktree is
*already* calling `lstat` on every file, and caching their metadata. So
in this PR, I've changed the `Repository` API so that there are separate
methods for retrieving a file's *staged* and *unstaged* statuses. The
*staged* statuses are retrieved in one giant batch, like before, to
reduce our git calls (which also have an inherent cost). But the
`unstaged` statuses are retrieved one-by-one, after we load files'
mtimes. Often, all that's required is an index lookup, and an mtime
comparison.

With this optimization, it once again becomes pretty responsive to open
`WebKit` or `chromium` in Zed.

Release Notes:

- Optimized the loading of project file when working in very large git
repositories
2023-07-24 11:23:32 -07:00
Quinn Wilton e199a6a3a1 Highlight all Elm function calls 2023-07-24 10:55:15 -07:00
Mikayla Maki 7603659479 Add MacOS standard key binding for file renames (#2784)
Release Notes:

- Added a default keybinding for using enter to rename files in the
project panel
2023-07-24 10:46:43 -07:00
Quinn Wilton 3cc88904bf Add all Elm functions to the outline, including locals 2023-07-24 10:45:46 -07:00
Quinn Wilton 62ee52a5fc Highlight qualified Elm function calls 2023-07-24 10:45:15 -07:00
Quinn Wilton fbe0108959 Highlight Elm arrows as keywords 2023-07-24 10:44:56 -07:00
Mikayla Maki 41105136a4 Add MacOS standard key binding for file renames 2023-07-24 10:20:10 -07:00
Mikayla Maki d95c4fdb2b Remove unbound highlight queries 2023-07-24 09:01:15 -07:00
Conrad Irwin baa16a2fc6 Better method ordering 2023-07-24 09:57:51 -06:00
Mikayla Maki ea74734b0a Touch up elm tree sitter integration 2023-07-24 08:52:51 -07:00
Conrad Irwin 43d94e37ec Refactor mode indicator to remove itself
One of the problems we had is that the status_bar shows a gap between
items, and we want to not add an additional gap for an invisible status
indicator.
2023-07-24 09:51:54 -06:00
Mikayla Maki 25e4bcea7f Implement cascading resize algorithm 2023-07-24 08:04:46 -07:00
Kirill Bulatov 52154f76ac Fixes a crash when SelectAllMatches action was called on no matches (#2783)
Release Notes:

- Fixes a crash when SelectAllMatches action was called on no matches
2023-07-24 15:48:45 +03:00
Kirill Bulatov 7dccb487de Fixes a crash when SelectAllMatches action was called on no matches 2023-07-24 15:42:10 +03:00
Quinn Wilton 6ad0852a70 Add outline.scm for Elm 2023-07-24 00:58:59 -07:00
Quinn Wilton dd504f5965 Add tree-sitter-glsl 2023-07-23 22:22:11 -07:00
Quinn Wilton a4914fcf3b Add tree-sitter-elm 2023-07-23 22:22:11 -07:00
Max Brunsfeld 8fff0b0ff8 Fix pathspec in staged_statuses
Enable non-literal matching so that directory paths match
all files contained within them.
2023-07-23 21:36:29 -07:00
Mikayla Maki 429a2fc623 Add drag end events
Fix left dragging cascade
WIP: Implement right dragging, WIP: use drag end events to set and reset state around initial flex orientation
2023-07-23 13:28:30 -07:00
Mikayla Maki 28ee05b324 WIP: cascade split resizes 2023-07-23 01:20:25 -07:00
Mikayla Maki b4b53eb5f1 Refactor resize handle code to be amenable to cascading resizes 2023-07-22 21:48:45 -07:00
Max Brunsfeld a3a9d024ba Fix filtering of staged statuses 2023-07-22 17:53:58 -07:00
Max Brunsfeld b338ffe8d8 Rely on git status for any paths not matching the git index 2023-07-22 17:47:36 -07:00
Kirill Bulatov e0915190d4 In terminal, open paths starting with ~ and focus on project panel when opening directories (#2780)
Further improves terminal navigation with cmd+click, now allowing to
open paths starting with `~` (if they are present otherwise) and
focusing project panel with highlighted entry for the directories
opened.

Release Notes:

- Further improves terminal navigation with cmd+click, now allowing to
open paths starting with `~` (if they are present otherwise) and
focusing project panel with highlighted entry for the directories
opened.
2023-07-23 00:23:19 +03:00
Kirill Bulatov f05095a6dd Focus project panel on directory select 2023-07-23 00:12:25 +03:00
Max Brunsfeld 6c09782aa2 Optimize full file status via passing in known file mtime 2023-07-22 11:53:26 -07:00
Max Brunsfeld 51d311affd Compute unstaged git status separately, to take advantage of our cached file mtimes 2023-07-21 17:58:43 -07:00
Max Brunsfeld ff0864026e Only fetch statuses for changed paths 2023-07-21 17:08:31 -07:00
Max Brunsfeld 05b161118c Don't call git status when ignored files change 2023-07-21 17:05:42 -07:00
Kirill Bulatov dcaf8a9af8 Open paths starting with ~ from terminal click 2023-07-22 01:34:25 +03:00
Conrad Irwin d14a484a20 Add support for adding/removing status items 2023-07-21 16:06:14 -06:00
Conrad Irwin 458916409c Add a mode indicator for vim
This is the second most common remaining complaint (after :w not
working).

Fixes: zed-industries/community#409
2023-07-21 16:06:14 -06:00
Max Brunsfeld 7788eabec0 Avoid performance bottlenecks from git status calls during worktree scanning (#2777)
Closes
https://linear.app/zed-industries/issue/Z-2689/huge-slowdown-when-working-in-large-git-repositories-like-webkit
Closes https://github.com/zed-industries/community/issues/1770

In large git repositories (like Webkit), `git status` can be very slow.
And our current approach of retrieving git statuses (one by one as we
load paths), causes catastrophic slowdowns in these repos. This PR
further optimizes our retrieval of git statuses (started in
https://github.com/zed-industries/zed/pull/2728), so that when scanning
a directory, we only load git statuses once, in a single batch, at the
beginning of the scan.

There is still an initial lag when opening `WebKit` in Zed, while the
initial git status runs. But once this call completes, everything is
fast. Let's come back to this problem later.

For now, this makes Zed's directory scanning massively more efficient,
even in the case of normal-sized repos like `zed`. The git status code
was a huge percentage of zed's CPU usage when launching. Here is that
code, highlighted in a flamegraph before and after this change:

Before:

![before](https://github.com/zed-industries/zed/assets/326587/627012f2-6131-44ac-95c2-ea4a4531cb24)

After:

![after](https://github.com/zed-industries/zed/assets/326587/a11a3e1b-e925-4bff-a421-ea71cb4de85d)


Release Notes:

- Fixed a bug where project paths took a very long time to load when
working in large git repositories
([#1770](https://github.com/zed-industries/community/issues/1770))
2023-07-21 14:46:53 -07:00
Kirill Bulatov bd9118f673 Do not scroll when selecting all (#2778)
In big buffers, when I press `cmd-a`, the view gets scrolled to the very
bottom.
Usually it's now that I want, I can scroll to bottom with `cmd-down`
separately, and selecting all text is used for copy-pasting it
somewhere, no need to scroll anywhere for that — I can get back to the
same place later.

Release Notes:

- Removed the scroll to the end of the editor after `editor::SelectAll`
action
2023-07-22 00:25:37 +03:00
Kirill Bulatov c538504b9c Do not scroll when selecting all 2023-07-22 00:17:02 +03:00
Max Brunsfeld 4bd415f2b6 Retrieve git statuses in one batch when scanning dirs 2023-07-21 13:50:54 -07:00
Kirill Bulatov 25ea07cd41 When renaming in project panel, select file names without extensions (#2776)
Closes
https://github.com/zed-industries/community/issues/1789#issuecomment-1646061712

<img width="196" alt="Screenshot 2023-07-21 at 23 23 47"
src="https://github.com/zed-industries/zed/assets/2690773/f5c7025b-6dc8-4f0c-81e5-3cc98a3a9c8b">
<img width="197" alt="Screenshot 2023-07-21 at 23 23 52"
src="https://github.com/zed-industries/zed/assets/2690773/596f8ab0-15e0-4285-be34-ce4c276b686f">

When renaming in project panel, select file names without extensions.

Release Notes:

- Improved project panel rename by selecting file names without
extensions
2023-07-21 23:30:55 +03:00
Kirill Bulatov 33b215a288 Add search in directory action in the project panel (#2774)
Part of https://github.com/zed-industries/zed/issues/1153
Closes https://github.com/zed-industries/community/issues/1326

<img width="432" alt="image"
src="https://github.com/zed-industries/zed/assets/2690773/a50ee073-9d2e-4e5c-ae5e-23312693c540">

Adds an `project_panel::NewSearchInDirectory` action ("alt-shift-f"
default) in the project editor context to open a new project search in
the selected directory.

Release Notes:

- Adds an action to open project search in the project panel's directory
2023-07-21 23:25:45 +03:00
Julia f2c9738a69 Put our downloaded copy of Node in the env for every NPM action (#2775)
Intelephense (PHP language server) has a dependency on `protobufjs`
which invokes `node` in the `postinstall` script and if the user did not
have a system Node runtime installed that would fail. Have this use our
downloaded installation too

Fixes
https://linear.app/zed-industries/issue/Z-2687/php-language-server-failed

Release Notes:
- Fixed PHP language server installation on systems without a system
Node installation.
2023-07-21 16:24:05 -04:00
Kirill Bulatov 804da68af7 When renaming in project panel, select file names without extensions 2023-07-21 23:22:22 +03:00
Julia 2d8159998d Put our downloaded copy of Node in the env for every NPM action
Intelephense (PHP language server) has a dependency on `protobufjs`
which invokes `node` in the `postinstall` script and if the user did
not have a system Node runtime installed that would fail. Have this
use our downloaded installation too
2023-07-21 16:13:00 -04:00
Kirill Bulatov 595bc16749 Add search in directory action in the project panel 2023-07-21 22:47:57 +03:00
Julia e002d9efb0 Avoid panic from assuming a vim operator exists on the operator stack (#2773)
Fixes
https://linear.app/zed-industries/issue/Z-338/operator-popped-when-no-operator-was-on-the-stack-this-likely-means

Release Notes:
- Fixed a panic that could occur when invoking a Vim object without an
operator.
2023-07-21 14:47:38 -04:00
Julia 243a1a854e Avoid panic from assuming a vim operator exists on the operator stack 2023-07-21 14:25:30 -04:00
Conrad Irwin 56c657fe79 Vim shortcuts (#2760)
Refactors some of the vim bindings to make the vim.json file less
obtuse.

Release Notes:

- vim: add `;` and `,` to repeat last `{f,F,t,T}`
- vim: add zed-specific shortcuts for common IDE actions:
- - `g A` to find all references
- - `g .` to open the code actions menu.
- - `c d` for rename
2023-07-21 10:31:18 -06:00
Conrad Irwin 4772e4ccee vim: add , and ; 2023-07-21 09:50:22 -06:00
Conrad Irwin a50d30bf8e Quality of life shortcuts for code actions 2023-07-21 09:47:15 -06:00
Conrad Irwin 8ba69c15d1 refactor: Remove G/Z Namespace support
This previously enabled things like `d g g` to work, but we can
fix that instead by not clearing out pending vim state on change.

Either way, it is unnecessary and causes some user-confusion
(zed-industries/community#176), so remove this code for now; and use
comments to organize the file a bit instead.
2023-07-21 09:47:14 -06:00
Conrad Irwin bf2583414b Fix shift-enter in search (#2772)
Fixes shift-enter to go to previous result.

Release Notes:

- To type a newline in search use `ctrl-enter` (or `ctrl-shift-enter`
for a newline below).
2023-07-21 09:23:04 -06:00
Conrad Irwin 807279208d Fix shift-enter in search
If you want to type a newline in an auto_height editor, ctrl and
ctrl-shift are your friends.
2023-07-21 09:10:12 -06:00