c5bfa93bfbb6bfc2bf45fcfaea3ee31d70c0a3f3
10
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
692a137782 |
agent: Add project-level disable_ai setting (#47902)
Closes #47854 Move `disable_ai` from root settings to `ProjectSettingsContent` to enable per-project AI configuration via `.zed/settings.json`. - Update settings UI to allow viewing/editing at both user and project level - Update editor to check project-level settings for edit predictions and context menus - Prevent MCP servers from starting when AI is disabled at project level Note: SaturatingBool ensures that if user globally disables AI, projects cannot re-enable it. Projects can only further restrict AI, not grant it. Release Notes: - added support for disabling AI in project settings --------- Co-authored-by: Ben Kunkle <ben.kunkle@gmail.com> |
||
|
|
e7926480dd |
settings: Add ability to select audio input/output devices for collab (#49015)
This PR adds ability to select and test audio input/output devices for use in collaboration setting (which is what the team at Zed relies heavily on). Currently, we only ever used whatever the system default is and it worked well until it didn't - for some reason, when I am on my Linux laptop, I am unable to force Zed to use my external mic + headphones via external USB audio interface. With this PR, now I can list all available devices and select the one I want. There are still a couple of caveats that we should be aware of: * I've decided to list *all* available devices meaning on Linux it is quite possible that you may discover that what your desktop environment is reporting to you is a significantly shorter list than what your sound framework/hw is actually exposing. I think this makes sense given my inexperience with audio drivers/devices and frameworks on various OSes so that we get full control over what is available with the goal of being able to come up with some filtering heuristic as we go along. * We currently populate the list of available audio devices only once at startup meaning if you unplug your device while you have Zed running this will not register until you restart Zed which is a PITA. However, in order to keep the changes manageable I thought it would be best to do minimal work in this regard now, and iterate on this some more in the near future. After all, we don't really monitor device changes on any platform except macOS anyhow, so it might be the case that when I get round to implementing this I will have the opportunity to tackle both at the same time. * In order to get a valid list of all audio devices using `cpal` crate (which is the building block of `rodio`), I had to bump `cpal` to 0.17, and pin `rodio` to a more recent commit sha as a result, so if you see any regressions, lemme know and/or feel free to revert this PR. * Finally, I've done my best to integrate this with the settings UI, but I am sure more could be done in terms of styling, etc. Some screenshots: <img width="1152" height="949" alt="Screenshot From 2026-02-12 11-40-04" src="https://github.com/user-attachments/assets/e147c153-1902-49d6-bf68-3ac317a6a7b0" /> <img width="1152" height="949" alt="Screenshot From 2026-02-12 11-40-16" src="https://github.com/user-attachments/assets/b4e9a2f8-b38e-4de0-b910-067cc432b5bc" /> Release Notes: - Added ability to select audio input/output devices as part of Collaboration page in Settings. Added ability to test selected devices with a simple playback loop routing input directly into output for easier debugging of your audio devices. --------- Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com> |
||
|
|
4f8ff64452 |
Fix settings migrations for nested platform/channel/profile keys (#48550)
Previously, some settings migrations only operated on root-level keys and missed settings nested under platform keys (`macos`, `linux`, etc.), channel keys (`nightly`, `stable`, etc.), or profile blocks. This fixes migrations to recurse into those nested locations. Also fixes `m_2026_02_02` to gracefully skip when `edit_predictions` is not an object (e.g. `true`) instead of bailing and aborting the entire migration chain. Release Notes: - Fixed settings migrations to correctly handle settings nested under platform, channel, or profile keys. |
||
|
|
602d64f238 |
Add configurable REPL output size limits (#47114)
Closes #47113 Adds configurable REPL output size limits with two new settings, `repl.output_max_height_lines` and `repl.output_max_width_columns`, so large outputs scroll instead of expanding and images scale down to fit the available space. The output containers in both inline REPL blocks and notebook cells now respect these bounds, and image sizing uses the same text metrics as the terminal output for consistent column-based width calculations. Release Notes: - REPL output now supports configurable max height and width limits, with large outputs scrolling and images scaling to stay within the viewport. |
||
|
|
85d03d5122 |
Use remote user from devcontainer CLI and respect shell in passwd (#48230)
Closes #46252 Uses the `remoteUser` property returned from the devcontainer CLI so that settings are respected. Additionally, checks for a default shell in `passwd` if `$SHELL` is not set. Release Notes: - Fixed remote_user and shell inconsistencies from within dev containers |
||
|
|
41ce23f896 |
vim: Add gdefault setting to set /g as a default substitution flag (#47664)
Add support for Vim's `gdefault` option which makes the `:substitute` command replace all matches in a line by default, instead of just the first match. When enabled, the `/g` flag inverts this behavior. - Add `vim.gdefault` setting - Add `:set gdefault`, `:set nogdefault` (and short forms `:set gd`, `:set nogd`) - Fix handling of multiple `/g` flags so that each one inverts the one before Closes #36209 Release Notes: - vim: Add `vim.gdefault` setting to make `/g` (replace all matches in a line) the default for substitutions, along with `:set gdefault` and `:set nogdefault` commands (short forms: `gd`, `nogd`) --------- Co-authored-by: dino <dinojoaocosta@gmail.com> |
||
|
|
3a7c746043 |
Revert " Add vim/emacs modeline support " (#47479)
Reverts zed-industries/zed#44210 I am forced to revert this PR as it completely breaks release builds with the following panic: ``` thread 'main' (2648653) panicked at crates/rope/src/rope.rs:893:25: byte index 73 is not a char boundary; it is inside 'স' (bytes 71..74) of `কৰক</translation> <translation id="9216898458513705996">টেবসমূহ এই ডিভাইচত খোলা ` stack backtrace: 2026-01-23T15:37:48+01:00 INFO [node_runtime] using Zed managed Node.js at /Users/kubkon/Library/Application Support/Zed/node/node-v24.11.0-darwin-arm64 since system Node.js wasn't found on PATH: cannot find binary path 0: __rustc::rust_begin_unwind at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/std/src/panicking.rs:698:5 1: core::panicking::panic_fmt at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/panicking.rs:80:14 2: core::str::slice_error_fail_rt 3: core::str::slice_error_fail at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/str/mod.rs:69:5 4: core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::index at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/str/traits.rs:248:21 5: <str as core::ops::index::Index<core::ops::range::Range<usize>>>::index at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/str/traits.rs:63:15 6: <rope::Chunks>::peek at /Users/kubkon/dev/zed/crates/rope/src/rope.rs:893:25 7: <rope::Lines>::next at /Users/kubkon/dev/zed/crates/rope/src/rope.rs:1111:45 8: <project::lsp_store::LspStore>::parse_modeline at /Users/kubkon/dev/zed/crates/project/src/lsp_store.rs:4570:43 9: <project::lsp_store::LspStore>::on_buffer_added at /Users/kubkon/dev/zed/crates/project/src/lsp_store.rs:4301:14 10: <project::lsp_store::LspStore>::on_buffer_store_event at /Users/kubkon/dev/zed/crates/project/src/lsp_store.rs:4166:22 11: <<project::lsp_store::LspStore>::on_buffer_store_event as core::ops::function::FnMut<(&mut project::lsp_store::LspStore, gpui::app::entity_map::Entity<project::buffer_store::BufferStore>, &project::buffer_store::BufferStoreEvent, &mut gpui::app::context::Context<project::lsp_store::LspStore>)>>::call_mut at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/ops/function.rs:166:5 12: <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe::<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}::{closure#0} at /Users/kubkon/dev/zed/crates/gpui/src/app/context.rs:111:44 13: <gpui::app::App as gpui::AppContext>::update_entity::<project::lsp_store::LspStore, (), <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}::{closure#0}>::{closure#0} at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:2281:26 14: <gpui::app::App>::update::<(), <gpui::app::App as gpui::AppContext>::update_entity<project::lsp_store::LspStore, (), <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}::{closure#0}>::{closure#0}> at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:818:22 15: <gpui::app::App as gpui::AppContext>::update_entity::<project::lsp_store::LspStore, (), <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}::{closure#0}> at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:2279:14 16: <gpui::app::entity_map::Entity<project::lsp_store::LspStore>>::update::<(), gpui::app::App, <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}::{closure#0}> at /Users/kubkon/dev/zed/crates/gpui/src/app/entity_map.rs:445:12 17: <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe::<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0} at /Users/kubkon/dev/zed/crates/gpui/src/app/context.rs:111:22 18: <gpui::app::App>::subscribe_internal::<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}>::{closure#0} at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:964:25 19: <alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>> as core::ops::function::FnMut<(&dyn core::any::Any, &mut gpui::app::App)>>::call_mut at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/alloc/src/boxed.rs:2012:9 20: <gpui::app::App>::apply_emit_effect::{closure#0} at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:1407:21 21: <gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain::<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1} at /Users/kubkon/dev/zed/crates/gpui/src/subscription.rs:132:17 22: <alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain::<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}>::{closure#0} at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/alloc/src/collections/btree/map.rs:1177:37 23: <alloc::collections::btree::map::ExtractIfInner<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>, core::ops::range::RangeFull>>::next::<<alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}>::{closure#0}, alloc::alloc::Global> at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/alloc/src/collections/btree/map.rs:2036:16 24: <alloc::collections::btree::map::ExtractIf<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>, core::ops::range::RangeFull, <alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}>::{closure#0}> as core::iter::traits::iterator::Iterator>::next at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/alloc/src/collections/btree/map.rs:2002:20 25: <alloc::collections::btree::map::ExtractIf<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>, core::ops::range::RangeFull, <alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}>::{closure#0}> as core::iter::traits::iterator::Iterator>::fold::<(), core::iter::traits::iterator::Iterator::for_each::call<(usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>), core::mem::drop<(usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>)>>::{closure#0}> at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/iter/traits/iterator.rs:2602:34 26: <alloc::collections::btree::map::ExtractIf<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>, core::ops::range::RangeFull, <alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}>::{closure#0}> as core::iter::traits::iterator::Iterator>::for_each::<core::mem::drop<(usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>)>> at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/iter/traits/iterator.rs:828:14 27: <alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain::<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}> at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/alloc/src/collections/btree/map.rs:1177:46 28: <gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain::<<gpui::app::App>::apply_emit_effect::{closure#0}> at /Users/kubkon/dev/zed/crates/gpui/src/subscription.rs:130:21 29: <gpui::app::App>::apply_emit_effect at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:1405:14 30: <gpui::app::App>::flush_effects at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:1308:31 31: <gpui::app::App>::finish_update at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:830:18 32: <gpui::app::App>::update::<core::result::Result<(), anyhow::Error>, <gpui::app::App as gpui::AppContext>::update_entity<project::buffer_store::BufferStore, core::result::Result<(), anyhow::Error>, <project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}::{closure#0}::{closure#3}>::{closure#0}> at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:819:14 33: <gpui::app::App as gpui::AppContext>::update_entity::<project::buffer_store::BufferStore, core::result::Result<(), anyhow::Error>, <project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}::{closure#0}::{closure#3}> at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:2279:14 34: <gpui::app::async_context::AsyncApp as gpui::AppContext>::update_entity::<project::buffer_store::BufferStore, core::result::Result<(), anyhow::Error>, <project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}::{closure#0}::{closure#3}> at /Users/kubkon/dev/zed/crates/gpui/src/app/async_context.rs:65:13 35: <gpui::app::entity_map::WeakEntity<project::buffer_store::BufferStore>>::update::<gpui::app::async_context::AsyncApp, core::result::Result<(), anyhow::Error>, <project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}::{closure#0}::{closure#3}> at /Users/kubkon/dev/zed/crates/gpui/src/app/entity_map.rs:750:15 36: <project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}::{closure#0}::<i32> at /Users/kubkon/dev/zed/crates/project/src/buffer_store.rs:683:18 37: <gpui::app::context::Context<project::buffer_store::BufferStore>>::spawn::<<project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}::{closure#0}::<i32> at /Users/kubkon/dev/zed/crates/gpui/src/app/context.rs:244:52 38: <gpui::app::App>::spawn::<<gpui::app::context::Context<project::buffer_store::BufferStore>>::spawn<<project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0} at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:1532:44 39: <scheduler::executor::spawn_local_with_source_location::Checked<<gpui::app::App>::spawn<<gpui::app::context::Context<project::buffer_store::BufferStore>>::spawn<<project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}> as core::future::future::Future>::poll at /Users/kubkon/dev/zed/crates/scheduler/src/executor.rs:393:64 40: <async_task::raw::RawTask<scheduler::executor::spawn_local_with_source_location::Checked<<gpui::app::App>::spawn<<gpui::app::context::Context<project::buffer_store::BufferStore>>::spawn<<project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}>, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>, <scheduler::executor::ForegroundExecutor>::spawn<<gpui::app::App>::spawn<<gpui::app::context::Context<project::buffer_store::BufferStore>>::spawn<<project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}>::{closure#0}, scheduler::RunnableMeta>>::run at /Users/kubkon/.cargo/git/checkouts/async-task-e468f817236eac43/b4486cd/src/raw.rs:296:17 41: <async_task::runnable::Runnable<scheduler::RunnableMeta>>::run at /Users/kubkon/.cargo/git/checkouts/async-task-e468f817236eac43/b4486cd/src/runnable.rs:788:18 42: gpui::platform::mac::dispatcher::trampoline at /Users/kubkon/dev/zed/crates/gpui/src/platform/mac/dispatcher.rs:248:14 43: <unknown> 44: <unknown> 45: <unknown> 46: <unknown> 47: <unknown> 48: <unknown> 49: <unknown> 50: <unknown> 51: <unknown> 52: <unknown> 53: <unknown> 54: <unknown> 55: <unknown> 56: <unknown> 57: <unknown> 58: <gpui::platform::mac::platform::MacPlatform as gpui::platform::Platform>::run at /Users/kubkon/dev/zed/crates/gpui/src/platform/mac/platform.rs:473:17 59: <gpui::app::Application>::run::<zed::main::{closure#9}> at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:192:18 60: zed::main at /Users/kubkon/dev/zed/crates/zed/src/main.rs:419:9 61: <fn() as core::ops::function::FnOnce<()>>::call_once at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/ops/function.rs:250:5 note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. ``` cc @ConradIrwin @elmarco |
||
|
|
4186e5764f |
Add vim/emacs modeline support (#44210)
Many editors such as vim and emacs support "modelines", a comment at the beginning of the file that allows the file type to be explicitly specified along with per-file specific settings - The amount of configurations, style and settings mapping cannot be handled in one go, so this opens up a lot of potential improvements. - I left out the possiblity to have "zed" specific modelines for now, but this could be potentially interesting. - Mapping the mode or filetype to zed language names isn't obvious either. We may want to make it configurable. This is my first contribution to zed, be kind. I struggled a bit to find the right place to add those settings. I use a similar approach as done with editorconfig (merge_with_editorconfig). There might be better ways. Closes #4762 Release Notes: - Add basic emacs/vim modeline support. Supersedes #41899, changes: - limit reading to the first and last 1kb - add documentation - more variables handled - add Arc around ModelineSettings to avoid extra cloning - changed the way mode -> language mapping is done, thanks to `modeline_aliases` language config - drop vim ex: support - made "Local Variables:" handling a separate commit, so we can drop it easily - various code style improvements --------- Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com> |
||
|
|
6acca17c44 |
Devcontainer setup modal (#47021)
Adds the ability to create a dev container definition from scratch. Additionally, separates devcontainer logic out into its own crate, since it was getting sufficiently complex to separate from the `recent_projects` crate. A screen recording of the modal experience: https://github.com/user-attachments/assets/f6cf95e1-eb7b-4ca3-86c7-c1cbc26ca557 Release Notes: - Added modal to initialize a dev container definition in the project with `projects: initialize dev container` - Added podman support for dev container actions with the `use_podman` setting - Improved devcontainer error handling --------- Co-authored-by: Sam Coward <idoru42@gmail.com> |
||
|
|
a2728e39a8 |
Split settings content into its own crate (#46845)
Closes #ISSUE Moves the settings content definitions into their own crate, so that they are compiled+cached separately from settings, primarily to avoid recompiles due to changes in gpui. In that vain many gpui types such as font weight/features, and `SharedString` were replaced in the content crate, either with `*Content` types for font/modifier things, or `String`/`Arc<str>` for `SharedString`. To make the conversions easy a new trait method in the settings crate named `IntoGpui::into_gpui` allows for `into()` like conversions to the gpui types in `from_settings` impls. Release Notes: - N/A --------- Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> |