Zed Improved. Aiming to improve upon Zed and make a truly delightful code editor.
https://zed.dev
![]() ## Description of Feature or Change Zed currently lacks a built-in way to convert a file’s indentation style on the fly. While it's possible to change indentation behavior via global or language-specific settings, these changes are persistent and broad in scope as they apply to all files or all files of a given language. We believe this could be improved for quick one-off adjustments to specific files. This PR introduces two new editor commands: `Editor::convert_indentation_to_spaces` and `Editor::convert_indentation_to_tabs`. These commands allow users to convert the indentation of either the entire buffer or a selection of lines, to spaces or tabs. Indentation levels are preserved, and any mixed whitespace lines are properly normalized. This feature is inspired by VS Code’s "Convert Indentation to Tabs/Spaces" commands, but offers faster execution and supports selection-based conversion, making it more flexible for quick formatting changes. ## Implementation Details To enable selection-based indentation conversion, we initially considered reusing the existing `Editor::manipulate_lines` function, which handles selections for line-based manipulations. However, this method was designed specifically for operations like sorting or reversing lines, and does not allow modifications to the line contents themselves. To address this limitation, we refactored the method into a more flexible version: `Editor::manipulate_generic_lines`. This new method passes a reference to the selected text directly into a callback, giving the callback full control over how to process and construct the resulting lines. The callback returns a `String` containing the modified text, as well as the number of lines before and after the transformation. These counts are computed using `.len()` on the line vectors during manipulation, which is more efficient than calculating them after the fact. ```rust fn manipulate_generic_lines<M>( &mut self, window: &mut Window, cx: &mut Context<Self>, mut manipulate: M, ) where M: FnMut(&str) -> (String, usize, usize), { // ... Get text from buffer.text_for_range() ... let (new_text, lines_before, lines_after) = manipulate(&text); // ... ``` We now introduce two specialized methods: `Editor::manipulate_mutable_lines` and `Editor::manipulate_immutable_lines`. Each editor command selects the appropriate method based on whether it needs to modify line contents or simply reorder them. This distinction is important for performance: when line contents remain unchanged, working with an immutable reference as `&mut Vec<&str>` is both faster and more memory-efficient than using an owned `&mut Vec<String>`. ## Demonstration https://github.com/user-attachments/assets/e50b37ea-a128-4c2a-b252-46c3c4530d97 Release Notes: - Added `editor::ConvertIndentationToSpaces` and `editor::ConvertIndentationToTabs` actions to change editor indents --------- Co-authored-by: Pedro Silveira <pedroruanosilveira@tecnico.ulisboa.pt> |
||
---|---|---|
.cargo | ||
.cloudflare | ||
.config | ||
.github | ||
.zed | ||
assets | ||
crates | ||
docs | ||
extensions | ||
legal | ||
nix | ||
script | ||
tooling | ||
.clinerules | ||
.cursorrules | ||
.git-blame-ignore-revs | ||
.gitattributes | ||
.gitignore | ||
.mailmap | ||
.prettierrc | ||
.rules | ||
.windsurfrules | ||
Cargo.lock | ||
Cargo.toml | ||
CLAUDE.md | ||
clippy.toml | ||
CODE_OF_CONDUCT.md | ||
compose.yml | ||
CONTRIBUTING.md | ||
Cross.toml | ||
debug.plist | ||
default.nix | ||
docker-compose.sql | ||
Dockerfile-collab | ||
Dockerfile-collab.dockerignore | ||
Dockerfile-cross | ||
Dockerfile-cross.dockerignore | ||
Dockerfile-distros | ||
Dockerfile-distros.dockerignore | ||
flake.lock | ||
flake.nix | ||
LICENSE-AGPL | ||
LICENSE-APACHE | ||
LICENSE-GPL | ||
livekit.yaml | ||
lychee.toml | ||
Procfile | ||
Procfile.postgrest | ||
README.md | ||
renovate.json | ||
rust-toolchain.toml | ||
shell.nix | ||
typos.toml |
Zed
Welcome to Zed, a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.
Installation
On macOS and Linux you can download Zed directly or install Zed via your local package manager.
Other platforms are not yet available:
- Windows (tracking issue)
- Web (tracking issue)
Developing Zed
- Building Zed for macOS
- Building Zed for Linux
- Building Zed for Windows
- Running Collaboration Locally
Contributing
See CONTRIBUTING.md for ways you can contribute to Zed.
Also... we're hiring! Check out our jobs page for open roles.
Licensing
License information for third party dependencies must be correctly provided for CI to pass.
We use cargo-about
to automatically comply with open source licenses. If CI is failing, check the following:
- Is it showing a
no license specified
error for a crate you've created? If so, addpublish = false
under[package]
in your crate's Cargo.toml. - Is the error
failed to satisfy license requirements
for a dependency? If so, first determine what license the project has and whether this system is sufficient to comply with this license's requirements. If you're unsure, ask a lawyer. Once you've verified that this system is acceptable add the license's SPDX identifier to theaccepted
array inscript/licenses/zed-licenses.toml
. - Is
cargo-about
unable to find the license for a dependency? If so, add a clarification field at the end ofscript/licenses/zed-licenses.toml
, as specified in the cargo-about book.