Find a file
Jordan Pittman 4e4bfd6f4e
editor: Add "Wrap Selections in Tag" action (#36948)
This PR adds the ability for a user to select one or more blocks of text
and wrap each selection in an HTML tag — which works by placing multiple
cursors inside the open and close tags so the appropriate element name
can be typed in to all places simultaneously.

This is similar to the emmet "Wrap with Abbreviation" functionality
discussed in #15588 but is a simpler version that does not rely on
Emmet's language server.

Here's a preview of the feature in action:


https://github.com/user-attachments/assets/1931e717-136c-4766-a585-e4ba939d9adf


Some notes and questions:
- The current implementation is a hardcoded with regards to supported
languages. I'd love some direction on how much of this information to
push into the relevant language structs.
- I can see this feature as something that languages added by an
extension would want to enable support for — is this something you'd
want?
- The syntax is hardcoded to support HTML/XML/JSX-like languages. I
don't suppose this is a problem but figured I'd point it out anyway.
- I called it "Wrap in tag" but open to whatever naming you feel is
appropriate.
- The implementation doesn't use `manipulate_lines` — I wasn't sure how
make use of that without extra overhead / bookkeeping — does this seem
fine?
- I could also investigate adding wrap in abbreviation support by
communicating with the Emmet language server but I think I'll need some
direction on how to handle Emmet's custom LSP message. I could do this
either in addition to or instead of this feature — though imo this
feature is a nice "shortcut" regardless.

Release Notes:

- Added a new "Wrap Selections in Tag" action that lets you wrap one or
more selections in tags based on language. Works in HTML, JSX, and
similar languages, and places cursors inside both opening and closing
tags so you can type the tag name once and apply it everywhere.

---------

Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
2025-08-28 02:37:32 +05:30
.cargo windows: Publish nightly (#24800) 2025-07-09 08:57:03 +08:00
.cloudflare docs: Document context servers (#21170) 2024-11-25 11:05:14 -05:00
.config emmet: Extract to zed-extensions/emmet repository (#36323) 2025-08-16 17:02:51 +00:00
.github chore: Fix typo in 10_bug_report.yml (#36922) 2025-08-26 11:05:40 +02:00
.zed Ensure *.json recognized as JSONC if checkout folder not zed (#34289) 2025-07-11 14:25:09 +00:00
assets Swap NewlineBelow and NewlineAbove bindings for default linux keymap (#36939) 2025-08-27 07:06:33 +00:00
crates editor: Add "Wrap Selections in Tag" action (#36948) 2025-08-28 02:37:32 +05:30
docs Update Wednesday release process docs (#37033) 2025-08-27 15:59:08 -04:00
extensions editor: Add "Wrap Selections in Tag" action (#36948) 2025-08-28 02:37:32 +05:30
legal ci: Check for broken links (#30844) 2025-06-06 09:39:35 +00:00
nix Use IBM Plex Sans / Lilex (#36084) 2025-08-13 13:25:52 -06:00
script Add get stable channel release notes script (#36969) 2025-08-26 23:35:29 +00:00
tooling acp: Remove ACP v0 (#36785) 2025-08-22 22:09:08 -06:00
.clinerules Initial .rules file for agent with symlinks for other rules file paths (#29014) 2025-04-17 23:41:23 +00:00
.cursorrules Initial .rules file for agent with symlinks for other rules file paths (#29014) 2025-04-17 23:41:23 +00:00
.git-blame-ignore-revs Add PR 15352 to .git-blame-ignore-revs (#30870) 2025-05-17 11:35:58 +00:00
.gitattributes
.gitignore Account for issue types in top-ranking issues script (#33118) 2025-06-20 14:19:29 -04:00
.mailmap Update .mailmap (#30874) 2025-05-17 12:34:42 +00:00
.prettierrc ci: Add check for formatting default.json (#30034) 2025-05-06 18:55:26 +00:00
.rules gpui: Simplify Action macros + support doc comments in actions! (#33263) 2025-06-24 04:34:51 +00:00
.windsurfrules Initial .rules file for agent with symlinks for other rules file paths (#29014) 2025-04-17 23:41:23 +00:00
Cargo.lock Remote LSP logs (#36709) 2025-08-27 21:55:34 +03:00
Cargo.toml Enhance syntax highlight for C++20 keywords (#36817) 2025-08-27 04:31:57 +00:00
CLAUDE.md Initial .rules file for agent with symlinks for other rules file paths (#29014) 2025-04-17 23:41:23 +00:00
clippy.toml Restructure agent context (#29233) 2025-04-24 21:29:33 +00:00
CODE_OF_CONDUCT.md Remove community content from docs and point to zed.dev (#19895) 2024-10-29 09:44:58 -04:00
compose.yml Set stripe-mock version to 0.178.0 to match stripe API version used (#34786) 2025-07-20 19:39:04 +00:00
CONTRIBUTING.md Allow icon themes to provide their own file associations (#24926) 2025-02-15 00:35:13 +00:00
Cross.toml Add remote server cross compilation (#19136) 2024-10-12 23:23:56 -07:00
debug.plist
default.nix Fix nix build (#26270) 2025-03-10 01:06:11 -07:00
docker-compose.sql
Dockerfile-collab Revert "Revert "chore: Bump Rust to 1.89 (#35788)"" (#35937) 2025-08-09 23:48:58 +02:00
Dockerfile-collab.dockerignore
Dockerfile-cross Add remote server cross compilation (#19136) 2024-10-12 23:23:56 -07:00
Dockerfile-cross.dockerignore Add remote server cross compilation (#19136) 2024-10-12 23:23:56 -07:00
Dockerfile-distros
Dockerfile-distros.dockerignore
flake.lock Revert "Revert "chore: Bump Rust to 1.89 (#35788)"" (#35937) 2025-08-09 23:48:58 +02:00
flake.nix nix: Add job names and garnix substitutor (#31625) 2025-05-28 13:32:12 -07:00
LICENSE-AGPL Update license year (#24191) 2025-02-04 09:02:59 -05:00
LICENSE-APACHE Update license year (#24191) 2025-02-04 09:02:59 -05:00
LICENSE-GPL
livekit.yaml
lychee.toml ci: Check for broken links (#30844) 2025-06-06 09:39:35 +00:00
Procfile Update instructions for local collaboration (#35689) 2025-08-06 11:10:28 -07:00
Procfile.postgrest
Procfile.web Add a few more testing features (#36778) 2025-08-22 22:17:02 +00:00
README.md Adjust Zed badge (#35290) 2025-07-29 14:24:10 -04:00
renovate.json renovate: Require dependency dashboard approval for updates (#29065) 2025-04-18 18:44:30 +00:00
rust-toolchain.toml Eliminate host targets from rust toolchain file (#36077) 2025-08-12 14:36:48 -07:00
shell.nix Fix nix build (#26270) 2025-03-10 01:06:11 -07:00
typos.toml Remove /docs slash command (#36325) 2025-08-16 19:00:31 +00:00

Zed

Zed CI

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:

Developing Zed

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, add publish = 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 the accepted array in script/licenses/zed-licenses.toml.
  • Is cargo-about unable to find the license for a dependency? If so, add a clarification field at the end of script/licenses/zed-licenses.toml, as specified in the cargo-about book.