From 7fbe0b86386368456c6c61798f876f8a5c507add Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 9 Jan 2024 10:14:05 -0800 Subject: [PATCH 001/104] Start work on language docs --- crates/language/src/buffer.rs | 103 +++++++++++++++++++++-- crates/language/src/language.rs | 36 +++++++- crates/language/src/language_settings.rs | 62 +++++++++++++- crates/language/src/markdown.rs | 35 +++++++- crates/language/src/proto.rs | 9 ++ 5 files changed, 231 insertions(+), 14 deletions(-) diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index d9472e8a77afc2dc7222d003aa23f513448ed661..f4917780b318e7e3cc4d0e81eac5656822d17e6d 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -42,7 +42,13 @@ use std::{ }; use sum_tree::TreeMap; use text::operation_queue::OperationQueue; -pub use text::{Buffer as TextBuffer, BufferSnapshot as TextBufferSnapshot, *}; +use text::*; +pub use text::{ + Anchor, Bias, Buffer as TextBuffer, BufferSnapshot as TextBufferSnapshot, Edit, OffsetRangeExt, + OffsetUtf16, Patch, Point, PointUtf16, Rope, RopeFingerprint, Selection, SelectionGoal, + Subscription, TextDimension, TextSummary, ToOffset, ToOffsetUtf16, ToPoint, ToPointUtf16, + Transaction, TransactionId, Unclipped, +}; use theme::SyntaxTheme; #[cfg(any(test, feature = "test-support"))] use util::RandomCharIter; @@ -63,6 +69,7 @@ pub enum Capability { ReadOnly, } +/// An in-memory representation of a source code file. pub struct Buffer { text: TextBuffer, diff_base: Option, @@ -99,6 +106,8 @@ pub struct Buffer { capability: Capability, } +/// An immutable, cheaply cloneable representation of a certain +/// state of a buffer. pub struct BufferSnapshot { text: text::BufferSnapshot, pub git_diff: git::diff::BufferDiff, @@ -150,6 +159,7 @@ pub struct GroupId { id: usize, } +/// A diagnostic associated with a certain range of a buffer. #[derive(Clone, Debug, PartialEq, Eq)] pub struct Diagnostic { pub source: Option, @@ -257,6 +267,7 @@ pub enum Event { Closed, } +/// The file associated with a buffer. pub trait File: Send + Sync { fn as_local(&self) -> Option<&dyn LocalFile>; @@ -306,6 +317,10 @@ pub trait LocalFile: File { ); } +/// The auto-indent behavior associated with an editing operation. +/// For some editing operations, each affected line of text has its +/// indentation recomputed. For other operations, the entire block +/// of edited text is adjusted uniformly. #[derive(Clone, Debug)] pub enum AutoindentMode { /// Indent each line of inserted text. @@ -353,6 +368,8 @@ struct BufferChunkHighlights<'a> { highlight_maps: Vec, } +/// An iterator that yields chunks of a buffer's text, along with their +/// syntax highlights and diagnostic status. pub struct BufferChunks<'a> { range: Range, chunks: text::Chunks<'a>, @@ -365,6 +382,8 @@ pub struct BufferChunks<'a> { highlights: Option>, } +/// A chunk of a buffer's text, along with its syntax highlight and +/// diagnostic status. #[derive(Clone, Copy, Debug, Default)] pub struct Chunk<'a> { pub text: &'a str, @@ -375,6 +394,7 @@ pub struct Chunk<'a> { pub is_tab: bool, } +/// A set of edits to a given version of a buffer, computed asynchronously. pub struct Diff { pub(crate) base_version: clock::Global, line_ending: LineEnding, @@ -407,6 +427,7 @@ impl CharKind { } impl Buffer { + /// Create a new buffer with the given base text. pub fn new>(replica_id: ReplicaId, id: u64, base_text: T) -> Self { Self::build( TextBuffer::new(replica_id, id, base_text.into()), @@ -416,6 +437,7 @@ impl Buffer { ) } + /// Create a new buffer that is a replica of a remote buffer. pub fn remote( remote_id: u64, replica_id: ReplicaId, @@ -430,6 +452,8 @@ impl Buffer { ) } + /// Create a new buffer that is a replica of a remote buffer, populating its + /// state from the given protobuf message. pub fn from_proto( replica_id: ReplicaId, capability: Capability, @@ -456,6 +480,7 @@ impl Buffer { Ok(this) } + /// Serialize the buffer's state to a protobuf message. pub fn to_proto(&self) -> proto::BufferState { proto::BufferState { id: self.remote_id(), @@ -469,6 +494,7 @@ impl Buffer { } } + /// Serialize as protobufs all of the changes to the buffer since the given version. pub fn serialize_ops( &self, since: Option, @@ -515,6 +541,7 @@ impl Buffer { }) } + /// Assign a language to the buffer, returning the buffer. pub fn with_language(mut self, language: Arc, cx: &mut ModelContext) -> Self { self.set_language(Some(language), cx); self @@ -572,6 +599,8 @@ impl Buffer { } } + /// Retrieve a snapshot of the buffer's current state. This is computationally + /// cheap, and allows reading from the buffer on a background thread. pub fn snapshot(&self) -> BufferSnapshot { let text = self.text.snapshot(); let mut syntax_map = self.syntax_map.lock(); @@ -594,18 +623,22 @@ impl Buffer { } } - pub fn as_text_snapshot(&self) -> &text::BufferSnapshot { + pub(crate) fn as_text_snapshot(&self) -> &text::BufferSnapshot { &self.text } + /// Retrieve a snapshot of the buffer's raw text, without any + /// language-related state like the syntax tree or diagnostics. pub fn text_snapshot(&self) -> text::BufferSnapshot { self.text.snapshot() } + /// The file associated with the buffer, if any. pub fn file(&self) -> Option<&Arc> { self.file.as_ref() } + /// The version of the buffer that was last saved or reloaded from disk. pub fn saved_version(&self) -> &clock::Global { &self.saved_version } @@ -614,10 +647,12 @@ impl Buffer { self.file_fingerprint } + /// The mtime of the buffer's file when the buffer was last saved or reloaded from disk. pub fn saved_mtime(&self) -> SystemTime { self.saved_mtime } + /// Assign a language to the buffer. pub fn set_language(&mut self, language: Option>, cx: &mut ModelContext) { self.syntax_map.lock().clear(); self.language = language; @@ -625,6 +660,8 @@ impl Buffer { cx.emit(Event::LanguageChanged); } + /// Assign a language registry to the buffer. This allows the buffer to retrieve + /// other languages if parts of the buffer are written in different languages. pub fn set_language_registry(&mut self, language_registry: Arc) { self.syntax_map .lock() @@ -935,6 +972,7 @@ impl Buffer { cx.notify(); } + /// Assign to the buffer a set of diagnostics created by a given language server. pub fn update_diagnostics( &mut self, server_id: LanguageServerId, @@ -1164,9 +1202,9 @@ impl Buffer { self.edit(edits, None, cx); } - // Create a minimal edit that will cause the the given row to be indented - // with the given size. After applying this edit, the length of the line - // will always be at least `new_size.len`. + /// Create a minimal edit that will cause the the given row to be indented + /// with the given size. After applying this edit, the length of the line + /// will always be at least `new_size.len`. pub fn edit_for_indent_size_adjustment( row: u32, current_size: IndentSize, @@ -1201,6 +1239,8 @@ impl Buffer { } } + /// Spawns a background task that asynchronously computes a `Diff` between the buffer's text + /// and the given new text. pub fn diff(&self, mut new_text: String, cx: &AppContext) -> Task { let old_text = self.as_rope().clone(); let base_version = self.version(); @@ -1272,7 +1312,7 @@ impl Buffer { }) } - /// Spawn a background task that searches the buffer for any whitespace + /// Spawns a background task that searches the buffer for any whitespace /// at the ends of a lines, and returns a `Diff` that removes that whitespace. pub fn remove_trailing_whitespace(&self, cx: &AppContext) -> Task { let old_text = self.as_rope().clone(); @@ -1292,7 +1332,7 @@ impl Buffer { }) } - /// Ensure that the buffer ends with a single newline character, and + /// Ensures that the buffer ends with a single newline character, and /// no other whitespace. pub fn ensure_final_newline(&mut self, cx: &mut ModelContext) { let len = self.len(); @@ -1313,7 +1353,7 @@ impl Buffer { self.edit([(offset..len, "\n")], None, cx); } - /// Apply a diff to the buffer. If the buffer has changed since the given diff was + /// Applies a diff to the buffer. If the buffer has changed since the given diff was /// calculated, then adjust the diff to account for those changes, and discard any /// parts of the diff that conflict with those changes. pub fn apply_diff(&mut self, diff: Diff, cx: &mut ModelContext) -> Option { @@ -1352,11 +1392,14 @@ impl Buffer { self.end_transaction(cx) } + /// Checks if the buffer has unsaved changes. pub fn is_dirty(&self) -> bool { self.file_fingerprint != self.as_rope().fingerprint() || self.file.as_ref().map_or(false, |file| file.is_deleted()) } + /// Checks if the buffer and its file have both changed since the buffer + /// was last saved or reloaded. pub fn has_conflict(&self) -> bool { self.file_fingerprint != self.as_rope().fingerprint() && self @@ -1365,14 +1408,23 @@ impl Buffer { .map_or(false, |file| file.mtime() > self.saved_mtime) } + /// Gets a [`Subscription`] that tracks all of the changes to the buffer's text. pub fn subscribe(&mut self) -> Subscription { self.text.subscribe() } + /// Starts a transaction, if one is not already in-progress. When undoing or + /// redoing edits, all of the edits performed within a transaction are undone + /// or redone together. pub fn start_transaction(&mut self) -> Option { self.start_transaction_at(Instant::now()) } + /// Starts a transaction, providing the current time. Subsequent transactions + /// that occur within a short period of time will be grouped together. This + /// is controlled by the buffer's undo grouping duration. + /// + /// See [`Buffer::set_group_interval`]. pub fn start_transaction_at(&mut self, now: Instant) -> Option { self.transaction_depth += 1; if self.was_dirty_before_starting_transaction.is_none() { @@ -1381,10 +1433,16 @@ impl Buffer { self.text.start_transaction_at(now) } + /// Terminates the current transaction, if this is the outermost transaction. pub fn end_transaction(&mut self, cx: &mut ModelContext) -> Option { self.end_transaction_at(Instant::now(), cx) } + /// Terminates the current transaction, providing the current time. Subsequent transactions + /// that occur within a short period of time will be grouped together. This + /// is controlled by the buffer's undo grouping duration. + /// + /// See [`Buffer::set_group_interval`]. pub fn end_transaction_at( &mut self, now: Instant, @@ -1405,26 +1463,33 @@ impl Buffer { } } + /// Manually add a transaction to the buffer's undo history. pub fn push_transaction(&mut self, transaction: Transaction, now: Instant) { self.text.push_transaction(transaction, now); } + /// Prevent the last transaction from being grouped with any subsequent transactions, + /// even if they occur with the buffer's undo grouping duration. pub fn finalize_last_transaction(&mut self) -> Option<&Transaction> { self.text.finalize_last_transaction() } + /// Manually group all changes since a given transaction. pub fn group_until_transaction(&mut self, transaction_id: TransactionId) { self.text.group_until_transaction(transaction_id); } + /// Manually remove a transaction from the buffer's undo history pub fn forget_transaction(&mut self, transaction_id: TransactionId) { self.text.forget_transaction(transaction_id); } + /// Manually merge two adjacent transactions in the buffer's undo history. pub fn merge_transactions(&mut self, transaction: TransactionId, destination: TransactionId) { self.text.merge_transactions(transaction, destination); } + /// Waits for the buffer to receive operations with the given timestamps. pub fn wait_for_edits( &mut self, edit_ids: impl IntoIterator, @@ -1432,6 +1497,7 @@ impl Buffer { self.text.wait_for_edits(edit_ids) } + /// Waits for the buffer to receive the operations necessary for resolving the given anchors. pub fn wait_for_anchors( &mut self, anchors: impl IntoIterator, @@ -1439,14 +1505,18 @@ impl Buffer { self.text.wait_for_anchors(anchors) } + /// Waits for the buffer to receive operations up to the given version. pub fn wait_for_version(&mut self, version: clock::Global) -> impl Future> { self.text.wait_for_version(version) } + /// Forces all futures returned by [`Buffer::wait_for_version`], [`Buffer::wait_for_edits`], or + /// [`Buffer::wait_for_version`] to resolve with an error. pub fn give_up_waiting(&mut self) { self.text.give_up_waiting(); } + /// Stores a set of selections that should be broadcasted to all of the buffer's replicas. pub fn set_active_selections( &mut self, selections: Arc<[Selection]>, @@ -1475,6 +1545,8 @@ impl Buffer { ); } + /// Clears the selections, so that other replicas of the buffer do not see any selections for + /// this replica. pub fn remove_active_selections(&mut self, cx: &mut ModelContext) { if self .remote_selections @@ -1485,6 +1557,7 @@ impl Buffer { } } + /// Replaces the buffer's entire text. pub fn set_text(&mut self, text: T, cx: &mut ModelContext) -> Option where T: Into>, @@ -1493,6 +1566,15 @@ impl Buffer { self.edit([(0..self.len(), text)], None, cx) } + /// Applies the given edits to the buffer. Each edit is specified as a range of text to + /// delete, and a string of text to insert at that location. + /// + /// If an [`AutoindentMode`] is provided, then the buffer will enqueue an auto-indent + /// request for the edited ranges, which will be processed when the buffer finishes + /// parsing. + /// + /// Parsing takes place at the end of a transaction, and may compute synchronously + /// or asynchronously, depending on the changes. pub fn edit( &mut self, edits_iter: I, @@ -1626,6 +1708,7 @@ impl Buffer { cx.notify(); } + /// Applies the given remote operations to the buffer. pub fn apply_ops>( &mut self, ops: I, @@ -1773,11 +1856,13 @@ impl Buffer { cx.emit(Event::Operation(operation)); } + /// Removes the selections for a given peer. pub fn remove_peer(&mut self, replica_id: ReplicaId, cx: &mut ModelContext) { self.remote_selections.remove(&replica_id); cx.notify(); } + /// Undoes the most recent transaction. pub fn undo(&mut self, cx: &mut ModelContext) -> Option { let was_dirty = self.is_dirty(); let old_version = self.version.clone(); @@ -1791,6 +1876,7 @@ impl Buffer { } } + /// Manually undoes a specific transaction in the buffer's undo history. pub fn undo_transaction( &mut self, transaction_id: TransactionId, @@ -1807,6 +1893,7 @@ impl Buffer { } } + /// Manually undoes all changes after a given transaction in the buffer's undo history. pub fn undo_to_transaction( &mut self, transaction_id: TransactionId, diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 366d2b0098ca36437252044c50825bceaed96081..df12a270c95f64cd15bc5d4fb73908d0b4f3f9a3 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -1,3 +1,7 @@ +//! The `language` crate provides... ??? + +#![warn(missing_docs)] + mod buffer; mod diagnostic_set; mod highlight_map; @@ -58,6 +62,9 @@ pub use syntax_map::{OwnedSyntaxLayerInfo, SyntaxLayerInfo}; pub use text::LineEnding; pub use tree_sitter::{Parser, Tree}; +/// Initializes the `language` crate. +/// +/// This should be called before making use of items from the create. pub fn init(cx: &mut AppContext) { language_settings::init(cx); } @@ -90,7 +97,7 @@ thread_local! { } lazy_static! { - pub static ref NEXT_GRAMMAR_ID: AtomicUsize = Default::default(); + pub(crate) static ref NEXT_GRAMMAR_ID: AtomicUsize = Default::default(); pub static ref PLAIN_TEXT: Arc = Arc::new(Language::new( LanguageConfig { name: "Plain Text".into(), @@ -358,14 +365,22 @@ pub struct CodeLabel { #[derive(Clone, Deserialize)] pub struct LanguageConfig { + /// Human-readable name of the language. pub name: Arc, + // The name of the grammar in a WASM bundle. pub grammar_name: Option>, + /// Given a list of `LanguageConfig`'s, the language of a file can be determined based on the path extension matching any of the `path_suffixes`. pub path_suffixes: Vec, + /// List of pub brackets: BracketPairConfig, + /// A regex pattern that determines whether the language should be assigned to a file or not. #[serde(default, deserialize_with = "deserialize_regex")] pub first_line_pattern: Option, + /// If set to true, auto indentation uses last non empty line to determine + /// the indentation level for a new line. #[serde(default = "auto_indent_using_last_non_empty_line_default")] pub auto_indent_using_last_non_empty_line: bool, + /// A regex that is used to determine whether the #[serde(default, deserialize_with = "deserialize_regex")] pub increase_indent_pattern: Option, #[serde(default, deserialize_with = "deserialize_regex")] @@ -382,12 +397,16 @@ pub struct LanguageConfig { pub scope_opt_in_language_servers: Vec, #[serde(default)] pub overrides: HashMap, + /// A list of characters that Zed should treat as word characters for the + /// purpose of features that operate on word boundaries, like 'move to next word end' + /// or a whole-word search in buffer search. #[serde(default)] pub word_characters: HashSet, #[serde(default)] pub prettier_parser_name: Option, } +/// Tree-sitter language queries for a given language. #[derive(Debug, Default)] pub struct LanguageQueries { pub highlights: Option>, @@ -399,6 +418,9 @@ pub struct LanguageQueries { pub overrides: Option>, } +/// Represents a language for the given range. Some languages (e.g. HTML) +/// interleave several languages together, thus a single buffer might actually contain +/// several nested scopes. #[derive(Clone, Debug)] pub struct LanguageScope { language: Arc, @@ -491,7 +513,10 @@ pub struct FakeLspAdapter { #[derive(Clone, Debug, Default)] pub struct BracketPairConfig { + /// A list of character pairs that should be treated as brackets in the context of a given language. pub pairs: Vec, + /// A list of tree-sitter scopes for which a given bracket should not be active. + /// N-th entry in `[Self::disabled_scopes_by_bracket_ix]` contains a list of disabled scopes for an n-th entry in `[Self::pairs]` pub disabled_scopes_by_bracket_ix: Vec>, } @@ -1641,6 +1666,8 @@ impl LanguageScope { self.language.config.collapsed_placeholder.as_ref() } + /// Returns line prefix that is inserted in e.g. line continuations or + /// in `toggle comments` action. pub fn line_comment_prefix(&self) -> Option<&Arc> { Override::as_option( self.config_override().map(|o| &o.line_comment), @@ -1656,6 +1683,11 @@ impl LanguageScope { .map(|e| (&e.0, &e.1)) } + /// Returns a list of language-specific word characters. + /// + /// By default, Zed treats alphanumeric characters (and '_') as word characters for + /// the purpose of actions like 'move to next word end` or whole-word search. + /// It additionally accounts for language's additional word characters. pub fn word_characters(&self) -> Option<&HashSet> { Override::as_option( self.config_override().map(|o| &o.word_characters), @@ -1663,6 +1695,8 @@ impl LanguageScope { ) } + /// Returns a list of bracket pairs for a given language with an additional + /// piece of information about whether the particular bracket pair is currently active for a given language. pub fn brackets(&self) -> impl Iterator { let mut disabled_ids = self .config_override() diff --git a/crates/language/src/language_settings.rs b/crates/language/src/language_settings.rs index 5359d184d65a9249f8fc82b1eae9c95d71beda6c..3ac8842243abf28823db57c9b9d15eec29bc9c6c 100644 --- a/crates/language/src/language_settings.rs +++ b/crates/language/src/language_settings.rs @@ -1,3 +1,5 @@ +//! Provides `language`-related settings. + use crate::{File, Language}; use anyhow::Result; use collections::{HashMap, HashSet}; @@ -11,10 +13,12 @@ use serde::{Deserialize, Serialize}; use settings::Settings; use std::{num::NonZeroU32, path::Path, sync::Arc}; -pub fn init(cx: &mut AppContext) { +/// Initializes the language settings. +pub(crate) fn init(cx: &mut AppContext) { AllLanguageSettings::register(cx); } +/// Returns the settings for the specified language from the provided file. pub fn language_settings<'a>( language: Option<&Arc>, file: Option<&Arc>, @@ -24,6 +28,7 @@ pub fn language_settings<'a>( all_language_settings(file, cx).language(language_name.as_deref()) } +/// Returns the settings for all languages from the provided file. pub fn all_language_settings<'a>( file: Option<&Arc>, cx: &'a AppContext, @@ -32,36 +37,68 @@ pub fn all_language_settings<'a>( AllLanguageSettings::get(location, cx) } +/// The settings for all languages. #[derive(Debug, Clone)] pub struct AllLanguageSettings { + /// The settings for GitHub Copilot. pub copilot: CopilotSettings, defaults: LanguageSettings, languages: HashMap, LanguageSettings>, } +/// The settings for a particular language. #[derive(Debug, Clone, Deserialize)] pub struct LanguageSettings { + /// How many columns a tab should occupy. pub tab_size: NonZeroU32, + /// Whether to indent lines using tab characters, as opposed to multiple + /// spaces. pub hard_tabs: bool, + /// How to soft-wrap long lines of text. pub soft_wrap: SoftWrap, + /// The column at which to soft-wrap lines, for buffers where soft-wrap + /// is enabled. pub preferred_line_length: u32, + /// Whether to show wrap guides in the editor. Setting this to true will + /// show a guide at the 'preferred_line_length' value if softwrap is set to + /// 'preferred_line_length', and will show any additional guides as specified + /// by the 'wrap_guides' setting. pub show_wrap_guides: bool, + /// Character counts at which to show wrap guides in the editor. pub wrap_guides: Vec, + /// Whether or not to perform a buffer format before saving. pub format_on_save: FormatOnSave, + /// Whether or not to remove any trailing whitespace from lines of a buffer + /// before saving it. pub remove_trailing_whitespace_on_save: bool, + /// Whether or not to ensure there's a single newline at the end of a buffer + /// when saving it. pub ensure_final_newline_on_save: bool, + /// How to perform a buffer format. pub formatter: Formatter, + /// Zed's Prettier integration settings. + /// If Prettier is enabled, Zed will use this its Prettier instance for any applicable file, if + /// the project has no other Prettier installed. pub prettier: HashMap, + /// Whether to use language servers to provide code intelligence. pub enable_language_server: bool, + /// Controls whether Copilot provides suggestion immediately (true) + /// or waits for a `copilot::Toggle` (false). pub show_copilot_suggestions: bool, + /// Whether to show tabs and spaces in the editor. pub show_whitespaces: ShowWhitespaceSetting, + /// Whether to start a new line with a comment when a previous line is a comment as well. pub extend_comment_on_newline: bool, + /// Inlay hint related settings. pub inlay_hints: InlayHintSettings, } +/// The settings for [GitHub Copilot](https://github.com/features/copilot). #[derive(Clone, Debug, Default)] pub struct CopilotSettings { + /// Whether Copilit is enabled. pub feature_enabled: bool, + /// A list of globs representing files that Copilot should be disabled for. pub disabled_globs: Vec, } @@ -138,7 +175,7 @@ pub struct LanguageSettingsContent { pub formatter: Option, /// Zed's Prettier integration settings. /// If Prettier is enabled, Zed will use this its Prettier instance for any applicable file, if - /// project has no other Prettier installed. + /// the project has no other Prettier installed. /// /// Default: {} #[serde(default)] @@ -148,7 +185,7 @@ pub struct LanguageSettingsContent { /// Default: true #[serde(default)] pub enable_language_server: Option, - /// Controls whether copilot provides suggestion immediately (true) + /// Controls whether Copilot provides suggestion immediately (true) /// or waits for a `copilot::Toggle` (false). /// /// Default: true @@ -176,9 +213,11 @@ pub struct CopilotSettingsContent { #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct FeaturesContent { + /// Whether the GitHub Copilot feature is enabled. pub copilot: Option, } +/// Controls the soft-wrapping behavior in the editor. #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum SoftWrap { @@ -190,14 +229,20 @@ pub enum SoftWrap { PreferredLineLength, } +/// Controls the behavior of formatting files when they are saved. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum FormatOnSave { + /// Files should be formatted on save. On, + /// Files should not be formatted on save. Off, LanguageServer, + /// The external program to use to format the files on save. External { + /// The external program to run. command: Arc, + /// The arguments to pass to the program. arguments: Arc<[String]>, }, } @@ -231,6 +276,7 @@ pub enum Formatter { }, } +/// The settings for inlay hints. #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] pub struct InlayHintSettings { /// Global switch to toggle hints on and off. @@ -238,10 +284,19 @@ pub struct InlayHintSettings { /// Default: false #[serde(default)] pub enabled: bool, + /// Whether type hints should be shown. + /// + /// Default: true #[serde(default = "default_true")] pub show_type_hints: bool, + /// Whether parameter hints should be shown. + /// + /// Default: true #[serde(default = "default_true")] pub show_parameter_hints: bool, + /// Whether other hints should be shown. + /// + /// Default: true #[serde(default = "default_true")] pub show_other_hints: bool, } @@ -251,6 +306,7 @@ fn default_true() -> bool { } impl InlayHintSettings { + /// Returns the kinds of inlay hints that are enabled based on the settings. pub fn enabled_inlay_hint_kinds(&self) -> HashSet> { let mut kinds = HashSet::default(); if self.show_type_hints { diff --git a/crates/language/src/markdown.rs b/crates/language/src/markdown.rs index df75b610ef844ec858d74ae7a3a8bafa5a59edbe..863f38667f27c4124dc76702cffd12ed0a8ad0be 100644 --- a/crates/language/src/markdown.rs +++ b/crates/language/src/markdown.rs @@ -1,3 +1,5 @@ +//! Provides Markdown-related constructs. + use std::sync::Arc; use std::{ops::Range, path::PathBuf}; @@ -5,21 +7,30 @@ use crate::{HighlightId, Language, LanguageRegistry}; use gpui::{px, FontStyle, FontWeight, HighlightStyle, UnderlineStyle}; use pulldown_cmark::{CodeBlockKind, Event, Options, Parser, Tag}; +/// Parsed Markdown content. #[derive(Debug, Clone)] pub struct ParsedMarkdown { + /// The Markdown text. pub text: String, + /// The list of highlights contained in the Markdown document. pub highlights: Vec<(Range, MarkdownHighlight)>, + /// The regions of the various ranges in the Markdown document. pub region_ranges: Vec>, + /// The regions of the Markdown document. pub regions: Vec, } +/// A run of highlighted Markdown text. #[derive(Debug, Clone, PartialEq, Eq)] pub enum MarkdownHighlight { + /// A styled Markdown highlight. Style(MarkdownHighlightStyle), + /// A highlighted code block. Code(HighlightId), } impl MarkdownHighlight { + /// Converts this [`MarkdownHighlight`] to a [`HighlightStyle`]. pub fn to_highlight_style(&self, theme: &theme::SyntaxTheme) -> Option { match self { MarkdownHighlight::Style(style) => { @@ -48,23 +59,39 @@ impl MarkdownHighlight { } } +/// The style for a Markdown highlight. #[derive(Debug, Clone, Default, PartialEq, Eq)] pub struct MarkdownHighlightStyle { + /// Whether the text should be italicized. pub italic: bool, + /// Whether the text should be underlined. pub underline: bool, + /// The weight of the text. pub weight: FontWeight, } +/// A parsed region in a Markdown document. #[derive(Debug, Clone)] pub struct ParsedRegion { + /// Whether the region is a code block. pub code: bool, + /// The link contained in this region, if it has one. pub link: Option, } +/// A Markdown link. #[derive(Debug, Clone)] pub enum Link { - Web { url: String }, - Path { path: PathBuf }, + /// A link to a webpage. + Web { + /// The URL of the webpage. + url: String, + }, + /// A link to a path on the filesystem. + Path { + /// The path to the item. + path: PathBuf, + }, } impl Link { @@ -82,6 +109,7 @@ impl Link { } } +/// Parses a string of Markdown. pub async fn parse_markdown( markdown: &str, language_registry: &Arc, @@ -111,6 +139,7 @@ pub async fn parse_markdown( } } +/// Parses a Markdown block. pub async fn parse_markdown_block( markdown: &str, language_registry: &Arc, @@ -261,6 +290,7 @@ pub async fn parse_markdown_block( } } +/// Appends a highlighted run of text to the provided `text` buffer. pub fn highlight_code( text: &mut String, highlights: &mut Vec<(Range, MarkdownHighlight)>, @@ -275,6 +305,7 @@ pub fn highlight_code( } } +/// Appends a new paragraph to the provided `text` buffer. pub fn new_paragraph(text: &mut String, list_stack: &mut Vec<(Option, bool)>) { let mut is_subsequent_paragraph_of_list = false; if let Some((_, has_content)) = list_stack.last_mut() { diff --git a/crates/language/src/proto.rs b/crates/language/src/proto.rs index 957f4ee7fbc4da251698fd640d33d37d5cf4a06b..8d71e6e397af8ff11c24e3ba2b7c322395952d93 100644 --- a/crates/language/src/proto.rs +++ b/crates/language/src/proto.rs @@ -1,3 +1,5 @@ +//! Handles conversions of `language` items to and from the [`rpc`] protocol. + use crate::{ diagnostic_set::DiagnosticEntry, CodeAction, CodeLabel, Completion, CursorShape, Diagnostic, Language, @@ -11,15 +13,18 @@ use text::*; pub use proto::{BufferState, Operation}; +/// Serializes a [`RopeFingerprint`] to be sent over the wire. pub fn serialize_fingerprint(fingerprint: RopeFingerprint) -> String { fingerprint.to_hex() } +/// Deserializes a [`RopeFingerprint`] from the wire format. pub fn deserialize_fingerprint(fingerprint: &str) -> Result { RopeFingerprint::from_hex(fingerprint) .map_err(|error| anyhow!("invalid fingerprint: {}", error)) } +/// Deserializes a `[text::LineEnding]` from the wire format. pub fn deserialize_line_ending(message: proto::LineEnding) -> text::LineEnding { match message { proto::LineEnding::Unix => text::LineEnding::Unix, @@ -27,6 +32,7 @@ pub fn deserialize_line_ending(message: proto::LineEnding) -> text::LineEnding { } } +/// Serializes a [`text::LineEnding`] to be sent over the wire. pub fn serialize_line_ending(message: text::LineEnding) -> proto::LineEnding { match message { text::LineEnding::Unix => proto::LineEnding::Unix, @@ -34,6 +40,7 @@ pub fn serialize_line_ending(message: text::LineEnding) -> proto::LineEnding { } } +/// Serializes a [`crate::Operation`] to be sent over the wire. pub fn serialize_operation(operation: &crate::Operation) -> proto::Operation { proto::Operation { variant: Some(match operation { @@ -96,6 +103,7 @@ pub fn serialize_operation(operation: &crate::Operation) -> proto::Operation { } } +/// Serializes an [`operation::EditOperation`] to be sent over the wire. pub fn serialize_edit_operation(operation: &EditOperation) -> proto::operation::Edit { proto::operation::Edit { replica_id: operation.timestamp.replica_id as u32, @@ -110,6 +118,7 @@ pub fn serialize_edit_operation(operation: &EditOperation) -> proto::operation:: } } +/// Serializes an entry in the undo map to be sent over the wire. pub fn serialize_undo_map_entry( (edit_id, counts): (&clock::Lamport, &[(clock::Lamport, u32)]), ) -> proto::UndoMapEntry { From b02f37083b2e703cadb6752ba75ed7f8be626d15 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 9 Jan 2024 10:53:57 -0800 Subject: [PATCH 002/104] More docs --- crates/language/src/buffer.rs | 26 +++++++++--- crates/language/src/language.rs | 32 ++++++++++++--- crates/language/src/language_settings.rs | 33 +++++++++++++-- crates/language/src/outline.rs | 1 + crates/language/src/proto.rs | 41 +++++++++++++++---- crates/language/src/syntax_map.rs | 36 ++++++++-------- crates/language_tools/src/syntax_tree_view.rs | 6 +-- 7 files changed, 133 insertions(+), 42 deletions(-) diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index f4917780b318e7e3cc4d0e81eac5656822d17e6d..b745ff6f43fbb88908989ca71dcdc11d9ed6657a 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -10,7 +10,7 @@ use crate::{ markdown::parse_markdown, outline::OutlineItem, syntax_map::{ - SyntaxLayerInfo, SyntaxMap, SyntaxMapCapture, SyntaxMapCaptures, SyntaxMapMatches, + SyntaxLayer, SyntaxMap, SyntaxMapCapture, SyntaxMapCaptures, SyntaxMapMatches, SyntaxSnapshot, ToTreeSitterPoint, }, CodeLabel, LanguageScope, Outline, @@ -69,7 +69,8 @@ pub enum Capability { ReadOnly, } -/// An in-memory representation of a source code file. +/// An in-memory representation of a source code file, including its text, +/// syntax trees, git status, and diagnostics. pub struct Buffer { text: TextBuffer, diff_base: Option, @@ -123,12 +124,15 @@ pub struct BufferSnapshot { parse_count: usize, } +/// The kind and amount of indentation in a particular line. For now, +/// assumes that indentation is all the same character. #[derive(Clone, Copy, Debug, PartialEq, Eq, Default)] pub struct IndentSize { pub len: u32, pub kind: IndentKind, } +/// A whitespace character that's used for indentation. #[derive(Clone, Copy, Debug, PartialEq, Eq, Default)] pub enum IndentKind { #[default] @@ -136,6 +140,7 @@ pub enum IndentKind { Tab, } +/// The shape of a selection cursor. #[derive(Copy, Clone, PartialEq, Eq, Debug, Default)] pub enum CursorShape { #[default] @@ -300,6 +305,7 @@ pub trait File: Send + Sync { fn to_proto(&self) -> rpc::proto::File; } +/// The file associated with a buffer, in the case where the file is on the local disk. pub trait LocalFile: File { /// Returns the absolute path of this file. fn abs_path(&self, cx: &AppContext) -> PathBuf; @@ -409,6 +415,7 @@ pub(crate) struct DiagnosticEndpoint { is_unnecessary: bool, } +/// A class of characters, used for characterizing a run of text. #[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord, Debug)] pub enum CharKind { Whitespace, @@ -2048,6 +2055,8 @@ impl BufferSnapshot { } } + /// Retrieve the suggested indent size for all of the given rows. The unit of indentation + /// is passed in as `single_indent_size`. pub fn suggested_indents( &self, rows: impl Iterator, @@ -2294,6 +2303,10 @@ impl BufferSnapshot { None } + /// Iterates over chunks of text in the given range of the buffer. Text is chunked + /// in an arbitrary way due to being stored in a [`rope::Rope`]. The text is also + /// returned in chunks where each chunk has a single syntax highlighting style and + /// diagnostic status. pub fn chunks(&self, range: Range, language_aware: bool) -> BufferChunks { let range = range.start.to_offset(self)..range.end.to_offset(self); @@ -2330,7 +2343,9 @@ impl BufferSnapshot { BufferChunks::new(self.text.as_rope(), range, syntax, diagnostic_endpoints) } - pub fn for_each_line(&self, range: Range, mut callback: impl FnMut(u32, &str)) { + /// Invokes the given callback for each line of text in the given range of the buffer. + /// Uses callback to avoid allocating a string for each line. + fn for_each_line(&self, range: Range, mut callback: impl FnMut(u32, &str)) { let mut line = String::new(); let mut row = range.start.row; for chunk in self @@ -2349,11 +2364,12 @@ impl BufferSnapshot { } } - pub fn syntax_layers(&self) -> impl Iterator + '_ { + /// Iterates over every [`SyntaxLayer`] in the buffer. + pub fn syntax_layers(&self) -> impl Iterator + '_ { self.syntax.layers_for_range(0..self.len(), &self.text) } - pub fn syntax_layer_at(&self, position: D) -> Option { + pub fn syntax_layer_at(&self, position: D) -> Option { let offset = position.to_offset(self); self.syntax .layers_for_range(offset..offset, &self.text) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index df12a270c95f64cd15bc5d4fb73908d0b4f3f9a3..8182af1e54054c0b973afd296a18c1a3c993a405 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -58,7 +58,7 @@ pub use buffer::*; pub use diagnostic_set::DiagnosticEntry; pub use lsp::LanguageServerId; pub use outline::{Outline, OutlineItem}; -pub use syntax_map::{OwnedSyntaxLayerInfo, SyntaxLayerInfo}; +pub use syntax_map::{OwnedSyntaxLayer, SyntaxLayer}; pub use text::LineEnding; pub use tree_sitter::{Parser, Tree}; @@ -246,6 +246,8 @@ impl CachedLspAdapter { } } +/// [`LspAdapterDelegate`] allows [`LspAdapter]` implementations to interface with the application +// e.g. to display a notification or fetch data from the web. pub trait LspAdapterDelegate: Send + Sync { fn show_notification(&self, message: &str, cx: &mut AppContext); fn http_client(&self) -> Arc; @@ -291,6 +293,10 @@ pub trait LspAdapter: 'static + Send + Sync { delegate: &dyn LspAdapterDelegate, ) -> Option; + /// Returns true if a language server can be reinstalled. + /// If language server initialization fails, a reinstallation will be attempted unless the value returned from this method is false. + /// Implementations that rely on software already installed on user's system + /// should have [`can_be_reinstalled`] return false. fn can_be_reinstalled(&self) -> bool { true } @@ -302,6 +308,9 @@ pub trait LspAdapter: 'static + Send + Sync { fn process_diagnostics(&self, _: &mut lsp::PublishDiagnosticsParams) {} + /// A callback called for each [`lsp_types::CompletionItem`] obtained from LSP server. + /// Some LspAdapter implementations might want to modify the obtained item to + /// change how it's displayed. async fn process_completion(&self, _: &mut lsp::CompletionItem) {} async fn label_for_completion( @@ -321,6 +330,7 @@ pub trait LspAdapter: 'static + Send + Sync { None } + /// Returns initialization options that are going to be sent to a LSP server as a part of [`lsp_types::InitializeParams`] async fn initialization_options(&self) -> Option { None } @@ -329,6 +339,7 @@ pub trait LspAdapter: 'static + Send + Sync { futures::future::ready(serde_json::json!({})).boxed() } + /// Returns a list of code actions supported by a given LspAdapter fn code_action_kinds(&self) -> Option> { Some(vec![ CodeActionKind::EMPTY, @@ -380,19 +391,29 @@ pub struct LanguageConfig { /// the indentation level for a new line. #[serde(default = "auto_indent_using_last_non_empty_line_default")] pub auto_indent_using_last_non_empty_line: bool, - /// A regex that is used to determine whether the + /// A regex that is used to determine whether the indentation level should be + /// increased in the following line. #[serde(default, deserialize_with = "deserialize_regex")] pub increase_indent_pattern: Option, + /// A regex that is used to determine whether the indentation level should be + /// decreased in the following line. #[serde(default, deserialize_with = "deserialize_regex")] pub decrease_indent_pattern: Option, + /// A list of characters that trigger the automatic insertion of a closing + /// bracket when they immediately precede the point where an opening + /// bracket is inserted. #[serde(default)] pub autoclose_before: String, - #[serde(default)] - pub line_comment: Option>, + /// A placeholder used internally by Semantic Index. #[serde(default)] pub collapsed_placeholder: String, + /// A line comment string that is inserted in e.g. `toggle comments` action. + #[serde(default)] + pub line_comment: Option>, + /// Starting and closing characters of a block comment. #[serde(default)] pub block_comment: Option<(Arc, Arc)>, + /// A list of language servers that are allowed to run on subranges of a given language. #[serde(default)] pub scope_opt_in_language_servers: Vec, #[serde(default)] @@ -402,6 +423,7 @@ pub struct LanguageConfig { /// or a whole-word search in buffer search. #[serde(default)] pub word_characters: HashSet, + /// The name of a Prettier parser that should be used for this language. #[serde(default)] pub prettier_parser_name: Option, } @@ -480,9 +502,9 @@ impl Default for LanguageConfig { block_comment: Default::default(), scope_opt_in_language_servers: Default::default(), overrides: Default::default(), - collapsed_placeholder: Default::default(), word_characters: Default::default(), prettier_parser_name: None, + collapsed_placeholder: Default::default(), } } } diff --git a/crates/language/src/language_settings.rs b/crates/language/src/language_settings.rs index 3ac8842243abf28823db57c9b9d15eec29bc9c6c..c1bd3aa57fa723231a3de6b36566adad5b749c55 100644 --- a/crates/language/src/language_settings.rs +++ b/crates/language/src/language_settings.rs @@ -96,24 +96,30 @@ pub struct LanguageSettings { /// The settings for [GitHub Copilot](https://github.com/features/copilot). #[derive(Clone, Debug, Default)] pub struct CopilotSettings { - /// Whether Copilit is enabled. + /// Whether Copilot is enabled. pub feature_enabled: bool, /// A list of globs representing files that Copilot should be disabled for. pub disabled_globs: Vec, } +/// The settings for all languages. #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] pub struct AllLanguageSettingsContent { + /// The settings for enabling/disabling features. #[serde(default)] pub features: Option, + /// The settings for GitHub Copilot. #[serde(default)] pub copilot: Option, + /// The default language settings. #[serde(flatten)] pub defaults: LanguageSettingsContent, + /// The settings for individual languages. #[serde(default, alias = "language_overrides")] pub languages: HashMap, LanguageSettingsContent>, } +/// The settings for a particular language. #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] pub struct LanguageSettingsContent { /// How many columns a tab should occupy. @@ -204,12 +210,15 @@ pub struct LanguageSettingsContent { pub inlay_hints: Option, } +/// The contents of the GitHub Copilot settings. #[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)] pub struct CopilotSettingsContent { + /// A list of globs representing files that Copilot should be disabled for. #[serde(default)] pub disabled_globs: Option>, } +/// The settings for enabling/disabling features. #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct FeaturesContent { @@ -237,6 +246,7 @@ pub enum FormatOnSave { On, /// Files should not be formatted on save. Off, + /// Files should be formatted using the current language server. LanguageServer, /// The external program to use to format the files on save. External { @@ -247,17 +257,19 @@ pub enum FormatOnSave { }, } +/// Controls how whitespace should be displayedin the editor. #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum ShowWhitespaceSetting { - /// Draw tabs and spaces only for the selected text. + /// Draw whitespace only for the selected text. Selection, - /// Do not draw any tabs or spaces + /// Do not draw any tabs or spaces. None, - /// Draw all invisible symbols + /// Draw all invisible symbols. All, } +/// Controls which formatter should be used when formatting code. #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum Formatter { @@ -271,7 +283,9 @@ pub enum Formatter { Prettier, /// Format code using an external command. External { + /// The external program to run. command: Arc, + /// The arguments to pass to the program. arguments: Arc<[String]>, }, } @@ -323,6 +337,7 @@ impl InlayHintSettings { } impl AllLanguageSettings { + /// Returns the [`LanguageSettings`] for the language with the specified name. pub fn language<'a>(&'a self, language_name: Option<&str>) -> &'a LanguageSettings { if let Some(name) = language_name { if let Some(overrides) = self.languages.get(name) { @@ -332,6 +347,7 @@ impl AllLanguageSettings { &self.defaults } + /// Returns whether GitHub Copilot is enabled for the given path. pub fn copilot_enabled_for_path(&self, path: &Path) -> bool { !self .copilot @@ -340,6 +356,7 @@ impl AllLanguageSettings { .any(|glob| glob.is_match(path)) } + /// Returns whether GitHub Copilot is enabled for the given language and path. pub fn copilot_enabled(&self, language: Option<&Arc>, path: Option<&Path>) -> bool { if !self.copilot.feature_enabled { return false; @@ -356,13 +373,20 @@ impl AllLanguageSettings { } } +/// The kind of an inlay hint. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum InlayHintKind { + /// An inlay hint for a type. Type, + /// An inlay hint for a parameter. Parameter, } impl InlayHintKind { + /// Returns the [`InlayHintKind`] from the given name. + /// + /// Returns `None` if `name` does not match any of the expected + /// string representations. pub fn from_name(name: &str) -> Option { match name { "type" => Some(InlayHintKind::Type), @@ -371,6 +395,7 @@ impl InlayHintKind { } } + /// Returns the name of this [`InlayHintKind`]. pub fn name(&self) -> &'static str { match self { InlayHintKind::Type => "type", diff --git a/crates/language/src/outline.rs b/crates/language/src/outline.rs index df1a3c629e75e7695fcf9bd1f6c6a796df2c01f1..014b32676af586bb3b0f69f3b14e4ee8ec99f6c9 100644 --- a/crates/language/src/outline.rs +++ b/crates/language/src/outline.rs @@ -2,6 +2,7 @@ use fuzzy::{StringMatch, StringMatchCandidate}; use gpui::{BackgroundExecutor, HighlightStyle}; use std::ops::Range; +/// An outline of all the symbols contained in a buffer. #[derive(Debug)] pub struct Outline { pub items: Vec>, diff --git a/crates/language/src/proto.rs b/crates/language/src/proto.rs index 8d71e6e397af8ff11c24e3ba2b7c322395952d93..0497a4c4593e8307fc3f90809e32e9b5e4a6ab7e 100644 --- a/crates/language/src/proto.rs +++ b/crates/language/src/proto.rs @@ -13,18 +13,18 @@ use text::*; pub use proto::{BufferState, Operation}; -/// Serializes a [`RopeFingerprint`] to be sent over the wire. +/// Serializes a [`RopeFingerprint`] to be sent over RPC. pub fn serialize_fingerprint(fingerprint: RopeFingerprint) -> String { fingerprint.to_hex() } -/// Deserializes a [`RopeFingerprint`] from the wire format. +/// Deserializes a [`RopeFingerprint`] from the RPC representation. pub fn deserialize_fingerprint(fingerprint: &str) -> Result { RopeFingerprint::from_hex(fingerprint) .map_err(|error| anyhow!("invalid fingerprint: {}", error)) } -/// Deserializes a `[text::LineEnding]` from the wire format. +/// Deserializes a `[text::LineEnding]` from the RPC representation. pub fn deserialize_line_ending(message: proto::LineEnding) -> text::LineEnding { match message { proto::LineEnding::Unix => text::LineEnding::Unix, @@ -32,7 +32,7 @@ pub fn deserialize_line_ending(message: proto::LineEnding) -> text::LineEnding { } } -/// Serializes a [`text::LineEnding`] to be sent over the wire. +/// Serializes a [`text::LineEnding`] to be sent over RPC. pub fn serialize_line_ending(message: text::LineEnding) -> proto::LineEnding { match message { text::LineEnding::Unix => proto::LineEnding::Unix, @@ -40,7 +40,7 @@ pub fn serialize_line_ending(message: text::LineEnding) -> proto::LineEnding { } } -/// Serializes a [`crate::Operation`] to be sent over the wire. +/// Serializes a [`crate::Operation`] to be sent over RPC. pub fn serialize_operation(operation: &crate::Operation) -> proto::Operation { proto::Operation { variant: Some(match operation { @@ -103,7 +103,7 @@ pub fn serialize_operation(operation: &crate::Operation) -> proto::Operation { } } -/// Serializes an [`operation::EditOperation`] to be sent over the wire. +/// Serializes an [`operation::EditOperation`] to be sent over RPC. pub fn serialize_edit_operation(operation: &EditOperation) -> proto::operation::Edit { proto::operation::Edit { replica_id: operation.timestamp.replica_id as u32, @@ -118,7 +118,7 @@ pub fn serialize_edit_operation(operation: &EditOperation) -> proto::operation:: } } -/// Serializes an entry in the undo map to be sent over the wire. +/// Serializes an entry in the undo map to be sent over RPC. pub fn serialize_undo_map_entry( (edit_id, counts): (&clock::Lamport, &[(clock::Lamport, u32)]), ) -> proto::UndoMapEntry { @@ -136,6 +136,7 @@ pub fn serialize_undo_map_entry( } } +/// Splits the given list of operations into chunks. pub fn split_operations( mut operations: Vec, ) -> impl Iterator> { @@ -161,10 +162,12 @@ pub fn split_operations( }) } +/// Serializes selections to be sent over RPC. pub fn serialize_selections(selections: &Arc<[Selection]>) -> Vec { selections.iter().map(serialize_selection).collect() } +/// Serializes a [`Selection`] to be sent over RPC. pub fn serialize_selection(selection: &Selection) -> proto::Selection { proto::Selection { id: selection.id as u64, @@ -180,6 +183,7 @@ pub fn serialize_selection(selection: &Selection) -> proto::Selection { } } +/// Serializes a [`CursorShape`] to be sent over RPC. pub fn serialize_cursor_shape(cursor_shape: &CursorShape) -> proto::CursorShape { match cursor_shape { CursorShape::Bar => proto::CursorShape::CursorBar, @@ -189,6 +193,7 @@ pub fn serialize_cursor_shape(cursor_shape: &CursorShape) -> proto::CursorShape } } +/// Deserializes a [`CursorShape`] from the RPC representation. pub fn deserialize_cursor_shape(cursor_shape: proto::CursorShape) -> CursorShape { match cursor_shape { proto::CursorShape::CursorBar => CursorShape::Bar, @@ -198,6 +203,7 @@ pub fn deserialize_cursor_shape(cursor_shape: proto::CursorShape) -> CursorShape } } +/// Serializes a list of diagnostics to be sent over RPC. pub fn serialize_diagnostics<'a>( diagnostics: impl IntoIterator>, ) -> Vec { @@ -225,6 +231,7 @@ pub fn serialize_diagnostics<'a>( .collect() } +/// Serializes an [`Anchor`] to be sent over RPC. pub fn serialize_anchor(anchor: &Anchor) -> proto::Anchor { proto::Anchor { replica_id: anchor.timestamp.replica_id as u32, @@ -239,6 +246,7 @@ pub fn serialize_anchor(anchor: &Anchor) -> proto::Anchor { } // This behavior is currently copied in the collab database, for snapshotting channel notes +/// Deserializes an [`crate::Operation`] from the RPC representation. pub fn deserialize_operation(message: proto::Operation) -> Result { Ok( match message @@ -321,6 +329,7 @@ pub fn deserialize_operation(message: proto::Operation) -> Result EditOperation { EditOperation { timestamp: clock::Lamport { @@ -333,6 +342,7 @@ pub fn deserialize_edit_operation(edit: proto::operation::Edit) -> EditOperation } } +/// Deserializes an entry in the undo map from the RPC representation. pub fn deserialize_undo_map_entry( entry: proto::UndoMapEntry, ) -> (clock::Lamport, Vec<(clock::Lamport, u32)>) { @@ -357,6 +367,7 @@ pub fn deserialize_undo_map_entry( ) } +/// Deserializes selections from the RPC representation. pub fn deserialize_selections(selections: Vec) -> Arc<[Selection]> { Arc::from( selections @@ -366,6 +377,7 @@ pub fn deserialize_selections(selections: Vec) -> Arc<[Selecti ) } +/// Deserializes a [`Selection`] from the RPC representation. pub fn deserialize_selection(selection: proto::Selection) -> Option> { Some(Selection { id: selection.id as usize, @@ -376,6 +388,7 @@ pub fn deserialize_selection(selection: proto::Selection) -> Option, ) -> Arc<[DiagnosticEntry]> { @@ -406,6 +419,7 @@ pub fn deserialize_diagnostics( .collect() } +/// Deserializes an [`Anchor`] from the RPC representation. pub fn deserialize_anchor(anchor: proto::Anchor) -> Option { Some(Anchor { timestamp: clock::Lamport { @@ -421,6 +435,7 @@ pub fn deserialize_anchor(anchor: proto::Anchor) -> Option { }) } +/// Returns a `[clock::Lamport`] timestamp for the given [`proto::Operation`]. pub fn lamport_timestamp_for_operation(operation: &proto::Operation) -> Option { let replica_id; let value; @@ -453,6 +468,7 @@ pub fn lamport_timestamp_for_operation(operation: &proto::Operation) -> Option proto::Completion { proto::Completion { old_start: Some(serialize_anchor(&completion.old_range.start)), @@ -463,6 +479,7 @@ pub fn serialize_completion(completion: &Completion) -> proto::Completion { } } +/// Deserializes a [`Completion`] from the RPC representation. pub async fn deserialize_completion( completion: proto::Completion, language: Option>, @@ -497,6 +514,7 @@ pub async fn deserialize_completion( }) } +/// Serializes a [`CodeAction`] to be sent over RPC. pub fn serialize_code_action(action: &CodeAction) -> proto::CodeAction { proto::CodeAction { server_id: action.server_id.0 as u64, @@ -506,6 +524,7 @@ pub fn serialize_code_action(action: &CodeAction) -> proto::CodeAction { } } +/// Deserializes a [`CodeAction`] from the RPC representation. pub fn deserialize_code_action(action: proto::CodeAction) -> Result { let start = action .start @@ -523,6 +542,7 @@ pub fn deserialize_code_action(action: proto::CodeAction) -> Result }) } +/// Serializes a [`Transaction`] to be sent over RPC. pub fn serialize_transaction(transaction: &Transaction) -> proto::Transaction { proto::Transaction { id: Some(serialize_timestamp(transaction.id)), @@ -536,6 +556,7 @@ pub fn serialize_transaction(transaction: &Transaction) -> proto::Transaction { } } +/// Deserializes a [`Transaction`] from the RPC representation. pub fn deserialize_transaction(transaction: proto::Transaction) -> Result { Ok(Transaction { id: deserialize_timestamp( @@ -552,6 +573,7 @@ pub fn deserialize_transaction(transaction: proto::Transaction) -> Result proto::LamportTimestamp { proto::LamportTimestamp { replica_id: timestamp.replica_id as u32, @@ -559,6 +581,7 @@ pub fn serialize_timestamp(timestamp: clock::Lamport) -> proto::LamportTimestamp } } +/// Deserializes a [`clock::Lamport`] timestamp from the RPC representation. pub fn deserialize_timestamp(timestamp: proto::LamportTimestamp) -> clock::Lamport { clock::Lamport { replica_id: timestamp.replica_id as ReplicaId, @@ -566,6 +589,7 @@ pub fn deserialize_timestamp(timestamp: proto::LamportTimestamp) -> clock::Lampo } } +/// Serializes a range of [`FullOffset`]s to be sent over RPC. pub fn serialize_range(range: &Range) -> proto::Range { proto::Range { start: range.start.0 as u64, @@ -573,10 +597,12 @@ pub fn serialize_range(range: &Range) -> proto::Range { } } +/// Deserializes a range of [`FullOffset`]s from the RPC representation. pub fn deserialize_range(range: proto::Range) -> Range { FullOffset(range.start as usize)..FullOffset(range.end as usize) } +/// Deserializes a clock version from the RPC representation. pub fn deserialize_version(message: &[proto::VectorClockEntry]) -> clock::Global { let mut version = clock::Global::new(); for entry in message { @@ -588,6 +614,7 @@ pub fn deserialize_version(message: &[proto::VectorClockEntry]) -> clock::Global version } +/// Serializes a clock version to be sent over RPC. pub fn serialize_version(version: &clock::Global) -> Vec { version .iter() diff --git a/crates/language/src/syntax_map.rs b/crates/language/src/syntax_map.rs index c22ece48aff0b41a089538cba70424f81cd4e042..9174dc7df9e8e45663a75a268ede925460cc6139 100644 --- a/crates/language/src/syntax_map.rs +++ b/crates/language/src/syntax_map.rs @@ -29,7 +29,7 @@ pub struct SyntaxMap { #[derive(Clone, Default)] pub struct SyntaxSnapshot { - layers: SumTree, + layers: SumTree, parsed_version: clock::Global, interpolated_version: clock::Global, language_registry_version: usize, @@ -84,7 +84,7 @@ struct SyntaxMapMatchesLayer<'a> { } #[derive(Clone)] -struct SyntaxLayer { +struct SyntaxLayerEntry { depth: usize, range: Range, content: SyntaxLayerContent, @@ -118,7 +118,7 @@ impl SyntaxLayerContent { } #[derive(Debug)] -pub struct SyntaxLayerInfo<'a> { +pub struct SyntaxLayer<'a> { pub depth: usize, pub language: &'a Arc, tree: &'a Tree, @@ -126,7 +126,7 @@ pub struct SyntaxLayerInfo<'a> { } #[derive(Clone)] -pub struct OwnedSyntaxLayerInfo { +pub struct OwnedSyntaxLayer { pub depth: usize, pub language: Arc, tree: tree_sitter::Tree, @@ -691,7 +691,7 @@ impl SyntaxSnapshot { }; layers.push( - SyntaxLayer { + SyntaxLayerEntry { depth: step.depth, range: step.range, content, @@ -741,7 +741,7 @@ impl SyntaxSnapshot { SyntaxMapCaptures::new( range.clone(), text, - [SyntaxLayerInfo { + [SyntaxLayer { language, tree, depth: 0, @@ -781,7 +781,7 @@ impl SyntaxSnapshot { } #[cfg(test)] - pub fn layers<'a>(&'a self, buffer: &'a BufferSnapshot) -> Vec { + pub fn layers<'a>(&'a self, buffer: &'a BufferSnapshot) -> Vec { self.layers_for_range(0..buffer.len(), buffer).collect() } @@ -789,7 +789,7 @@ impl SyntaxSnapshot { &'a self, range: Range, buffer: &'a BufferSnapshot, - ) -> impl 'a + Iterator { + ) -> impl 'a + Iterator { let start_offset = range.start.to_offset(buffer); let end_offset = range.end.to_offset(buffer); let start = buffer.anchor_before(start_offset); @@ -813,7 +813,7 @@ impl SyntaxSnapshot { let layer_start_offset = layer.range.start.to_offset(buffer); let layer_start_point = layer.range.start.to_point(buffer).to_ts_point(); - info = Some(SyntaxLayerInfo { + info = Some(SyntaxLayer { tree, language, depth: layer.depth, @@ -842,7 +842,7 @@ impl<'a> SyntaxMapCaptures<'a> { fn new( range: Range, text: &'a Rope, - layers: impl Iterator>, + layers: impl Iterator>, query: fn(&Grammar) -> Option<&Query>, ) -> Self { let mut result = Self { @@ -964,7 +964,7 @@ impl<'a> SyntaxMapMatches<'a> { fn new( range: Range, text: &'a Rope, - layers: impl Iterator>, + layers: impl Iterator>, query: fn(&Grammar) -> Option<&Query>, ) -> Self { let mut result = Self::default(); @@ -1436,16 +1436,16 @@ fn insert_newlines_between_ranges( } } -impl OwnedSyntaxLayerInfo { +impl OwnedSyntaxLayer { pub fn node(&self) -> Node { self.tree .root_node_with_offset(self.offset.0, self.offset.1) } } -impl<'a> SyntaxLayerInfo<'a> { - pub fn to_owned(&self) -> OwnedSyntaxLayerInfo { - OwnedSyntaxLayerInfo { +impl<'a> SyntaxLayer<'a> { + pub fn to_owned(&self) -> OwnedSyntaxLayer { + OwnedSyntaxLayer { tree: self.tree.clone(), offset: self.offset, depth: self.depth, @@ -1564,7 +1564,7 @@ impl ChangeRegionSet { ) } - fn intersects(&self, layer: &SyntaxLayer, text: &BufferSnapshot) -> bool { + fn intersects(&self, layer: &SyntaxLayerEntry, text: &BufferSnapshot) -> bool { for region in &self.0 { if region.depth < layer.depth { continue; @@ -1675,7 +1675,7 @@ impl<'a> SeekTarget<'a, SyntaxLayerSummary, SyntaxLayerSummary> } } -impl sum_tree::Item for SyntaxLayer { +impl sum_tree::Item for SyntaxLayerEntry { type Summary = SyntaxLayerSummary; fn summary(&self) -> Self::Summary { @@ -1690,7 +1690,7 @@ impl sum_tree::Item for SyntaxLayer { } } -impl std::fmt::Debug for SyntaxLayer { +impl std::fmt::Debug for SyntaxLayerEntry { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("SyntaxLayer") .field("depth", &self.depth) diff --git a/crates/language_tools/src/syntax_tree_view.rs b/crates/language_tools/src/syntax_tree_view.rs index c30564e9bfe3f8c0e0fd1f5c2f6827a4f070fd81..493ce162cb060f3a7df890b481c1d7cba1485535 100644 --- a/crates/language_tools/src/syntax_tree_view.rs +++ b/crates/language_tools/src/syntax_tree_view.rs @@ -5,7 +5,7 @@ use gpui::{ MouseButton, MouseDownEvent, MouseMoveEvent, ParentElement, Pixels, Render, Styled, UniformListScrollHandle, View, ViewContext, VisualContext, WeakView, WindowContext, }; -use language::{Buffer, OwnedSyntaxLayerInfo}; +use language::{Buffer, OwnedSyntaxLayer}; use settings::Settings; use std::{mem, ops::Range}; use theme::{ActiveTheme, ThemeSettings}; @@ -57,7 +57,7 @@ struct EditorState { struct BufferState { buffer: Model, excerpt_id: ExcerptId, - active_layer: Option, + active_layer: Option, } impl SyntaxTreeView { @@ -491,7 +491,7 @@ impl SyntaxTreeToolbarItemView { }) } - fn render_header(active_layer: &OwnedSyntaxLayerInfo) -> ButtonLike { + fn render_header(active_layer: &OwnedSyntaxLayer) -> ButtonLike { ButtonLike::new("syntax tree header") .child(Label::new(active_layer.language.name())) .child(Label::new(format_node_range(active_layer.node()))) From 686dce85dda1fef979c532a749c3c80c0739e6b4 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 9 Jan 2024 20:32:50 +0100 Subject: [PATCH 003/104] Document bracket pairs --- crates/language/src/language.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 8182af1e54054c0b973afd296a18c1a3c993a405..49a87df35d72d71d4071a4239d6d88724b2e8f01 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -98,6 +98,8 @@ thread_local! { lazy_static! { pub(crate) static ref NEXT_GRAMMAR_ID: AtomicUsize = Default::default(); + /// A shared grammar for plain text, exposed for reuse by downstream crates. + #[doc(hidden)] pub static ref PLAIN_TEXT: Arc = Arc::new(Language::new( LanguageConfig { name: "Plain Text".into(), @@ -382,7 +384,7 @@ pub struct LanguageConfig { pub grammar_name: Option>, /// Given a list of `LanguageConfig`'s, the language of a file can be determined based on the path extension matching any of the `path_suffixes`. pub path_suffixes: Vec, - /// List of + /// List of bracket types in a language. pub brackets: BracketPairConfig, /// A regex pattern that determines whether the language should be assigned to a file or not. #[serde(default, deserialize_with = "deserialize_regex")] @@ -522,6 +524,7 @@ fn deserialize_regex<'de, D: Deserializer<'de>>(d: D) -> Result, D } } +#[doc(hidden)] #[cfg(any(test, feature = "test-support"))] pub struct FakeLspAdapter { pub name: &'static str, @@ -533,6 +536,10 @@ pub struct FakeLspAdapter { pub prettier_plugins: Vec<&'static str>, } +/// Configuration of handling bracket pairs for a given language. +/// +/// This struct includes settings for defining which pairs of characters are considered brackets and +/// also specifies any language-specific scopes where these pairs should be ignored for bracket matching purposes. #[derive(Clone, Debug, Default)] pub struct BracketPairConfig { /// A list of character pairs that should be treated as brackets in the context of a given language. @@ -570,11 +577,18 @@ impl<'de> Deserialize<'de> for BracketPairConfig { } } +/// Describes a single bracket pair and how an editor should react to e.g. inserting +/// an opening bracket or to a newline character insertion inbetween `start` and `end` characters. #[derive(Clone, Debug, Default, Deserialize, PartialEq)] pub struct BracketPair { + /// Starting substring for a bracket. pub start: String, + /// Ending substring for a bracket. pub end: String, + /// True if `end` should be automatically inserted right after `start` characters. pub close: bool, + /// True if an extra newline should be inserted while the cursor is in the middle + /// of that bracket pair. pub newline: bool, } From 6144ee1b5dcf793d90d05c0404e7cbf7f2e4aa78 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 9 Jan 2024 20:50:34 +0100 Subject: [PATCH 004/104] Docs for indent_size_for_line and co --- crates/language/src/buffer.rs | 10 +++++++++- crates/language/src/highlight_map.rs | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index b745ff6f43fbb88908989ca71dcdc11d9ed6657a..7863be8b9396c3da6a9a165365b68d17d7619ff7 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1920,6 +1920,7 @@ impl Buffer { undone } + /// Manually redoes a specific transaction in the buffer's redo history. pub fn redo(&mut self, cx: &mut ModelContext) -> Option { let was_dirty = self.is_dirty(); let old_version = self.version.clone(); @@ -1933,6 +1934,7 @@ impl Buffer { } } + /// Manually undoes all changes until a given transaction in the buffer's redo history. pub fn redo_to_transaction( &mut self, transaction_id: TransactionId, @@ -1952,6 +1954,7 @@ impl Buffer { redone } + /// Override current completion triggers with the user-provided completion triggers. pub fn set_completion_triggers(&mut self, triggers: Vec, cx: &mut ModelContext) { self.completion_triggers = triggers.clone(); self.completion_triggers_timestamp = self.text.lamport_clock.tick(); @@ -1965,11 +1968,14 @@ impl Buffer { cx.notify(); } + /// Returns a list of strings which trigger a completion menu for this language. + /// Usually this is driven by LSP server which returns a list of trigger characters for completions. pub fn completion_triggers(&self) -> &[String] { &self.completion_triggers } } +#[doc(hidden)] #[cfg(any(test, feature = "test-support"))] impl Buffer { pub fn edit_via_marked_text( @@ -2042,10 +2048,12 @@ impl Deref for Buffer { } impl BufferSnapshot { + /// Returns [`IndentSize`] for a given line that respects user settings and /// language preferences. pub fn indent_size_for_line(&self, row: u32) -> IndentSize { indent_size_for_line(self, row) } - + /// Returns [`IndentSize`] for a given position that respects user settings + /// and language preferences. pub fn language_indent_size_at(&self, position: T, cx: &AppContext) -> IndentSize { let settings = language_settings(self.language_at(position), self.file(), cx); if settings.hard_tabs { diff --git a/crates/language/src/highlight_map.rs b/crates/language/src/highlight_map.rs index 270ac259c9d78eff8d36a2ee8c8038f117d33260..8829eb94ac576be4b1ad7bc6512fd4720cf81dcb 100644 --- a/crates/language/src/highlight_map.rs +++ b/crates/language/src/highlight_map.rs @@ -11,7 +11,7 @@ pub struct HighlightId(pub u32); const DEFAULT_SYNTAX_HIGHLIGHT_ID: HighlightId = HighlightId(u32::MAX); impl HighlightMap { - pub fn new(capture_names: &[&str], theme: &SyntaxTheme) -> Self { + pub(crate) fn new(capture_names: &[&str], theme: &SyntaxTheme) -> Self { // For each capture name in the highlight query, find the longest // key in the theme's syntax styles that matches all of the // dot-separated components of the capture name. @@ -51,7 +51,7 @@ impl HighlightMap { } impl HighlightId { - pub fn is_default(&self) -> bool { + pub(crate) fn is_default(&self) -> bool { *self == DEFAULT_SYNTAX_HIGHLIGHT_ID } From ebe2c3658cf93fc88d12d6b284ae40875b6d3a93 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 9 Jan 2024 21:08:01 +0100 Subject: [PATCH 005/104] Add short top-level description of a crate --- crates/language/src/language.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 49a87df35d72d71d4071a4239d6d88724b2e8f01..fdb086ebc6ac85a91ccb1e0ece95385d8bc94fd3 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -1,7 +1,12 @@ -//! The `language` crate provides... ??? - #![warn(missing_docs)] - +//! The `language` crate provides a large chunk of Zed's language-related +//! features (the other big contributors being project and lsp crates that revolve around LSP features). +//! Namely, this crate: +//! - Provides [`Language`], [`Grammar`] and [`LanguageRegistry`] types that +//! use Tree-sitter to provide syntax highlighting to the editor; note though that `language` doesn't perform the highlighting by itself. It only maps ranges in a buffer to colors. Treesitter is also used for buffer outlines (lists of symbols in a buffer) +//! - Exposes [`LanguageConfig`] that describes how constructs (like brackets or line comments) should be handled by the editor for a source file of a particular language. +//! +//! Notably we do *not* assign a single language to a single file; in real world a single file can consist of multiple programming languages - HTML is a good example of that - and `language` crate tends to reflect that status quo in it's API. mod buffer; mod diagnostic_set; mod highlight_map; From 0ca9f286c6da11e718e23a54972e8fe1ef3363a4 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Tue, 16 Jan 2024 21:43:44 -0700 Subject: [PATCH 006/104] Show cursors for remote participants --- crates/client/src/user.rs | 46 +++++++++++++++- crates/collab_ui/src/channel_view.rs | 9 ++++ crates/editor/src/editor.rs | 13 +++++ crates/editor/src/element.rs | 55 +++++++++++++++++++- crates/gpui/src/executor.rs | 2 +- crates/terminal_view/src/terminal_element.rs | 1 + 6 files changed, 122 insertions(+), 4 deletions(-) diff --git a/crates/client/src/user.rs b/crates/client/src/user.rs index 4453bb40eaaf34291cfa5b7f9cc917cd8606706f..75f0acd810d7e58814802b860f88ee1df254e991 100644 --- a/crates/client/src/user.rs +++ b/crates/client/src/user.rs @@ -3,7 +3,10 @@ use anyhow::{anyhow, Context, Result}; use collections::{hash_map::Entry, HashMap, HashSet}; use feature_flags::FeatureFlagAppExt; use futures::{channel::mpsc, Future, StreamExt}; -use gpui::{AsyncAppContext, EventEmitter, Model, ModelContext, SharedUrl, Task}; +use gpui::{ + AppContext, AsyncAppContext, EventEmitter, Model, ModelContext, SharedString, SharedUrl, Task, + WeakModel, +}; use postage::{sink::Sink, watch}; use rpc::proto::{RequestMessage, UsersResponse}; use std::sync::{Arc, Weak}; @@ -77,6 +80,7 @@ pub struct UserStore { client: Weak, _maintain_contacts: Task<()>, _maintain_current_user: Task>, + weak_self: WeakModel, } #[derive(Clone)] @@ -194,6 +198,7 @@ impl UserStore { Ok(()) }), pending_contact_requests: Default::default(), + weak_self: cx.weak_model(), } } @@ -579,6 +584,19 @@ impl UserStore { self.users.get(&user_id).cloned() } + pub fn get_user_optimistic( + &mut self, + user_id: u64, + cx: &mut ModelContext, + ) -> Option> { + if let Some(user) = self.users.get(&user_id).cloned() { + return Some(user); + } + + self.get_user(user_id, cx).detach_and_log_err(cx); + None + } + pub fn get_user( &mut self, user_id: u64, @@ -617,6 +635,7 @@ impl UserStore { cx.spawn(|this, mut cx| async move { if let Some(rpc) = client.upgrade() { let response = rpc.request(request).await.context("error loading users")?; + dbg!(&response.users); let users = response .users .into_iter() @@ -651,6 +670,31 @@ impl UserStore { pub fn participant_indices(&self) -> &HashMap { &self.participant_indices } + + pub fn participant_names( + &self, + user_ids: impl Iterator, + cx: &AppContext, + ) -> HashMap { + let mut ret = HashMap::default(); + let mut missing_user_ids = Vec::new(); + for id in user_ids { + if let Some(github_login) = self.get_cached_user(id).map(|u| u.github_login.clone()) { + ret.insert(id, github_login.into()); + } else { + missing_user_ids.push(id) + } + } + if !missing_user_ids.is_empty() { + let this = self.weak_self.clone(); + cx.spawn(|mut cx| async move { + this.update(&mut cx, |this, cx| this.get_users(missing_user_ids, cx))? + .await + }) + .detach_and_log_err(cx); + } + ret + } } impl User { diff --git a/crates/collab_ui/src/channel_view.rs b/crates/collab_ui/src/channel_view.rs index 033889f771d84bafc13dae5005957096e61cb3c6..b2c243dc898b529b42b63876882361a8901b8dbf 100644 --- a/crates/collab_ui/src/channel_view.rs +++ b/crates/collab_ui/src/channel_view.rs @@ -442,4 +442,13 @@ impl CollaborationHub for ChannelBufferCollaborationHub { ) -> &'a HashMap { self.0.read(cx).user_store().read(cx).participant_indices() } + + fn user_names(&self, cx: &AppContext) -> HashMap { + let user_ids = self.collaborators(cx).values().map(|c| c.user_id); + self.0 + .read(cx) + .user_store() + .read(cx) + .participant_names(user_ids, cx) + } } diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 30b0a73d37e093bcb456d4fa6cf8e0c2ff98d5ff..d8918d3f297cadb130021c18d862d85c82aef568 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -627,6 +627,7 @@ pub struct RemoteSelection { pub peer_id: PeerId, pub line_mode: bool, pub participant_index: Option, + pub user_name: Option, } #[derive(Clone, Debug)] @@ -9246,6 +9247,7 @@ pub trait CollaborationHub { &self, cx: &'a AppContext, ) -> &'a HashMap; + fn user_names(&self, cx: &AppContext) -> HashMap; } impl CollaborationHub for Model { @@ -9259,6 +9261,14 @@ impl CollaborationHub for Model { ) -> &'a HashMap { self.read(cx).user_store().read(cx).participant_indices() } + + fn user_names(&self, cx: &AppContext) -> HashMap { + let this = self.read(cx); + let user_ids = this.collaborators().values().map(|c| c.user_id); + this.user_store().read_with(cx, |user_store, cx| { + user_store.participant_names(user_ids, cx) + }) + } } fn inlay_hint_settings( @@ -9310,6 +9320,7 @@ impl EditorSnapshot { collaboration_hub: &dyn CollaborationHub, cx: &'a AppContext, ) -> impl 'a + Iterator { + let participant_names = collaboration_hub.user_names(cx); let participant_indices = collaboration_hub.user_participant_indices(cx); let collaborators_by_peer_id = collaboration_hub.collaborators(cx); let collaborators_by_replica_id = collaborators_by_peer_id @@ -9321,6 +9332,7 @@ impl EditorSnapshot { .filter_map(move |(replica_id, line_mode, cursor_shape, selection)| { let collaborator = collaborators_by_replica_id.get(&replica_id)?; let participant_index = participant_indices.get(&collaborator.user_id).copied(); + let user_name = participant_names.get(&collaborator.user_id).cloned(); Some(RemoteSelection { replica_id, selection, @@ -9328,6 +9340,7 @@ impl EditorSnapshot { line_mode, participant_index, peer_id: collaborator.peer_id, + user_name, }) }) } diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index b82bd55bcf5e898299ca8a3a0e1d88cf37c72367..4e7a3bc243022605503925c955c4403ce57afe36 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -64,6 +64,7 @@ struct SelectionLayout { is_local: bool, range: Range, active_rows: Range, + user_name: Option, } impl SelectionLayout { @@ -74,6 +75,7 @@ impl SelectionLayout { map: &DisplaySnapshot, is_newest: bool, is_local: bool, + user_name: Option, ) -> Self { let point_selection = selection.map(|p| p.to_point(&map.buffer_snapshot)); let display_selection = point_selection.map(|p| p.to_display_point(map)); @@ -113,6 +115,7 @@ impl SelectionLayout { is_local, range, active_rows, + user_name, } } } @@ -980,8 +983,10 @@ impl EditorElement { let corner_radius = 0.15 * layout.position_map.line_height; let mut invisible_display_ranges = SmallVec::<[Range; 32]>::new(); - for (selection_style, selections) in &layout.selections { - for selection in selections { + for (participant_ix, (selection_style, selections)) in + layout.selections.iter().enumerate() + { + for selection in selections.into_iter() { self.paint_highlighted_range( selection.range.clone(), selection_style.selection, @@ -1062,6 +1067,7 @@ impl EditorElement { )) }); } + cursors.push(Cursor { color: selection_style.cursor, block_width, @@ -1069,6 +1075,14 @@ impl EditorElement { line_height: layout.position_map.line_height, shape: selection.cursor_shape, block_text, + cursor_name: selection.user_name.clone().map(|name| { + CursorName { + string: name, + color: self.style.background, + is_top_row: cursor_position.row() == 0, + z_index: (participant_ix % 256).try_into().unwrap(), + } + }), }); } } @@ -1887,6 +1901,7 @@ impl EditorElement { &snapshot.display_snapshot, is_newest, true, + None, ); if is_newest { newest_selection_head = Some(layout.head); @@ -1959,6 +1974,7 @@ impl EditorElement { &snapshot.display_snapshot, false, false, + selection.user_name, )); } @@ -1990,6 +2006,7 @@ impl EditorElement { &snapshot.display_snapshot, true, true, + None, ) .head }); @@ -3096,6 +3113,15 @@ pub struct Cursor { color: Hsla, shape: CursorShape, block_text: Option, + cursor_name: Option, +} + +#[derive(Debug)] +pub struct CursorName { + string: SharedString, + color: Hsla, + is_top_row: bool, + z_index: u8, } impl Cursor { @@ -3106,6 +3132,7 @@ impl Cursor { color: Hsla, shape: CursorShape, block_text: Option, + cursor_name: Option, ) -> Cursor { Cursor { origin, @@ -3114,6 +3141,7 @@ impl Cursor { color, shape, block_text, + cursor_name, } } @@ -3156,6 +3184,29 @@ impl Cursor { .paint(self.origin + origin, self.line_height, cx) .log_err(); } + + if let Some(name) = &self.cursor_name { + let name_origin = if name.is_top_row { + point(bounds.right() - px(1.), bounds.top()) + } else { + point(bounds.left(), bounds.top() - self.line_height / 4. - px(1.)) + }; + cx.with_z_index(name.z_index, |cx| { + div() + .bg(self.color) + .text_size(self.line_height / 2.) + .px_0p5() + .line_height(self.line_height / 2. + px(1.)) + .text_color(name.color) + .child(name.string.clone()) + .into_any_element() + .draw( + name_origin, + size(AvailableSpace::MinContent, AvailableSpace::MinContent), + cx, + ) + }) + } } pub fn shape(&self) -> CursorShape { diff --git a/crates/gpui/src/executor.rs b/crates/gpui/src/executor.rs index fc60cb1ec6afcd1c79f5b561a436eac4635c47bc..1fe05b25573e74212fca3b7367a7a3076e864408 100644 --- a/crates/gpui/src/executor.rs +++ b/crates/gpui/src/executor.rs @@ -68,7 +68,7 @@ where /// Run the task to completion in the background and log any /// errors that occur. #[track_caller] - pub fn detach_and_log_err(self, cx: &mut AppContext) { + pub fn detach_and_log_err(self, cx: &AppContext) { let location = core::panic::Location::caller(); cx.foreground_executor() .spawn(self.log_tracked_err(*location)) diff --git a/crates/terminal_view/src/terminal_element.rs b/crates/terminal_view/src/terminal_element.rs index 1fec041de9c633493993696cdc6fdda142355c77..65e013d0e0aeb7635a1a3e9a6db7126c09b9f796 100644 --- a/crates/terminal_view/src/terminal_element.rs +++ b/crates/terminal_view/src/terminal_element.rs @@ -550,6 +550,7 @@ impl TerminalElement { theme.players().local().cursor, shape, text, + None, ) }, ) From ef0432da0db27d3250c1c76b72aacb4c32594316 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Wed, 17 Jan 2024 10:14:20 -0700 Subject: [PATCH 007/104] Hide cursors by default, but show some --- crates/editor/src/editor.rs | 14 ++++++++++++++ crates/editor/src/element.rs | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index d8918d3f297cadb130021c18d862d85c82aef568..6b449f4e73b1eab1298835e4f46b4c26589ede9d 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -569,6 +569,8 @@ pub struct Editor { project: Option>, collaboration_hub: Option>, blink_manager: Model, + recently_focused: bool, + hovered_selections: HashSet<(ReplicaId, usize)>, pub show_local_selections: bool, mode: EditorMode, show_gutter: bool, @@ -1808,6 +1810,8 @@ impl Editor { pixel_position_of_newest_cursor: None, gutter_width: Default::default(), style: None, + recently_focused: false, + hovered_selections: Default::default(), editor_actions: Default::default(), show_copilot_suggestions: mode == EditorMode::Full, _subscriptions: vec![ @@ -9196,6 +9200,16 @@ impl Editor { cx.focus(&rename_editor_focus_handle); } else { self.blink_manager.update(cx, BlinkManager::enable); + self.recently_focused = true; + cx.spawn(|this, mut cx| async move { + cx.background_executor().timer(Duration::from_secs(5)).await; + this.update(&mut cx, |this, cx| { + this.recently_focused = false; + cx.notify() + }) + .ok() + }) + .detach(); self.buffer.update(cx, |buffer, cx| { buffer.finalize_last_transaction(cx); if self.leader_peer_id.is_none() { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 4e7a3bc243022605503925c955c4403ce57afe36..cf3b1d2f16028aea87b2b46b6053502f1945ecaa 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -586,6 +586,32 @@ impl EditorElement { } } + fn update_visible_cursor( + editor: &mut Editor, + point: DisplayPoint, + cx: &mut ViewContext, + ) { + let snapshot = editor.snapshot(cx); + if let Some(hub) = editor.collaboration_hub() { + let range = if point.column() > 0 { + DisplayPoint::new(point.row(), point.column() - 1)..point + } else { + point..DisplayPoint::new(point.row(), point.column() + 1) + }; + let range = snapshot + .buffer_snapshot + .anchor_at(range.start.to_point(&snapshot.display_snapshot), Bias::Left) + ..snapshot + .buffer_snapshot + .anchor_at(range.end.to_point(&snapshot.display_snapshot), Bias::Right); + for selection in snapshot.remote_selections_in_range(&range, hub, cx) { + let key = (selection.replica_id, selection.selection.id); + editor.hovered_selections.insert(key); + } + } + editor.hovered_selections.clear(); + } + fn paint_background( &self, gutter_bounds: Bounds, @@ -1962,6 +1988,7 @@ impl EditorElement { if Some(selection.peer_id) == editor.leader_peer_id { continue; } + let id = (selection.replica_id, selection.selection.id); remote_selections .entry(selection.replica_id) @@ -1974,7 +2001,11 @@ impl EditorElement { &snapshot.display_snapshot, false, false, - selection.user_name, + if editor.recently_focused || editor.hovered_selections.contains(&id) { + selection.user_name + } else { + None + }, )); } From 6457ccf9ece3b36a37e675783abee9748a443115 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 17 Jan 2024 10:08:42 -0800 Subject: [PATCH 008/104] Add docs for buffer.rs Co-authored-by: Antonio --- crates/language/src/buffer.rs | 203 ++++++++++++++++++++---- crates/language/src/proto.rs | 3 +- crates/multi_buffer/src/multi_buffer.rs | 2 +- crates/project/src/project.rs | 2 - crates/rpc/proto/zed.proto | 3 + crates/vim/src/motion.rs | 20 ++- 6 files changed, 194 insertions(+), 39 deletions(-) diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 7863be8b9396c3da6a9a165365b68d17d7619ff7..8feb566c7e7b0a9819eeed6e644856690fc46e86 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -60,12 +60,15 @@ pub use {tree_sitter_rust, tree_sitter_typescript}; pub use lsp::DiagnosticSeverity; lazy_static! { - pub static ref BUFFER_DIFF_TASK: TaskLabel = TaskLabel::new(); + static ref BUFFER_DIFF_TASK: TaskLabel = TaskLabel::new(); } +/// Indicate whether a [Buffer] has permissions to edit. #[derive(PartialEq, Clone, Copy, Debug)] pub enum Capability { + /// The buffer is a mutable replica. ReadWrite, + /// The buffer is a read-only replica. ReadOnly, } @@ -107,11 +110,11 @@ pub struct Buffer { capability: Capability, } -/// An immutable, cheaply cloneable representation of a certain +/// An immutable, cheaply cloneable representation of a fixed /// state of a buffer. pub struct BufferSnapshot { text: text::BufferSnapshot, - pub git_diff: git::diff::BufferDiff, + git_diff: git::diff::BufferDiff, pub(crate) syntax: SyntaxSnapshot, file: Option>, diagnostics: SmallVec<[(LanguageServerId, DiagnosticSet); 2]>, @@ -128,25 +131,33 @@ pub struct BufferSnapshot { /// assumes that indentation is all the same character. #[derive(Clone, Copy, Debug, PartialEq, Eq, Default)] pub struct IndentSize { + /// The number of bytes that comprise the indentation. pub len: u32, + /// The kind of whitespace used for indentation. pub kind: IndentKind, } /// A whitespace character that's used for indentation. #[derive(Clone, Copy, Debug, PartialEq, Eq, Default)] pub enum IndentKind { + /// An ASCII space character. #[default] Space, + /// An ASCII tab chracter. Tab, } /// The shape of a selection cursor. #[derive(Copy, Clone, PartialEq, Eq, Debug, Default)] pub enum CursorShape { + /// A vertical bar #[default] Bar, + /// A block that surrounds the following character Block, + /// An underline that runs along the following character Underscore, + /// A box drawn around the following character Hollow, } @@ -158,26 +169,40 @@ struct SelectionSet { lamport_timestamp: clock::Lamport, } -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct GroupId { - source: Arc, - id: usize, -} - /// A diagnostic associated with a certain range of a buffer. #[derive(Clone, Debug, PartialEq, Eq)] pub struct Diagnostic { + /// The name of the service that produced this diagnostic. pub source: Option, + /// A machine-readable code that identifies this diagnostic. pub code: Option, + /// Whether this diagnostic is a hint, warning, or error. pub severity: DiagnosticSeverity, + /// The human-readable message associated with this diagnostic. pub message: String, + /// An id that identifies the group to which this diagnostic belongs. + /// + /// When a language server produces a diagnostic with + /// one or more associated diagnostics, those diagnostics are all + /// assigned a single group id. pub group_id: usize, - pub is_valid: bool, + /// Whether this diagnostic is the primary diagnostic for its group. + /// + /// In a given group, the primary diagnostic is the top-level diagnostic + /// returned by the language server. The non-primary diagnostics are the + /// associated diagnostics. pub is_primary: bool, + /// Whether this diagnostic is considered to originate from an analysis of + /// files on disk, as opposed to any unsaved buffer contents. This is a + /// property of a given diagnostic source, and is configured for a given + /// language server via the [LspAdapter::disk_based_diagnostic_sources] method + /// for the language server. pub is_disk_based: bool, + /// Whether this diagnostic marks unnecessary code. pub is_unnecessary: bool, } +/// TODO - move this into the `project` crate and make it private. pub async fn prepare_completion_documentation( documentation: &lsp::Documentation, language_registry: &Arc, @@ -209,77 +234,125 @@ pub async fn prepare_completion_documentation( } } +/// Documentation associated with a [Completion]. #[derive(Clone, Debug)] pub enum Documentation { + /// There is no documentation for this completion. Undocumented, + /// A single line of documentation. SingleLine(String), + /// Multiple lines of plain text documentation. MultiLinePlainText(String), + /// Markdown documentation. MultiLineMarkdown(ParsedMarkdown), } +/// A completion provided by a language server #[derive(Clone, Debug)] pub struct Completion { + /// The range of the buffer that will be replaced. pub old_range: Range, + /// The new text that will be inserted. pub new_text: String, + /// A label for this completion that is shown in the menu. pub label: CodeLabel, + /// The id of the language server that produced this completion. pub server_id: LanguageServerId, + /// The documentation for this completion. pub documentation: Option, + /// The raw completion provided by the language server. pub lsp_completion: lsp::CompletionItem, } +/// A code action provided by a language server. #[derive(Clone, Debug)] pub struct CodeAction { + /// The id of the language server that produced this code action. pub server_id: LanguageServerId, + /// The range of the buffer where this code action is applicable. pub range: Range, + /// The raw code action provided by the language server. pub lsp_action: lsp::CodeAction, } +/// An operation used to synchronize this buffer with its other replicas. #[derive(Clone, Debug, PartialEq)] pub enum Operation { + /// A text operation. Buffer(text::Operation), + /// An update to the buffer's diagnostics. UpdateDiagnostics { + /// The id of the language server that produced the new diagnostics. server_id: LanguageServerId, + /// The diagnostics. diagnostics: Arc<[DiagnosticEntry]>, + /// The buffer's lamport timestamp. lamport_timestamp: clock::Lamport, }, + /// An update to the most recent selections in this buffer. UpdateSelections { + /// The selections. selections: Arc<[Selection]>, + /// The buffer's lamport timestamp. lamport_timestamp: clock::Lamport, + /// Whether the selections are in 'line mode'. line_mode: bool, + /// The [CursorShape] associated with these selections. cursor_shape: CursorShape, }, + /// An update to the characters that should trigger autocompletion + /// for this buffer. UpdateCompletionTriggers { + /// The characters that trigger autocompletion. triggers: Vec, + /// The buffer's lamport timestamp. lamport_timestamp: clock::Lamport, }, } +/// An event that occurs in a buffer. #[derive(Clone, Debug, PartialEq)] pub enum Event { + /// The buffer was changed in a way that must be + /// propagated to its other replicas. Operation(Operation), + /// The buffer was edited. Edited, + /// The buffer's `dirty` bit changed. DirtyChanged, + /// The buffer was saved. Saved, + /// The buffer's file was changed on disk. FileHandleChanged, + /// The buffer was reloaded. Reloaded, + /// The buffer's diff_base changed. DiffBaseChanged, + /// The buffer's language was changed. LanguageChanged, + /// The buffer's syntax trees were updated. Reparsed, + /// The buffer's diagnostics were updated. DiagnosticsUpdated, + /// The buffer was explicitly requested to close. Closed, } /// The file associated with a buffer. pub trait File: Send + Sync { + /// Returns the [LocalFile] associated with this file, if the + /// file is local. fn as_local(&self) -> Option<&dyn LocalFile>; + /// Returns whether this file is local. fn is_local(&self) -> bool { self.as_local().is_some() } + /// Returns the file's mtime. fn mtime(&self) -> SystemTime; /// Returns the path of this file relative to the worktree's root directory. @@ -298,10 +371,13 @@ pub trait File: Send + Sync { /// This is needed for looking up project-specific settings. fn worktree_id(&self) -> usize; + /// Returns whether the file has been deleted. fn is_deleted(&self) -> bool; + /// Converts this file into an [Any] trait object. fn as_any(&self) -> &dyn Any; + /// Converts this file into a protobuf message. fn to_proto(&self) -> rpc::proto::File; } @@ -310,8 +386,10 @@ pub trait LocalFile: File { /// Returns the absolute path of this file. fn abs_path(&self, cx: &AppContext) -> PathBuf; + /// Loads the file's contents from disk. fn load(&self, cx: &AppContext) -> Task>; + /// Called when the buffer is reloaded from disk. fn buffer_reloaded( &self, buffer_id: u64, @@ -392,11 +470,18 @@ pub struct BufferChunks<'a> { /// diagnostic status. #[derive(Clone, Copy, Debug, Default)] pub struct Chunk<'a> { + /// The text of the chunk. pub text: &'a str, + /// The syntax highlighting style of the chunk. pub syntax_highlight_id: Option, + /// The highlight style that has been applied to this chunk in + /// the editor. pub highlight_style: Option, + /// The severity of diagnostic associated with this chunk, if any. pub diagnostic_severity: Option, + /// Whether this chunk of text is marked as unnecessary. pub is_unnecessary: bool, + /// Whether this chunk of text was originally a tab character. pub is_tab: bool, } @@ -418,21 +503,14 @@ pub(crate) struct DiagnosticEndpoint { /// A class of characters, used for characterizing a run of text. #[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord, Debug)] pub enum CharKind { + /// Whitespace. Whitespace, + /// Punctuation. Punctuation, + /// Word. Word, } -impl CharKind { - pub fn coerce_punctuation(self, treat_punctuation_as_word: bool) -> Self { - if treat_punctuation_as_word && self == CharKind::Punctuation { - CharKind::Word - } else { - self - } - } -} - impl Buffer { /// Create a new buffer with the given base text. pub fn new>(replica_id: ReplicaId, id: u64, base_text: T) -> Self { @@ -554,14 +632,17 @@ impl Buffer { self } + /// Returns the [Capability] of this buffer. pub fn capability(&self) -> Capability { self.capability } + /// Whether this buffer can only be read. pub fn read_only(&self) -> bool { self.capability == Capability::ReadOnly } + /// Builds a [Buffer] with the given underlying [TextBuffer], diff base, [File] and [Capability]. pub fn build( buffer: TextBuffer, diff_base: Option, @@ -675,6 +756,7 @@ impl Buffer { .set_language_registry(language_registry); } + /// This method is called to signal that the buffer has been saved. pub fn did_save( &mut self, version: clock::Global, @@ -689,6 +771,7 @@ impl Buffer { cx.notify(); } + /// Reloads the contents of the buffer from disk. pub fn reload( &mut self, cx: &mut ModelContext, @@ -737,6 +820,7 @@ impl Buffer { rx } + /// This method is called to signal that the buffer has been reloaded. pub fn did_reload( &mut self, version: clock::Global, @@ -763,6 +847,8 @@ impl Buffer { cx.notify(); } + /// Updates the [File] backing this buffer. This should be called when + /// the file has changed or has been deleted. pub fn file_updated(&mut self, new_file: Arc, cx: &mut ModelContext) { let mut file_changed = false; @@ -800,16 +886,20 @@ impl Buffer { } } + /// Returns the current diff base, see [Buffer::set_diff_base]. pub fn diff_base(&self) -> Option<&str> { self.diff_base.as_deref() } + /// Sets the text that will be used to compute a Git diff + /// against the buffer text. pub fn set_diff_base(&mut self, diff_base: Option, cx: &mut ModelContext) { self.diff_base = diff_base; self.git_diff_recalc(cx); cx.emit(Event::DiffBaseChanged); } + /// Recomputes the Git diff status. pub fn git_diff_recalc(&mut self, cx: &mut ModelContext) -> Option> { let diff_base = self.diff_base.clone()?; // TODO: Make this an Arc let snapshot = self.snapshot(); @@ -830,14 +920,12 @@ impl Buffer { })) } - pub fn close(&mut self, cx: &mut ModelContext) { - cx.emit(Event::Closed); - } - + /// Returns the primary [Language] assigned to this [Buffer]. pub fn language(&self) -> Option<&Arc> { self.language.as_ref() } + /// Returns the [Language] at the given location. pub fn language_at(&self, position: D) -> Option> { let offset = position.to_offset(self); self.syntax_map @@ -848,26 +936,32 @@ impl Buffer { .or_else(|| self.language.clone()) } + /// The number of times the buffer was parsed. pub fn parse_count(&self) -> usize { self.parse_count } + /// The number of times selections were updated. pub fn selections_update_count(&self) -> usize { self.selections_update_count } + /// The number of times diagnostics were updated. pub fn diagnostics_update_count(&self) -> usize { self.diagnostics_update_count } + /// The number of times the underlying file was updated. pub fn file_update_count(&self) -> usize { self.file_update_count } + /// The number of times the git diff status was updated. pub fn git_diff_update_count(&self) -> usize { self.git_diff_update_count } + /// Whether the buffer is being parsed in the background. #[cfg(any(test, feature = "test-support"))] pub fn is_parsing(&self) -> bool { self.parsing_in_background @@ -2377,7 +2471,7 @@ impl BufferSnapshot { self.syntax.layers_for_range(0..self.len(), &self.text) } - pub fn syntax_layer_at(&self, position: D) -> Option { + fn syntax_layer_at(&self, position: D) -> Option { let offset = position.to_offset(self); self.syntax .layers_for_range(offset..offset, &self.text) @@ -2385,12 +2479,14 @@ impl BufferSnapshot { .last() } + /// Returns the [Language] at the given location. pub fn language_at(&self, position: D) -> Option<&Arc> { self.syntax_layer_at(position) .map(|info| info.language) .or(self.language.as_ref()) } + /// Returns the settings for the language at the given location. pub fn settings_at<'a, D: ToOffset>( &self, position: D, @@ -2399,6 +2495,7 @@ impl BufferSnapshot { language_settings(self.language_at(position), self.file.as_ref(), cx) } + /// Returns the [LanguageScope] at the given location. pub fn language_scope_at(&self, position: D) -> Option { let offset = position.to_offset(self); let mut scope = None; @@ -2443,6 +2540,8 @@ impl BufferSnapshot { }) } + /// Returns a tuple of the range and character kind of the word + /// surrounding the given position. pub fn surrounding_word(&self, start: T) -> (Range, Option) { let mut start = start.to_offset(self); let mut end = start; @@ -2475,6 +2574,7 @@ impl BufferSnapshot { (start..end, word_kind) } + /// Returns the range for the closes syntax node enclosing the given range. pub fn range_for_syntax_ancestor(&self, range: Range) -> Option> { let range = range.start.to_offset(self)..range.end.to_offset(self); let mut result: Option> = None; @@ -2543,11 +2643,19 @@ impl BufferSnapshot { result } + /// Returns the outline for the buffer. + /// + /// This method allows passing an optional [SyntaxTheme] to + /// syntax-highlight the returned symbols. pub fn outline(&self, theme: Option<&SyntaxTheme>) -> Option> { self.outline_items_containing(0..self.len(), true, theme) .map(Outline::new) } + /// Returns all the symbols that contain the given position. + /// + /// This method allows passing an optional [SyntaxTheme] to + /// syntax-highlight the returned symbols. pub fn symbols_containing( &self, position: T, @@ -2699,6 +2807,8 @@ impl BufferSnapshot { Some(items) } + /// For each grammar in the language, runs the provided + /// [tree_sitter::Query] against the given range. pub fn matches( &self, range: Range, @@ -2755,6 +2865,7 @@ impl BufferSnapshot { }) } + /// Returns selections for remote peers intersecting the given range. #[allow(clippy::type_complexity)] pub fn remote_selections_in_range( &self, @@ -2793,6 +2904,13 @@ impl BufferSnapshot { }) } + /// Whether the buffer contains any git changes. + pub fn has_git_diff(&self) -> bool { + !self.git_diff.is_empty() + } + + /// Returns all the Git diff hunks intersecting the given + /// row range. pub fn git_diff_hunks_in_row_range<'a>( &'a self, range: Range, @@ -2800,6 +2918,8 @@ impl BufferSnapshot { self.git_diff.hunks_in_row_range(range, self) } + /// Returns all the Git diff hunks intersecting the given + /// range. pub fn git_diff_hunks_intersecting_range<'a>( &'a self, range: Range, @@ -2807,6 +2927,8 @@ impl BufferSnapshot { self.git_diff.hunks_intersecting_range(range, self) } + /// Returns all the Git diff hunks intersecting the given + /// range, in reverse order. pub fn git_diff_hunks_intersecting_range_rev<'a>( &'a self, range: Range, @@ -2814,6 +2936,7 @@ impl BufferSnapshot { self.git_diff.hunks_intersecting_range_rev(range, self) } + /// Returns all the diagnostics intersecting the given range. pub fn diagnostics_in_range<'a, T, O>( &'a self, search_range: Range, @@ -2843,6 +2966,9 @@ impl BufferSnapshot { }) } + /// Returns all the diagnostic groups associated with the given + /// language server id. If no language server id is provided, + /// all diagnostics groups are returned. pub fn diagnostic_groups( &self, language_server_id: Option, @@ -2873,6 +2999,7 @@ impl BufferSnapshot { groups } + /// Returns an iterator over the diagnostics for the given group. pub fn diagnostic_group<'a, O>( &'a self, group_id: usize, @@ -2885,22 +3012,27 @@ impl BufferSnapshot { .flat_map(move |(_, set)| set.group(group_id, self)) } + /// The number of times diagnostics were updated. pub fn diagnostics_update_count(&self) -> usize { self.diagnostics_update_count } + /// The number of times the buffer was parsed. pub fn parse_count(&self) -> usize { self.parse_count } + /// The number of times selections were updated. pub fn selections_update_count(&self) -> usize { self.selections_update_count } + /// Returns a snapshot of underlying file. pub fn file(&self) -> Option<&Arc> { self.file.as_ref() } + /// Resolves the file path (relative to the worktree root) associated with the underlying file. pub fn resolve_file_path(&self, cx: &AppContext, include_root: bool) -> Option { if let Some(file) = self.file() { if file.path().file_name().is_none() || include_root { @@ -2913,10 +3045,12 @@ impl BufferSnapshot { } } + /// The number of times the underlying file was updated. pub fn file_update_count(&self) -> usize { self.file_update_count } + /// The number of times the git diff status was updated. pub fn git_diff_update_count(&self) -> usize { self.git_diff_update_count } @@ -2926,7 +3060,7 @@ fn indent_size_for_line(text: &text::BufferSnapshot, row: u32) -> IndentSize { indent_size_for_text(text.chars_at(Point::new(row, 0))) } -pub fn indent_size_for_text(text: impl Iterator) -> IndentSize { +fn indent_size_for_text(text: impl Iterator) -> IndentSize { let mut result = IndentSize::spaces(0); for c in text { let kind = match c { @@ -3004,6 +3138,7 @@ impl<'a> BufferChunks<'a> { } } + /// Seeks to the given byte offset in the buffer. pub fn seek(&mut self, offset: usize) { self.range.start = offset; self.chunks.seek(self.range.start); @@ -3027,6 +3162,7 @@ impl<'a> BufferChunks<'a> { } } + /// The current byte offset in the buffer. pub fn offset(&self) -> usize { self.range.start } @@ -3179,7 +3315,6 @@ impl Default for Diagnostic { message: Default::default(), group_id: 0, is_primary: false, - is_valid: true, is_disk_based: false, is_unnecessary: false, } @@ -3187,6 +3322,7 @@ impl Default for Diagnostic { } impl IndentSize { + /// Returns an [IndentSize] representing the given spaces. pub fn spaces(len: u32) -> Self { Self { len, @@ -3194,6 +3330,7 @@ impl IndentSize { } } + /// Returns an [IndentSize] representing a tab. pub fn tab() -> Self { Self { len: 1, @@ -3201,10 +3338,12 @@ impl IndentSize { } } + /// An iterator over the characters represented by this [IndentSize]. pub fn chars(&self) -> impl Iterator { iter::repeat(self.char()).take(self.len as usize) } + /// The character representation of this [IndentSize]. pub fn char(&self) -> char { match self.kind { IndentKind::Space => ' ', @@ -3212,6 +3351,8 @@ impl IndentSize { } } + /// Consumes the current [IndentSize] and returns a new one that has + /// been shrunk or enlarged by the given size along the given direction. pub fn with_delta(mut self, direction: Ordering, size: IndentSize) -> Self { match direction { Ordering::Less => { @@ -3233,6 +3374,8 @@ impl IndentSize { } impl Completion { + /// A key that can be used to sort completions when displaying + /// them to the user. pub fn sort_key(&self) -> (usize, &str) { let kind_key = match self.lsp_completion.kind { Some(lsp::CompletionItemKind::VARIABLE) => 0, @@ -3241,12 +3384,13 @@ impl Completion { (kind_key, &self.label.text[self.label.filter_range.clone()]) } + /// Whether this completion is a snippet. pub fn is_snippet(&self) -> bool { self.lsp_completion.insert_text_format == Some(lsp::InsertTextFormat::SNIPPET) } } -pub fn contiguous_ranges( +pub(crate) fn contiguous_ranges( values: impl Iterator, max_len: usize, ) -> impl Iterator> { @@ -3272,6 +3416,9 @@ pub fn contiguous_ranges( }) } +/// Returns the [CharKind] for the given character. When a scope is provided, +/// the function checks if the character is considered a word character +/// based on the language scope's word character settings. pub fn char_kind(scope: &Option, c: char) -> CharKind { if c.is_whitespace() { return CharKind::Whitespace; diff --git a/crates/language/src/proto.rs b/crates/language/src/proto.rs index 0497a4c4593e8307fc3f90809e32e9b5e4a6ab7e..d4b553de47966847916794a327b315272bbff3d1 100644 --- a/crates/language/src/proto.rs +++ b/crates/language/src/proto.rs @@ -223,7 +223,7 @@ pub fn serialize_diagnostics<'a>( } as i32, group_id: entry.diagnostic.group_id as u64, is_primary: entry.diagnostic.is_primary, - is_valid: entry.diagnostic.is_valid, + is_valid: true, code: entry.diagnostic.code.clone(), is_disk_based: entry.diagnostic.is_disk_based, is_unnecessary: entry.diagnostic.is_unnecessary, @@ -409,7 +409,6 @@ pub fn deserialize_diagnostics( message: diagnostic.message, group_id: diagnostic.group_id as usize, code: diagnostic.code, - is_valid: diagnostic.is_valid, is_primary: diagnostic.is_primary, is_disk_based: diagnostic.is_disk_based, is_unnecessary: diagnostic.is_unnecessary, diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 946e6af5ab5fd9a97439edb5acb296972068cf44..e02f19155bdda86748fc6b0daf09a886c9ecb086 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -3023,7 +3023,7 @@ impl MultiBufferSnapshot { pub fn has_git_diffs(&self) -> bool { for excerpt in self.excerpts.iter() { - if !excerpt.buffer.git_diff.is_empty() { + if excerpt.buffer.has_git_diff() { return true; } } diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 044b750ad9d7cecce1a00f491e0fd66199989bb7..fdaab47bc1bdeb9a677c9f9c7d1817c0f8762144 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -3912,7 +3912,6 @@ impl Project { message: diagnostic.message.clone(), group_id, is_primary: true, - is_valid: true, is_disk_based, is_unnecessary, }, @@ -3930,7 +3929,6 @@ impl Project { message: info.message.clone(), group_id, is_primary: false, - is_valid: true, is_disk_based, is_unnecessary: false, }, diff --git a/crates/rpc/proto/zed.proto b/crates/rpc/proto/zed.proto index e423441a30218674c4d6b68098a8f724c8a32654..086deeef119153d151c02b59b4184ec9b3cae06a 100644 --- a/crates/rpc/proto/zed.proto +++ b/crates/rpc/proto/zed.proto @@ -1471,7 +1471,10 @@ message Diagnostic { optional string code = 6; uint64 group_id = 7; bool is_primary = 8; + + // TODO: remove this field bool is_valid = 9; + bool is_disk_based = 10; bool is_unnecessary = 11; diff --git a/crates/vim/src/motion.rs b/crates/vim/src/motion.rs index 73ba70d5add11f33d55e001e2637c05bcca0afe5..685c7a28f9b91de84686d7a9e876ab1e49dd5594 100644 --- a/crates/vim/src/motion.rs +++ b/crates/vim/src/motion.rs @@ -681,8 +681,8 @@ pub(crate) fn next_word_start( for _ in 0..times { let mut crossed_newline = false; point = movement::find_boundary(map, point, FindRange::MultiLine, |left, right| { - let left_kind = char_kind(&scope, left).coerce_punctuation(ignore_punctuation); - let right_kind = char_kind(&scope, right).coerce_punctuation(ignore_punctuation); + let left_kind = coerce_punctuation(char_kind(&scope, left), ignore_punctuation); + let right_kind = coerce_punctuation(char_kind(&scope, right), ignore_punctuation); let at_newline = right == '\n'; let found = (left_kind != right_kind && right_kind != CharKind::Whitespace) @@ -711,8 +711,8 @@ fn next_word_end( *point.column_mut() = 0; } point = movement::find_boundary(map, point, FindRange::MultiLine, |left, right| { - let left_kind = char_kind(&scope, left).coerce_punctuation(ignore_punctuation); - let right_kind = char_kind(&scope, right).coerce_punctuation(ignore_punctuation); + let left_kind = coerce_punctuation(char_kind(&scope, left), ignore_punctuation); + let right_kind = ccoerce_punctuation(har_kind(&scope, right), ignore_punctuation); left_kind != right_kind && left_kind != CharKind::Whitespace }); @@ -744,8 +744,8 @@ fn previous_word_start( // cursor because the newline is checked only once. point = movement::find_preceding_boundary(map, point, FindRange::MultiLine, |left, right| { - let left_kind = char_kind(&scope, left).coerce_punctuation(ignore_punctuation); - let right_kind = char_kind(&scope, right).coerce_punctuation(ignore_punctuation); + let left_kind = coerce_punctuation(char_kind(&scope, left), ignore_punctuation); + let right_kind = coerce_punctuation(char_kind(&scope, right), ignore_punctuation); (left_kind != right_kind && !right.is_whitespace()) || left == '\n' }); @@ -952,6 +952,14 @@ pub(crate) fn next_line_end( end_of_line(map, false, point) } +fn coerce_punctuation(kind: CharKind, treat_punctuation_as_word: bool) -> Self { + if treat_punctuation_as_word && kind == CharKind::Punctuation { + CharKind::Word + } else { + kind + } +} + #[cfg(test)] mod test { From bf8e57098d0a30e2bfba900781da06eb40828b26 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 18 Jan 2024 23:11:05 +0200 Subject: [PATCH 009/104] Avoid gutter resizes on line number increase/decrease Reserves 4 characters for the line number in the gutter to avoid editor bounds jumping when editing small files like commit messages. --- crates/editor/src/element.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 06faf3265ebdffdc54bccc19529b008e4059c46b..ec1d3085153159d5de025a58659f691f2a7ab480 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1790,8 +1790,10 @@ impl EditorElement { let descent = cx.text_system().descent(font_id, font_size); let gutter_padding_factor = 3.5; + // Avoid flicker-like gutter resizes when the line number gains another digit and only resize the gutter on files with N*10^5 lines. + let min_width_for_number_on_gutter = em_width * 4.0; gutter_padding = (em_width * gutter_padding_factor).round(); - gutter_width = self.max_line_number_width(&snapshot, cx) + gutter_padding * 2.0; + gutter_width = self.max_line_number_width(&snapshot, cx).max(min_width_for_number_on_gutter) + gutter_padding * 2.0; gutter_margin = -descent; } else { gutter_padding = Pixels::ZERO; @@ -3843,7 +3845,9 @@ fn compute_auto_height_layout( let descent = cx.text_system().descent(font_id, font_size); let gutter_padding_factor = 3.5; let gutter_padding = (em_width * gutter_padding_factor).round(); - gutter_width = max_line_number_width + gutter_padding * 2.0; + let min_width_for_number_on_gutter = em_width * 4.0; + gutter_width = + max_line_number_width.max(min_width_for_number_on_gutter) + gutter_padding * 2.0; gutter_margin = -descent; } else { gutter_width = Pixels::ZERO; From e513020fbbca97e9e0d45f9a4be7399759123fc8 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Thu, 18 Jan 2024 15:59:13 -0700 Subject: [PATCH 010/104] Fine tune --- crates/channel/src/channel_buffer.rs | 12 ++++- crates/client/src/user.rs | 1 - crates/collab/src/db/queries/buffers.rs | 17 ++++++- crates/editor/src/editor.rs | 13 +++-- crates/editor/src/element.rs | 67 ++++++++++++++----------- 5 files changed, 73 insertions(+), 37 deletions(-) diff --git a/crates/channel/src/channel_buffer.rs b/crates/channel/src/channel_buffer.rs index 1aca05ec867a05e2125d451ef1b42266b765fd02..b5f4a06b972d8925735d0e692d4e682a32a19b5d 100644 --- a/crates/channel/src/channel_buffer.rs +++ b/crates/channel/src/channel_buffer.rs @@ -1,6 +1,6 @@ use crate::{Channel, ChannelId, ChannelStore}; use anyhow::Result; -use client::{Client, Collaborator, UserStore}; +use client::{Client, Collaborator, UserStore, ZED_ALWAYS_ACTIVE}; use collections::HashMap; use gpui::{AppContext, AsyncAppContext, Context, EventEmitter, Model, ModelContext, Task}; use language::proto::serialize_version; @@ -181,6 +181,16 @@ impl ChannelBuffer { ) { match event { language::Event::Operation(operation) => { + if *ZED_ALWAYS_ACTIVE { + match operation { + language::Operation::UpdateSelections { selections, .. } => { + if selections.is_empty() { + return; + } + } + _ => {} + } + } let operation = language::proto::serialize_operation(operation); self.client .send(proto::UpdateChannelBuffer { diff --git a/crates/client/src/user.rs b/crates/client/src/user.rs index 75f0acd810d7e58814802b860f88ee1df254e991..dcab0e53942032045d5dcdc117e1c0e3adbe7c9e 100644 --- a/crates/client/src/user.rs +++ b/crates/client/src/user.rs @@ -635,7 +635,6 @@ impl UserStore { cx.spawn(|this, mut cx| async move { if let Some(rpc) = client.upgrade() { let response = rpc.request(request).await.context("error loading users")?; - dbg!(&response.users); let users = response .users .into_iter() diff --git a/crates/collab/src/db/queries/buffers.rs b/crates/collab/src/db/queries/buffers.rs index bdcaaab6ef62d8718d3b8903d9f16b4ce9d4b3f5..c19cd530a017fe93c89c68b4f5b814836cd1ef77 100644 --- a/crates/collab/src/db/queries/buffers.rs +++ b/crates/collab/src/db/queries/buffers.rs @@ -450,8 +450,21 @@ impl Database { )> { self.transaction(move |tx| async move { let channel = self.get_channel_internal(channel_id, &*tx).await?; - self.check_user_is_channel_member(&channel, user, &*tx) - .await?; + + let mut requires_write_permission = false; + for op in operations.iter() { + match op.variant { + None | Some(proto::operation::Variant::UpdateSelections(_)) => {} + Some(_) => requires_write_permission = true, + } + } + if requires_write_permission { + self.check_user_is_channel_member(&channel, user, &*tx) + .await?; + } else { + self.check_user_is_channel_participant(&channel, user, &*tx) + .await?; + } let buffer = buffer::Entity::find() .filter(buffer::Column::ChannelId.eq(channel_id)) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 56709fc79f12b73167040d0f6ee28f09e136d2a9..8876feeceff1daf1dfb85277d2cd958f1051544d 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -368,7 +368,7 @@ pub struct Editor { collaboration_hub: Option>, blink_manager: Model, recently_focused: bool, - hovered_selections: HashSet<(ReplicaId, usize)>, + hovered_cursor: Option, pub show_local_selections: bool, mode: EditorMode, show_gutter: bool, @@ -420,6 +420,7 @@ pub struct EditorSnapshot { ongoing_scroll: OngoingScroll, } +#[derive(Debug)] pub struct RemoteSelection { pub replica_id: ReplicaId, pub selection: Selection, @@ -444,6 +445,11 @@ enum SelectionHistoryMode { Redoing, } +struct HoveredCursor { + replica_id: u16, + selection_id: usize, +} + impl Default for SelectionHistoryMode { fn default() -> Self { Self::Normal @@ -1608,7 +1614,7 @@ impl Editor { gutter_width: Default::default(), style: None, recently_focused: false, - hovered_selections: Default::default(), + hovered_cursor: Default::default(), editor_actions: Default::default(), show_copilot_suggestions: mode == EditorMode::Full, _subscriptions: vec![ @@ -8998,8 +9004,9 @@ impl Editor { } else { self.blink_manager.update(cx, BlinkManager::enable); self.recently_focused = true; + cx.notify(); cx.spawn(|this, mut cx| async move { - cx.background_executor().timer(Duration::from_secs(5)).await; + cx.background_executor().timer(Duration::from_secs(2)).await; this.update(&mut cx, |this, cx| { this.recently_focused = false; cx.notify() diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 942ca9fa64e0b40633328572cc299588f133f53d..309f6c7789ebe9853b0b6b7c6923524ac09afed8 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -567,6 +567,7 @@ impl EditorElement { cx, ); hover_at(editor, Some(point), cx); + Self::update_visible_cursor(editor, point, cx); } None => { update_inlay_link_and_hover_points( @@ -594,24 +595,28 @@ impl EditorElement { cx: &mut ViewContext, ) { let snapshot = editor.snapshot(cx); - if let Some(hub) = editor.collaboration_hub() { - let range = if point.column() > 0 { - DisplayPoint::new(point.row(), point.column() - 1)..point - } else { - point..DisplayPoint::new(point.row(), point.column() + 1) - }; - let range = snapshot + let Some(hub) = editor.collaboration_hub() else { + return; + }; + let range = DisplayPoint::new(point.row(), point.column().saturating_sub(1)) + ..DisplayPoint::new(point.row(), point.column() + 1); + + let range = snapshot + .buffer_snapshot + .anchor_at(range.start.to_point(&snapshot.display_snapshot), Bias::Left) + ..snapshot .buffer_snapshot - .anchor_at(range.start.to_point(&snapshot.display_snapshot), Bias::Left) - ..snapshot - .buffer_snapshot - .anchor_at(range.end.to_point(&snapshot.display_snapshot), Bias::Right); - for selection in snapshot.remote_selections_in_range(&range, hub, cx) { - let key = (selection.replica_id, selection.selection.id); - editor.hovered_selections.insert(key); - } - } - editor.hovered_selections.clear(); + .anchor_at(range.end.to_point(&snapshot.display_snapshot), Bias::Right); + + let Some(selection) = snapshot.remote_selections_in_range(&range, hub, cx).next() else { + editor.hovered_cursor.take(); + return; + }; + editor.hovered_cursor.replace(crate::HoveredCursor { + replica_id: selection.replica_id, + selection_id: selection.selection.id, + }); + cx.notify() } fn paint_background( @@ -1990,7 +1995,7 @@ impl EditorElement { if Some(selection.peer_id) == editor.leader_peer_id { continue; } - let id = (selection.replica_id, selection.selection.id); + let is_shown = editor.recently_focused || editor.hovered_cursor.as_ref().is_some_and(|c| c.replica_id == selection.replica_id && c.selection_id == selection.selection.id); remote_selections .entry(selection.replica_id) @@ -2003,7 +2008,7 @@ impl EditorElement { &snapshot.display_snapshot, false, false, - if editor.recently_focused || editor.hovered_selections.contains(&id) { + if is_shown { selection.user_name } else { None @@ -3209,26 +3214,20 @@ impl Cursor { fill(bounds, self.color) }; - cx.paint_quad(cursor); - - if let Some(block_text) = &self.block_text { - block_text - .paint(self.origin + origin, self.line_height, cx) - .log_err(); - } - if let Some(name) = &self.cursor_name { + let text_size = self.line_height / 1.5; + let name_origin = if name.is_top_row { point(bounds.right() - px(1.), bounds.top()) } else { - point(bounds.left(), bounds.top() - self.line_height / 4. - px(1.)) + point(bounds.left(), bounds.top() - text_size / 2. - px(1.)) }; cx.with_z_index(name.z_index, |cx| { div() .bg(self.color) - .text_size(self.line_height / 2.) + .text_size(text_size) .px_0p5() - .line_height(self.line_height / 2. + px(1.)) + .line_height(text_size + px(2.)) .text_color(name.color) .child(name.string.clone()) .into_any_element() @@ -3239,6 +3238,14 @@ impl Cursor { ) }) } + + cx.paint_quad(cursor); + + if let Some(block_text) = &self.block_text { + block_text + .paint(self.origin + origin, self.line_height, cx) + .log_err(); + } } pub fn shape(&self) -> CursorShape { From a5084510a1b2b39166733edfeced078b58b39c1f Mon Sep 17 00:00:00 2001 From: Mikayla Date: Thu, 18 Jan 2024 15:16:09 -0800 Subject: [PATCH 011/104] Fix popin for project panel by pre-resolving keybindings in terms of the project panel --- crates/project_panel/src/project_panel.rs | 114 ++++++++++------------ crates/ui/src/components/context_menu.rs | 44 ++++++++- 2 files changed, 96 insertions(+), 62 deletions(-) diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index 79c158048ee7e08b79f9adcc1d31fa1eea587e44..eef3921a45092bed933ed2fabda030515513dee8 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -381,67 +381,59 @@ impl ProjectPanel { let is_local = project.is_local(); let is_read_only = project.is_read_only(); - let context_menu = ContextMenu::build(cx, |mut menu, cx| { - if is_read_only { - menu = menu.action("Copy Relative Path", Box::new(CopyRelativePath)); - if is_dir { - menu = menu.action("Search Inside", Box::new(NewSearchInDirectory)) - } - - return menu; - } - - if is_local { - menu = menu.action( - "Add Folder to Project", - Box::new(workspace::AddFolderToProject), - ); - if is_root { - menu = menu.entry( - "Remove from Project", - None, - cx.handler_for(&this, move |this, cx| { - this.project.update(cx, |project, cx| { - project.remove_worktree(worktree_id, cx) - }); - }), - ); - } - } - - menu = menu - .action("New File", Box::new(NewFile)) - .action("New Folder", Box::new(NewDirectory)) - .separator() - .action("Cut", Box::new(Cut)) - .action("Copy", Box::new(Copy)); - - if let Some(clipboard_entry) = self.clipboard_entry { - if clipboard_entry.worktree_id() == worktree_id { - menu = menu.action("Paste", Box::new(Paste)); - } - } - - menu = menu - .separator() - .action("Copy Path", Box::new(CopyPath)) - .action("Copy Relative Path", Box::new(CopyRelativePath)) - .separator() - .action("Reveal in Finder", Box::new(RevealInFinder)); - - if is_dir { - menu = menu - .action("Open in Terminal", Box::new(OpenInTerminal)) - .action("Search Inside", Box::new(NewSearchInDirectory)) - } - - menu = menu.separator().action("Rename", Box::new(Rename)); - - if !is_root { - menu = menu.action("Delete", Box::new(Delete)); - } - - menu + let context_menu = ContextMenu::build(cx, |menu, cx| { + menu.context(self.focus_handle.clone()).then_if_else( + is_read_only, + |menu| { + menu.action("Copy Relative Path", Box::new(CopyRelativePath)) + .then_if(is_dir, |menu| { + menu.action("Search Inside", Box::new(NewSearchInDirectory)) + }) + }, + |menu| { + menu.then_if(is_local, |menu| { + menu.action( + "Add Folder to Project", + Box::new(workspace::AddFolderToProject), + ) + .then_if(is_root, |menu| { + menu.entry( + "Remove from Project", + None, + cx.handler_for(&this, move |this, cx| { + this.project.update(cx, |project, cx| { + project.remove_worktree(worktree_id, cx) + }); + }), + ) + }) + }) + .action("New File", Box::new(NewFile)) + .action("New Folder", Box::new(NewDirectory)) + .separator() + .action("Cut", Box::new(Cut)) + .action("Copy", Box::new(Copy)) + .if_some(self.clipboard_entry, |menu, entry| { + menu.then_if(entry.worktree_id() == worktree_id, |menu| { + menu.action("Paste", Box::new(Paste)) + }) + }) + .separator() + .action("Copy Path", Box::new(CopyPath)) + .action("Copy Relative Path", Box::new(CopyRelativePath)) + .separator() + .action("Reveal in Finder", Box::new(RevealInFinder)) + .then_if(is_dir, |menu| { + menu + .action("Open in Terminal", Box::new(OpenInTerminal)) + .action("Search Inside", Box::new(NewSearchInDirectory)) + }) + .separator().action("Rename", Box::new(Rename)) + .then_if(!is_root, |menu| { + menu.action("Delete", Box::new(Delete)) + }) + }, + ) }); cx.focus_view(&context_menu); diff --git a/crates/ui/src/components/context_menu.rs b/crates/ui/src/components/context_menu.rs index 470483cc0a713cbfc53d1a9e7db343a604918a2e..dbc0394a5bec68edfacdb01ff1b994f84d19fcea 100644 --- a/crates/ui/src/components/context_menu.rs +++ b/crates/ui/src/components/context_menu.rs @@ -27,6 +27,7 @@ enum ContextMenuItem { pub struct ContextMenu { items: Vec, focus_handle: FocusHandle, + action_context: Option, selected_index: Option, delayed: bool, clicked: bool, @@ -56,6 +57,7 @@ impl ContextMenu { Self { items: Default::default(), focus_handle, + action_context: None, selected_index: None, delayed: false, clicked: false, @@ -66,6 +68,39 @@ impl ContextMenu { }) } + pub fn if_some(self, condition: Option, f: impl FnOnce(Self, T) -> Self) -> Self { + if let Some(t) = condition { + f(self, t) + } else { + self + } + } + + pub fn then_if_else(self, condition: bool, then: impl FnOnce(Self) -> Self, otherwise: impl FnOnce(Self) -> Self) -> Self { + if condition { + then(self) + } else { + otherwise(self) + } + } + + pub fn then_if(self, condition: bool, f: impl FnOnce(Self) -> Self) -> Self { + if condition { + f(self) + } else { + self + } + } + + pub fn map(self, f: impl FnOnce(Self) -> Self) -> Self { + f(self) + } + + pub fn context(mut self, focus: FocusHandle) -> Self { + self.action_context = Some(focus); + self + } + pub fn header(mut self, title: impl Into) -> Self { self.items.push(ContextMenuItem::Header(title.into())); self @@ -305,7 +340,14 @@ impl Render for ContextMenu { .child(label_element) .debug_selector(|| format!("MENU_ITEM-{}", label)) .children(action.as_ref().and_then(|action| { - KeyBinding::for_action(&**action, cx) + self.action_context + .as_ref() + .map(|focus| { + KeyBinding::for_action_in(&**action, focus, cx) + }) + .unwrap_or_else(|| { + KeyBinding::for_action(&**action, cx) + }) .map(|binding| div().ml_1().child(binding)) })), ) From 903176d8ff24ff679755745269996f5cd47fea50 Mon Sep 17 00:00:00 2001 From: Mikayla Date: Thu, 18 Jan 2024 15:31:31 -0800 Subject: [PATCH 012/104] Pull out fluent builder helpers into re-usable trait --- crates/collab_ui/src/face_pile.rs | 1 + crates/gpui/src/element.rs | 38 ++------------ crates/gpui/src/prelude.rs | 6 +-- crates/gpui/src/util.rs | 52 +++++++++++++++++++ .../src/active_buffer_language.rs | 2 +- crates/project_panel/src/project_panel.rs | 24 ++++----- crates/ui/src/components/context_menu.rs | 30 +---------- crates/ui/src/components/popover_menu.rs | 6 +-- 8 files changed, 77 insertions(+), 82 deletions(-) diff --git a/crates/collab_ui/src/face_pile.rs b/crates/collab_ui/src/face_pile.rs index fb6c59cc8079073acbb6b481e214b54619f9eea6..b12b11f63f7f842ca07275565bd687883e64e0b3 100644 --- a/crates/collab_ui/src/face_pile.rs +++ b/crates/collab_ui/src/face_pile.rs @@ -1,5 +1,6 @@ use gpui::{div, AnyElement, IntoElement, ParentElement, RenderOnce, Styled, WindowContext}; use smallvec::SmallVec; +use ui::FluentBuilder; #[derive(Default, IntoElement)] pub struct FacePile { diff --git a/crates/gpui/src/element.rs b/crates/gpui/src/element.rs index 3022f9f30a5fa48d3a3d9b14b06011bdde2cc610..47fb7241aba03890120d57312361a0c004237b07 100644 --- a/crates/gpui/src/element.rs +++ b/crates/gpui/src/element.rs @@ -1,6 +1,6 @@ use crate::{ - ArenaBox, AvailableSpace, BorrowWindow, Bounds, ElementId, LayoutId, Pixels, Point, Size, - ViewContext, WindowContext, ELEMENT_ARENA, + util::FluentBuilder, ArenaBox, AvailableSpace, BorrowWindow, Bounds, ElementId, LayoutId, + Pixels, Point, Size, ViewContext, WindowContext, ELEMENT_ARENA, }; use derive_more::{Deref, DerefMut}; pub(crate) use smallvec::SmallVec; @@ -77,40 +77,10 @@ pub trait IntoElement: Sized { }) } } - - /// Convert self to another type by calling the given closure. Useful in rendering code. - fn map(self, f: impl FnOnce(Self) -> U) -> U - where - Self: Sized, - U: IntoElement, - { - f(self) - } - - /// Conditionally chain onto self with the given closure. Useful in rendering code. - fn when(self, condition: bool, then: impl FnOnce(Self) -> Self) -> Self - where - Self: Sized, - { - self.map(|this| if condition { then(this) } else { this }) - } - - /// Conditionally chain onto self with the given closure if the given option is Some. - /// The contents of the option are provided to the closure. - fn when_some(self, option: Option, then: impl FnOnce(Self, T) -> Self) -> Self - where - Self: Sized, - { - self.map(|this| { - if let Some(value) = option { - then(this, value) - } else { - this - } - }) - } } +impl FluentBuilder for T {} + pub trait Render: 'static + Sized { fn render(&mut self, cx: &mut ViewContext) -> impl IntoElement; } diff --git a/crates/gpui/src/prelude.rs b/crates/gpui/src/prelude.rs index 90d09b3fc53db18c02dd067dbb8916042aa020fc..218cbd0e282786bacc20b8e76b87fc0358ef5b37 100644 --- a/crates/gpui/src/prelude.rs +++ b/crates/gpui/src/prelude.rs @@ -1,5 +1,5 @@ pub use crate::{ - BorrowAppContext, BorrowWindow, Context, Element, FocusableElement, InteractiveElement, - IntoElement, ParentElement, Refineable, Render, RenderOnce, StatefulInteractiveElement, Styled, - VisualContext, + util::FluentBuilder, BorrowAppContext, BorrowWindow, Context, Element, FocusableElement, + InteractiveElement, IntoElement, ParentElement, Refineable, Render, RenderOnce, + StatefulInteractiveElement, Styled, VisualContext, }; diff --git a/crates/gpui/src/util.rs b/crates/gpui/src/util.rs index cba7ed84b58b77f6491380277ace81341e8041c5..4bff3da740b4d60458f74427cbdfb2eb25418a0e 100644 --- a/crates/gpui/src/util.rs +++ b/crates/gpui/src/util.rs @@ -9,6 +9,58 @@ use smol::future::FutureExt; pub use util::*; +/// A helper trait for building complex objects with imperative conditionals in a fluent style. +pub trait FluentBuilder { + /// Imperatively modify self with the given closure. + fn map(self, f: impl FnOnce(Self) -> U) -> U + where + Self: Sized, + { + f(self) + } + + /// Conditionally modify self with the given closure. + fn when(self, condition: bool, then: impl FnOnce(Self) -> Self) -> Self + where + Self: Sized, + { + self.map(|this| if condition { then(this) } else { this }) + } + + /// Conditionally unwrap and modify self with the given closure, if the given option is Some. + fn when_some(self, option: Option, then: impl FnOnce(Self, T) -> Self) -> Self + where + Self: Sized, + { + self.map(|this| { + if let Some(value) = option { + then(this, value) + } else { + this + } + }) + } + + /// Conditionally modify self with one closure or another + fn when_else( + self, + condition: bool, + then: impl FnOnce(Self) -> Self, + otherwise: impl FnOnce(Self) -> Self, + ) -> Self + where + Self: Sized, + { + self.map(|this| { + if condition { + then(this) + } else { + otherwise(this) + } + }) + } +} + #[cfg(any(test, feature = "test-support"))] pub async fn timeout(timeout: Duration, f: F) -> Result where diff --git a/crates/language_selector/src/active_buffer_language.rs b/crates/language_selector/src/active_buffer_language.rs index d5f177f7d61a649b6b438782e265c0e5eb9a4b77..647ff93b818f37fff6396deb15edd12b59ede9b7 100644 --- a/crates/language_selector/src/active_buffer_language.rs +++ b/crates/language_selector/src/active_buffer_language.rs @@ -1,7 +1,7 @@ use editor::Editor; use gpui::{div, IntoElement, ParentElement, Render, Subscription, View, ViewContext, WeakView}; use std::sync::Arc; -use ui::{Button, ButtonCommon, Clickable, LabelSize, Tooltip}; +use ui::{Button, ButtonCommon, Clickable, FluentBuilder, LabelSize, Tooltip}; use workspace::{item::ItemHandle, StatusItemView, Workspace}; use crate::LanguageSelector; diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index eef3921a45092bed933ed2fabda030515513dee8..abfc2d581883bf865e1cf70cd7721502860668b5 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -382,21 +382,21 @@ impl ProjectPanel { let is_read_only = project.is_read_only(); let context_menu = ContextMenu::build(cx, |menu, cx| { - menu.context(self.focus_handle.clone()).then_if_else( + menu.context(self.focus_handle.clone()).when_else( is_read_only, |menu| { menu.action("Copy Relative Path", Box::new(CopyRelativePath)) - .then_if(is_dir, |menu| { + .when(is_dir, |menu| { menu.action("Search Inside", Box::new(NewSearchInDirectory)) }) }, |menu| { - menu.then_if(is_local, |menu| { + menu.when(is_local, |menu| { menu.action( "Add Folder to Project", Box::new(workspace::AddFolderToProject), ) - .then_if(is_root, |menu| { + .when(is_root, |menu| { menu.entry( "Remove from Project", None, @@ -413,8 +413,8 @@ impl ProjectPanel { .separator() .action("Cut", Box::new(Cut)) .action("Copy", Box::new(Copy)) - .if_some(self.clipboard_entry, |menu, entry| { - menu.then_if(entry.worktree_id() == worktree_id, |menu| { + .when_some(self.clipboard_entry, |menu, entry| { + menu.when(entry.worktree_id() == worktree_id, |menu| { menu.action("Paste", Box::new(Paste)) }) }) @@ -423,15 +423,13 @@ impl ProjectPanel { .action("Copy Relative Path", Box::new(CopyRelativePath)) .separator() .action("Reveal in Finder", Box::new(RevealInFinder)) - .then_if(is_dir, |menu| { - menu - .action("Open in Terminal", Box::new(OpenInTerminal)) + .when(is_dir, |menu| { + menu.action("Open in Terminal", Box::new(OpenInTerminal)) .action("Search Inside", Box::new(NewSearchInDirectory)) }) - .separator().action("Rename", Box::new(Rename)) - .then_if(!is_root, |menu| { - menu.action("Delete", Box::new(Delete)) - }) + .separator() + .action("Rename", Box::new(Rename)) + .when(!is_root, |menu| menu.action("Delete", Box::new(Delete))) }, ) }); diff --git a/crates/ui/src/components/context_menu.rs b/crates/ui/src/components/context_menu.rs index dbc0394a5bec68edfacdb01ff1b994f84d19fcea..e3a7aeefda4ab8ab8ea6c583ba59b2549c98a5f6 100644 --- a/crates/ui/src/components/context_menu.rs +++ b/crates/ui/src/components/context_menu.rs @@ -42,6 +42,8 @@ impl FocusableView for ContextMenu { impl EventEmitter for ContextMenu {} +impl FluentBuilder for ContextMenu {} + impl ContextMenu { pub fn build( cx: &mut WindowContext, @@ -68,34 +70,6 @@ impl ContextMenu { }) } - pub fn if_some(self, condition: Option, f: impl FnOnce(Self, T) -> Self) -> Self { - if let Some(t) = condition { - f(self, t) - } else { - self - } - } - - pub fn then_if_else(self, condition: bool, then: impl FnOnce(Self) -> Self, otherwise: impl FnOnce(Self) -> Self) -> Self { - if condition { - then(self) - } else { - otherwise(self) - } - } - - pub fn then_if(self, condition: bool, f: impl FnOnce(Self) -> Self) -> Self { - if condition { - f(self) - } else { - self - } - } - - pub fn map(self, f: impl FnOnce(Self) -> Self) -> Self { - f(self) - } - pub fn context(mut self, focus: FocusHandle) -> Self { self.action_context = Some(focus); self diff --git a/crates/ui/src/components/popover_menu.rs b/crates/ui/src/components/popover_menu.rs index 39202bf7ef5c68e5722c5b6d55a6cab3676c8ef7..73384321cb9faf8da275455763583706dec663de 100644 --- a/crates/ui/src/components/popover_menu.rs +++ b/crates/ui/src/components/popover_menu.rs @@ -1,9 +1,9 @@ use std::{cell::RefCell, rc::Rc}; use gpui::{ - overlay, point, px, rems, AnchorCorner, AnyElement, Bounds, DismissEvent, DispatchPhase, - Element, ElementId, InteractiveBounds, IntoElement, LayoutId, ManagedView, MouseDownEvent, - ParentElement, Pixels, Point, View, VisualContext, WindowContext, + overlay, point, prelude::FluentBuilder, px, rems, AnchorCorner, AnyElement, Bounds, + DismissEvent, DispatchPhase, Element, ElementId, InteractiveBounds, IntoElement, LayoutId, + ManagedView, MouseDownEvent, ParentElement, Pixels, Point, View, VisualContext, WindowContext, }; use crate::{Clickable, Selectable}; From 058f39c180b6dc36d86ff58586d7fe99633a1dc2 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 18 Jan 2024 15:34:04 -0800 Subject: [PATCH 013/104] Document DiagnosticSet, SyntaxMap --- crates/language/src/buffer.rs | 2 +- crates/language/src/diagnostic_set.rs | 31 ++++++++++++++++++++++++++- crates/language/src/language.rs | 4 ++++ crates/language/src/syntax_map.rs | 13 ++++++++--- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index bfb37e91ebe80fd289a8d94279f42453ee014933..ce8b5281f01dc786a7505146a4fbc4444b4ae82d 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -145,7 +145,7 @@ pub enum IndentKind { /// An ASCII space character. #[default] Space, - /// An ASCII tab chracter. + /// An ASCII tab character. Tab, } diff --git a/crates/language/src/diagnostic_set.rs b/crates/language/src/diagnostic_set.rs index f269fce88d694c8efe2f255e302bbef7aed865ea..48e3bd78c7c24066a3dd0b4c29237f347dc835f5 100644 --- a/crates/language/src/diagnostic_set.rs +++ b/crates/language/src/diagnostic_set.rs @@ -9,20 +9,36 @@ use std::{ use sum_tree::{self, Bias, SumTree}; use text::{Anchor, FromAnchor, PointUtf16, ToOffset}; +/// A set of diagnostics associated with a given buffer, provided +/// by a single language server. +/// +/// The diagnostics are stored in a [SumTree], which allows this struct +/// to be cheaply copied, and allows for efficient retrieval of the +/// diagnostics that intersect a given range of the buffer. #[derive(Clone, Debug, Default)] pub struct DiagnosticSet { diagnostics: SumTree>, } +/// A single diagnostic in a set. Generic over its range type, because +/// the diagnostics are stored internally as [Anchor]s, but can be +/// resolved to different coordinates types like [usize] byte offsets or +/// [Point]s. #[derive(Clone, Debug, PartialEq, Eq)] pub struct DiagnosticEntry { + /// The range of the buffer where the diagnostic applies. pub range: Range, + /// The information about the diagnostic. pub diagnostic: Diagnostic, } +/// A group of related diagnostics, ordered by their start position +/// in the buffer. #[derive(Debug)] pub struct DiagnosticGroup { + /// The diagnostics. pub entries: Vec>, + /// The index into `entries` where the primary diagnostic is stored. pub primary_ix: usize, } @@ -36,7 +52,8 @@ pub struct Summary { } impl DiagnosticEntry { - // Used to provide diagnostic context to lsp codeAction request + /// Returns a raw LSP diagnostic ssed to provide diagnostic context to lsp + /// codeAction request pub fn to_lsp_diagnostic_stub(&self) -> lsp::Diagnostic { let code = self .diagnostic @@ -53,6 +70,8 @@ impl DiagnosticEntry { } impl DiagnosticSet { + /// Constructs a [DiagnosticSet] from a sequence of entries, ordered by + /// their position in the buffer. pub fn from_sorted_entries(iter: I, buffer: &text::BufferSnapshot) -> Self where I: IntoIterator>, @@ -62,6 +81,7 @@ impl DiagnosticSet { } } + /// Constructs a [DiagnosticSet] from a sequence of entries in an arbitrary order. pub fn new(iter: I, buffer: &text::BufferSnapshot) -> Self where I: IntoIterator>, @@ -80,14 +100,18 @@ impl DiagnosticSet { } } + /// Returns the number of diagnostics in the set. pub fn len(&self) -> usize { self.diagnostics.summary().count } + /// Returns an iterator over the diagnostic entries in the set. pub fn iter(&self) -> impl Iterator> { self.diagnostics.iter() } + /// Returns an iterator over the diagnostic entries that intersect the + /// given range of the buffer. pub fn range<'a, T, O>( &'a self, range: Range, @@ -134,6 +158,7 @@ impl DiagnosticSet { }) } + /// Adds all of this set's diagnostic groups to the given output vector. pub fn groups( &self, language_server_id: LanguageServerId, @@ -173,6 +198,8 @@ impl DiagnosticSet { }); } + /// Returns all of the diagnostics in a particular diagnostic group, + /// in order of their position in the buffer. pub fn group<'a, O: FromAnchor>( &'a self, group_id: usize, @@ -183,6 +210,7 @@ impl DiagnosticSet { .map(|entry| entry.resolve(buffer)) } } + impl sum_tree::Item for DiagnosticEntry { type Summary = Summary; @@ -198,6 +226,7 @@ impl sum_tree::Item for DiagnosticEntry { } impl DiagnosticEntry { + /// Converts the [DiagnosticEntry] to a different buffer coordinate type. pub fn resolve(&self, buffer: &text::BufferSnapshot) -> DiagnosticEntry { DiagnosticEntry { range: O::from_anchor(&self.range.start, buffer) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 9a292cbd8819615f11f96a8d12bd3c017568c6c8..534d313453f08ec54b559dd798b15a2e10bab6ae 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -114,10 +114,14 @@ lazy_static! { )); } +/// Types that represent a position in a buffer, and can be converted into +/// an LSP position, to send to a language server. pub trait ToLspPosition { + /// Converts the value into an LSP position. fn to_lsp_position(self) -> lsp::Position; } +/// A name of a language server. #[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct LanguageServerName(pub Arc); diff --git a/crates/language/src/syntax_map.rs b/crates/language/src/syntax_map.rs index 9174dc7df9e8e45663a75a268ede925460cc6139..8c489a30cbcadc10ee248510d112c99cddcefb13 100644 --- a/crates/language/src/syntax_map.rs +++ b/crates/language/src/syntax_map.rs @@ -117,17 +117,22 @@ impl SyntaxLayerContent { } } +/// A layer of syntax highlighting, corresponding to a single syntax +/// tree in a particular language. #[derive(Debug)] pub struct SyntaxLayer<'a> { - pub depth: usize, + /// The language for this layer. pub language: &'a Arc, + depth: usize, tree: &'a Tree, offset: (usize, tree_sitter::Point), } +/// A layer of syntax highlighting. Like [SyntaxLayer], but holding +/// owned data instead of references. #[derive(Clone)] pub struct OwnedSyntaxLayer { - pub depth: usize, + /// The language for this layer. pub language: Arc, tree: tree_sitter::Tree, offset: (usize, tree_sitter::Point), @@ -1437,6 +1442,7 @@ fn insert_newlines_between_ranges( } impl OwnedSyntaxLayer { + /// Returns the root syntax node for this layer. pub fn node(&self) -> Node { self.tree .root_node_with_offset(self.offset.0, self.offset.1) @@ -1444,15 +1450,16 @@ impl OwnedSyntaxLayer { } impl<'a> SyntaxLayer<'a> { + /// Returns an owned version of this layer. pub fn to_owned(&self) -> OwnedSyntaxLayer { OwnedSyntaxLayer { tree: self.tree.clone(), offset: self.offset, - depth: self.depth, language: self.language.clone(), } } + /// Returns the root node for this layer. pub fn node(&self) -> Node<'a> { self.tree .root_node_with_offset(self.offset.0, self.offset.1) From 0e8bdda249cf25ad4cc5806308f042170875348e Mon Sep 17 00:00:00 2001 From: Mikayla Date: Thu, 18 Jan 2024 15:47:10 -0800 Subject: [PATCH 014/104] ????? --- crates/collab_ui/src/face_pile.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/collab_ui/src/face_pile.rs b/crates/collab_ui/src/face_pile.rs index b12b11f63f7f842ca07275565bd687883e64e0b3..453eedd6e01861c2b61be4696d9696d63f2df7a4 100644 --- a/crates/collab_ui/src/face_pile.rs +++ b/crates/collab_ui/src/face_pile.rs @@ -1,14 +1,14 @@ -use gpui::{div, AnyElement, IntoElement, ParentElement, RenderOnce, Styled, WindowContext}; +use gpui::{div, AnyElement, ParentElement, RenderOnce, Styled, WindowContext}; use smallvec::SmallVec; use ui::FluentBuilder; -#[derive(Default, IntoElement)] +#[derive(Default, gpui::IntoElement)] pub struct FacePile { pub faces: SmallVec<[AnyElement; 2]>, } impl RenderOnce for FacePile { - fn render(self, _: &mut WindowContext) -> impl IntoElement { + fn render(self, _: &mut WindowContext) -> impl gpui::IntoElement { let player_count = self.faces.len(); let player_list = self.faces.into_iter().enumerate().map(|(ix, player)| { let isnt_last = ix < player_count - 1; From f11d676641d6a8260d23bcddd1a1e3bc344f54bc Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 18 Jan 2024 15:51:25 -0800 Subject: [PATCH 015/104] Remove missing docs warning for now --- crates/language/src/language.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 534d313453f08ec54b559dd798b15a2e10bab6ae..7d44250a0f21b289ff51b4ef88b589aed8bc62c3 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -1,4 +1,3 @@ -#![warn(missing_docs)] //! The `language` crate provides a large chunk of Zed's language-related //! features (the other big contributors being project and lsp crates that revolve around LSP features). //! Namely, this crate: @@ -389,7 +388,7 @@ pub struct CodeLabel { pub struct LanguageConfig { /// Human-readable name of the language. pub name: Arc, - // The name of the grammar in a WASM bundle. + // The name of the grammar in a WASM bundle (experimental). pub grammar_name: Option>, /// Given a list of `LanguageConfig`'s, the language of a file can be determined based on the path extension matching any of the `path_suffixes`. pub path_suffixes: Vec, From 3542b99c9df5701ce7e3e1e71233d340ad00e968 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Thu, 18 Jan 2024 18:52:16 -0500 Subject: [PATCH 016/104] Tweak the description of the `gpui` crate (#4142) This PR tweaks the description of the `gpui` crate, since it's now the only version. There can only be one! Release Notes: - N/A --- crates/gpui/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/gpui/Cargo.toml b/crates/gpui/Cargo.toml index ee7549287378f537de71b08abf59bc6af2ab4a98..70608ccb0c549e72b0757a72381e38681ebc4335 100644 --- a/crates/gpui/Cargo.toml +++ b/crates/gpui/Cargo.toml @@ -3,7 +3,7 @@ name = "gpui" version = "0.1.0" edition = "2021" authors = ["Nathan Sobo "] -description = "The next version of Zed's GPU-accelerated UI framework" +description = "Zed's GPU-accelerated UI framework" publish = false [features] From 276032398bd22952a29052bb827119e00ac161c9 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Thu, 18 Jan 2024 16:53:05 -0700 Subject: [PATCH 017/104] Fix overflow in hover handler --- crates/editor/src/element.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 309f6c7789ebe9853b0b6b7c6923524ac09afed8..6c6bfba190c70b6aac155783a312cbb5af4f31a0 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -599,7 +599,10 @@ impl EditorElement { return; }; let range = DisplayPoint::new(point.row(), point.column().saturating_sub(1)) - ..DisplayPoint::new(point.row(), point.column() + 1); + ..DisplayPoint::new( + point.row(), + (point.column() + 1).min(snapshot.line_len(point.row())), + ); let range = snapshot .buffer_snapshot From e278410fbc5accbf5b8c2be94e31f659d9a9ef0d Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Thu, 18 Jan 2024 20:49:51 -0500 Subject: [PATCH 018/104] Make `FacePile` a component again (#4143) This PR turns `FacePile` back into a component. Our usage of it seemed a little weird, with us calling `render` manually. We're now implementing `Styled` on `FacePile` through its inner `Div` so that we can apply the `p_1` at the call site. Release Notes: - N/A --- crates/collab_ui/src/collab_panel.rs | 10 +++--- crates/collab_ui/src/collab_titlebar_item.rs | 5 ++- crates/collab_ui/src/face_pile.rs | 32 ++++++++++++++++---- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/crates/collab_ui/src/collab_panel.rs b/crates/collab_ui/src/collab_panel.rs index 4bfb5fe3ae9988f0ad8a34769d803fa18dcbb8dd..4a1c2e372dd21a312a58d92e8559d566eedd16e3 100644 --- a/crates/collab_ui/src/collab_panel.rs +++ b/crates/collab_ui/src/collab_panel.rs @@ -2214,15 +2214,15 @@ impl CollabPanel { let face_pile = if !participants.is_empty() { let extra_count = participants.len().saturating_sub(FACEPILE_LIMIT); - let result = FacePile { - faces: participants + let result = FacePile::new( + participants .iter() .map(|user| Avatar::new(user.avatar_uri.clone()).into_any_element()) .take(FACEPILE_LIMIT) .chain(if extra_count > 0 { Some( div() - .ml_1() + .ml_2() .child(Label::new(format!("+{extra_count}"))) .into_any_element(), ) @@ -2230,7 +2230,7 @@ impl CollabPanel { None }) .collect::>(), - }; + ); Some(result) } else { @@ -2295,7 +2295,7 @@ impl CollabPanel { h_flex() .id(channel_id as usize) .child(Label::new(channel.name.clone())) - .children(face_pile.map(|face_pile| face_pile.render().p_1())), + .children(face_pile.map(|face_pile| face_pile.p_1())), ), ) .child( diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index e864c4c54add0ff4235928983c0fd8b3c801b071..32ab64f77eedb869fdb25d538762ce1538d53715 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -495,7 +495,7 @@ impl CollabTitlebarItem { div.rounded_md().bg(color) }) .child( - FacePile::default() + FacePile::empty() .child( Avatar::new(user.avatar_uri.clone()) .grayscale(!is_present) @@ -547,8 +547,7 @@ impl CollabTitlebarItem { ) } else { None - }) - .render(), + }), ), ) } diff --git a/crates/collab_ui/src/face_pile.rs b/crates/collab_ui/src/face_pile.rs index 3efe17e5a600f95ce860c1c09586622ee1389b99..eb20814ca75bf48a67ab26f5fc9fb276405754e2 100644 --- a/crates/collab_ui/src/face_pile.rs +++ b/crates/collab_ui/src/face_pile.rs @@ -1,14 +1,28 @@ -use gpui::{div, AnyElement, Div, ParentElement, Styled}; +use gpui::AnyElement; use smallvec::SmallVec; -use ui::FluentBuilder; +use ui::prelude::*; -#[derive(Default)] +#[derive(IntoElement)] pub struct FacePile { - pub faces: SmallVec<[AnyElement; 2]>, + base: Div, + faces: SmallVec<[AnyElement; 2]>, } impl FacePile { - pub fn render(self) -> Div { + pub fn empty() -> Self { + Self::new(SmallVec::new()) + } + + pub fn new(faces: SmallVec<[AnyElement; 2]>) -> Self { + Self { + base: h_flex(), + faces, + } + } +} + +impl RenderOnce for FacePile { + fn render(self, _cx: &mut WindowContext) -> impl IntoElement { let player_count = self.faces.len(); let player_list = self.faces.into_iter().enumerate().map(|(ix, player)| { let isnt_last = ix < player_count - 1; @@ -18,7 +32,7 @@ impl FacePile { .when(isnt_last, |div| div.neg_mr_1()) .child(player) }); - div().flex().items_center().children(player_list) + self.base.children(player_list) } } @@ -27,3 +41,9 @@ impl ParentElement for FacePile { &mut self.faces } } + +impl Styled for FacePile { + fn style(&mut self) -> &mut gpui::StyleRefinement { + self.base.style() + } +} From fbc693d1d72d1a0642e80330640bce0e6fb97e9f Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Thu, 18 Jan 2024 19:39:13 -0700 Subject: [PATCH 019/104] Revert "Improve panic logging" This reverts commit 345b983c8edd18acc346845dcdd1266e144a05a9. --- crates/zed/src/main.rs | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index be07ba6a5faed48a1a43940aef2e55198f2e9332..b25145367070a23e127c10284c67704a7cfebd4f 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -544,22 +544,7 @@ fn init_panic_hook(app: &App, installation_id: Option, session_id: Strin let mut backtrace = backtrace .frames() .iter() - .flat_map(|frame| { - frame.symbols().iter().filter_map(|symbol| { - let name = symbol.name()?; - let addr = symbol.addr()? as usize; - let position = if let (Some(path), Some(lineno)) = ( - symbol.filename().and_then(|path| path.file_name()), - symbol.lineno(), - ) { - format!("{}:{}", path.to_string_lossy(), lineno) - } else { - "?".to_string() - }; - - Some(format!("{:} ({:#x}) at {}", name, addr, position)) - }) - }) + .filter_map(|frame| Some(format!("{:#}", frame.symbols().first()?.name()?))) .collect::>(); // Strip out leading stack frames for rust panic-handling. From 9993418f58b1885652d45b33da14c964387060d0 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Thu, 18 Jan 2024 21:56:37 -0500 Subject: [PATCH 020/104] Prevent diagnostics from overflowing the status bar (#4145) This PR makes it so long diagnostic messages no longer overflow the status bar and push the right tools off-screen. Here is an example with a long (placeholder) diagnostic message: Screenshot 2024-01-18 at 9 47 07 PM Release Notes: - Fixed long diagnostic messages overflowing the status bar. --- crates/workspace/src/status_bar.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/crates/workspace/src/status_bar.rs b/crates/workspace/src/status_bar.rs index 34a1412533bf14829e193df680085bc50c1166c2..f6fe91a574edc74471673b545a1bcf7015421933 100644 --- a/crates/workspace/src/status_bar.rs +++ b/crates/workspace/src/status_bar.rs @@ -1,6 +1,6 @@ use crate::{ItemHandle, Pane}; use gpui::{ - div, AnyView, IntoElement, ParentElement, Render, Styled, Subscription, View, ViewContext, + AnyView, IntoElement, ParentElement, Render, Styled, Subscription, View, ViewContext, WindowContext, }; use std::any::TypeId; @@ -34,13 +34,12 @@ pub struct StatusBar { impl Render for StatusBar { fn render(&mut self, cx: &mut ViewContext) -> impl IntoElement { - div() + h_flex() + .w_full() + .justify_between() + .gap_2() .py_0p5() .px_1() - .flex() - .items_center() - .justify_between() - .w_full() .h_8() .bg(cx.theme().colors().status_bar_background) .child(self.render_left_tools(cx)) @@ -51,14 +50,13 @@ impl Render for StatusBar { impl StatusBar { fn render_left_tools(&self, _: &mut ViewContext) -> impl IntoElement { h_flex() - .items_center() .gap_2() + .overflow_hidden_x() .children(self.left_items.iter().map(|item| item.to_any())) } fn render_right_tools(&self, _: &mut ViewContext) -> impl IntoElement { h_flex() - .items_center() .gap_2() .children(self.right_items.iter().rev().map(|item| item.to_any())) } From decf320a74b4cbef34d40f617a54778ecd4b4525 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Thu, 18 Jan 2024 22:10:41 -0500 Subject: [PATCH 021/104] Rename `overflow_hidden_{x,y}` to `overflow_{x,y}_hidden` (#4146) This PR renames the `overflow_hidden_x` and `overflow_hidden_y` methods to `overflow_x_hidden` and `overflow_y_hidden`, respectively. This provides consistency with our `overflow_x_scroll` / `overflow_y_scroll` methods, as well as better matches Tailwind's naming. Release Notes: - N/A --- crates/gpui/src/styled.rs | 10 ++++++++-- crates/story/src/story.rs | 2 +- crates/ui/src/components/tab_bar.rs | 2 +- crates/workspace/src/status_bar.rs | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/crates/gpui/src/styled.rs b/crates/gpui/src/styled.rs index 0eba1771f52d47bde32f465a887e52547f3a89b2..508dca958349a9cb52ad69df70c5c8f2b570ba88 100644 --- a/crates/gpui/src/styled.rs +++ b/crates/gpui/src/styled.rs @@ -66,18 +66,24 @@ pub trait Styled: Sized { self } + /// Sets the behavior of content that overflows the container to be hidden. + /// [Docs](https://tailwindcss.com/docs/overflow#hiding-content-that-overflows) fn overflow_hidden(mut self) -> Self { self.style().overflow.x = Some(Overflow::Hidden); self.style().overflow.y = Some(Overflow::Hidden); self } - fn overflow_hidden_x(mut self) -> Self { + /// Sets the behavior of content that overflows the container on the X axis to be hidden. + /// [Docs](https://tailwindcss.com/docs/overflow#hiding-content-that-overflows) + fn overflow_x_hidden(mut self) -> Self { self.style().overflow.x = Some(Overflow::Hidden); self } - fn overflow_hidden_y(mut self) -> Self { + /// Sets the behavior of content that overflows the container on the Y axis to be hidden. + /// [Docs](https://tailwindcss.com/docs/overflow#hiding-content-that-overflows) + fn overflow_y_hidden(mut self) -> Self { self.style().overflow.y = Some(Overflow::Hidden); self } diff --git a/crates/story/src/story.rs b/crates/story/src/story.rs index f5448831cb168c240d4e8d8c038cd3f02a0bd2dd..47bdab7f239643ae9e6fd2ebf2366c80ed8555f4 100644 --- a/crates/story/src/story.rs +++ b/crates/story/src/story.rs @@ -104,7 +104,7 @@ impl RenderOnce for StoryContainer { .h_px() .flex_1() .id("story_body") - .overflow_hidden_x() + .overflow_x_hidden() .overflow_y_scroll() .flex() .flex_col() diff --git a/crates/ui/src/components/tab_bar.rs b/crates/ui/src/components/tab_bar.rs index adee8389e47a8db3f343e01cc9d81a9c1d08ead4..4b61d90bcdffc573d9c8940d5173e051f09b812e 100644 --- a/crates/ui/src/components/tab_bar.rs +++ b/crates/ui/src/components/tab_bar.rs @@ -117,7 +117,7 @@ impl RenderOnce for TabBar { .relative() .flex_1() .h_full() - .overflow_hidden_x() + .overflow_x_hidden() .child( div() .absolute() diff --git a/crates/workspace/src/status_bar.rs b/crates/workspace/src/status_bar.rs index f6fe91a574edc74471673b545a1bcf7015421933..f575feef7ed8046bd661c0f33d8d4e107a6dd058 100644 --- a/crates/workspace/src/status_bar.rs +++ b/crates/workspace/src/status_bar.rs @@ -51,7 +51,7 @@ impl StatusBar { fn render_left_tools(&self, _: &mut ViewContext) -> impl IntoElement { h_flex() .gap_2() - .overflow_hidden_x() + .overflow_x_hidden() .children(self.left_items.iter().map(|item| item.to_any())) } From 03826be19669661f8ad2fa62b3206f424baef230 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Thu, 18 Jan 2024 22:52:30 -0500 Subject: [PATCH 022/104] Fix docs references in `ui` (#4147) This PR fixes some more references in the docs in the `ui` crate. Release Notes: - N/A --- crates/ui/src/components/avatar/avatar.rs | 2 +- .../ui/src/components/avatar/avatar_availability_indicator.rs | 2 +- crates/ui/src/components/popover.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/ui/src/components/avatar/avatar.rs b/crates/ui/src/components/avatar/avatar.rs index 932cc9e243558fb78cbf6e15340974a0551699c9..54f5557e358e4b695db556fe308c5a0f94666d34 100644 --- a/crates/ui/src/components/avatar/avatar.rs +++ b/crates/ui/src/components/avatar/avatar.rs @@ -44,7 +44,7 @@ impl Avatar { /// Sets the shape of the avatar image. /// - /// This method allows the shape of the avatar to be specified using a [`Shape`]. + /// This method allows the shape of the avatar to be specified using an [`AvatarShape`]. /// It modifies the corner radius of the image to match the specified shape. /// /// # Examples diff --git a/crates/ui/src/components/avatar/avatar_availability_indicator.rs b/crates/ui/src/components/avatar/avatar_availability_indicator.rs index 3a033cd3959c5d63af5960ba839fb37950fbec57..3e4f9b2d1bc7d00a3383b6b1ebe1bf11ec2195a1 100644 --- a/crates/ui/src/components/avatar/avatar_availability_indicator.rs +++ b/crates/ui/src/components/avatar/avatar_availability_indicator.rs @@ -20,7 +20,7 @@ impl AvatarAvailabilityIndicator { } } - /// Sets the size of the [`Avatar`] this indicator appears on. + /// Sets the size of the [`Avatar`](crate::Avatar) this indicator appears on. pub fn avatar_size(mut self, size: impl Into>) -> Self { self.avatar_size = size.into(); self diff --git a/crates/ui/src/components/popover.rs b/crates/ui/src/components/popover.rs index ad72a1d9b6efd45cf16270ac0cb552b46732957a..3ef692e8624405a0daa7dd7a9a97becf7361b6ee 100644 --- a/crates/ui/src/components/popover.rs +++ b/crates/ui/src/components/popover.rs @@ -16,7 +16,7 @@ use smallvec::SmallVec; /// /// Related elements: /// -/// `ContextMenu`: +/// [`ContextMenu`](crate::ContextMenu): /// /// Used to display a popover menu that only contains a list of items. Context menus are always /// launched by secondary clicking on an element. The menu is positioned relative to the user's cursor. From 87d60beda714c18c9a7b216cfa7216f72cebc561 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Thu, 18 Jan 2024 20:47:29 -0700 Subject: [PATCH 023/104] Fix a double borrow error in window.open It seems that sometimes calling toggleFullScreen will cause the display_layer callback of a different window to fire. --- crates/gpui/src/platform/mac/window.rs | 40 ++++++++++++++------------ 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index 134390bb79900b0cc09efba720b373303d8cd26b..ee7411bc4f8aa67e7b6eee9162c415b2b46da0b8 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -516,25 +516,6 @@ impl MacWindow { NSArray::arrayWithObject(nil, NSFilenamesPboardType) ]; - let screen = native_window.screen(); - match options.bounds { - WindowBounds::Fullscreen => { - native_window.toggleFullScreen_(nil); - } - WindowBounds::Maximized => { - native_window.setFrame_display_(screen.visibleFrame(), YES); - } - WindowBounds::Fixed(bounds) => { - let display_bounds = display.bounds(); - let frame = if bounds.intersects(&display_bounds) { - display_bounds_to_native(bounds) - } else { - display_bounds_to_native(display_bounds) - }; - native_window.setFrame_display_(mem::transmute::(frame), YES); - } - } - let native_view: id = msg_send![VIEW_CLASS, alloc]; let native_view = NSView::init(native_view); @@ -656,6 +637,27 @@ impl MacWindow { native_window.orderFront_(nil); } + let screen = native_window.screen(); + match options.bounds { + WindowBounds::Fullscreen => { + // We need to toggle full screen asynchronously as doing so may + // call back into the platform handlers. + window.toggle_full_screen() + } + WindowBounds::Maximized => { + native_window.setFrame_display_(screen.visibleFrame(), YES); + } + WindowBounds::Fixed(bounds) => { + let display_bounds = display.bounds(); + let frame = if bounds.intersects(&display_bounds) { + display_bounds_to_native(bounds) + } else { + display_bounds_to_native(display_bounds) + }; + native_window.setFrame_display_(mem::transmute::(frame), YES); + } + } + window.0.lock().move_traffic_light(); pool.drain(); From fd726ad6ee97f3f9e0d19842398009d3fc6a7f9e Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Thu, 18 Jan 2024 21:03:55 -0700 Subject: [PATCH 024/104] collab 0.38.0 --- Cargo.lock | 2 +- crates/collab/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 62dbd027dd47c2d99e6f2295d63d6a8ce3b6ea8f..010e7763e490515c7a47f3fada4ffa24a612e522 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1452,7 +1452,7 @@ dependencies = [ [[package]] name = "collab" -version = "0.37.0" +version = "0.38.0" dependencies = [ "anyhow", "async-trait", diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index 9209d9ac2d3e24ffec20b628076e1c3709d92bb6..e30622adc3d360f40bb3c832cca063f6d4f6a84e 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -3,7 +3,7 @@ authors = ["Nathan Sobo "] default-run = "collab" edition = "2021" name = "collab" -version = "0.37.0" +version = "0.38.0" publish = false [[bin]] From ebce6226bb9f5ffe290bfd3e26a71cb580551cc5 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Thu, 18 Jan 2024 23:12:42 -0500 Subject: [PATCH 025/104] Remove commented-out code in `auto_update` (#4149) This PR removes some commented-out code in the `auto_update` crate that we no longer need. Release Notes: - N/A --- crates/auto_update/src/auto_update.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/crates/auto_update/src/auto_update.rs b/crates/auto_update/src/auto_update.rs index 3b8d1c6e61e2f42839930ac49311c8f60a38e341..61fa8dcb75c15341e97ddf36ac2a8855bc96f275 100644 --- a/crates/auto_update/src/auto_update.rs +++ b/crates/auto_update/src/auto_update.rs @@ -96,12 +96,6 @@ pub fn init(http_client: Arc, server_url: String, cx: &mut AppCo workspace.register_action(|_, action, cx| { view_release_notes(action, cx); }); - - // @nate - code to trigger update notification on launch - // todo!("remove this when Nate is done") - // workspace.show_notification(0, _cx, |cx| { - // cx.build_view(|_| UpdateNotification::new(SemanticVersion::from_str("1.1.1").unwrap())) - // }); }) .detach(); From 4ce0c27e0a8d0dc77e6777493ae074f86d1d02f0 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Thu, 18 Jan 2024 23:17:41 -0500 Subject: [PATCH 026/104] Remove more commented-out code (#4150) This PR removes some more commented-out code from various spots in the codebase. Release Notes: - N/A --- crates/storybook/src/stories/text.rs | 63 ---------------------------- crates/workspace/src/workspace.rs | 12 ------ 2 files changed, 75 deletions(-) diff --git a/crates/storybook/src/stories/text.rs b/crates/storybook/src/stories/text.rs index b7445ef95aac857a258c903a64ccde0c25497461..6cf6d4609abc97166d12dd0b97f136a5dfcbf649 100644 --- a/crates/storybook/src/stories/text.rs +++ b/crates/storybook/src/stories/text.rs @@ -110,66 +110,3 @@ impl Render for TextStory { ).into_element() } } - -// TODO: Check all were updated to new style and remove - -// impl Render for TextStory { -// type Element = Div; - -// fn render(&mut self, cx: &mut gpui::ViewContext) -> Self::Element { -// v_flex() -// .bg(blue()) -// .child( -// div() -// .flex() -// .child(div().max_w_96().bg(white()).child(concat!( -// "max-width: 96. The quick brown fox jumps over the lazy dog. ", -// "Meanwhile, the lazy dog decided it was time for a change. ", -// "He started daily workout routines, ate healthier and became the fastest dog in town.", -// ))), -// ) -// .child(div().h_5()) -// .child(div().flex().flex_col().w_96().bg(white()).child(concat!( -// "flex-col. width: 96; The quick brown fox jumps over the lazy dog. ", -// "Meanwhile, the lazy dog decided it was time for a change. ", -// "He started daily workout routines, ate healthier and became the fastest dog in town.", -// ))) -// .child(div().h_5()) -// .child( -// div() -// .flex() -// .child(div().min_w_96().bg(white()).child(concat!( -// "min-width: 96. The quick brown fox jumps over the lazy dog. ", -// "Meanwhile, the lazy dog decided it was time for a change. ", -// "He started daily workout routines, ate healthier and became the fastest dog in town.", -// )))) -// .child(div().h_5()) -// .child(div().flex().w_96().bg(white()).child(div().overflow_hidden().child(concat!( -// "flex-row. width 96. overflow-hidden. The quick brown fox jumps over the lazy dog. ", -// "Meanwhile, the lazy dog decided it was time for a change. ", -// "He started daily workout routines, ate healthier and became the fastest dog in town.", -// )))) -// // NOTE: When rendering text in a horizontal flex container, -// // Taffy will not pass width constraints down from the parent. -// // To fix this, render text in a parent with overflow: hidden -// .child(div().h_5()) -// .child(div().flex().w_96().bg(red()).child(concat!( -// "flex-row. width 96. The quick brown fox jumps over the lazy dog. ", -// "Meanwhile, the lazy dog decided it was time for a change. ", -// "He started daily workout routines, ate healthier and became the fastest dog in town.", -// ))).child( -// InteractiveText::new( -// "interactive", -// StyledText::new("Hello world, how is it going?").with_highlights(&cx.text_style(), [ -// (6..11, HighlightStyle { -// background_color: Some(green()), -// ..Default::default() -// }), -// ]), -// ) -// .on_click(vec![2..4, 1..3, 7..9], |range_ix, _cx| { -// println!("Clicked range {range_ix}"); -// }) -// ) -// } -// } diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 20c8bfc94a8adffb1eeb680d95c4f6dc602b34f5..a0f42cec29fd904bd1dd5df4dbbad3e8b60efad0 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -669,18 +669,6 @@ impl Workspace { cx.defer(|this, cx| { this.update_window_title(cx); - // todo! @nate - these are useful for testing notifications - // this.show_error( - // &anyhow::anyhow!("what happens if this message is very very very very very long"), - // cx, - // ); - - // this.show_notification(1, cx, |cx| { - // cx.new_view(|_cx| { - // simple_message_notification::MessageNotification::new(format!("Error:")) - // .with_click_message("click here because!") - // }) - // }); }); Workspace { weak_self: weak_handle.clone(), From 0062cc000b825e3437221b408f826b7288638086 Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Fri, 19 Jan 2024 02:54:52 -0500 Subject: [PATCH 027/104] Allow cursors to be shown via a command --- assets/keymaps/default.json | 3 ++- crates/editor/src/actions.rs | 1 + crates/editor/src/editor.rs | 30 +++++++++++++++++++----------- crates/editor/src/element.rs | 1 + 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/assets/keymaps/default.json b/assets/keymaps/default.json index f18cc2a111ec432a283f9f08f3fd1acecdddda52..c4cfed2916cf7a44d63a4fe212f66001b5879aed 100644 --- a/assets/keymaps/default.json +++ b/assets/keymaps/default.json @@ -349,7 +349,8 @@ "alt-cmd-]": "editor::UnfoldLines", "ctrl-space": "editor::ShowCompletions", "cmd-.": "editor::ToggleCodeActions", - "alt-cmd-r": "editor::RevealInFinder" + "alt-cmd-r": "editor::RevealInFinder", + "ctrl-cmd-c": "editor::ShowCursors" } }, { diff --git a/crates/editor/src/actions.rs b/crates/editor/src/actions.rs index 9532bb642d85b15ae5cd8edf68e2338b1cefa174..dd489c039398b21cc5148884f0d8742558fa03f8 100644 --- a/crates/editor/src/actions.rs +++ b/crates/editor/src/actions.rs @@ -214,5 +214,6 @@ gpui::actions!( Undo, UndoSelection, UnfoldLines, + ShowCursors ] ); diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 8876feeceff1daf1dfb85277d2cd958f1051544d..3b7b99cb82e66a931e39737d9ba85116c87ff176 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -3899,6 +3899,24 @@ impl Editor { self.update_visible_copilot_suggestion(cx); } + pub fn show_cursors(&mut self, _: &ShowCursors, cx: &mut ViewContext) { + self.display_cursors(cx); + } + + fn display_cursors(&mut self, cx: &mut ViewContext) { + self.recently_focused = true; + cx.notify(); + cx.spawn(|this, mut cx| async move { + cx.background_executor().timer(Duration::from_secs(2)).await; + this.update(&mut cx, |this, cx| { + this.recently_focused = false; + cx.notify() + }) + .ok() + }) + .detach(); + } + fn next_copilot_suggestion(&mut self, _: &copilot::NextSuggestion, cx: &mut ViewContext) { if self.has_active_copilot_suggestion(cx) { self.cycle_copilot_suggestions(Direction::Next, cx); @@ -9003,17 +9021,7 @@ impl Editor { cx.focus(&rename_editor_focus_handle); } else { self.blink_manager.update(cx, BlinkManager::enable); - self.recently_focused = true; - cx.notify(); - cx.spawn(|this, mut cx| async move { - cx.background_executor().timer(Duration::from_secs(2)).await; - this.update(&mut cx, |this, cx| { - this.recently_focused = false; - cx.notify() - }) - .ok() - }) - .detach(); + self.display_cursors(cx); self.buffer.update(cx, |buffer, cx| { buffer.finalize_last_transaction(cx); if self.leader_peer_id.is_none() { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 6c6bfba190c70b6aac155783a312cbb5af4f31a0..2f7afe2d06e44ee1f9539fbc2064ac7bdc73c5dc 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -327,6 +327,7 @@ impl EditorElement { register_action(view, cx, Editor::context_menu_prev); register_action(view, cx, Editor::context_menu_next); register_action(view, cx, Editor::context_menu_last); + register_action(view, cx, Editor::show_cursors); } fn register_key_listeners(&self, cx: &mut WindowContext) { From 070de14a6b1eda49d9e31358c19875826b51d66e Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Fri, 19 Jan 2024 11:23:05 +0200 Subject: [PATCH 028/104] Show channel rename keybinding in the context menu --- crates/collab_ui/src/collab_panel.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/collab_ui/src/collab_panel.rs b/crates/collab_ui/src/collab_panel.rs index 4a1c2e372dd21a312a58d92e8559d566eedd16e3..28c76b155eabbefdd087f1732e794ee706e5bf2f 100644 --- a/crates/collab_ui/src/collab_panel.rs +++ b/crates/collab_ui/src/collab_panel.rs @@ -20,7 +20,7 @@ use gpui::{ Model, MouseDownEvent, ParentElement, Pixels, Point, PromptLevel, Render, SharedString, Styled, Subscription, Task, TextStyle, View, ViewContext, VisualContext, WeakView, WhiteSpace, }; -use menu::{Cancel, Confirm, SelectNext, SelectPrev}; +use menu::{Cancel, Confirm, SecondaryConfirm, SelectNext, SelectPrev}; use project::{Fs, Project}; use rpc::proto::{self, PeerId}; use serde_derive::{Deserialize, Serialize}; @@ -1124,7 +1124,7 @@ impl CollabPanel { ) .entry( "Rename", - None, + Some(Box::new(SecondaryConfirm)), cx.handler_for(&this, move |this, cx| this.rename_channel(channel_id, cx)), ) .entry( @@ -1492,7 +1492,7 @@ impl CollabPanel { } } - fn rename_selected_channel(&mut self, _: &menu::SecondaryConfirm, cx: &mut ViewContext) { + fn rename_selected_channel(&mut self, _: &SecondaryConfirm, cx: &mut ViewContext) { if let Some(channel) = self.selected_channel() { self.rename_channel(channel.id, cx); } From 9446e573e977d9064acddc461b16b486508c3f29 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 19 Jan 2024 10:26:39 +0100 Subject: [PATCH 029/104] Reuse layout for view's element when it wasn't cached --- crates/gpui/src/view.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/gpui/src/view.rs b/crates/gpui/src/view.rs index e485aa3e57525118ea777f402a44d7d45928c5b6..ede1bd8b7fd33c01f31b65ba06e70001debb428e 100644 --- a/crates/gpui/src/view.rs +++ b/crates/gpui/src/view.rs @@ -321,8 +321,12 @@ impl Element for AnyView { } } - let mut element = (self.request_layout)(self, cx).1; - element.draw(bounds.origin, bounds.size.into(), cx); + if let Some(mut element) = state.element.take() { + element.paint(cx); + } else { + let mut element = (self.request_layout)(self, cx).1; + element.draw(bounds.origin, bounds.size.into(), cx); + } state.cache_key = Some(ViewCacheKey { bounds, From 0b3923af52a93af5182c4ffe1c6a074a6e7310b4 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 19 Jan 2024 12:20:18 +0100 Subject: [PATCH 030/104] Center "Open Chat" button in chat panel The layout of the chat panel wasn't correct but this visual glitch was being masked by caching, because it seems like Taffy was rendering things slightly differently when laying out the chat panel as a detached layout node. This wasn't an issue with caching, but rather an inconsistency with how Taffy lays things out. Co-Authored-By: Thorsten Co-Authored-By: Piotr --- crates/collab_ui/src/chat_panel.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/collab_ui/src/chat_panel.rs b/crates/collab_ui/src/chat_panel.rs index 44b0669c307bcb491e53e0f07ab48ae461d7f6b3..ba8c71fb1e969c539b35aa8cec23eaa0df12f148 100644 --- a/crates/collab_ui/src/chat_panel.rs +++ b/crates/collab_ui/src/chat_panel.rs @@ -559,6 +559,7 @@ impl Render for ChatPanel { } else { this.child( div() + .full() .p_4() .child( Label::new("Select a channel to chat in.") From bcc13e151cc92e9af11ba4438499c88eff694388 Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Fri, 19 Jan 2024 07:52:28 -0500 Subject: [PATCH 031/104] Change struct field name --- crates/editor/src/editor.rs | 8 ++++---- crates/editor/src/element.rs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 3b7b99cb82e66a931e39737d9ba85116c87ff176..7de6a69f1187ca97ab70aa0a5d6b808701adf329 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -367,7 +367,7 @@ pub struct Editor { project: Option>, collaboration_hub: Option>, blink_manager: Model, - recently_focused: bool, + display_cursors: bool, hovered_cursor: Option, pub show_local_selections: bool, mode: EditorMode, @@ -1613,7 +1613,7 @@ impl Editor { pixel_position_of_newest_cursor: None, gutter_width: Default::default(), style: None, - recently_focused: false, + display_cursors: false, hovered_cursor: Default::default(), editor_actions: Default::default(), show_copilot_suggestions: mode == EditorMode::Full, @@ -3904,12 +3904,12 @@ impl Editor { } fn display_cursors(&mut self, cx: &mut ViewContext) { - self.recently_focused = true; + self.display_cursors = true; cx.notify(); cx.spawn(|this, mut cx| async move { cx.background_executor().timer(Duration::from_secs(2)).await; this.update(&mut cx, |this, cx| { - this.recently_focused = false; + this.display_cursors = false; cx.notify() }) .ok() diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 2f7afe2d06e44ee1f9539fbc2064ac7bdc73c5dc..adb82b492c499668cdb237e6930d9831259e1ba9 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1999,7 +1999,7 @@ impl EditorElement { if Some(selection.peer_id) == editor.leader_peer_id { continue; } - let is_shown = editor.recently_focused || editor.hovered_cursor.as_ref().is_some_and(|c| c.replica_id == selection.replica_id && c.selection_id == selection.selection.id); + let is_shown = editor.display_cursors || editor.hovered_cursor.as_ref().is_some_and(|c| c.replica_id == selection.replica_id && c.selection_id == selection.selection.id); remote_selections .entry(selection.replica_id) From f4e3c4a107e741fbf7dfbdf17a8c75f40fe0c748 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Fri, 19 Jan 2024 08:24:24 -0500 Subject: [PATCH 032/104] Remove VS Code config (#4151) Who uses VS Code anymore? Release Notes: - N/A --- .vscode/launch.json | 69 --------------------------------------------- 1 file changed, 69 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 668019e696d7a0b4ac2e05382d46df143bddd53e..0000000000000000000000000000000000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "lldb", - "request": "launch", - "name": "Debug executable 'Zed'", - "env": { - "ZED_SERVER_URL": "http://localhost:8080" - }, - "cargo": { - "args": [ - "build", - "--bin=Zed", - "--package=zed" - ], - "filter": { - "name": "Zed", - "kind": "bin" - } - }, - "args": [ - "${workspaceFolder}" - ], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in executable 'zed'", - "cargo": { - "args": [ - "test", - "--no-run", - "--bin=zed", - "--package=zed" - ], - "filter": { - "name": "zed", - "kind": "bin" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in library 'gpui'", - "cargo": { - "args": [ - "test", - "--no-run", - "--lib", - "--package=gpui" - ], - "filter": { - "name": "gpui", - "kind": "lib" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - } - ] -} \ No newline at end of file From 1a6cd7333429d0b102eaaa30ff96841ed46569b7 Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Fri, 19 Jan 2024 16:28:27 +0100 Subject: [PATCH 033/104] Cancel language server requests if request is dropped Before this change, we would send requests to language servers without canceling them even if we never wait for their response. Example: when doing document highlights, we'd send a request (modulo debouncing) whenever a change was made, ignoring previously sent requests that might still be in-flight. With this change, we now send a Cancel request (from the LSP spec) to the language server in case no one listens to the response anymore (which is what happens when the `Future` returned by `request_internal`) is dropped. --- crates/lsp/src/lsp.rs | 14 ++++++++++++++ crates/util/src/util.rs | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/crates/lsp/src/lsp.rs b/crates/lsp/src/lsp.rs index a70422008ccd86a4db70c33e4ac8cdface6c9217..31b85b180baaca3bf915ec8b29dfaa4678134ef5 100644 --- a/crates/lsp/src/lsp.rs +++ b/crates/lsp/src/lsp.rs @@ -863,17 +863,31 @@ impl LanguageServer { .try_send(message) .context("failed to write to language server's stdin"); + let outbound_tx = outbound_tx.downgrade(); let mut timeout = executor.timer(LSP_REQUEST_TIMEOUT).fuse(); let started = Instant::now(); async move { handle_response?; send?; + let cancel_on_drop = util::defer(move || { + if let Some(outbound_tx) = outbound_tx.upgrade() { + Self::notify_internal::( + &outbound_tx, + CancelParams { + id: NumberOrString::Number(id as i32), + }, + ) + .log_err(); + } + }); + let method = T::METHOD; futures::select! { response = rx.fuse() => { let elapsed = started.elapsed(); log::trace!("Took {elapsed:?} to receive response to {method:?} id {id}"); + cancel_on_drop.abort(); response? } diff --git a/crates/util/src/util.rs b/crates/util/src/util.rs index a2f8b87feea91e5ccb09aea4c752cd1c5a583fda..ccf612e16a2441a00fe95b34b793f613c6462354 100644 --- a/crates/util/src/util.rs +++ b/crates/util/src/util.rs @@ -299,7 +299,7 @@ pub struct Deferred(Option); impl Deferred { /// Drop without running the deferred function. - pub fn cancel(mut self) { + pub fn abort(mut self) { self.0.take(); } } From 14863e9a286685732c06995dc6f2e85d69270d85 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Fri, 19 Jan 2024 11:00:22 -0500 Subject: [PATCH 034/104] Fix assistant panel header when viewing conversation history (#4160) This PR fixes the assistant panel header when in the conversation history view to hide the irrelevant tools and/or the slots where they would go. Release Notes: - Improved the assistant panel header when viewing conversation history. --- crates/assistant/src/assistant_panel.rs | 36 +++++++++++++------------ 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/crates/assistant/src/assistant_panel.rs b/crates/assistant/src/assistant_panel.rs index f2988b907c07cddba5c1646178762e8b28a508a5..1f57e52032b1e4e76f7297f577d4db82cf970eb3 100644 --- a/crates/assistant/src/assistant_panel.rs +++ b/crates/assistant/src/assistant_panel.rs @@ -1172,23 +1172,25 @@ impl Render for AssistantPanel { .px_2() .child(Label::new(editor.read(cx).title(cx)).into_element()) })) - .end_child(if self.focus_handle.contains_focused(cx) { - h_flex() - .gap_2() - .child(h_flex().gap_1().children(self.render_editor_tools(cx))) - .child( - ui::Divider::vertical() - .inset() - .color(ui::DividerColor::Border), - ) - .child( - h_flex() - .gap_1() - .child(Self::render_plus_button(cx)) - .child(self.render_zoom_button(cx)), - ) - } else { - div() + .when(self.focus_handle.contains_focused(cx), |this| { + this.end_child( + h_flex() + .gap_2() + .when(self.active_editor().is_some(), |this| { + this.child(h_flex().gap_1().children(self.render_editor_tools(cx))) + .child( + ui::Divider::vertical() + .inset() + .color(ui::DividerColor::Border), + ) + }) + .child( + h_flex() + .gap_1() + .child(Self::render_plus_button(cx)) + .child(self.render_zoom_button(cx)), + ), + ) }); let contents = if self.active_editor().is_some() { From 01f06f96a15887703a06e5953c564005c308a9c9 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Fri, 19 Jan 2024 11:18:50 -0500 Subject: [PATCH 035/104] Update tenses of doc comment summary lines (#4161) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR updates the tenses used by the summary line of doc comments to match the [Rust API documentation conventions](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#summary-sentence). Specifically: > The summary line should be written in third person singular present indicative form. Basically, this means write ‘Returns’ instead of ‘Return’. I'm sure there are plenty occurrences that I missed. Release Notes: - N/A --- crates/collab/src/db/queries/notifications.rs | 2 +- crates/collab/src/db/queries/users.rs | 4 +- crates/collab/src/rpc.rs | 16 +++---- crates/gpui/src/app.rs | 8 ++-- crates/gpui/src/app/entity_map.rs | 6 +-- crates/gpui/src/app/model_context.rs | 2 +- crates/gpui/src/app/test_context.rs | 2 +- crates/gpui/src/executor.rs | 2 +- crates/gpui/src/view.rs | 4 +- crates/gpui/src/window.rs | 46 +++++++++---------- crates/language/src/syntax_map.rs | 2 +- crates/plugin_runtime/src/plugin.rs | 6 +-- crates/project/src/worktree.rs | 2 +- crates/settings/src/settings_store.rs | 10 ++-- crates/terminal/src/terminal.rs | 2 +- crates/terminal/src/terminal_settings.rs | 14 +++--- crates/terminal_view/src/terminal_view.rs | 2 +- crates/ui/src/components/label/label.rs | 2 +- crates/vim/src/object.rs | 16 ++++--- 19 files changed, 75 insertions(+), 73 deletions(-) diff --git a/crates/collab/src/db/queries/notifications.rs b/crates/collab/src/db/queries/notifications.rs index 57685e141b78e5aa6c4a541c385bf056b1802000..ccdda65342fcbcbf3a6837e0725cee8763e7f311 100644 --- a/crates/collab/src/db/queries/notifications.rs +++ b/crates/collab/src/db/queries/notifications.rs @@ -66,7 +66,7 @@ impl Database { .await } - /// Create a notification. If `avoid_duplicates` is set to true, then avoid + /// Creates a notification. If `avoid_duplicates` is set to true, then avoid /// creating a new notification if the given recipient already has an /// unread notification with the given kind and entity id. pub async fn create_notification( diff --git a/crates/collab/src/db/queries/users.rs b/crates/collab/src/db/queries/users.rs index 8f975b5cbe5d8b4239e34e8770b57b979d6ac378..d6dfe480427fc8ed6dce8f460b5b307e7735317e 100644 --- a/crates/collab/src/db/queries/users.rs +++ b/crates/collab/src/db/queries/users.rs @@ -153,7 +153,7 @@ impl Database { .await } - /// Set "connected_once" on the user for analytics. + /// Sets "connected_once" on the user for analytics. pub async fn set_user_connected_once(&self, id: UserId, connected_once: bool) -> Result<()> { self.transaction(|tx| async move { user::Entity::update_many() @@ -252,7 +252,7 @@ impl Database { .await } - /// Return the active flags for the user. + /// Returns the active flags for the user. pub async fn get_user_flags(&self, user: UserId) -> Result> { self.transaction(|tx| async move { #[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 4e9807acfb562a67732147e26b12d36afaa07340..2a715fa4a456ccd0564b88a2afe662136e151d6a 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -950,7 +950,7 @@ async fn ping(_: proto::Ping, response: Response, _session: Session Ok(()) } -/// Create a new room for calling (outside of channels) +/// Creates a new room for calling (outside of channels) async fn create_room( _request: proto::CreateRoom, response: Response, @@ -1276,7 +1276,7 @@ async fn leave_room( Ok(()) } -/// Update the permissions of someone else in the room. +/// Updates the permissions of someone else in the room. async fn set_room_participant_role( request: proto::SetRoomParticipantRole, response: Response, @@ -1460,7 +1460,7 @@ async fn decline_call(message: proto::DeclineCall, session: Session) -> Result<( Ok(()) } -/// Update other participants in the room with your current location. +/// Updates other participants in the room with your current location. async fn update_participant_location( request: proto::UpdateParticipantLocation, response: Response, @@ -1673,7 +1673,7 @@ async fn leave_project(request: proto::LeaveProject, session: Session) -> Result Ok(()) } -/// Update other participants with changes to the project +/// Updates other participants with changes to the project async fn update_project( request: proto::UpdateProject, response: Response, @@ -1700,7 +1700,7 @@ async fn update_project( Ok(()) } -/// Update other participants with changes to the worktree +/// Updates other participants with changes to the worktree async fn update_worktree( request: proto::UpdateWorktree, response: Response, @@ -1725,7 +1725,7 @@ async fn update_worktree( Ok(()) } -/// Update other participants with changes to the diagnostics +/// Updates other participants with changes to the diagnostics async fn update_diagnostic_summary( message: proto::UpdateDiagnosticSummary, session: Session, @@ -1749,7 +1749,7 @@ async fn update_diagnostic_summary( Ok(()) } -/// Update other participants with changes to the worktree settings +/// Updates other participants with changes to the worktree settings async fn update_worktree_settings( message: proto::UpdateWorktreeSettings, session: Session, @@ -2293,7 +2293,7 @@ async fn remove_contact( Ok(()) } -/// Create a new channel. +/// Creates a new channel. async fn create_channel( request: proto::CreateChannel, response: Response, diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index c7a6a92a17dce204412fa2c088132789d33b0cc4..d898d865164a61c9935f8fe1ed5e957a28026ee5 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -864,7 +864,7 @@ impl AppContext { .unwrap() } - /// Set the value of the global of the given type. + /// Sets the value of the global of the given type. pub fn set_global(&mut self, global: G) { let global_type = TypeId::of::(); self.push_effect(Effect::NotifyGlobalObservers { global_type }); @@ -889,7 +889,7 @@ impl AppContext { .unwrap() } - /// Update the global of the given type with a closure. Unlike `global_mut`, this method provides + /// Updates the global of the given type with a closure. Unlike `global_mut`, this method provides /// your closure with mutable access to the `AppContext` and the global simultaneously. pub fn update_global(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R { self.update(|cx| { @@ -1106,7 +1106,7 @@ impl AppContext { .contains_key(&action.as_any().type_id()) } - /// Set the menu bar for this application. This will replace any existing menu bar. + /// Sets the menu bar for this application. This will replace any existing menu bar. pub fn set_menus(&mut self, menus: Vec) { self.platform.set_menus(menus, &self.keymap.lock()); } @@ -1190,7 +1190,7 @@ impl Context for AppContext { }) } - /// Update the entity referenced by the given model. The function is passed a mutable reference to the + /// Updates the entity referenced by the given model. The function is passed a mutable reference to the /// entity along with a `ModelContext` for the entity. fn update_model( &mut self, diff --git a/crates/gpui/src/app/entity_map.rs b/crates/gpui/src/app/entity_map.rs index 7ab21a5477526d064d70283a04442b33cffcedfa..db5d844d17c173bbc0541d49aaf5f67e70f139a0 100644 --- a/crates/gpui/src/app/entity_map.rs +++ b/crates/gpui/src/app/entity_map.rs @@ -104,7 +104,7 @@ impl EntityMap { } } - /// Return an entity after moving it to the stack. + /// Returns an entity after moving it to the stack. pub fn end_lease(&mut self, mut lease: Lease) { self.entities .insert(lease.model.entity_id, lease.entity.take().unwrap()); @@ -391,7 +391,7 @@ impl Model { cx.read_model(self, f) } - /// Update the entity referenced by this model with the given function. + /// Updates the entity referenced by this model with the given function. /// /// The update function receives a context appropriate for its environment. /// When updating in an `AppContext`, it receives a `ModelContext`. @@ -571,7 +571,7 @@ impl WeakModel { Model::upgrade_from(self) } - /// Update the entity referenced by this model with the given function if + /// Updates the entity referenced by this model with the given function if /// the referenced entity still exists. Returns an error if the entity has /// been released. pub fn update( diff --git a/crates/gpui/src/app/model_context.rs b/crates/gpui/src/app/model_context.rs index e2aad9fee93aeba5c0c022a5d619f8cdd57b0e63..268410245e95aae8e1f1a091f9b98d0ce359dfdb 100644 --- a/crates/gpui/src/app/model_context.rs +++ b/crates/gpui/src/app/model_context.rs @@ -189,7 +189,7 @@ impl<'a, T: 'static> ModelContext<'a, T> { } } - /// Update the given global + /// Updates the given global pub fn update_global(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R where G: 'static, diff --git a/crates/gpui/src/app/test_context.rs b/crates/gpui/src/app/test_context.rs index d11c1239dd576d9db944f605cad7d4140624feb9..66f74a91b38871da18829ce9539f48d3e397fcbb 100644 --- a/crates/gpui/src/app/test_context.rs +++ b/crates/gpui/src/app/test_context.rs @@ -578,7 +578,7 @@ impl<'a> VisualTestContext { self.cx.update_window(self.window, |_, cx| f(cx)).unwrap() } - /// Create a new VisualTestContext. You would typically shadow the passed in + /// Creates a new VisualTestContext. You would typically shadow the passed in /// TestAppContext with this, as this is typically more useful. /// `let cx = VisualTestContext::from_window(window, cx);` pub fn from_window(window: AnyWindowHandle, cx: &TestAppContext) -> Self { diff --git a/crates/gpui/src/executor.rs b/crates/gpui/src/executor.rs index 3e233854bc38cf63f2582c1bdb38fc482881276a..88e46c28c4714c860d2db8c0c735a0bca2813fb6 100644 --- a/crates/gpui/src/executor.rs +++ b/crates/gpui/src/executor.rs @@ -46,7 +46,7 @@ pub enum Task { } impl Task { - /// Create a new task that will resolve with the value + /// Creates a new task that will resolve with the value pub fn ready(val: T) -> Self { Task::Ready(Some(val)) } diff --git a/crates/gpui/src/view.rs b/crates/gpui/src/view.rs index ede1bd8b7fd33c01f31b65ba06e70001debb428e..c5d759c61599a6082f5fa2531471ea4a9da34e4c 100644 --- a/crates/gpui/src/view.rs +++ b/crates/gpui/src/view.rs @@ -64,7 +64,7 @@ impl View { Entity::downgrade(self) } - /// Update the view's state with the given function, which is passed a mutable reference and a context. + /// Updates the view's state with the given function, which is passed a mutable reference and a context. pub fn update( &self, cx: &mut C, @@ -156,7 +156,7 @@ impl WeakView { Entity::upgrade_from(self) } - /// Update this view's state if it hasn't been released. + /// Updates this view's state if it hasn't been released. /// Returns an error if this view has been released. pub fn update( &self, diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 2329a5251ed010791e043bc08b70fb2e5e19d895..4e7ba2001a373e1a66406373ade0182fedd9fe34 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -721,7 +721,7 @@ impl<'a> WindowContext<'a> { subscription } - /// Create an `AsyncWindowContext`, which has a static lifetime and can be held across + /// Creates an [`AsyncWindowContext`], which has a static lifetime and can be held across /// await points in async code. pub fn to_async(&self) -> AsyncWindowContext { AsyncWindowContext::new(self.app.to_async(), self.window.handle) @@ -794,7 +794,7 @@ impl<'a> WindowContext<'a> { .spawn(|app| f(AsyncWindowContext::new(app, self.window.handle))) } - /// Update the global of the given type. The given closure is given simultaneous mutable + /// Updates the global of the given type. The given closure is given simultaneous mutable /// access both to the global and the context. pub fn update_global(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R where @@ -913,7 +913,7 @@ impl<'a> WindowContext<'a> { self.window.platform_window.zoom(); } - /// Update the window's title at the platform level. + /// Updates the window's title at the platform level. pub fn set_window_title(&mut self, title: &str) { self.window.platform_window.set_title(title); } @@ -1063,14 +1063,14 @@ impl<'a> WindowContext<'a> { self.window.modifiers } - /// Update the cursor style at the platform level. + /// Updates the cursor style at the platform level. pub fn set_cursor_style(&mut self, style: CursorStyle) { let view_id = self.parent_view_id(); self.window.next_frame.cursor_styles.insert(view_id, style); self.window.next_frame.requested_cursor_style = Some(style); } - /// Set a tooltip to be rendered for the upcoming frame + /// Sets a tooltip to be rendered for the upcoming frame pub fn set_tooltip(&mut self, tooltip: AnyTooltip) { let view_id = self.parent_view_id(); self.window.next_frame.tooltip_request = Some(TooltipRequest { view_id, tooltip }); @@ -2080,8 +2080,8 @@ impl<'a> WindowContext<'a> { }) } - /// Update or initialize state for an element with the given id that lives across multiple - /// frames. If an element with this id existed in the rendered frame, its state will be passed + /// Updates or initializes state for an element with the given id that lives across multiple + /// frames. If an element with this ID existed in the rendered frame, its state will be passed /// to the given closure. The state returned by the closure will be stored so it can be referenced /// when drawing the next frame. pub(crate) fn with_element_state( @@ -2182,7 +2182,7 @@ impl<'a> WindowContext<'a> { .expect("a view should always be on the stack while drawing") } - /// Set an input handler, such as [`ElementInputHandler`][element_input_handler], which interfaces with the + /// Sets an input handler, such as [`ElementInputHandler`][element_input_handler], which interfaces with the /// platform to receive textual input with proper integration with concerns such /// as IME interactions. This handler will be active for the upcoming frame until the following frame is /// rendered. @@ -2322,7 +2322,7 @@ impl VisualContext for WindowContext<'_> { view } - /// Update the given view. Prefer calling `View::update` instead, which calls this method. + /// Updates the given view. Prefer calling [`View::update`] instead, which calls this method. fn update_view( &mut self, view: &View, @@ -2491,7 +2491,7 @@ pub trait BorrowWindow: BorrowMut + BorrowMut { result } - /// Update the global element offset relative to the current offset. This is used to implement + /// Updates the global element offset relative to the current offset. This is used to implement /// scrolling. fn with_element_offset( &mut self, @@ -2506,7 +2506,7 @@ pub trait BorrowWindow: BorrowMut + BorrowMut { self.with_absolute_element_offset(abs_offset, f) } - /// Update the global element offset based on the given offset. This is used to implement + /// Updates the global element offset based on the given offset. This is used to implement /// drag handles and other manual painting of elements. fn with_absolute_element_offset( &mut self, @@ -2629,7 +2629,7 @@ impl<'a, V: 'static> ViewContext<'a, V> { &mut self.window_cx } - /// Set a given callback to be run on the next frame. + /// Sets a given callback to be run on the next frame. pub fn on_next_frame(&mut self, f: impl FnOnce(&mut V, &mut ViewContext) + 'static) where V: 'static, @@ -2957,7 +2957,7 @@ impl<'a, V: 'static> ViewContext<'a, V> { self.window_cx.spawn(|cx| f(view, cx)) } - /// Update the global state of the given type. + /// Updates the global state of the given type. pub fn update_global(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R where G: 'static, @@ -3189,7 +3189,7 @@ pub struct WindowHandle { } impl WindowHandle { - /// Create a new handle from a window ID. + /// Creates a new handle from a window ID. /// This does not check if the root type of the window is `V`. pub fn new(id: WindowId) -> Self { WindowHandle { @@ -3215,7 +3215,7 @@ impl WindowHandle { })) } - /// Update the root view of this window. + /// Updates the root view of this window. /// /// This will fail if the window has been closed or if the root view's type does not match pub fn update( @@ -3337,7 +3337,7 @@ impl AnyWindowHandle { } } - /// Update the state of the root view of this window. + /// Updates the state of the root view of this window. /// /// This will fail if the window has been closed. pub fn update( @@ -3477,7 +3477,7 @@ pub struct PaintQuad { } impl PaintQuad { - /// Set the corner radii of the quad. + /// Sets the corner radii of the quad. pub fn corner_radii(self, corner_radii: impl Into>) -> Self { PaintQuad { corner_radii: corner_radii.into(), @@ -3485,7 +3485,7 @@ impl PaintQuad { } } - /// Set the border widths of the quad. + /// Sets the border widths of the quad. pub fn border_widths(self, border_widths: impl Into>) -> Self { PaintQuad { border_widths: border_widths.into(), @@ -3493,7 +3493,7 @@ impl PaintQuad { } } - /// Set the border color of the quad. + /// Sets the border color of the quad. pub fn border_color(self, border_color: impl Into) -> Self { PaintQuad { border_color: border_color.into(), @@ -3501,7 +3501,7 @@ impl PaintQuad { } } - /// Set the background color of the quad. + /// Sets the background color of the quad. pub fn background(self, background: impl Into) -> Self { PaintQuad { background: background.into(), @@ -3510,7 +3510,7 @@ impl PaintQuad { } } -/// Create a quad with the given parameters. +/// Creates a quad with the given parameters. pub fn quad( bounds: Bounds, corner_radii: impl Into>, @@ -3527,7 +3527,7 @@ pub fn quad( } } -/// Create a filled quad with the given bounds and background color. +/// Creates a filled quad with the given bounds and background color. pub fn fill(bounds: impl Into>, background: impl Into) -> PaintQuad { PaintQuad { bounds: bounds.into(), @@ -3538,7 +3538,7 @@ pub fn fill(bounds: impl Into>, background: impl Into) -> P } } -/// Create a rectangle outline with the given bounds, border color, and a 1px border width +/// Creates a rectangle outline with the given bounds, border color, and a 1px border width pub fn outline(bounds: impl Into>, border_color: impl Into) -> PaintQuad { PaintQuad { bounds: bounds.into(), diff --git a/crates/language/src/syntax_map.rs b/crates/language/src/syntax_map.rs index c22ece48aff0b41a089538cba70424f81cd4e042..b5e243e7ff705e5091f3c73fdbbf5f801922a392 100644 --- a/crates/language/src/syntax_map.rs +++ b/crates/language/src/syntax_map.rs @@ -1296,7 +1296,7 @@ fn get_injections( } } -/// Update the given list of included `ranges`, removing any ranges that intersect +/// Updates the given list of included `ranges`, removing any ranges that intersect /// `removed_ranges`, and inserting the given `new_ranges`. /// /// Returns a new vector of ranges, and the range of the vector that was changed, diff --git a/crates/plugin_runtime/src/plugin.rs b/crates/plugin_runtime/src/plugin.rs index 8070539b35da3ab2ec438c3886defe3e8cff8578..a19a49c47a678e8f0fe78877de5e7a177c340c60 100644 --- a/crates/plugin_runtime/src/plugin.rs +++ b/crates/plugin_runtime/src/plugin.rs @@ -69,7 +69,7 @@ impl Default for Metering { } /// This struct is used to build a new [`Plugin`], using the builder pattern. -/// Create a new default plugin with `PluginBuilder::new_with_default_ctx`, +/// Creates a new default plugin with `PluginBuilder::new_with_default_ctx`, /// and add host-side exported functions using `host_function` and `host_function_async`. /// Finalize the plugin by calling [`init`]. pub struct PluginBuilder { @@ -90,7 +90,7 @@ fn create_default_engine() -> Result { } impl PluginBuilder { - /// Create a new [`PluginBuilder`] with the given WASI context. + /// Creates a new [`PluginBuilder`] with the given WASI context. /// Using the default context is a safe bet, see [`new_with_default_context`]. /// This plugin will yield after a configurable amount of fuel is consumed. pub fn new(wasi_ctx: WasiCtx, metering: Metering) -> Result { @@ -105,7 +105,7 @@ impl PluginBuilder { }) } - /// Create a new `PluginBuilder` with the default `WasiCtx` (see [`default_ctx`]). + /// Creates a new `PluginBuilder` with the default `WasiCtx` (see [`default_ctx`]). /// This plugin will yield after a configurable amount of fuel is consumed. pub fn new_default() -> Result { let default_ctx = WasiCtxBuilder::new() diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 461ea303b3d42cedb577d53f22c9e1de75a14b6a..6a29725b05efcb7a2fa7506c73bf49ddb976a019 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -1866,7 +1866,7 @@ impl Snapshot { }) } - /// Update the `git_status` of the given entries such that files' + /// Updates the `git_status` of the given entries such that files' /// statuses bubble up to their ancestor directories. pub fn propagate_git_statuses(&self, result: &mut [Entry]) { let mut cursor = self diff --git a/crates/settings/src/settings_store.rs b/crates/settings/src/settings_store.rs index aa351bc8c2e0572231280de300c32f7c5165edc3..4f6179e2532b343b29bcb361377619a6a800844a 100644 --- a/crates/settings/src/settings_store.rs +++ b/crates/settings/src/settings_store.rs @@ -246,7 +246,7 @@ impl SettingsStore { this } - /// Update the value of a setting in the user's global configuration. + /// Updates the value of a setting in the user's global configuration. /// /// This is only for tests. Normally, settings are only loaded from /// JSON files. @@ -261,7 +261,7 @@ impl SettingsStore { self.set_user_settings(&new_text, cx).unwrap(); } - /// Update the value of a setting in a JSON file, returning the new text + /// Updates the value of a setting in a JSON file, returning the new text /// for that JSON file. pub fn new_text_for_update( &self, @@ -276,7 +276,7 @@ impl SettingsStore { new_text } - /// Update the value of a setting in a JSON file, returning a list + /// Updates the value of a setting in a JSON file, returning a list /// of edits to apply to the JSON file. pub fn edits_for_update( &self, @@ -344,7 +344,7 @@ impl SettingsStore { DEFAULT_JSON_TAB_SIZE } - /// Set the default settings via a JSON string. + /// Sets the default settings via a JSON string. /// /// The string should contain a JSON object with a default value for every setting. pub fn set_default_settings( @@ -362,7 +362,7 @@ impl SettingsStore { } } - /// Set the user settings via a JSON string. + /// Sets the user settings via a JSON string. pub fn set_user_settings( &mut self, user_settings_content: &str, diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index 0b87ed1d976daf247b7b84efe3280290602911f3..ede9dc1af0a9fef1134d485c5fae3f70475ed258 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -599,7 +599,7 @@ impl Terminal { } } - /// Update the cached process info, returns whether the Zed-relevant info has changed + /// Updates the cached process info, returns whether the Zed-relevant info has changed fn update_process_info(&mut self) -> bool { let mut pid = unsafe { libc::tcgetpgrp(self.shell_fd as i32) }; if pid < 0 { diff --git a/crates/terminal/src/terminal_settings.rs b/crates/terminal/src/terminal_settings.rs index b9b79c9c6b6996e674f1af25485343a093b3fe85..7fcbcf954180fd32eb674339a439f5f433087585 100644 --- a/crates/terminal/src/terminal_settings.rs +++ b/crates/terminal/src/terminal_settings.rs @@ -90,17 +90,17 @@ pub struct TerminalSettingsContent { /// /// Default: current_project_directory pub working_directory: Option, - /// Set the terminal's font size. + /// Sets the terminal's font size. /// /// If this option is not included, /// the terminal will default to matching the buffer's font size. pub font_size: Option, - /// Set the terminal's font family. + /// Sets the terminal's font family. /// /// If this option is not included, /// the terminal will default to matching the buffer's font family. pub font_family: Option, - /// Set the terminal's line height. + /// Sets the terminal's line height. /// /// Default: comfortable pub line_height: Option, @@ -110,18 +110,18 @@ pub struct TerminalSettingsContent { /// /// Default: {} pub env: Option>, - /// Set the cursor blinking behavior in the terminal. + /// Sets the cursor blinking behavior in the terminal. /// /// Default: terminal_controlled pub blinking: Option, - /// Set whether Alternate Scroll mode (code: ?1007) is active by default. + /// Sets whether Alternate Scroll mode (code: ?1007) is active by default. /// Alternate Scroll mode converts mouse scroll events into up / down key /// presses when in the alternate screen (e.g. when running applications /// like vim or less). The terminal can still set and unset this mode. /// /// Default: off pub alternate_scroll: Option, - /// Set whether the option key behaves as the meta key. + /// Sets whether the option key behaves as the meta key. /// /// Default: false pub option_as_meta: Option, @@ -139,7 +139,7 @@ pub struct TerminalSettingsContent { /// /// Default: 320 pub default_height: Option, - /// Activate the python virtual environment, if one is found, in the + /// Activates the python virtual environment, if one is found, in the /// terminal's working directory (as resolved by the working_directory /// setting). Set this to "off" to disable this behavior. /// diff --git a/crates/terminal_view/src/terminal_view.rs b/crates/terminal_view/src/terminal_view.rs index fc5829ba00058d686bd67676e85755fbbb955197..25e67aa8f472c14c2943f55b75a0909ec831426d 100644 --- a/crates/terminal_view/src/terminal_view.rs +++ b/crates/terminal_view/src/terminal_view.rs @@ -832,7 +832,7 @@ impl SearchableItem for TerminalView { self.terminal().update(cx, |term, _| term.matches = matches) } - /// Return the selection content to pre-load into this search + /// Returns the selection content to pre-load into this search fn query_suggestion(&mut self, cx: &mut ViewContext) -> String { self.terminal() .read(cx) diff --git a/crates/ui/src/components/label/label.rs b/crates/ui/src/components/label/label.rs index 0ba67286a22ccaeec1505612ec34cbc3b1b5883e..13ee4161451444282d951b3b8f80daf3fb7b6568 100644 --- a/crates/ui/src/components/label/label.rs +++ b/crates/ui/src/components/label/label.rs @@ -37,7 +37,7 @@ pub struct Label { } impl Label { - /// Create a new [`Label`] with the given text. + /// Creates a new [`Label`] with the given text. /// /// # Examples /// diff --git a/crates/vim/src/object.rs b/crates/vim/src/object.rs index 1e9361618c5cd6874a3d869dabe9ba01e411599c..f65ed763b900d386f8d71c1a3e07aeade0e209cd 100644 --- a/crates/vim/src/object.rs +++ b/crates/vim/src/object.rs @@ -195,9 +195,10 @@ impl Object { } } -/// Return a range that surrounds the word relative_to is in -/// If relative_to is at the start of a word, return the word. -/// If relative_to is between words, return the space between +/// Returns a range that surrounds the word `relative_to` is in. +/// +/// If `relative_to` is at the start of a word, return the word. +/// If `relative_to` is between words, return the space between. fn in_word( map: &DisplaySnapshot, relative_to: DisplayPoint, @@ -225,11 +226,12 @@ fn in_word( Some(start..end) } -/// Return a range that surrounds the word and following whitespace +/// Returns a range that surrounds the word and following whitespace /// relative_to is in. -/// If relative_to is at the start of a word, return the word and following whitespace. -/// If relative_to is between words, return the whitespace back and the following word - +/// +/// If `relative_to` is at the start of a word, return the word and following whitespace. +/// If `relative_to` is between words, return the whitespace back and the following word. +/// /// if in word /// delete that word /// if there is whitespace following the word, delete that as well From 595428a8b1eb3aba68ba0d07217f5a25d68be148 Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Fri, 19 Jan 2024 11:37:57 -0500 Subject: [PATCH 036/104] Rename `show cursors` to `display cursor names` --- assets/keymaps/default.json | 2 +- crates/editor/src/actions.rs | 2 +- crates/editor/src/editor.rs | 16 ++++++++-------- crates/editor/src/element.rs | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/assets/keymaps/default.json b/assets/keymaps/default.json index c4cfed2916cf7a44d63a4fe212f66001b5879aed..cd353d776749c6da998821ec20e68672e79aa835 100644 --- a/assets/keymaps/default.json +++ b/assets/keymaps/default.json @@ -350,7 +350,7 @@ "ctrl-space": "editor::ShowCompletions", "cmd-.": "editor::ToggleCodeActions", "alt-cmd-r": "editor::RevealInFinder", - "ctrl-cmd-c": "editor::ShowCursors" + "ctrl-cmd-c": "editor::DisplayCursorNames" } }, { diff --git a/crates/editor/src/actions.rs b/crates/editor/src/actions.rs index dd489c039398b21cc5148884f0d8742558fa03f8..4edc1d12ea744c53f4e9878573684a95387c0ea5 100644 --- a/crates/editor/src/actions.rs +++ b/crates/editor/src/actions.rs @@ -214,6 +214,6 @@ gpui::actions!( Undo, UndoSelection, UnfoldLines, - ShowCursors + DisplayCursorNames ] ); diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 7de6a69f1187ca97ab70aa0a5d6b808701adf329..b31dd54208a52df335e7b1af55f163d758e91293 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -367,7 +367,7 @@ pub struct Editor { project: Option>, collaboration_hub: Option>, blink_manager: Model, - display_cursors: bool, + show_cursor_names: bool, hovered_cursor: Option, pub show_local_selections: bool, mode: EditorMode, @@ -1613,7 +1613,7 @@ impl Editor { pixel_position_of_newest_cursor: None, gutter_width: Default::default(), style: None, - display_cursors: false, + show_cursor_names: false, hovered_cursor: Default::default(), editor_actions: Default::default(), show_copilot_suggestions: mode == EditorMode::Full, @@ -3899,17 +3899,17 @@ impl Editor { self.update_visible_copilot_suggestion(cx); } - pub fn show_cursors(&mut self, _: &ShowCursors, cx: &mut ViewContext) { - self.display_cursors(cx); + pub fn display_cursor_names(&mut self, _: &DisplayCursorNames, cx: &mut ViewContext) { + self.show_cursor_names(cx); } - fn display_cursors(&mut self, cx: &mut ViewContext) { - self.display_cursors = true; + fn show_cursor_names(&mut self, cx: &mut ViewContext) { + self.show_cursor_names = true; cx.notify(); cx.spawn(|this, mut cx| async move { cx.background_executor().timer(Duration::from_secs(2)).await; this.update(&mut cx, |this, cx| { - this.display_cursors = false; + this.show_cursor_names = false; cx.notify() }) .ok() @@ -9021,7 +9021,7 @@ impl Editor { cx.focus(&rename_editor_focus_handle); } else { self.blink_manager.update(cx, BlinkManager::enable); - self.display_cursors(cx); + self.show_cursor_names(cx); self.buffer.update(cx, |buffer, cx| { buffer.finalize_last_transaction(cx); if self.leader_peer_id.is_none() { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 7e35ff61ac2dd2cd82a308fd12731884db87939f..1c4fafb26898ec0ed05ed1ef9f5e98ce8b3fe3bd 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -327,7 +327,7 @@ impl EditorElement { register_action(view, cx, Editor::context_menu_prev); register_action(view, cx, Editor::context_menu_next); register_action(view, cx, Editor::context_menu_last); - register_action(view, cx, Editor::show_cursors); + register_action(view, cx, Editor::display_cursor_names); } fn register_key_listeners(&self, cx: &mut WindowContext) { @@ -2001,7 +2001,7 @@ impl EditorElement { if Some(selection.peer_id) == editor.leader_peer_id { continue; } - let is_shown = editor.display_cursors || editor.hovered_cursor.as_ref().is_some_and(|c| c.replica_id == selection.replica_id && c.selection_id == selection.selection.id); + let is_shown = editor.show_cursor_names || editor.hovered_cursor.as_ref().is_some_and(|c| c.replica_id == selection.replica_id && c.selection_id == selection.selection.id); remote_selections .entry(selection.replica_id) From 0578c1bdae18f3d1321d2452d2e7c2cfd9516733 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Fri, 19 Jan 2024 11:46:28 -0500 Subject: [PATCH 037/104] Style notifications for notification panel (#4163) This PR styles the notifications for the notification panel. These are the notification toasts you receive when you have a new notification (e.g., a mention in chat): Screenshot 2024-01-19 at 11 39 16 AM Release Notes: - Improved the look of toasts for incoming notifications. --- crates/collab_ui/src/notification_panel.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/collab_ui/src/notification_panel.rs b/crates/collab_ui/src/notification_panel.rs index b30f8d15f035b5bc49e08449d20efd21b0e5b8c9..6f4ee1baaec8e2b93cdd47373a96f79ebd931be7 100644 --- a/crates/collab_ui/src/notification_panel.rs +++ b/crates/collab_ui/src/notification_panel.rs @@ -713,6 +713,9 @@ impl Render for NotificationToast { h_flex() .id("notification_panel_toast") + .elevation_3(cx) + .p_2() + .gap_2() .children(user.map(|user| Avatar::new(user.avatar_uri.clone()))) .child(Label::new(self.text.clone())) .child( From 4a92506a32a57a48e4bbaaf0978c292f53e82733 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Fri, 19 Jan 2024 10:10:34 -0700 Subject: [PATCH 038/104] Watch deploys a little closer --- script/deploy-collab | 1 + 1 file changed, 1 insertion(+) diff --git a/script/deploy-collab b/script/deploy-collab index 8dbee18e3b78cfb1a26a74338509a69db54b0307..54442d5ddfc89fe74475914e5c99e4a63c8b059b 100755 --- a/script/deploy-collab +++ b/script/deploy-collab @@ -19,5 +19,6 @@ export ZED_IMAGE_ID=${image_id} target_zed_kube_cluster envsubst < crates/collab/k8s/collab.template.yml | kubectl apply -f - +kubectl -n "$environment" rollout status deployment/collab --watch echo "deployed collab v${version} to ${environment}" From 0479ebc26d6fb7812cc06d2b4ab8071ddd727078 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Fri, 19 Jan 2024 10:35:25 -0700 Subject: [PATCH 039/104] Don't toggle WHOLE_WORD in vim search Fixes */# in visual mode, and avoids setting up irritating state. --- Cargo.lock | 1 + assets/keymaps/vim.json | 16 +++++++-- crates/vim/Cargo.toml | 1 + crates/vim/README.md | 36 +++++++++++++++++++ crates/vim/src/normal/search.rs | 35 ++++++++++++------ .../vim/test_data/test_visual_star_hash.json | 6 ++++ 6 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 crates/vim/README.md create mode 100644 crates/vim/test_data/test_visual_star_hash.json diff --git a/Cargo.lock b/Cargo.lock index 010e7763e490515c7a47f3fada4ffa24a612e522..a9072004c3fda4143d50fa1c3c71118ee4ea471f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9079,6 +9079,7 @@ dependencies = [ "nvim-rs", "parking_lot 0.11.2", "project", + "regex", "search", "serde", "serde_derive", diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index 1da6f0ef8c5da25a60742fda933125c23eac81bf..32acb90d697837eecfda39efec54cb5f4420fbba 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -104,8 +104,6 @@ "shift-v": "vim::ToggleVisualLine", "ctrl-v": "vim::ToggleVisualBlock", "ctrl-q": "vim::ToggleVisualBlock", - "*": "vim::MoveToNext", - "#": "vim::MoveToPrev", "0": "vim::StartOfLine", // When no number operator present, use start of line motion "ctrl-f": "vim::PageDown", "pagedown": "vim::PageDown", @@ -329,6 +327,8 @@ "backwards": true } ], + "*": "vim::MoveToNext", + "#": "vim::MoveToPrev", ";": "vim::RepeatFind", ",": [ "vim::RepeatFind", @@ -421,6 +421,18 @@ "shift-r": "vim::SubstituteLine", "c": "vim::Substitute", "~": "vim::ChangeCase", + "*": [ + "vim::MoveToNext", + { + "partialWord": true + } + ], + "#": [ + "vim::MoveToPrev", + { + "partialWord": true + } + ], "ctrl-a": "vim::Increment", "ctrl-x": "vim::Decrement", "g ctrl-a": [ diff --git a/crates/vim/Cargo.toml b/crates/vim/Cargo.toml index 95702585292d82fe586d72cc2e0bfb54f4979a1b..ef3fd2a4c790ee928ecc7ea05882fd7cf6d3a738 100644 --- a/crates/vim/Cargo.toml +++ b/crates/vim/Cargo.toml @@ -23,6 +23,7 @@ async-trait = { workspace = true, "optional" = true } nvim-rs = { git = "https://github.com/KillTheMule/nvim-rs", branch = "master", features = ["use_tokio"], optional = true } tokio = { version = "1.15", "optional" = true } serde_json.workspace = true +regex.workspace = true collections = { path = "../collections" } command_palette = { path = "../command_palette" } diff --git a/crates/vim/README.md b/crates/vim/README.md new file mode 100644 index 0000000000000000000000000000000000000000..547ca686fb9c5b5146d254db808a9b61aa630804 --- /dev/null +++ b/crates/vim/README.md @@ -0,0 +1,36 @@ +This contains the code for Zed's Vim emulation mode. + +Vim mode in Zed is supposed to primarily "do what you expect": it mostly tries to copy vim exactly, but will use Zed-specific functionality when available to make things smoother. This means Zed will never be 100% vim compatible, but should be 100% vim familiar! + +The backlog is maintained in the `#vim` channel notes. + +## Testing against Neovim + +If you are making a change to make Zed's behaviour more closely match vim/nvim, you can create a test using the `NeovimBackedTestContext`. + +For example, the following test checks that Zed and Neovim have the same behaviour when running `*` in visual mode: + +```rust +#[gpui::test] +async fn test_visual_star_hash(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + + cx.set_shared_state("ˇa.c. abcd a.c. abcd").await; + cx.simulate_shared_keystrokes(["v", "3", "l", "*"]).await; + cx.assert_shared_state("a.c. abcd ˇa.c. abcd").await; +} +``` + +To keep CI runs fast, by default the neovim tests use a cached JSON file that records what neovim did (see crates/vim/test_data), +but while developing this test you'll need to run it with the neovim flag enabled: + +``` +cargo test -p vim --features neovim test_visual_star_hash +``` + +This will run your keystrokes against a headless neovim and cache the results in the test_data directory. + + +## Testing zed-only behaviour + +Zed does more than vim/neovim in their default modes. The `VimTestContext` can be used instead. This lets you test integration with the language server and other parts of zed's UI that don't have a NeoVim equivalent. diff --git a/crates/vim/src/normal/search.rs b/crates/vim/src/normal/search.rs index f85e3d9ba92415040114fbcfd61c55c5066dbf79..31fda7788f01bbaf6799b5e6468c41236b12d025 100644 --- a/crates/vim/src/normal/search.rs +++ b/crates/vim/src/normal/search.rs @@ -91,7 +91,6 @@ fn search(workspace: &mut Workspace, action: &Search, cx: &mut ViewContext() { let search = search_bar.update(cx, |search_bar, cx| { - let mut options = SearchOptions::CASE_SENSITIVE; - options.set(SearchOptions::WHOLE_WORD, whole_word); - if search_bar.show(cx) { - search_bar - .query_suggestion(cx) - .map(|query| search_bar.search(&query, Some(options), cx)) - } else { - None + let options = SearchOptions::CASE_SENSITIVE; + if !search_bar.show(cx) { + return None; + } + let Some(query) = search_bar.query_suggestion(cx) else { + return None; + }; + let mut query = regex::escape(&query); + if whole_word { + query = format!(r"\b{}\b", query); } + search_bar.activate_search_mode(SearchMode::Regex, cx); + Some(search_bar.search(&query, Some(options), cx)) }); if let Some(search) = search { @@ -350,7 +353,10 @@ mod test { use editor::DisplayPoint; use search::BufferSearchBar; - use crate::{state::Mode, test::VimTestContext}; + use crate::{ + state::Mode, + test::{NeovimBackedTestContext, VimTestContext}, + }; #[gpui::test] async fn test_move_to_next(cx: &mut gpui::TestAppContext) { @@ -474,4 +480,13 @@ mod test { cx.simulate_keystrokes(["shift-enter"]); cx.assert_editor_state("«oneˇ» one one one"); } + + #[gpui::test] + async fn test_visual_star_hash(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + + cx.set_shared_state("ˇa.c. abcd a.c. abcd").await; + cx.simulate_shared_keystrokes(["v", "3", "l", "*"]).await; + cx.assert_shared_state("a.c. abcd ˇa.c. abcd").await; + } } diff --git a/crates/vim/test_data/test_visual_star_hash.json b/crates/vim/test_data/test_visual_star_hash.json new file mode 100644 index 0000000000000000000000000000000000000000..d6523c4a45145cbbf1d053488227149c4fc99c3e --- /dev/null +++ b/crates/vim/test_data/test_visual_star_hash.json @@ -0,0 +1,6 @@ +{"Put":{"state":"ˇa.c. abcd a.c. abcd"}} +{"Key":"v"} +{"Key":"3"} +{"Key":"l"} +{"Key":"*"} +{"Get":{"state":"a.c. abcd ˇa.c. abcd","mode":"Normal"}} From 1cc7f66f86987c55a6c5d3d13f5f363de44ab680 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Fri, 19 Jan 2024 14:01:09 -0500 Subject: [PATCH 040/104] Fix documentation labels obscuring other content in completion menu (#4167) This PF fixes an issue where the documentation labels in the completion menu could end up completing obscuring the primary content. #### Before Screenshot 2024-01-19 at 1 42 19 PM #### After Screenshot 2024-01-19 at 1 39 45 PM Since this involved changes to the `ListItem`, I also made sure to test the other problematic case that was fixed in #3845 to make sure we didn't regress there: Screenshot 2024-01-19 at 1 39 11 PM I also tried to capture these cases in the `ListItem` stories to make it easier to test all of them at once: Screenshot 2024-01-19 at 1 40 03 PM Release Notes: - Fixed an issue where documentation labels could obscure other content in the editor completion menu ([#2419](https://github.com/zed-industries/community/issues/2419)). --- crates/gpui/src/styled.rs | 21 +++++++++++++++ crates/ui/src/components/list/list_item.rs | 10 ++++--- crates/ui/src/components/stories/list_item.rs | 26 +++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/crates/gpui/src/styled.rs b/crates/gpui/src/styled.rs index 508dca958349a9cb52ad69df70c5c8f2b570ba88..535cc3e0536bdb1db084016765e1aeffb4b62efa 100644 --- a/crates/gpui/src/styled.rs +++ b/crates/gpui/src/styled.rs @@ -307,6 +307,13 @@ pub trait Styled: Sized { self } + /// Sets the initial size of flex items for this element. + /// [Docs](https://tailwindcss.com/docs/flex-basis) + fn flex_basis(mut self, basis: impl Into) -> Self { + self.style().flex_basis = Some(basis.into()); + self + } + /// Sets the element to allow a flex item to grow to fill any available space. /// [Docs](https://tailwindcss.com/docs/flex-grow) fn flex_grow(mut self) -> Self { @@ -314,6 +321,20 @@ pub trait Styled: Sized { self } + /// Sets the element to allow a flex item to shrink if needed. + /// [Docs](https://tailwindcss.com/docs/flex-shrink) + fn flex_shrink(mut self) -> Self { + self.style().flex_shrink = Some(1.); + self + } + + /// Sets the element to prevent a flex item from shrinking. + /// [Docs](https://tailwindcss.com/docs/flex-shrink#dont-shrink) + fn flex_shrink_0(mut self) -> Self { + self.style().flex_shrink = Some(0.); + self + } + /// Sets the element to align flex items to the start of the container's cross axis. /// [Docs](https://tailwindcss.com/docs/align-items#start) fn items_start(mut self) -> Self { diff --git a/crates/ui/src/components/list/list_item.rs b/crates/ui/src/components/list/list_item.rs index ed1edc0864c7f6ee7435779dd7daeff9f2d329f9..33676ee11d1c27c5f36ca1faeb02c2eb6cfa3cb1 100644 --- a/crates/ui/src/components/list/list_item.rs +++ b/crates/ui/src/components/list/list_item.rs @@ -222,17 +222,19 @@ impl RenderOnce for ListItem { })) .child( h_flex() - // HACK: We need to set *any* width value here in order for this container to size correctly. - // Without this the `h_flex` will overflow the parent `inner_list_item`. - .w_px() - .flex_1() + .flex_grow() + .flex_shrink_0() + .flex_basis(relative(0.25)) .gap_1() + .overflow_hidden() .children(self.start_slot) .children(self.children), ) .when_some(self.end_slot, |this, end_slot| { this.justify_between().child( h_flex() + .flex_shrink() + .overflow_hidden() .when(self.end_hover_slot.is_some(), |this| { this.visible() .group_hover("list_item", |this| this.invisible()) diff --git a/crates/ui/src/components/stories/list_item.rs b/crates/ui/src/components/stories/list_item.rs index f2af011db8e8554b07434e699b61c8492040ede8..ae7be9b9c74c6ce2084ae84615ae7468ec64dbe0 100644 --- a/crates/ui/src/components/stories/list_item.rs +++ b/crates/ui/src/components/stories/list_item.rs @@ -4,6 +4,8 @@ use story::Story; use crate::{prelude::*, Avatar}; use crate::{IconName, ListItem}; +const OVERFLOWING_TEXT: &'static str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean mauris ligula, luctus vel dignissim eu, vestibulum sed libero. Sed at convallis velit."; + pub struct ListItemStory; impl Render for ListItemStory { @@ -98,5 +100,29 @@ impl Render for ListItemStory { println!("Right mouse down!"); }), ) + .child(Story::label("With overflowing content in the `end_slot`")) + .child( + ListItem::new("with_overflowing_content_in_end_slot") + .child("An excerpt") + .end_slot(Label::new(OVERFLOWING_TEXT).color(Color::Muted)), + ) + .child(Story::label( + "`inset` with overflowing content in the `end_slot`", + )) + .child( + ListItem::new("inset_with_overflowing_content_in_end_slot") + .inset(true) + .child("An excerpt") + .end_slot(Label::new(OVERFLOWING_TEXT).color(Color::Muted)), + ) + .child(Story::label( + "`inset` with overflowing content in `children` and `end_slot`", + )) + .child( + ListItem::new("inset_with_overflowing_content_in_children_and_end_slot") + .inset(true) + .child(Label::new(OVERFLOWING_TEXT)) + .end_slot(Label::new(OVERFLOWING_TEXT).color(Color::Muted)), + ) } } From df2b0f6d2ea2f49eb631b303682314105c278df3 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Fri, 19 Jan 2024 14:22:53 -0500 Subject: [PATCH 041/104] Add more terminal colors to the theme (#4168) This PR adds more terminal colors that were present in the Zed1 themes to the Zed2 theme. Namely, we now have the `dim_` variants for the various ANSI colors and various `foreground` colors. Release Notes: - Improved terminal colors. --- crates/terminal/src/terminal.rs | 48 +- crates/terminal_view/src/terminal_element.rs | 62 +-- crates/theme/src/default_colors.rs | 38 +- crates/theme/src/one_themes.rs | 11 + crates/theme/src/styles/colors.rs | 73 ++- crates/theme/src/themes/andromeda.rs | 27 +- crates/theme/src/themes/atelier.rs | 540 +++++++++++++------ crates/theme/src/themes/ayu.rs | 81 ++- crates/theme/src/themes/gruvbox.rs | 162 ++++-- crates/theme/src/themes/one.rs | 54 +- crates/theme/src/themes/rose_pine.rs | 81 ++- crates/theme/src/themes/sandcastle.rs | 27 +- crates/theme/src/themes/solarized.rs | 54 +- crates/theme/src/themes/summercamp.rs | 27 +- crates/theme_importer/src/theme_printer.rs | 33 +- crates/theme_importer/src/zed1/converter.rs | 27 +- 16 files changed, 926 insertions(+), 419 deletions(-) diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index ede9dc1af0a9fef1134d485c5fae3f70475ed258..502706eb5b30bebe35507e1a9fddeb951d674c53 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -52,9 +52,9 @@ use std::{ use thiserror::Error; use gpui::{ - actions, black, px, red, AnyWindowHandle, AppContext, Bounds, ClipboardItem, EventEmitter, - Hsla, Keystroke, ModelContext, Modifiers, MouseButton, MouseDownEvent, MouseMoveEvent, - MouseUpEvent, Pixels, Point, Rgba, ScrollWheelEvent, Size, Task, TouchPhase, + actions, black, px, AnyWindowHandle, AppContext, Bounds, ClipboardItem, EventEmitter, Hsla, + Keystroke, ModelContext, Modifiers, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent, + Pixels, Point, Rgba, ScrollWheelEvent, Size, Task, TouchPhase, }; use crate::mappings::{colors::to_alac_rgb, keys::to_esc_str}; @@ -1380,7 +1380,7 @@ pub fn get_color_at_index(index: usize, theme: &Theme) -> Hsla { let colors = theme.colors(); match index { - //0-15 are the same as the named colors above + // 0-15 are the same as the named colors above 0 => colors.terminal_ansi_black, 1 => colors.terminal_ansi_red, 2 => colors.terminal_ansi_green, @@ -1397,34 +1397,32 @@ pub fn get_color_at_index(index: usize, theme: &Theme) -> Hsla { 13 => colors.terminal_ansi_bright_magenta, 14 => colors.terminal_ansi_bright_cyan, 15 => colors.terminal_ansi_bright_white, - //16-231 are mapped to their RGB colors on a 0-5 range per channel + // 16-231 are mapped to their RGB colors on a 0-5 range per channel 16..=231 => { - let (r, g, b) = rgb_for_index(&(index as u8)); //Split the index into it's ANSI-RGB components - let step = (u8::MAX as f32 / 5.).floor() as u8; //Split the RGB range into 5 chunks, with floor so no overflow - rgba_color(r * step, g * step, b * step) //Map the ANSI-RGB components to an RGB color + let (r, g, b) = rgb_for_index(&(index as u8)); // Split the index into it's ANSI-RGB components + let step = (u8::MAX as f32 / 5.).floor() as u8; // Split the RGB range into 5 chunks, with floor so no overflow + rgba_color(r * step, g * step, b * step) // Map the ANSI-RGB components to an RGB color } - //232-255 are a 24 step grayscale from black to white + // 232-255 are a 24 step grayscale from black to white 232..=255 => { - let i = index as u8 - 232; //Align index to 0..24 - let step = (u8::MAX as f32 / 24.).floor() as u8; //Split the RGB grayscale values into 24 chunks - rgba_color(i * step, i * step, i * step) //Map the ANSI-grayscale components to the RGB-grayscale + let i = index as u8 - 232; // Align index to 0..24 + let step = (u8::MAX as f32 / 24.).floor() as u8; // Split the RGB grayscale values into 24 chunks + rgba_color(i * step, i * step, i * step) // Map the ANSI-grayscale components to the RGB-grayscale } - //For compatibility with the alacritty::Colors interface + // For compatibility with the alacritty::Colors interface 256 => colors.text, 257 => colors.background, 258 => theme.players().local().cursor, - - // todo!(more colors) - 259 => red(), //style.dim_black, - 260 => red(), //style.dim_red, - 261 => red(), //style.dim_green, - 262 => red(), //style.dim_yellow, - 263 => red(), //style.dim_blue, - 264 => red(), //style.dim_magenta, - 265 => red(), //style.dim_cyan, - 266 => red(), //style.dim_white, - 267 => red(), //style.bright_foreground, - 268 => colors.terminal_ansi_black, //'Dim Background', non-standard color + 259 => colors.terminal_ansi_dim_black, + 260 => colors.terminal_ansi_dim_red, + 261 => colors.terminal_ansi_dim_green, + 262 => colors.terminal_ansi_dim_yellow, + 263 => colors.terminal_ansi_dim_blue, + 264 => colors.terminal_ansi_dim_magenta, + 265 => colors.terminal_ansi_dim_cyan, + 266 => colors.terminal_ansi_dim_white, + 267 => colors.terminal_bright_foreground, + 268 => colors.terminal_ansi_black, // 'Dim Background', non-standard color _ => black(), } diff --git a/crates/terminal_view/src/terminal_element.rs b/crates/terminal_view/src/terminal_element.rs index 42428c04f8f026e916478589340da9a9e4208594..78235c3579624d510d47c64fd854ab46b82c8b96 100644 --- a/crates/terminal_view/src/terminal_element.rs +++ b/crates/terminal_view/src/terminal_element.rs @@ -1,12 +1,11 @@ use editor::{Cursor, HighlightedRange, HighlightedRangeLine}; use gpui::{ - div, fill, point, px, red, relative, AnyElement, AsyncWindowContext, AvailableSpace, - BorrowWindow, Bounds, DispatchPhase, Element, ElementId, FocusHandle, Font, FontStyle, - FontWeight, HighlightStyle, Hsla, InteractiveBounds, InteractiveElement, - InteractiveElementState, Interactivity, IntoElement, LayoutId, Model, ModelContext, - ModifiersChangedEvent, MouseButton, MouseMoveEvent, Pixels, PlatformInputHandler, Point, - ShapedLine, StatefulInteractiveElement, Styled, TextRun, TextStyle, TextSystem, UnderlineStyle, - WeakView, WhiteSpace, WindowContext, + div, fill, point, px, relative, AnyElement, AsyncWindowContext, AvailableSpace, BorrowWindow, + Bounds, DispatchPhase, Element, ElementId, FocusHandle, Font, FontStyle, FontWeight, + HighlightStyle, Hsla, InteractiveBounds, InteractiveElement, InteractiveElementState, + Interactivity, IntoElement, LayoutId, Model, ModelContext, ModifiersChangedEvent, MouseButton, + MouseMoveEvent, Pixels, PlatformInputHandler, Point, ShapedLine, StatefulInteractiveElement, + Styled, TextRun, TextStyle, TextSystem, UnderlineStyle, WeakView, WhiteSpace, WindowContext, }; use itertools::Itertools; use language::CursorShape; @@ -29,7 +28,7 @@ use workspace::Workspace; use std::mem; use std::{fmt::Debug, ops::RangeInclusive}; -///The information generated during layout that is necessary for painting +/// The information generated during layout that is necessary for painting. pub struct LayoutState { cells: Vec, rects: Vec, @@ -43,7 +42,7 @@ pub struct LayoutState { gutter: Pixels, } -///Helper struct for converting data between alacritty's cursor points, and displayed cursor points +/// Helper struct for converting data between Alacritty's cursor points, and displayed cursor points. struct DisplayCursor { line: i32, col: usize, @@ -139,8 +138,8 @@ impl LayoutRect { } } -///The GPUI element that paints the terminal. -///We need to keep a reference to the view for mouse events, do we need it for any other terminal stuff, or can we move that to connection? +/// The GPUI element that paints the terminal. +/// We need to keep a reference to the view for mouse events, do we need it for any other terminal stuff, or can we move that to connection? pub struct TerminalElement { terminal: Model, workspace: WeakView, @@ -278,8 +277,8 @@ impl TerminalElement { (cells, rects) } - // Compute the cursor position and expected block width, may return a zero width if x_for_index returns - // the same position for sequential indexes. Use em_width instead + /// Computes the cursor position and expected block width, may return a zero width if x_for_index returns + /// the same position for sequential indexes. Use em_width instead fn shape_cursor( cursor_point: DisplayCursor, size: TerminalSize, @@ -306,7 +305,7 @@ impl TerminalElement { } } - /// Convert the Alacritty cell styles to GPUI text styles and background color + /// Converts the Alacritty cell styles to GPUI text styles and background color. fn cell_style( indexed: &IndexedCell, fg: terminal::alacritty_terminal::ansi::Color, @@ -506,8 +505,8 @@ impl TerminalElement { cx, ); - //Layout cursor. Rectangle is used for IME, so we should lay it out even - //if we don't end up showing it. + // Layout cursor. Rectangle is used for IME, so we should lay it out even + // if we don't end up showing it. let cursor = if let AlacCursorShape::Hidden = cursor.shape { None } else { @@ -556,7 +555,6 @@ impl TerminalElement { ) }; - //Done! LayoutState { cells, cursor, @@ -991,11 +989,11 @@ fn to_highlighted_range_lines( Some((start_y, highlighted_range_lines)) } -///Converts a 2, 8, or 24 bit color ANSI color to the GPUI equivalent +/// Converts a 2, 8, or 24 bit color ANSI color to the GPUI equivalent. fn convert_color(fg: &terminal::alacritty_terminal::ansi::Color, theme: &Theme) -> Hsla { let colors = theme.colors(); match fg { - //Named and theme defined colors + // Named and theme defined colors terminal::alacritty_terminal::ansi::Color::Named(n) => match n { NamedColor::Black => colors.terminal_ansi_black, NamedColor::Red => colors.terminal_ansi_red, @@ -1016,24 +1014,22 @@ fn convert_color(fg: &terminal::alacritty_terminal::ansi::Color, theme: &Theme) NamedColor::Foreground => colors.text, NamedColor::Background => colors.background, NamedColor::Cursor => theme.players().local().cursor, - - // todo!(more colors) - NamedColor::DimBlack => red(), - NamedColor::DimRed => red(), - NamedColor::DimGreen => red(), - NamedColor::DimYellow => red(), - NamedColor::DimBlue => red(), - NamedColor::DimMagenta => red(), - NamedColor::DimCyan => red(), - NamedColor::DimWhite => red(), - NamedColor::BrightForeground => red(), - NamedColor::DimForeground => red(), + NamedColor::DimBlack => colors.terminal_ansi_dim_black, + NamedColor::DimRed => colors.terminal_ansi_dim_red, + NamedColor::DimGreen => colors.terminal_ansi_dim_green, + NamedColor::DimYellow => colors.terminal_ansi_dim_yellow, + NamedColor::DimBlue => colors.terminal_ansi_dim_blue, + NamedColor::DimMagenta => colors.terminal_ansi_dim_magenta, + NamedColor::DimCyan => colors.terminal_ansi_dim_cyan, + NamedColor::DimWhite => colors.terminal_ansi_dim_white, + NamedColor::BrightForeground => colors.terminal_bright_foreground, + NamedColor::DimForeground => colors.terminal_dim_foreground, }, - //'True' colors + // 'True' colors terminal::alacritty_terminal::ansi::Color::Spec(rgb) => { terminal::rgba_color(rgb.r, rgb.g, rgb.b) } - //8 bit, indexed colors + // 8 bit, indexed colors terminal::alacritty_terminal::ansi::Color::Indexed(i) => { terminal::get_color_at_index(*i as usize, theme) } diff --git a/crates/theme/src/default_colors.rs b/crates/theme/src/default_colors.rs index fb88afb7dacf79d947a170e26136b293d093542b..755ece62f98a28238b4d1da97d755e5effa716f2 100644 --- a/crates/theme/src/default_colors.rs +++ b/crates/theme/src/default_colors.rs @@ -77,6 +77,9 @@ impl ThemeColors { editor_document_highlight_read_background: neutral().light_alpha().step_3(), editor_document_highlight_write_background: neutral().light_alpha().step_4(), terminal_background: neutral().light().step_1(), + terminal_foreground: black().light().step_12(), + terminal_bright_foreground: black().light().step_11(), + terminal_dim_foreground: black().light().step_10(), terminal_ansi_bright_black: black().light().step_11(), terminal_ansi_bright_red: red().light().step_10(), terminal_ansi_bright_green: green().light().step_10(), @@ -93,6 +96,14 @@ impl ThemeColors { terminal_ansi_magenta: violet().light().step_11(), terminal_ansi_cyan: cyan().light().step_11(), terminal_ansi_white: neutral().light().step_12(), + terminal_ansi_dim_black: black().light().step_11(), + terminal_ansi_dim_red: red().light().step_10(), + terminal_ansi_dim_green: green().light().step_10(), + terminal_ansi_dim_yellow: yellow().light().step_10(), + terminal_ansi_dim_blue: blue().light().step_10(), + terminal_ansi_dim_magenta: violet().light().step_10(), + terminal_ansi_dim_cyan: cyan().light().step_10(), + terminal_ansi_dim_white: neutral().light().step_11(), link_text_hover: orange().light().step_10(), } } @@ -160,22 +171,33 @@ impl ThemeColors { editor_document_highlight_read_background: neutral().dark_alpha().step_4(), editor_document_highlight_write_background: neutral().dark_alpha().step_4(), terminal_background: neutral().dark().step_1(), - terminal_ansi_bright_black: black().dark().step_11(), - terminal_ansi_bright_red: red().dark().step_10(), - terminal_ansi_bright_green: green().dark().step_10(), - terminal_ansi_bright_yellow: yellow().dark().step_10(), - terminal_ansi_bright_blue: blue().dark().step_10(), - terminal_ansi_bright_magenta: violet().dark().step_10(), - terminal_ansi_bright_cyan: cyan().dark().step_10(), - terminal_ansi_bright_white: neutral().dark().step_11(), + terminal_foreground: white().dark().step_12(), + terminal_bright_foreground: white().dark().step_11(), + terminal_dim_foreground: white().dark().step_10(), terminal_ansi_black: black().dark().step_12(), + terminal_ansi_bright_black: black().dark().step_11(), + terminal_ansi_dim_black: black().dark().step_10(), terminal_ansi_red: red().dark().step_11(), + terminal_ansi_bright_red: red().dark().step_10(), + terminal_ansi_dim_red: red().dark().step_9(), terminal_ansi_green: green().dark().step_11(), + terminal_ansi_bright_green: green().dark().step_10(), + terminal_ansi_dim_green: green().dark().step_9(), terminal_ansi_yellow: yellow().dark().step_11(), + terminal_ansi_bright_yellow: yellow().dark().step_10(), + terminal_ansi_dim_yellow: yellow().dark().step_9(), terminal_ansi_blue: blue().dark().step_11(), + terminal_ansi_bright_blue: blue().dark().step_10(), + terminal_ansi_dim_blue: blue().dark().step_9(), terminal_ansi_magenta: violet().dark().step_11(), + terminal_ansi_bright_magenta: violet().dark().step_10(), + terminal_ansi_dim_magenta: violet().dark().step_9(), terminal_ansi_cyan: cyan().dark().step_11(), + terminal_ansi_bright_cyan: cyan().dark().step_10(), + terminal_ansi_dim_cyan: cyan().dark().step_9(), terminal_ansi_white: neutral().dark().step_12(), + terminal_ansi_bright_white: neutral().dark().step_11(), + terminal_ansi_dim_white: neutral().dark().step_10(), link_text_hover: orange().dark().step_10(), } } diff --git a/crates/theme/src/one_themes.rs b/crates/theme/src/one_themes.rs index fab3631d13ca890ca3ccb9fa2e06605534602abd..c461779bd1b7fd332537590f7dc0acde8e03338f 100644 --- a/crates/theme/src/one_themes.rs +++ b/crates/theme/src/one_themes.rs @@ -101,6 +101,9 @@ pub(crate) fn one_dark() -> Theme { terminal_background: bg, // todo!("Use one colors for terminal") + terminal_foreground: crate::white().dark().step_12(), + terminal_bright_foreground: crate::white().dark().step_11(), + terminal_dim_foreground: crate::white().dark().step_10(), terminal_ansi_black: crate::black().dark().step_12(), terminal_ansi_red: crate::red().dark().step_11(), terminal_ansi_green: crate::green().dark().step_11(), @@ -117,6 +120,14 @@ pub(crate) fn one_dark() -> Theme { terminal_ansi_bright_magenta: crate::violet().dark().step_10(), terminal_ansi_bright_cyan: crate::cyan().dark().step_10(), terminal_ansi_bright_white: crate::neutral().dark().step_11(), + terminal_ansi_dim_black: crate::black().dark().step_10(), + terminal_ansi_dim_red: crate::red().dark().step_9(), + terminal_ansi_dim_green: crate::green().dark().step_9(), + terminal_ansi_dim_yellow: crate::yellow().dark().step_9(), + terminal_ansi_dim_blue: crate::blue().dark().step_9(), + terminal_ansi_dim_magenta: crate::violet().dark().step_9(), + terminal_ansi_dim_cyan: crate::cyan().dark().step_9(), + terminal_ansi_dim_white: crate::neutral().dark().step_10(), panel_background: bg, panel_focused_border: blue, pane_focused_border: blue, diff --git a/crates/theme/src/styles/colors.rs b/crates/theme/src/styles/colors.rs index 51f3949897c2195ac5620886cf6b58dedebea9f2..a01e73f5ef3e47820c2aa58ae07db842584e3767 100644 --- a/crates/theme/src/styles/colors.rs +++ b/crates/theme/src/styles/colors.rs @@ -169,40 +169,63 @@ pub struct ThemeColors { // === // Terminal // === - /// Terminal Background Color + /// Terminal background color. pub terminal_background: Hsla, - /// Bright Black Color for ANSI Terminal - pub terminal_ansi_bright_black: Hsla, - /// Bright Red Color for ANSI Terminal - pub terminal_ansi_bright_red: Hsla, - /// Bright Green Color for ANSI Terminal - pub terminal_ansi_bright_green: Hsla, - /// Bright Yellow Color for ANSI Terminal - pub terminal_ansi_bright_yellow: Hsla, - /// Bright Blue Color for ANSI Terminal - pub terminal_ansi_bright_blue: Hsla, - /// Bright Magenta Color for ANSI Terminal - pub terminal_ansi_bright_magenta: Hsla, - /// Bright Cyan Color for ANSI Terminal - pub terminal_ansi_bright_cyan: Hsla, - /// Bright White Color for ANSI Terminal - pub terminal_ansi_bright_white: Hsla, - /// Black Color for ANSI Terminal + /// Terminal foreground color. + pub terminal_foreground: Hsla, + /// Bright terminal foreground color. + pub terminal_bright_foreground: Hsla, + /// Dim terminal foreground color. + pub terminal_dim_foreground: Hsla, + + /// Black ANSI terminal color. pub terminal_ansi_black: Hsla, - /// Red Color for ANSI Terminal + /// Bright black ANSI terminal color. + pub terminal_ansi_bright_black: Hsla, + /// Dim black ANSI terminal color. + pub terminal_ansi_dim_black: Hsla, + /// Red ANSI terminal color. pub terminal_ansi_red: Hsla, - /// Green Color for ANSI Terminal + /// Bright red ANSI terminal color. + pub terminal_ansi_bright_red: Hsla, + /// Dim red ANSI terminal color. + pub terminal_ansi_dim_red: Hsla, + /// Green ANSI terminal color. pub terminal_ansi_green: Hsla, - /// Yellow Color for ANSI Terminal + /// Bright green ANSI terminal color. + pub terminal_ansi_bright_green: Hsla, + /// Dim green ANSI terminal color. + pub terminal_ansi_dim_green: Hsla, + /// Yellow ANSI terminal color. pub terminal_ansi_yellow: Hsla, - /// Blue Color for ANSI Terminal + /// Bright yellow ANSI terminal color. + pub terminal_ansi_bright_yellow: Hsla, + /// Dim yellow ANSI terminal color. + pub terminal_ansi_dim_yellow: Hsla, + /// Blue ANSI terminal color. pub terminal_ansi_blue: Hsla, - /// Magenta Color for ANSI Terminal + /// Bright blue ANSI terminal color. + pub terminal_ansi_bright_blue: Hsla, + /// Dim blue ANSI terminal color. + pub terminal_ansi_dim_blue: Hsla, + /// Magenta ANSI terminal color. pub terminal_ansi_magenta: Hsla, - /// Cyan Color for ANSI Terminal + /// Bright magenta ANSI terminal color. + pub terminal_ansi_bright_magenta: Hsla, + /// Dim magenta ANSI terminal color. + pub terminal_ansi_dim_magenta: Hsla, + /// Cyan ANSI terminal color. pub terminal_ansi_cyan: Hsla, - /// White Color for ANSI Terminal + /// Bright cyan ANSI terminal color. + pub terminal_ansi_bright_cyan: Hsla, + /// Dim cyan ANSI terminal color. + pub terminal_ansi_dim_cyan: Hsla, + /// White ANSI terminal color. pub terminal_ansi_white: Hsla, + /// Bright white ANSI terminal color. + pub terminal_ansi_bright_white: Hsla, + /// Dim white ANSI terminal color. + pub terminal_ansi_dim_white: Hsla, // === // UI/Rich Text diff --git a/crates/theme/src/themes/andromeda.rs b/crates/theme/src/themes/andromeda.rs index 45dc66094518c5ab25fe2ad12e616213e4520994..184e27833d58fc5e203afb79fbb6a359a30b9c76 100644 --- a/crates/theme/src/themes/andromeda.rs +++ b/crates/theme/src/themes/andromeda.rs @@ -75,22 +75,33 @@ pub fn andromeda() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x11a7931a).into()), editor_document_highlight_write_background: Some(rgba(0x64646d66).into()), terminal_background: Some(rgba(0x1e2025ff).into()), - terminal_ansi_bright_black: Some(rgba(0x40434cff).into()), - terminal_ansi_bright_red: Some(rgba(0x8e103aff).into()), - terminal_ansi_bright_green: Some(rgba(0x457c38ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x958435ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x1b5148ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x682781ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x018169ff).into()), - terminal_ansi_bright_white: Some(rgba(0xf7f7f8ff).into()), + terminal_foreground: Some(rgba(0xf7f7f8ff).into()), + terminal_bright_foreground: Some(rgba(0xf7f7f8ff).into()), + terminal_dim_foreground: Some(rgba(0x1e2025ff).into()), terminal_ansi_black: Some(rgba(0x1e2025ff).into()), + terminal_ansi_bright_black: Some(rgba(0x40434cff).into()), + terminal_ansi_dim_black: Some(rgba(0xf7f7f8ff).into()), terminal_ansi_red: Some(rgba(0xf82872ff).into()), + terminal_ansi_bright_red: Some(rgba(0x8e103aff).into()), + terminal_ansi_dim_red: Some(rgba(0xffa3b6ff).into()), terminal_ansi_green: Some(rgba(0x96df72ff).into()), + terminal_ansi_bright_green: Some(rgba(0x457c38ff).into()), + terminal_ansi_dim_green: Some(rgba(0xcef0b9ff).into()), terminal_ansi_yellow: Some(rgba(0xfee56dff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x958435ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xfff2b8ff).into()), terminal_ansi_blue: Some(rgba(0x11a793ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x1b5148ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x9cd4c8ff).into()), terminal_ansi_magenta: Some(rgba(0xc74decff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x682781ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xe8abf7ff).into()), terminal_ansi_cyan: Some(rgba(0x09e7c6ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x018169ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xaaf5e2ff).into()), terminal_ansi_white: Some(rgba(0xf7f7f8ff).into()), + terminal_ansi_bright_white: Some(rgba(0xf7f7f8ff).into()), + terminal_ansi_dim_white: Some(rgba(0x88868dff).into()), link_text_hover: Some(rgba(0x11a793ff).into()), ..Default::default() }, diff --git a/crates/theme/src/themes/atelier.rs b/crates/theme/src/themes/atelier.rs index e0682b217e0442a53d7c25e6ac8e1339fc55524b..300c16f94c84bdbb49bae0549b74574d98dd1d7d 100644 --- a/crates/theme/src/themes/atelier.rs +++ b/crates/theme/src/themes/atelier.rs @@ -76,22 +76,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x576dda1a).into()), editor_document_highlight_write_background: Some(rgba(0x726c7a66).into()), terminal_background: Some(rgba(0x19171cff).into()), - terminal_ansi_bright_black: Some(rgba(0x635d6bff).into()), - terminal_ansi_bright_red: Some(rgba(0x5c283cff).into()), - terminal_ansi_bright_green: Some(rgba(0x1f4747ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x4e3821ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x2d376fff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x60255bff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x26445eff).into()), - terminal_ansi_bright_white: Some(rgba(0xefecf4ff).into()), + terminal_foreground: Some(rgba(0xefecf4ff).into()), + terminal_bright_foreground: Some(rgba(0xefecf4ff).into()), + terminal_dim_foreground: Some(rgba(0x19171cff).into()), terminal_ansi_black: Some(rgba(0x19171cff).into()), + terminal_ansi_bright_black: Some(rgba(0x635d6bff).into()), + terminal_ansi_dim_black: Some(rgba(0xefecf4ff).into()), terminal_ansi_red: Some(rgba(0xbe4678ff).into()), + terminal_ansi_bright_red: Some(rgba(0x5c283cff).into()), + terminal_ansi_dim_red: Some(rgba(0xe3a4b9ff).into()), terminal_ansi_green: Some(rgba(0x2c9292ff).into()), + terminal_ansi_bright_green: Some(rgba(0x1f4747ff).into()), + terminal_ansi_dim_green: Some(rgba(0x9dc8c8ff).into()), terminal_ansi_yellow: Some(rgba(0xa06e3bff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x4e3821ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xd4b499ff).into()), terminal_ansi_blue: Some(rgba(0x576ddaff).into()), + terminal_ansi_bright_blue: Some(rgba(0x2d376fff).into()), + terminal_ansi_dim_blue: Some(rgba(0xb3b3eeff).into()), terminal_ansi_magenta: Some(rgba(0xbf41bfff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x60255bff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xe3a4dfff).into()), terminal_ansi_cyan: Some(rgba(0x3a8bc6ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x26445eff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xa6c4e3ff).into()), terminal_ansi_white: Some(rgba(0xefecf4ff).into()), + terminal_ansi_bright_white: Some(rgba(0xefecf4ff).into()), + terminal_ansi_dim_white: Some(rgba(0x807b89ff).into()), link_text_hover: Some(rgba(0x576ddaff).into()), ..Default::default() }, @@ -541,22 +552,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x586dda1a).into()), editor_document_highlight_write_background: Some(rgba(0x726c7a66).into()), terminal_background: Some(rgba(0xefecf4ff).into()), - terminal_ansi_bright_black: Some(rgba(0x807b89ff).into()), - terminal_ansi_bright_red: Some(rgba(0xe3a4b9ff).into()), - terminal_ansi_bright_green: Some(rgba(0x9dc8c8ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xd4b499ff).into()), - terminal_ansi_bright_blue: Some(rgba(0xb3b3eeff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xe3a4dfff).into()), - terminal_ansi_bright_cyan: Some(rgba(0xa6c4e3ff).into()), - terminal_ansi_bright_white: Some(rgba(0x19171cff).into()), + terminal_foreground: Some(rgba(0x19171cff).into()), + terminal_bright_foreground: Some(rgba(0x19171cff).into()), + terminal_dim_foreground: Some(rgba(0xefecf4ff).into()), terminal_ansi_black: Some(rgba(0xefecf4ff).into()), + terminal_ansi_bright_black: Some(rgba(0x807b89ff).into()), + terminal_ansi_dim_black: Some(rgba(0x19171cff).into()), terminal_ansi_red: Some(rgba(0xbe4778ff).into()), + terminal_ansi_bright_red: Some(rgba(0xe3a4b9ff).into()), + terminal_ansi_dim_red: Some(rgba(0x5c283cff).into()), terminal_ansi_green: Some(rgba(0x2c9292ff).into()), + terminal_ansi_bright_green: Some(rgba(0x9dc8c8ff).into()), + terminal_ansi_dim_green: Some(rgba(0x1f4747ff).into()), terminal_ansi_yellow: Some(rgba(0xa06e3cff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xd4b499ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x4e3821ff).into()), terminal_ansi_blue: Some(rgba(0x586ddaff).into()), + terminal_ansi_bright_blue: Some(rgba(0xb3b3eeff).into()), + terminal_ansi_dim_blue: Some(rgba(0x2d376fff).into()), terminal_ansi_magenta: Some(rgba(0xbf41bfff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xe3a4dfff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x60255bff).into()), terminal_ansi_cyan: Some(rgba(0x3b8bc6ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0xa6c4e3ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x26445eff).into()), terminal_ansi_white: Some(rgba(0x19171cff).into()), + terminal_ansi_bright_white: Some(rgba(0x19171cff).into()), + terminal_ansi_dim_white: Some(rgba(0x635d6bff).into()), link_text_hover: Some(rgba(0x586ddaff).into()), ..Default::default() }, @@ -1006,22 +1028,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x6684e01a).into()), editor_document_highlight_write_background: Some(rgba(0x8b887466).into()), terminal_background: Some(rgba(0x20201dff).into()), - terminal_ansi_bright_black: Some(rgba(0x7a7766ff).into()), - terminal_ansi_bright_red: Some(rgba(0x781c1fff).into()), - terminal_ansi_bright_green: Some(rgba(0x335322ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x574815ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x334173ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x721d2bff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x1e5341ff).into()), - terminal_ansi_bright_white: Some(rgba(0xfefbecff).into()), + terminal_foreground: Some(rgba(0xfefbecff).into()), + terminal_bright_foreground: Some(rgba(0xfefbecff).into()), + terminal_dim_foreground: Some(rgba(0x20201dff).into()), terminal_ansi_black: Some(rgba(0x20201dff).into()), + terminal_ansi_bright_black: Some(rgba(0x7a7766ff).into()), + terminal_ansi_dim_black: Some(rgba(0xfefbecff).into()), terminal_ansi_red: Some(rgba(0xd73837ff).into()), + terminal_ansi_bright_red: Some(rgba(0x781c1fff).into()), + terminal_ansi_dim_red: Some(rgba(0xf7a195ff).into()), terminal_ansi_green: Some(rgba(0x60ac3aff).into()), + terminal_ansi_bright_green: Some(rgba(0x335322ff).into()), + terminal_ansi_dim_green: Some(rgba(0xb3d69cff).into()), terminal_ansi_yellow: Some(rgba(0xae9515ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x574815ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xdcc98eff).into()), terminal_ansi_blue: Some(rgba(0x6684e0ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x334173ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xb8c0f1ff).into()), terminal_ansi_magenta: Some(rgba(0xd43652ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x721d2bff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xf3a0a4ff).into()), terminal_ansi_cyan: Some(rgba(0x21ad83ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x1e5341ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x9ed7c0ff).into()), terminal_ansi_white: Some(rgba(0xfefbecff).into()), + terminal_ansi_bright_white: Some(rgba(0xfefbecff).into()), + terminal_ansi_dim_white: Some(rgba(0x9b9782ff).into()), link_text_hover: Some(rgba(0x6684e0ff).into()), ..Default::default() }, @@ -1471,22 +1504,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x6784e01a).into()), editor_document_highlight_write_background: Some(rgba(0x8b887466).into()), terminal_background: Some(rgba(0xfefbecff).into()), - terminal_ansi_bright_black: Some(rgba(0x9b9782ff).into()), - terminal_ansi_bright_red: Some(rgba(0xf7a195ff).into()), - terminal_ansi_bright_green: Some(rgba(0xb3d69cff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xdcc98eff).into()), - terminal_ansi_bright_blue: Some(rgba(0xb8c0f1ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xf3a0a4ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x9ed7c0ff).into()), - terminal_ansi_bright_white: Some(rgba(0x20201dff).into()), + terminal_foreground: Some(rgba(0x20201dff).into()), + terminal_bright_foreground: Some(rgba(0x20201dff).into()), + terminal_dim_foreground: Some(rgba(0xfefbecff).into()), terminal_ansi_black: Some(rgba(0xfefbecff).into()), + terminal_ansi_bright_black: Some(rgba(0x9b9782ff).into()), + terminal_ansi_dim_black: Some(rgba(0x20201dff).into()), terminal_ansi_red: Some(rgba(0xd73838ff).into()), + terminal_ansi_bright_red: Some(rgba(0xf7a195ff).into()), + terminal_ansi_dim_red: Some(rgba(0x781c1fff).into()), terminal_ansi_green: Some(rgba(0x61ac3aff).into()), + terminal_ansi_bright_green: Some(rgba(0xb3d69cff).into()), + terminal_ansi_dim_green: Some(rgba(0x335322ff).into()), terminal_ansi_yellow: Some(rgba(0xae9515ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xdcc98eff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x574815ff).into()), terminal_ansi_blue: Some(rgba(0x6784e0ff).into()), + terminal_ansi_bright_blue: Some(rgba(0xb8c0f1ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x334173ff).into()), terminal_ansi_magenta: Some(rgba(0xd43753ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xf3a0a4ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x721d2bff).into()), terminal_ansi_cyan: Some(rgba(0x22ad83ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x9ed7c0ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x1e5341ff).into()), terminal_ansi_white: Some(rgba(0x20201dff).into()), + terminal_ansi_bright_white: Some(rgba(0x20201dff).into()), + terminal_ansi_dim_white: Some(rgba(0x7a7766ff).into()), link_text_hover: Some(rgba(0x6784e0ff).into()), ..Default::default() }, @@ -1936,22 +1980,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x37a1661a).into()), editor_document_highlight_write_background: Some(rgba(0x7a786766).into()), terminal_background: Some(rgba(0x22221bff).into()), - terminal_ansi_bright_black: Some(rgba(0x6a6958ff).into()), - terminal_ansi_bright_red: Some(rgba(0x5c331fff).into()), - terminal_ansi_bright_green: Some(rgba(0x3f491aff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x514a14ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x234e34ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x4c373eff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x314c27ff).into()), - terminal_ansi_bright_white: Some(rgba(0xf4f3ecff).into()), + terminal_foreground: Some(rgba(0xf4f3ecff).into()), + terminal_bright_foreground: Some(rgba(0xf4f3ecff).into()), + terminal_dim_foreground: Some(rgba(0x22221bff).into()), terminal_ansi_black: Some(rgba(0x22221bff).into()), + terminal_ansi_bright_black: Some(rgba(0x6a6958ff).into()), + terminal_ansi_dim_black: Some(rgba(0xf4f3ecff).into()), terminal_ansi_red: Some(rgba(0xba6237ff).into()), + terminal_ansi_bright_red: Some(rgba(0x5c331fff).into()), + terminal_ansi_dim_red: Some(rgba(0xe4af96ff).into()), terminal_ansi_green: Some(rgba(0x7d9727ff).into()), + terminal_ansi_bright_green: Some(rgba(0x3f491aff).into()), + terminal_ansi_dim_green: Some(rgba(0xc0ca93ff).into()), terminal_ansi_yellow: Some(rgba(0xa59810ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x514a14ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xd7ca8dff).into()), terminal_ansi_blue: Some(rgba(0x37a166ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x234e34ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xa0d1b0ff).into()), terminal_ansi_magenta: Some(rgba(0x9d6c7cff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x4c373eff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xcfb4bcff).into()), terminal_ansi_cyan: Some(rgba(0x5b9d48ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x314c27ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xaecea1ff).into()), terminal_ansi_white: Some(rgba(0xf4f3ecff).into()), + terminal_ansi_bright_white: Some(rgba(0xf4f3ecff).into()), + terminal_ansi_dim_white: Some(rgba(0x898775ff).into()), link_text_hover: Some(rgba(0x37a166ff).into()), ..Default::default() }, @@ -2401,22 +2456,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x38a1661a).into()), editor_document_highlight_write_background: Some(rgba(0x7a786766).into()), terminal_background: Some(rgba(0xf4f3ecff).into()), - terminal_ansi_bright_black: Some(rgba(0x898775ff).into()), - terminal_ansi_bright_red: Some(rgba(0xe4af96ff).into()), - terminal_ansi_bright_green: Some(rgba(0xc0ca93ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xd7ca8dff).into()), - terminal_ansi_bright_blue: Some(rgba(0xa0d1b0ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xcfb4bcff).into()), - terminal_ansi_bright_cyan: Some(rgba(0xaecea1ff).into()), - terminal_ansi_bright_white: Some(rgba(0x22221bff).into()), + terminal_foreground: Some(rgba(0x22221bff).into()), + terminal_bright_foreground: Some(rgba(0x22221bff).into()), + terminal_dim_foreground: Some(rgba(0xf4f3ecff).into()), terminal_ansi_black: Some(rgba(0xf4f3ecff).into()), + terminal_ansi_bright_black: Some(rgba(0x898775ff).into()), + terminal_ansi_dim_black: Some(rgba(0x22221bff).into()), terminal_ansi_red: Some(rgba(0xba6337ff).into()), + terminal_ansi_bright_red: Some(rgba(0xe4af96ff).into()), + terminal_ansi_dim_red: Some(rgba(0x5c331fff).into()), terminal_ansi_green: Some(rgba(0x7d9728ff).into()), + terminal_ansi_bright_green: Some(rgba(0xc0ca93ff).into()), + terminal_ansi_dim_green: Some(rgba(0x3f491aff).into()), terminal_ansi_yellow: Some(rgba(0xa59810ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xd7ca8dff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x514a14ff).into()), terminal_ansi_blue: Some(rgba(0x38a166ff).into()), + terminal_ansi_bright_blue: Some(rgba(0xa0d1b0ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x234e34ff).into()), terminal_ansi_magenta: Some(rgba(0x9d6c7cff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xcfb4bcff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x4c373eff).into()), terminal_ansi_cyan: Some(rgba(0x5c9d49ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0xaecea1ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x314c27ff).into()), terminal_ansi_white: Some(rgba(0x22221bff).into()), + terminal_ansi_bright_white: Some(rgba(0x22221bff).into()), + terminal_ansi_dim_white: Some(rgba(0x6a6958ff).into()), link_text_hover: Some(rgba(0x38a166ff).into()), ..Default::default() }, @@ -2866,22 +2932,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x417ee61a).into()), editor_document_highlight_write_background: Some(rgba(0x89817e66).into()), terminal_background: Some(rgba(0x1b1918ff).into()), - terminal_ansi_bright_black: Some(rgba(0x746c69ff).into()), - terminal_ansi_bright_red: Some(rgba(0x8c1223ff).into()), - terminal_ansi_bright_green: Some(rgba(0x3e491aff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x674115ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x213f78ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x662186ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x264958ff).into()), - terminal_ansi_bright_white: Some(rgba(0xf1efeeff).into()), + terminal_foreground: Some(rgba(0xf1efeeff).into()), + terminal_bright_foreground: Some(rgba(0xf1efeeff).into()), + terminal_dim_foreground: Some(rgba(0x1b1918ff).into()), terminal_ansi_black: Some(rgba(0x1b1918ff).into()), + terminal_ansi_bright_black: Some(rgba(0x746c69ff).into()), + terminal_ansi_dim_black: Some(rgba(0xf1efeeff).into()), terminal_ansi_red: Some(rgba(0xf22d40ff).into()), + terminal_ansi_bright_red: Some(rgba(0x8c1223ff).into()), + terminal_ansi_dim_red: Some(rgba(0xffa29aff).into()), terminal_ansi_green: Some(rgba(0x7b9727ff).into()), + terminal_ansi_bright_green: Some(rgba(0x3e491aff).into()), + terminal_ansi_dim_green: Some(rgba(0xbfca93ff).into()), terminal_ansi_yellow: Some(rgba(0xc38419ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x674115ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xe9c08eff).into()), terminal_ansi_blue: Some(rgba(0x417ee6ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x213f78ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xaebcf4ff).into()), terminal_ansi_magenta: Some(rgba(0xc340f2ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x662186ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xe7a6fbff).into()), terminal_ansi_cyan: Some(rgba(0x3e97b8ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x264958ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xa6cadbff).into()), terminal_ansi_white: Some(rgba(0xf1efeeff).into()), + terminal_ansi_bright_white: Some(rgba(0xf1efeeff).into()), + terminal_ansi_dim_white: Some(rgba(0x9e9693ff).into()), link_text_hover: Some(rgba(0x417ee6ff).into()), ..Default::default() }, @@ -3331,22 +3408,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x417ee61a).into()), editor_document_highlight_write_background: Some(rgba(0x89817e66).into()), terminal_background: Some(rgba(0xf1efeeff).into()), - terminal_ansi_bright_black: Some(rgba(0x9e9693ff).into()), - terminal_ansi_bright_red: Some(rgba(0xffa29aff).into()), - terminal_ansi_bright_green: Some(rgba(0xbfca93ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xe9c08eff).into()), - terminal_ansi_bright_blue: Some(rgba(0xaebcf4ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xe7a6fbff).into()), - terminal_ansi_bright_cyan: Some(rgba(0xa6cadbff).into()), - terminal_ansi_bright_white: Some(rgba(0x1b1918ff).into()), + terminal_foreground: Some(rgba(0x1b1918ff).into()), + terminal_bright_foreground: Some(rgba(0x1b1918ff).into()), + terminal_dim_foreground: Some(rgba(0xf1efeeff).into()), terminal_ansi_black: Some(rgba(0xf1efeeff).into()), + terminal_ansi_bright_black: Some(rgba(0x9e9693ff).into()), + terminal_ansi_dim_black: Some(rgba(0x1b1918ff).into()), terminal_ansi_red: Some(rgba(0xf22e41ff).into()), + terminal_ansi_bright_red: Some(rgba(0xffa29aff).into()), + terminal_ansi_dim_red: Some(rgba(0x8c1223ff).into()), terminal_ansi_green: Some(rgba(0x7b9728ff).into()), + terminal_ansi_bright_green: Some(rgba(0xbfca93ff).into()), + terminal_ansi_dim_green: Some(rgba(0x3e491aff).into()), terminal_ansi_yellow: Some(rgba(0xc3841aff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xe9c08eff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x674115ff).into()), terminal_ansi_blue: Some(rgba(0x417ee6ff).into()), + terminal_ansi_bright_blue: Some(rgba(0xaebcf4ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x213f78ff).into()), terminal_ansi_magenta: Some(rgba(0xc340f2ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xe7a6fbff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x662186ff).into()), terminal_ansi_cyan: Some(rgba(0x3f97b8ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0xa6cadbff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x264958ff).into()), terminal_ansi_white: Some(rgba(0x1b1918ff).into()), + terminal_ansi_bright_white: Some(rgba(0x1b1918ff).into()), + terminal_ansi_dim_white: Some(rgba(0x746c69ff).into()), link_text_hover: Some(rgba(0x417ee6ff).into()), ..Default::default() }, @@ -3796,22 +3884,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x526aeb1a).into()), editor_document_highlight_write_background: Some(rgba(0x8b7c8b66).into()), terminal_background: Some(rgba(0x1b181bff).into()), - terminal_ansi_bright_black: Some(rgba(0x756775ff).into()), - terminal_ansi_bright_red: Some(rgba(0x6d221aff).into()), - terminal_ansi_bright_green: Some(rgba(0x474422ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x5e441fff).into()), - terminal_ansi_bright_blue: Some(rgba(0x26367eff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x6c1e67ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x1a4848ff).into()), - terminal_ansi_bright_white: Some(rgba(0xf7f3f7ff).into()), + terminal_foreground: Some(rgba(0xf7f3f7ff).into()), + terminal_bright_foreground: Some(rgba(0xf7f3f7ff).into()), + terminal_dim_foreground: Some(rgba(0x1b181bff).into()), terminal_ansi_black: Some(rgba(0x1b181bff).into()), + terminal_ansi_bright_black: Some(rgba(0x756775ff).into()), + terminal_ansi_dim_black: Some(rgba(0xf7f3f7ff).into()), terminal_ansi_red: Some(rgba(0xca402cff).into()), + terminal_ansi_bright_red: Some(rgba(0x6d221aff).into()), + terminal_ansi_dim_red: Some(rgba(0xf0a28fff).into()), terminal_ansi_green: Some(rgba(0x918b3bff).into()), + terminal_ansi_bright_green: Some(rgba(0x474422ff).into()), + terminal_ansi_dim_green: Some(rgba(0xcac49aff).into()), terminal_ansi_yellow: Some(rgba(0xbb8a36ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x5e441fff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xe2c398ff).into()), terminal_ansi_blue: Some(rgba(0x526aebff).into()), + terminal_ansi_bright_blue: Some(rgba(0x26367eff).into()), + terminal_ansi_dim_blue: Some(rgba(0xb4b2f7ff).into()), terminal_ansi_magenta: Some(rgba(0xcc34ccff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x6c1e67ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xeba2e6ff).into()), terminal_ansi_cyan: Some(rgba(0x189393ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x1a4848ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x9ac9c8ff).into()), terminal_ansi_white: Some(rgba(0xf7f3f7ff).into()), + terminal_ansi_bright_white: Some(rgba(0xf7f3f7ff).into()), + terminal_ansi_dim_white: Some(rgba(0xa091a0ff).into()), link_text_hover: Some(rgba(0x526aebff).into()), ..Default::default() }, @@ -4261,22 +4360,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x526aeb1a).into()), editor_document_highlight_write_background: Some(rgba(0x8b7c8b66).into()), terminal_background: Some(rgba(0xf7f3f7ff).into()), - terminal_ansi_bright_black: Some(rgba(0xa091a0ff).into()), - terminal_ansi_bright_red: Some(rgba(0xf0a28fff).into()), - terminal_ansi_bright_green: Some(rgba(0xcac49aff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xe2c398ff).into()), - terminal_ansi_bright_blue: Some(rgba(0xb4b2f7ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xeba2e6ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x9ac9c8ff).into()), - terminal_ansi_bright_white: Some(rgba(0x1b181bff).into()), + terminal_foreground: Some(rgba(0x1b181bff).into()), + terminal_bright_foreground: Some(rgba(0x1b181bff).into()), + terminal_dim_foreground: Some(rgba(0xf7f3f7ff).into()), terminal_ansi_black: Some(rgba(0xf7f3f7ff).into()), + terminal_ansi_bright_black: Some(rgba(0xa091a0ff).into()), + terminal_ansi_dim_black: Some(rgba(0x1b181bff).into()), terminal_ansi_red: Some(rgba(0xca412cff).into()), + terminal_ansi_bright_red: Some(rgba(0xf0a28fff).into()), + terminal_ansi_dim_red: Some(rgba(0x6d221aff).into()), terminal_ansi_green: Some(rgba(0x918b3cff).into()), + terminal_ansi_bright_green: Some(rgba(0xcac49aff).into()), + terminal_ansi_dim_green: Some(rgba(0x474422ff).into()), terminal_ansi_yellow: Some(rgba(0xbb8a36ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xe2c398ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x5e441fff).into()), terminal_ansi_blue: Some(rgba(0x526aebff).into()), + terminal_ansi_bright_blue: Some(rgba(0xb4b2f7ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x26367eff).into()), terminal_ansi_magenta: Some(rgba(0xcc35ccff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xeba2e6ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x6c1e67ff).into()), terminal_ansi_cyan: Some(rgba(0x199393ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x9ac9c8ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x1a4848ff).into()), terminal_ansi_white: Some(rgba(0x1b181bff).into()), + terminal_ansi_bright_white: Some(rgba(0x1b181bff).into()), + terminal_ansi_dim_white: Some(rgba(0x756775ff).into()), link_text_hover: Some(rgba(0x526aebff).into()), ..Default::default() }, @@ -4726,22 +4836,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x277fad1a).into()), editor_document_highlight_write_background: Some(rgba(0x66889a66).into()), terminal_background: Some(rgba(0x161b1dff).into()), - terminal_ansi_bright_black: Some(rgba(0x587989ff).into()), - terminal_ansi_bright_red: Some(rgba(0x6f1c3aff).into()), - terminal_ansi_bright_green: Some(rgba(0x2e4522ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x454413ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x1e3f53ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x5c1e6bff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x1f4638ff).into()), - terminal_ansi_bright_white: Some(rgba(0xebf8ffff).into()), + terminal_foreground: Some(rgba(0xebf8ffff).into()), + terminal_bright_foreground: Some(rgba(0xebf8ffff).into()), + terminal_dim_foreground: Some(rgba(0x161b1dff).into()), terminal_ansi_black: Some(rgba(0x161b1dff).into()), + terminal_ansi_bright_black: Some(rgba(0x587989ff).into()), + terminal_ansi_dim_black: Some(rgba(0xebf8ffff).into()), terminal_ansi_red: Some(rgba(0xd22e72ff).into()), + terminal_ansi_bright_red: Some(rgba(0x6f1c3aff).into()), + terminal_ansi_dim_red: Some(rgba(0xf09fb6ff).into()), terminal_ansi_green: Some(rgba(0x568c3bff).into()), + terminal_ansi_bright_green: Some(rgba(0x2e4522ff).into()), + terminal_ansi_dim_green: Some(rgba(0xabc59aff).into()), terminal_ansi_yellow: Some(rgba(0x8a8a11ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x454413ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xc8c38bff).into()), terminal_ansi_blue: Some(rgba(0x277fadff).into()), + terminal_ansi_bright_blue: Some(rgba(0x1e3f53ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x9ebdd6ff).into()), terminal_ansi_magenta: Some(rgba(0xb72ed2ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x5c1e6bff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xe09fe9ff).into()), terminal_ansi_cyan: Some(rgba(0x2e8f6fff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x1f4638ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x9bc7b5ff).into()), terminal_ansi_white: Some(rgba(0xebf8ffff).into()), + terminal_ansi_bright_white: Some(rgba(0xebf8ffff).into()), + terminal_ansi_dim_white: Some(rgba(0x7397aaff).into()), link_text_hover: Some(rgba(0x277fadff).into()), ..Default::default() }, @@ -5191,22 +5312,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x277fad1a).into()), editor_document_highlight_write_background: Some(rgba(0x66889a66).into()), terminal_background: Some(rgba(0xebf8ffff).into()), - terminal_ansi_bright_black: Some(rgba(0x7397aaff).into()), - terminal_ansi_bright_red: Some(rgba(0xf09fb6ff).into()), - terminal_ansi_bright_green: Some(rgba(0xabc59aff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xc8c38bff).into()), - terminal_ansi_bright_blue: Some(rgba(0x9ebdd6ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xe09fe9ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x9bc7b5ff).into()), - terminal_ansi_bright_white: Some(rgba(0x161b1dff).into()), + terminal_foreground: Some(rgba(0x161b1dff).into()), + terminal_bright_foreground: Some(rgba(0x161b1dff).into()), + terminal_dim_foreground: Some(rgba(0xebf8ffff).into()), terminal_ansi_black: Some(rgba(0xebf8ffff).into()), + terminal_ansi_bright_black: Some(rgba(0x7397aaff).into()), + terminal_ansi_dim_black: Some(rgba(0x161b1dff).into()), terminal_ansi_red: Some(rgba(0xd22f72ff).into()), + terminal_ansi_bright_red: Some(rgba(0xf09fb6ff).into()), + terminal_ansi_dim_red: Some(rgba(0x6f1c3aff).into()), terminal_ansi_green: Some(rgba(0x578c3cff).into()), + terminal_ansi_bright_green: Some(rgba(0xabc59aff).into()), + terminal_ansi_dim_green: Some(rgba(0x2e4522ff).into()), terminal_ansi_yellow: Some(rgba(0x8a8a11ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xc8c38bff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x454413ff).into()), terminal_ansi_blue: Some(rgba(0x277fadff).into()), + terminal_ansi_bright_blue: Some(rgba(0x9ebdd6ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x1e3f53ff).into()), terminal_ansi_magenta: Some(rgba(0xb72fd2ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xe09fe9ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x5c1e6bff).into()), terminal_ansi_cyan: Some(rgba(0x2f8f6fff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x9bc7b5ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x1f4638ff).into()), terminal_ansi_white: Some(rgba(0x161b1dff).into()), + terminal_ansi_bright_white: Some(rgba(0x161b1dff).into()), + terminal_ansi_dim_white: Some(rgba(0x587989ff).into()), link_text_hover: Some(rgba(0x277fadff).into()), ..Default::default() }, @@ -5656,22 +5788,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x7272ca1a).into()), editor_document_highlight_write_background: Some(rgba(0x726a6a66).into()), terminal_background: Some(rgba(0x1b1818ff).into()), - terminal_ansi_bright_black: Some(rgba(0x635b5bff).into()), - terminal_ansi_bright_red: Some(rgba(0x692727ff).into()), - terminal_ansi_bright_green: Some(rgba(0x2a4444ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x4e3821ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x3b3960ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x5b2c42ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x2e4257ff).into()), - terminal_ansi_bright_white: Some(rgba(0xf4ececff).into()), + terminal_foreground: Some(rgba(0xf4ececff).into()), + terminal_bright_foreground: Some(rgba(0xf4ececff).into()), + terminal_dim_foreground: Some(rgba(0x1b1818ff).into()), terminal_ansi_black: Some(rgba(0x1b1818ff).into()), + terminal_ansi_bright_black: Some(rgba(0x635b5bff).into()), + terminal_ansi_dim_black: Some(rgba(0xf4ececff).into()), terminal_ansi_red: Some(rgba(0xca4949ff).into()), + terminal_ansi_bright_red: Some(rgba(0x692727ff).into()), + terminal_ansi_dim_red: Some(rgba(0xeda69fff).into()), terminal_ansi_green: Some(rgba(0x4b8b8bff).into()), + terminal_ansi_bright_green: Some(rgba(0x2a4444ff).into()), + terminal_ansi_dim_green: Some(rgba(0xa6c4c4ff).into()), terminal_ansi_yellow: Some(rgba(0xa06e3bff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x4e3821ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xd4b499ff).into()), terminal_ansi_blue: Some(rgba(0x7272caff).into()), + terminal_ansi_bright_blue: Some(rgba(0x3b3960ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xbbb6e5ff).into()), terminal_ansi_magenta: Some(rgba(0xbd5187ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x5b2c42ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xe2a9c2ff).into()), terminal_ansi_cyan: Some(rgba(0x5485b6ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x2e4257ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xacc0daff).into()), terminal_ansi_white: Some(rgba(0xf4ececff).into()), + terminal_ansi_bright_white: Some(rgba(0xf4ececff).into()), + terminal_ansi_dim_white: Some(rgba(0x807979ff).into()), link_text_hover: Some(rgba(0x7272caff).into()), ..Default::default() }, @@ -6121,22 +6264,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x7372ca1a).into()), editor_document_highlight_write_background: Some(rgba(0x726a6a66).into()), terminal_background: Some(rgba(0xf4ececff).into()), - terminal_ansi_bright_black: Some(rgba(0x807979ff).into()), - terminal_ansi_bright_red: Some(rgba(0xeda69fff).into()), - terminal_ansi_bright_green: Some(rgba(0xa6c4c4ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xd4b499ff).into()), - terminal_ansi_bright_blue: Some(rgba(0xbbb6e5ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xe2a9c2ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0xacc0daff).into()), - terminal_ansi_bright_white: Some(rgba(0x1b1818ff).into()), + terminal_foreground: Some(rgba(0x1b1818ff).into()), + terminal_bright_foreground: Some(rgba(0x1b1818ff).into()), + terminal_dim_foreground: Some(rgba(0xf4ececff).into()), terminal_ansi_black: Some(rgba(0xf4ececff).into()), + terminal_ansi_bright_black: Some(rgba(0x807979ff).into()), + terminal_ansi_dim_black: Some(rgba(0x1b1818ff).into()), terminal_ansi_red: Some(rgba(0xca4a4aff).into()), + terminal_ansi_bright_red: Some(rgba(0xeda69fff).into()), + terminal_ansi_dim_red: Some(rgba(0x692727ff).into()), terminal_ansi_green: Some(rgba(0x4c8b8bff).into()), + terminal_ansi_bright_green: Some(rgba(0xa6c4c4ff).into()), + terminal_ansi_dim_green: Some(rgba(0x2a4444ff).into()), terminal_ansi_yellow: Some(rgba(0xa06e3cff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xd4b499ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x4e3821ff).into()), terminal_ansi_blue: Some(rgba(0x7372caff).into()), + terminal_ansi_bright_blue: Some(rgba(0xbbb6e5ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x3b3960ff).into()), terminal_ansi_magenta: Some(rgba(0xbd5287ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xe2a9c2ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x5b2c42ff).into()), terminal_ansi_cyan: Some(rgba(0x5585b6ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0xacc0daff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x2e4257ff).into()), terminal_ansi_white: Some(rgba(0x1b1818ff).into()), + terminal_ansi_bright_white: Some(rgba(0x1b1818ff).into()), + terminal_ansi_dim_white: Some(rgba(0x635b5bff).into()), link_text_hover: Some(rgba(0x7372caff).into()), ..Default::default() }, @@ -6586,22 +6740,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x478c901a).into()), editor_document_highlight_write_background: Some(rgba(0x6c7a7166).into()), terminal_background: Some(rgba(0x171c19ff).into()), - terminal_ansi_bright_black: Some(rgba(0x5d6b62ff).into()), - terminal_ansi_bright_red: Some(rgba(0x563220ff).into()), - terminal_ansi_bright_green: Some(rgba(0x294a33ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x4e3f22ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x284546ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x423a36ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x1d4b4dff).into()), - terminal_ansi_bright_white: Some(rgba(0xecf4eeff).into()), + terminal_foreground: Some(rgba(0xecf4eeff).into()), + terminal_bright_foreground: Some(rgba(0xecf4eeff).into()), + terminal_dim_foreground: Some(rgba(0x171c19ff).into()), terminal_ansi_black: Some(rgba(0x171c19ff).into()), + terminal_ansi_bright_black: Some(rgba(0x5d6b62ff).into()), + terminal_ansi_dim_black: Some(rgba(0xecf4eeff).into()), terminal_ansi_red: Some(rgba(0xb16139ff).into()), + terminal_ansi_bright_red: Some(rgba(0x563220ff).into()), + terminal_ansi_dim_red: Some(rgba(0xdeae97ff).into()), terminal_ansi_green: Some(rgba(0x489963ff).into()), + terminal_ansi_bright_green: Some(rgba(0x294a33ff).into()), + terminal_ansi_dim_green: Some(rgba(0xa5ccafff).into()), terminal_ansi_yellow: Some(rgba(0xa07e3bff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x4e3f22ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xd3bd9aff).into()), terminal_ansi_blue: Some(rgba(0x478c90ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x284546ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xa5c5c6ff).into()), terminal_ansi_magenta: Some(rgba(0x867469ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x423a36ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xc2b7b1ff).into()), terminal_ansi_cyan: Some(rgba(0x1e9aa0ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x1d4b4dff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x9dcdcfff).into()), terminal_ansi_white: Some(rgba(0xecf4eeff).into()), + terminal_ansi_bright_white: Some(rgba(0xecf4eeff).into()), + terminal_ansi_dim_white: Some(rgba(0x7b897fff).into()), link_text_hover: Some(rgba(0x478c90ff).into()), ..Default::default() }, @@ -7051,22 +7216,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x488c901a).into()), editor_document_highlight_write_background: Some(rgba(0x6c7a7166).into()), terminal_background: Some(rgba(0xecf4eeff).into()), - terminal_ansi_bright_black: Some(rgba(0x7b897fff).into()), - terminal_ansi_bright_red: Some(rgba(0xdeae97ff).into()), - terminal_ansi_bright_green: Some(rgba(0xa5ccafff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xd3bd9aff).into()), - terminal_ansi_bright_blue: Some(rgba(0xa5c5c6ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xc2b7b1ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x9dcdcfff).into()), - terminal_ansi_bright_white: Some(rgba(0x171c19ff).into()), + terminal_foreground: Some(rgba(0x171c19ff).into()), + terminal_bright_foreground: Some(rgba(0x171c19ff).into()), + terminal_dim_foreground: Some(rgba(0xecf4eeff).into()), terminal_ansi_black: Some(rgba(0xecf4eeff).into()), + terminal_ansi_bright_black: Some(rgba(0x7b897fff).into()), + terminal_ansi_dim_black: Some(rgba(0x171c19ff).into()), terminal_ansi_red: Some(rgba(0xb1623aff).into()), + terminal_ansi_bright_red: Some(rgba(0xdeae97ff).into()), + terminal_ansi_dim_red: Some(rgba(0x563220ff).into()), terminal_ansi_green: Some(rgba(0x499963ff).into()), + terminal_ansi_bright_green: Some(rgba(0xa5ccafff).into()), + terminal_ansi_dim_green: Some(rgba(0x294a33ff).into()), terminal_ansi_yellow: Some(rgba(0xa07e3cff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xd3bd9aff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x4e3f22ff).into()), terminal_ansi_blue: Some(rgba(0x488c90ff).into()), + terminal_ansi_bright_blue: Some(rgba(0xa5c5c6ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x284546ff).into()), terminal_ansi_magenta: Some(rgba(0x867469ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xc2b7b1ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x423a36ff).into()), terminal_ansi_cyan: Some(rgba(0x1f9aa0ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x9dcdcfff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x1d4b4dff).into()), terminal_ansi_white: Some(rgba(0x171c19ff).into()), + terminal_ansi_bright_white: Some(rgba(0x171c19ff).into()), + terminal_ansi_dim_white: Some(rgba(0x5d6b62ff).into()), link_text_hover: Some(rgba(0x488c90ff).into()), ..Default::default() }, @@ -7516,22 +7692,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x3e62f41a).into()), editor_document_highlight_write_background: Some(rgba(0x748b7466).into()), terminal_background: Some(rgba(0x131513ff).into()), - terminal_ansi_bright_black: Some(rgba(0x667a66ff).into()), - terminal_ansi_bright_red: Some(rgba(0x840b21ff).into()), - terminal_ansi_bright_green: Some(rgba(0x204f1bff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x4b4a17ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x193385ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x810e60ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x1d4a56ff).into()), - terminal_ansi_bright_white: Some(rgba(0xf4fbf4ff).into()), + terminal_foreground: Some(rgba(0xf4fbf4ff).into()), + terminal_bright_foreground: Some(rgba(0xf4fbf4ff).into()), + terminal_dim_foreground: Some(rgba(0x131513ff).into()), terminal_ansi_black: Some(rgba(0x131513ff).into()), + terminal_ansi_bright_black: Some(rgba(0x667a66ff).into()), + terminal_ansi_dim_black: Some(rgba(0xf4fbf4ff).into()), terminal_ansi_red: Some(rgba(0xe61c3cff).into()), + terminal_ansi_bright_red: Some(rgba(0x840b21ff).into()), + terminal_ansi_dim_red: Some(rgba(0xff9d98ff).into()), terminal_ansi_green: Some(rgba(0x2ba32aff).into()), + terminal_ansi_bright_green: Some(rgba(0x204f1bff).into()), + terminal_ansi_dim_green: Some(rgba(0xa0d294ff).into()), terminal_ansi_yellow: Some(rgba(0x98981cff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x4b4a17ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xd0ca90ff).into()), terminal_ansi_blue: Some(rgba(0x3e62f4ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x193385ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xb1adfcff).into()), terminal_ansi_magenta: Some(rgba(0xe61cc3ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x810e60ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xf9a1e1ff).into()), terminal_ansi_cyan: Some(rgba(0x1c99b3ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x1d4a56ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x9fccd9ff).into()), terminal_ansi_white: Some(rgba(0xf4fbf4ff).into()), + terminal_ansi_bright_white: Some(rgba(0xf4fbf4ff).into()), + terminal_ansi_dim_white: Some(rgba(0x829b82ff).into()), link_text_hover: Some(rgba(0x3e62f4ff).into()), ..Default::default() }, @@ -7981,22 +8168,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x3f62f41a).into()), editor_document_highlight_write_background: Some(rgba(0x748b7466).into()), terminal_background: Some(rgba(0xf4fbf4ff).into()), - terminal_ansi_bright_black: Some(rgba(0x829b82ff).into()), - terminal_ansi_bright_red: Some(rgba(0xff9d98ff).into()), - terminal_ansi_bright_green: Some(rgba(0xa0d294ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xd0ca90ff).into()), - terminal_ansi_bright_blue: Some(rgba(0xb1adfcff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xf9a1e1ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x9fccd9ff).into()), - terminal_ansi_bright_white: Some(rgba(0x131513ff).into()), + terminal_foreground: Some(rgba(0x131513ff).into()), + terminal_bright_foreground: Some(rgba(0x131513ff).into()), + terminal_dim_foreground: Some(rgba(0xf4fbf4ff).into()), terminal_ansi_black: Some(rgba(0xf4fbf4ff).into()), + terminal_ansi_bright_black: Some(rgba(0x829b82ff).into()), + terminal_ansi_dim_black: Some(rgba(0x131513ff).into()), terminal_ansi_red: Some(rgba(0xe61c3dff).into()), + terminal_ansi_bright_red: Some(rgba(0xff9d98ff).into()), + terminal_ansi_dim_red: Some(rgba(0x840b21ff).into()), terminal_ansi_green: Some(rgba(0x2ba32bff).into()), + terminal_ansi_bright_green: Some(rgba(0xa0d294ff).into()), + terminal_ansi_dim_green: Some(rgba(0x204f1bff).into()), terminal_ansi_yellow: Some(rgba(0x98981dff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xd0ca90ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x4b4a17ff).into()), terminal_ansi_blue: Some(rgba(0x3f62f4ff).into()), + terminal_ansi_bright_blue: Some(rgba(0xb1adfcff).into()), + terminal_ansi_dim_blue: Some(rgba(0x193385ff).into()), terminal_ansi_magenta: Some(rgba(0xe61dc3ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xf9a1e1ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x810e60ff).into()), terminal_ansi_cyan: Some(rgba(0x1d99b3ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x9fccd9ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x1d4a56ff).into()), terminal_ansi_white: Some(rgba(0x131513ff).into()), + terminal_ansi_bright_white: Some(rgba(0x131513ff).into()), + terminal_ansi_dim_white: Some(rgba(0x667a66ff).into()), link_text_hover: Some(rgba(0x3f62f4ff).into()), ..Default::default() }, @@ -8446,22 +8644,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x3e8fd01a).into()), editor_document_highlight_write_background: Some(rgba(0x7a819c66).into()), terminal_background: Some(rgba(0x202746ff).into()), - terminal_ansi_bright_black: Some(rgba(0x697192ff).into()), - terminal_ansi_bright_red: Some(rgba(0x6d2616ff).into()), - terminal_ansi_bright_green: Some(rgba(0x534921ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x63441eff).into()), - terminal_ansi_bright_blue: Some(rgba(0x274664ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x4c333dff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x214e5fff).into()), - terminal_ansi_bright_white: Some(rgba(0xf5f7ffff).into()), + terminal_foreground: Some(rgba(0xf5f7ffff).into()), + terminal_bright_foreground: Some(rgba(0xf5f7ffff).into()), + terminal_dim_foreground: Some(rgba(0x202746ff).into()), terminal_ansi_black: Some(rgba(0x202746ff).into()), + terminal_ansi_bright_black: Some(rgba(0x697192ff).into()), + terminal_ansi_dim_black: Some(rgba(0xf5f7ffff).into()), terminal_ansi_red: Some(rgba(0xc94923ff).into()), + terminal_ansi_bright_red: Some(rgba(0x6d2616ff).into()), + terminal_ansi_dim_red: Some(rgba(0xefa58cff).into()), terminal_ansi_green: Some(rgba(0xac973aff).into()), + terminal_ansi_bright_green: Some(rgba(0x534921ff).into()), + terminal_ansi_dim_green: Some(rgba(0xd9ca9bff).into()), terminal_ansi_yellow: Some(rgba(0xc08b31ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x63441eff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xe5c497ff).into()), terminal_ansi_blue: Some(rgba(0x3e8fd0ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x274664ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xa9c6e8ff).into()), terminal_ansi_magenta: Some(rgba(0x9c637aff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x4c333dff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xcfafbbff).into()), terminal_ansi_cyan: Some(rgba(0x25a2c9ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x214e5fff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xa4d0e4ff).into()), terminal_ansi_white: Some(rgba(0xf5f7ffff).into()), + terminal_ansi_bright_white: Some(rgba(0xf5f7ffff).into()), + terminal_ansi_dim_white: Some(rgba(0x8b91a7ff).into()), link_text_hover: Some(rgba(0x3e8fd0ff).into()), ..Default::default() }, @@ -8911,22 +9120,33 @@ pub fn atelier() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x3f8fd01a).into()), editor_document_highlight_write_background: Some(rgba(0x7a819c66).into()), terminal_background: Some(rgba(0xf5f7ffff).into()), - terminal_ansi_bright_black: Some(rgba(0x8b91a7ff).into()), - terminal_ansi_bright_red: Some(rgba(0xefa58cff).into()), - terminal_ansi_bright_green: Some(rgba(0xd9ca9bff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xe5c497ff).into()), - terminal_ansi_bright_blue: Some(rgba(0xa9c6e8ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xcfafbbff).into()), - terminal_ansi_bright_cyan: Some(rgba(0xa4d0e4ff).into()), - terminal_ansi_bright_white: Some(rgba(0x202746ff).into()), + terminal_foreground: Some(rgba(0x202746ff).into()), + terminal_bright_foreground: Some(rgba(0x202746ff).into()), + terminal_dim_foreground: Some(rgba(0xf5f7ffff).into()), terminal_ansi_black: Some(rgba(0xf5f7ffff).into()), + terminal_ansi_bright_black: Some(rgba(0x8b91a7ff).into()), + terminal_ansi_dim_black: Some(rgba(0x202746ff).into()), terminal_ansi_red: Some(rgba(0xc94a23ff).into()), + terminal_ansi_bright_red: Some(rgba(0xefa58cff).into()), + terminal_ansi_dim_red: Some(rgba(0x6d2616ff).into()), terminal_ansi_green: Some(rgba(0xac973aff).into()), + terminal_ansi_bright_green: Some(rgba(0xd9ca9bff).into()), + terminal_ansi_dim_green: Some(rgba(0x534921ff).into()), terminal_ansi_yellow: Some(rgba(0xc08b31ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xe5c497ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x63441eff).into()), terminal_ansi_blue: Some(rgba(0x3f8fd0ff).into()), + terminal_ansi_bright_blue: Some(rgba(0xa9c6e8ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x274664ff).into()), terminal_ansi_magenta: Some(rgba(0x9c637aff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xcfafbbff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x4c333dff).into()), terminal_ansi_cyan: Some(rgba(0x25a2c9ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0xa4d0e4ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x214e5fff).into()), terminal_ansi_white: Some(rgba(0x202746ff).into()), + terminal_ansi_bright_white: Some(rgba(0x202746ff).into()), + terminal_ansi_dim_white: Some(rgba(0x697192ff).into()), link_text_hover: Some(rgba(0x3f8fd0ff).into()), ..Default::default() }, diff --git a/crates/theme/src/themes/ayu.rs b/crates/theme/src/themes/ayu.rs index 9c9030b2f27928c5e9fb16a6e536de84036c4f8e..6bde2410ae94f90fc9709c2027db3330c3e186af 100644 --- a/crates/theme/src/themes/ayu.rs +++ b/crates/theme/src/themes/ayu.rs @@ -76,22 +76,33 @@ pub fn ayu() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x5ac2fe1a).into()), editor_document_highlight_write_background: Some(rgba(0x66676766).into()), terminal_background: Some(rgba(0x0d1017ff).into()), - terminal_ansi_bright_black: Some(rgba(0x545557ff).into()), - terminal_ansi_bright_red: Some(rgba(0x83363cff).into()), - terminal_ansi_bright_green: Some(rgba(0x567627ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x92592cff).into()), - terminal_ansi_bright_blue: Some(rgba(0x28628cff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x205b78ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x4c806fff).into()), - terminal_ansi_bright_white: Some(rgba(0xbfbdb6ff).into()), + terminal_foreground: Some(rgba(0xbfbdb6ff).into()), + terminal_bright_foreground: Some(rgba(0xbfbdb6ff).into()), + terminal_dim_foreground: Some(rgba(0x0d1017ff).into()), terminal_ansi_black: Some(rgba(0x0d1017ff).into()), + terminal_ansi_bright_black: Some(rgba(0x545557ff).into()), + terminal_ansi_dim_black: Some(rgba(0xbfbdb6ff).into()), terminal_ansi_red: Some(rgba(0xef7178ff).into()), + terminal_ansi_bright_red: Some(rgba(0x83363cff).into()), + terminal_ansi_dim_red: Some(rgba(0xfebab9ff).into()), terminal_ansi_green: Some(rgba(0xaad84cff).into()), + terminal_ansi_bright_green: Some(rgba(0x567627ff).into()), + terminal_ansi_dim_green: Some(rgba(0xd8eca8ff).into()), terminal_ansi_yellow: Some(rgba(0xfeb454ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x92592cff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xffd9aaff).into()), terminal_ansi_blue: Some(rgba(0x5ac2feff).into()), + terminal_ansi_bright_blue: Some(rgba(0x28628cff).into()), + terminal_ansi_dim_blue: Some(rgba(0xb8e0ffff).into()), terminal_ansi_magenta: Some(rgba(0x3abae5ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x205b78ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xaddcf3ff).into()), terminal_ansi_cyan: Some(rgba(0x95e5cbff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x4c806fff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xccf3e5ff).into()), terminal_ansi_white: Some(rgba(0xbfbdb6ff).into()), + terminal_ansi_bright_white: Some(rgba(0xbfbdb6ff).into()), + terminal_ansi_dim_white: Some(rgba(0x787876ff).into()), link_text_hover: Some(rgba(0x5ac2feff).into()), ..Default::default() }, @@ -520,22 +531,33 @@ pub fn ayu() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x3b9ee51a).into()), editor_document_highlight_write_background: Some(rgba(0xacafb166).into()), terminal_background: Some(rgba(0xfcfcfcff).into()), - terminal_ansi_bright_black: Some(rgba(0xbcbec0ff).into()), - terminal_ansi_bright_red: Some(rgba(0xfebab6ff).into()), - terminal_ansi_bright_green: Some(rgba(0xc7d98fff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xffd6a4ff).into()), - terminal_ansi_bright_blue: Some(rgba(0xaccef3ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xb2d9e9ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0xace0cbff).into()), - terminal_ansi_bright_white: Some(rgba(0x5c6166ff).into()), + terminal_foreground: Some(rgba(0x5c6166ff).into()), + terminal_bright_foreground: Some(rgba(0x5c6166ff).into()), + terminal_dim_foreground: Some(rgba(0xfcfcfcff).into()), terminal_ansi_black: Some(rgba(0xfcfcfcff).into()), + terminal_ansi_bright_black: Some(rgba(0xbcbec0ff).into()), + terminal_ansi_dim_black: Some(rgba(0x5c6166ff).into()), terminal_ansi_red: Some(rgba(0xef7271ff).into()), + terminal_ansi_bright_red: Some(rgba(0xfebab6ff).into()), + terminal_ansi_dim_red: Some(rgba(0x833639ff).into()), terminal_ansi_green: Some(rgba(0x86b305ff).into()), + terminal_ansi_bright_green: Some(rgba(0xc7d98fff).into()), + terminal_ansi_dim_green: Some(rgba(0x445614ff).into()), terminal_ansi_yellow: Some(rgba(0xf1ae4aff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xffd6a4ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x8a5328ff).into()), terminal_ansi_blue: Some(rgba(0x3b9ee5ff).into()), + terminal_ansi_bright_blue: Some(rgba(0xaccef3ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x214d76ff).into()), terminal_ansi_magenta: Some(rgba(0x56b4d3ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xb2d9e9ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x2f5669ff).into()), terminal_ansi_cyan: Some(rgba(0x4dbf99ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0xace0cbff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x2a5f4aff).into()), terminal_ansi_white: Some(rgba(0x5c6166ff).into()), + terminal_ansi_bright_white: Some(rgba(0x5c6166ff).into()), + terminal_ansi_dim_white: Some(rgba(0x9c9fa2ff).into()), link_text_hover: Some(rgba(0x3b9ee5ff).into()), ..Default::default() }, @@ -964,22 +986,33 @@ pub fn ayu() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x73cffe1a).into()), editor_document_highlight_write_background: Some(rgba(0x787a7c66).into()), terminal_background: Some(rgba(0x242936ff).into()), - terminal_ansi_bright_black: Some(rgba(0x67696eff).into()), - terminal_ansi_bright_red: Some(rgba(0x83403dff).into()), - terminal_ansi_bright_green: Some(rgba(0x76993dff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x937238ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x346e8dff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x2b6c7bff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x4c806fff).into()), - terminal_ansi_bright_white: Some(rgba(0xcccac2ff).into()), + terminal_foreground: Some(rgba(0xcccac2ff).into()), + terminal_bright_foreground: Some(rgba(0xcccac2ff).into()), + terminal_dim_foreground: Some(rgba(0x242936ff).into()), terminal_ansi_black: Some(rgba(0x242936ff).into()), + terminal_ansi_bright_black: Some(rgba(0x67696eff).into()), + terminal_ansi_dim_black: Some(rgba(0xcccac2ff).into()), terminal_ansi_red: Some(rgba(0xf18779ff).into()), + terminal_ansi_bright_red: Some(rgba(0x83403dff).into()), + terminal_ansi_dim_red: Some(rgba(0xfec4baff).into()), terminal_ansi_green: Some(rgba(0xd5fe80ff).into()), + terminal_ansi_bright_green: Some(rgba(0x76993dff).into()), + terminal_ansi_dim_green: Some(rgba(0xecffc1ff).into()), terminal_ansi_yellow: Some(rgba(0xfed073ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x937238ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xffe7b9ff).into()), terminal_ansi_blue: Some(rgba(0x73cffeff).into()), + terminal_ansi_bright_blue: Some(rgba(0x346e8dff).into()), + terminal_ansi_dim_blue: Some(rgba(0xc1e7ffff).into()), terminal_ansi_magenta: Some(rgba(0x5ccee5ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x2b6c7bff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xb7e7f2ff).into()), terminal_ansi_cyan: Some(rgba(0x95e5cbff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x4c806fff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xccf3e5ff).into()), terminal_ansi_white: Some(rgba(0xcccac2ff).into()), + terminal_ansi_bright_white: Some(rgba(0xcccac2ff).into()), + terminal_ansi_dim_white: Some(rgba(0x898a8aff).into()), link_text_hover: Some(rgba(0x73cffeff).into()), ..Default::default() }, diff --git a/crates/theme/src/themes/gruvbox.rs b/crates/theme/src/themes/gruvbox.rs index 34ccefee1172cb9aee9d85496f2fdce40ab4abd2..83cab3a89dafbce187daa5325cef09319310cde3 100644 --- a/crates/theme/src/themes/gruvbox.rs +++ b/crates/theme/src/themes/gruvbox.rs @@ -76,22 +76,33 @@ pub fn gruvbox() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x83a5981a).into()), editor_document_highlight_write_background: Some(rgba(0x92847466).into()), terminal_background: Some(rgba(0x282828ff).into()), - terminal_ansi_bright_black: Some(rgba(0x73675eff).into()), - terminal_ansi_bright_red: Some(rgba(0x93211eff).into()), - terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()), - terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()), - terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()), + terminal_foreground: Some(rgba(0xfbf1c7ff).into()), + terminal_bright_foreground: Some(rgba(0xfbf1c7ff).into()), + terminal_dim_foreground: Some(rgba(0x282828ff).into()), terminal_ansi_black: Some(rgba(0x282828ff).into()), + terminal_ansi_bright_black: Some(rgba(0x73675eff).into()), + terminal_ansi_dim_black: Some(rgba(0xfbf1c7ff).into()), terminal_ansi_red: Some(rgba(0xfb4a35ff).into()), + terminal_ansi_bright_red: Some(rgba(0x93211eff).into()), + terminal_ansi_dim_red: Some(rgba(0xffaa95ff).into()), terminal_ansi_green: Some(rgba(0xb8bb27ff).into()), + terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()), + terminal_ansi_dim_green: Some(rgba(0xe0dc98ff).into()), terminal_ansi_yellow: Some(rgba(0xf9bd30ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xffdd9cff).into()), terminal_ansi_blue: Some(rgba(0x83a598ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()), + terminal_ansi_dim_blue: Some(rgba(0xc0d2cbff).into()), terminal_ansi_magenta: Some(rgba(0xa89984ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xd3cbc0ff).into()), terminal_ansi_cyan: Some(rgba(0x8ec07cff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xc7dfbdff).into()), terminal_ansi_white: Some(rgba(0xfbf1c7ff).into()), + terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()), + terminal_ansi_dim_white: Some(rgba(0xb1a28aff).into()), link_text_hover: Some(rgba(0x83a598ff).into()), ..Default::default() }, @@ -527,22 +538,33 @@ pub fn gruvbox() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x83a5981a).into()), editor_document_highlight_write_background: Some(rgba(0x92847466).into()), terminal_background: Some(rgba(0x1d2021ff).into()), - terminal_ansi_bright_black: Some(rgba(0x73675eff).into()), - terminal_ansi_bright_red: Some(rgba(0x93211eff).into()), - terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()), - terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()), - terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()), + terminal_foreground: Some(rgba(0xfbf1c7ff).into()), + terminal_bright_foreground: Some(rgba(0xfbf1c7ff).into()), + terminal_dim_foreground: Some(rgba(0x1d2021ff).into()), terminal_ansi_black: Some(rgba(0x1d2021ff).into()), + terminal_ansi_bright_black: Some(rgba(0x73675eff).into()), + terminal_ansi_dim_black: Some(rgba(0xfbf1c7ff).into()), terminal_ansi_red: Some(rgba(0xfb4a35ff).into()), + terminal_ansi_bright_red: Some(rgba(0x93211eff).into()), + terminal_ansi_dim_red: Some(rgba(0xffaa95ff).into()), terminal_ansi_green: Some(rgba(0xb8bb27ff).into()), + terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()), + terminal_ansi_dim_green: Some(rgba(0xe0dc98ff).into()), terminal_ansi_yellow: Some(rgba(0xf9bd30ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xffdd9cff).into()), terminal_ansi_blue: Some(rgba(0x83a598ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()), + terminal_ansi_dim_blue: Some(rgba(0xc0d2cbff).into()), terminal_ansi_magenta: Some(rgba(0xa89984ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xd3cbc0ff).into()), terminal_ansi_cyan: Some(rgba(0x8ec07cff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xc7dfbdff).into()), terminal_ansi_white: Some(rgba(0xfbf1c7ff).into()), + terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()), + terminal_ansi_dim_white: Some(rgba(0xb1a28aff).into()), link_text_hover: Some(rgba(0x83a598ff).into()), ..Default::default() }, @@ -978,22 +1000,33 @@ pub fn gruvbox() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x83a5981a).into()), editor_document_highlight_write_background: Some(rgba(0x92847466).into()), terminal_background: Some(rgba(0x32302fff).into()), - terminal_ansi_bright_black: Some(rgba(0x73675eff).into()), - terminal_ansi_bright_red: Some(rgba(0x93211eff).into()), - terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()), - terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()), - terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()), + terminal_foreground: Some(rgba(0xfbf1c7ff).into()), + terminal_bright_foreground: Some(rgba(0xfbf1c7ff).into()), + terminal_dim_foreground: Some(rgba(0x32302fff).into()), terminal_ansi_black: Some(rgba(0x32302fff).into()), + terminal_ansi_bright_black: Some(rgba(0x73675eff).into()), + terminal_ansi_dim_black: Some(rgba(0xfbf1c7ff).into()), terminal_ansi_red: Some(rgba(0xfb4a35ff).into()), + terminal_ansi_bright_red: Some(rgba(0x93211eff).into()), + terminal_ansi_dim_red: Some(rgba(0xffaa95ff).into()), terminal_ansi_green: Some(rgba(0xb8bb27ff).into()), + terminal_ansi_bright_green: Some(rgba(0x615d1bff).into()), + terminal_ansi_dim_green: Some(rgba(0xe0dc98ff).into()), terminal_ansi_yellow: Some(rgba(0xf9bd30ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x91611cff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xffdd9cff).into()), terminal_ansi_blue: Some(rgba(0x83a598ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x414f4aff).into()), + terminal_ansi_dim_blue: Some(rgba(0xc0d2cbff).into()), terminal_ansi_magenta: Some(rgba(0xa89984ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x514a41ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xd3cbc0ff).into()), terminal_ansi_cyan: Some(rgba(0x8ec07cff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x45603eff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xc7dfbdff).into()), terminal_ansi_white: Some(rgba(0xfbf1c7ff).into()), + terminal_ansi_bright_white: Some(rgba(0xfbf1c7ff).into()), + terminal_ansi_dim_white: Some(rgba(0xb1a28aff).into()), link_text_hover: Some(rgba(0x83a598ff).into()), ..Default::default() }, @@ -1429,22 +1462,33 @@ pub fn gruvbox() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x0b66781a).into()), editor_document_highlight_write_background: Some(rgba(0x92847466).into()), terminal_background: Some(rgba(0xfbf1c7ff).into()), - terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()), - terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()), - terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()), - terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()), - terminal_ansi_bright_white: Some(rgba(0x282828ff).into()), + terminal_foreground: Some(rgba(0x282828ff).into()), + terminal_bright_foreground: Some(rgba(0x282828ff).into()), + terminal_dim_foreground: Some(rgba(0xfbf1c7ff).into()), terminal_ansi_black: Some(rgba(0xfbf1c7ff).into()), + terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()), + terminal_ansi_dim_black: Some(rgba(0x282828ff).into()), terminal_ansi_red: Some(rgba(0x9d0408ff).into()), + terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()), + terminal_ansi_dim_red: Some(rgba(0x4f1207ff).into()), terminal_ansi_green: Some(rgba(0x797410ff).into()), + terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()), + terminal_ansi_dim_green: Some(rgba(0x3e3a11ff).into()), terminal_ansi_yellow: Some(rgba(0xb57616ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x5c3b13ff).into()), terminal_ansi_blue: Some(rgba(0x0b6678ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()), + terminal_ansi_dim_blue: Some(rgba(0x14343cff).into()), terminal_ansi_magenta: Some(rgba(0x7c6f64ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x3e3833ff).into()), terminal_ansi_cyan: Some(rgba(0x437b59ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x253e2eff).into()), terminal_ansi_white: Some(rgba(0x282828ff).into()), + terminal_ansi_bright_white: Some(rgba(0x282828ff).into()), + terminal_ansi_dim_white: Some(rgba(0x73675eff).into()), link_text_hover: Some(rgba(0x0b6678ff).into()), ..Default::default() }, @@ -1880,22 +1924,33 @@ pub fn gruvbox() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x0b66781a).into()), editor_document_highlight_write_background: Some(rgba(0x92847466).into()), terminal_background: Some(rgba(0xf9f5d7ff).into()), - terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()), - terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()), - terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()), - terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()), - terminal_ansi_bright_white: Some(rgba(0x282828ff).into()), + terminal_foreground: Some(rgba(0x282828ff).into()), + terminal_bright_foreground: Some(rgba(0x282828ff).into()), + terminal_dim_foreground: Some(rgba(0xf9f5d7ff).into()), terminal_ansi_black: Some(rgba(0xf9f5d7ff).into()), + terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()), + terminal_ansi_dim_black: Some(rgba(0x282828ff).into()), terminal_ansi_red: Some(rgba(0x9d0408ff).into()), + terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()), + terminal_ansi_dim_red: Some(rgba(0x4f1207ff).into()), terminal_ansi_green: Some(rgba(0x797410ff).into()), + terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()), + terminal_ansi_dim_green: Some(rgba(0x3e3a11ff).into()), terminal_ansi_yellow: Some(rgba(0xb57616ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x5c3b13ff).into()), terminal_ansi_blue: Some(rgba(0x0b6678ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()), + terminal_ansi_dim_blue: Some(rgba(0x14343cff).into()), terminal_ansi_magenta: Some(rgba(0x7c6f64ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x3e3833ff).into()), terminal_ansi_cyan: Some(rgba(0x437b59ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x253e2eff).into()), terminal_ansi_white: Some(rgba(0x282828ff).into()), + terminal_ansi_bright_white: Some(rgba(0x282828ff).into()), + terminal_ansi_dim_white: Some(rgba(0x73675eff).into()), link_text_hover: Some(rgba(0x0b6678ff).into()), ..Default::default() }, @@ -2331,22 +2386,33 @@ pub fn gruvbox() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x0b66781a).into()), editor_document_highlight_write_background: Some(rgba(0x92847466).into()), terminal_background: Some(rgba(0xf2e5bcff).into()), - terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()), - terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()), - terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()), - terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()), - terminal_ansi_bright_white: Some(rgba(0x282828ff).into()), + terminal_foreground: Some(rgba(0x282828ff).into()), + terminal_bright_foreground: Some(rgba(0x282828ff).into()), + terminal_dim_foreground: Some(rgba(0xf2e5bcff).into()), terminal_ansi_black: Some(rgba(0xf2e5bcff).into()), + terminal_ansi_bright_black: Some(rgba(0xb1a28aff).into()), + terminal_ansi_dim_black: Some(rgba(0x282828ff).into()), terminal_ansi_red: Some(rgba(0x9d0408ff).into()), + terminal_ansi_bright_red: Some(rgba(0xdc8c7bff).into()), + terminal_ansi_dim_red: Some(rgba(0x4f1207ff).into()), terminal_ansi_green: Some(rgba(0x797410ff).into()), + terminal_ansi_bright_green: Some(rgba(0xbfb787ff).into()), + terminal_ansi_dim_green: Some(rgba(0x3e3a11ff).into()), terminal_ansi_yellow: Some(rgba(0xb57616ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xe2b88bff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x5c3b13ff).into()), terminal_ansi_blue: Some(rgba(0x0b6678ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x8fb0baff).into()), + terminal_ansi_dim_blue: Some(rgba(0x14343cff).into()), terminal_ansi_magenta: Some(rgba(0x7c6f64ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xbcb5afff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x3e3833ff).into()), terminal_ansi_cyan: Some(rgba(0x437b59ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x9fbca8ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x253e2eff).into()), terminal_ansi_white: Some(rgba(0x282828ff).into()), + terminal_ansi_bright_white: Some(rgba(0x282828ff).into()), + terminal_ansi_dim_white: Some(rgba(0x73675eff).into()), link_text_hover: Some(rgba(0x0b6678ff).into()), ..Default::default() }, diff --git a/crates/theme/src/themes/one.rs b/crates/theme/src/themes/one.rs index 5928939f7a5a51607f20cb7779ce35ad93a1278c..b2227b18a3729cd9ede63df8cc5e81c835bf2ce0 100644 --- a/crates/theme/src/themes/one.rs +++ b/crates/theme/src/themes/one.rs @@ -76,22 +76,33 @@ pub fn one() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x74ade81a).into()), editor_document_highlight_write_background: Some(rgba(0x555a6366).into()), terminal_background: Some(rgba(0x282c34ff).into()), - terminal_ansi_bright_black: Some(rgba(0x525661ff).into()), - terminal_ansi_bright_red: Some(rgba(0x673a3cff).into()), - terminal_ansi_bright_green: Some(rgba(0x4d6140ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x786441ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x385378ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x5e2b26ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x3a565bff).into()), - terminal_ansi_bright_white: Some(rgba(0xc8ccd4ff).into()), + terminal_foreground: Some(rgba(0xc8ccd4ff).into()), + terminal_bright_foreground: Some(rgba(0xc8ccd4ff).into()), + terminal_dim_foreground: Some(rgba(0x282c34ff).into()), terminal_ansi_black: Some(rgba(0x282c34ff).into()), + terminal_ansi_bright_black: Some(rgba(0x525661ff).into()), + terminal_ansi_dim_black: Some(rgba(0xc8ccd4ff).into()), terminal_ansi_red: Some(rgba(0xd07277ff).into()), + terminal_ansi_bright_red: Some(rgba(0x673a3cff).into()), + terminal_ansi_dim_red: Some(rgba(0xebb8b9ff).into()), terminal_ansi_green: Some(rgba(0xa1c181ff).into()), + terminal_ansi_bright_green: Some(rgba(0x4d6140ff).into()), + terminal_ansi_dim_green: Some(rgba(0xd1e0bfff).into()), terminal_ansi_yellow: Some(rgba(0xdec184ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x786441ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xf1dfc1ff).into()), terminal_ansi_blue: Some(rgba(0x74ade8ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x385378ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xbed5f4ff).into()), terminal_ansi_magenta: Some(rgba(0xbe5046ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x5e2b26ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xe6a79eff).into()), terminal_ansi_cyan: Some(rgba(0x6fb4c0ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x3a565bff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xb9d9dfff).into()), terminal_ansi_white: Some(rgba(0xc8ccd4ff).into()), + terminal_ansi_bright_white: Some(rgba(0xc8ccd4ff).into()), + terminal_ansi_dim_white: Some(rgba(0x575d65ff).into()), link_text_hover: Some(rgba(0x74ade8ff).into()), ..Default::default() }, @@ -527,22 +538,33 @@ pub fn one() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x5c79e21a).into()), editor_document_highlight_write_background: Some(rgba(0xa3a3a466).into()), terminal_background: Some(rgba(0xfafafaff).into()), - terminal_ansi_bright_black: Some(rgba(0xaaaaaaff).into()), - terminal_ansi_bright_red: Some(rgba(0xf0b0a4ff).into()), - terminal_ansi_bright_green: Some(rgba(0xb2cfa9ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xf1dfc1ff).into()), - terminal_ansi_bright_blue: Some(rgba(0xb5baf2ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xcea6d3ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0xa4bfdbff).into()), - terminal_ansi_bright_white: Some(rgba(0x383a41ff).into()), + terminal_foreground: Some(rgba(0x383a41ff).into()), + terminal_bright_foreground: Some(rgba(0x383a41ff).into()), + terminal_dim_foreground: Some(rgba(0xfafafaff).into()), terminal_ansi_black: Some(rgba(0xfafafaff).into()), + terminal_ansi_bright_black: Some(rgba(0xaaaaaaff).into()), + terminal_ansi_dim_black: Some(rgba(0x383a41ff).into()), terminal_ansi_red: Some(rgba(0xd36151ff).into()), + terminal_ansi_bright_red: Some(rgba(0xf0b0a4ff).into()), + terminal_ansi_dim_red: Some(rgba(0x6f312aff).into()), terminal_ansi_green: Some(rgba(0x669f59ff).into()), + terminal_ansi_bright_green: Some(rgba(0xb2cfa9ff).into()), + terminal_ansi_dim_green: Some(rgba(0x354d2eff).into()), terminal_ansi_yellow: Some(rgba(0xdec184ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xf1dfc1ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x786441ff).into()), terminal_ansi_blue: Some(rgba(0x5c79e2ff).into()), + terminal_ansi_bright_blue: Some(rgba(0xb5baf2ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x2d3d75ff).into()), terminal_ansi_magenta: Some(rgba(0x994fa6ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xcea6d3ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x4b2a50ff).into()), terminal_ansi_cyan: Some(rgba(0x3b82b7ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0xa4bfdbff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x254058ff).into()), terminal_ansi_white: Some(rgba(0x383a41ff).into()), + terminal_ansi_bright_white: Some(rgba(0x383a41ff).into()), + terminal_ansi_dim_white: Some(rgba(0x98989bff).into()), link_text_hover: Some(rgba(0x5c79e2ff).into()), ..Default::default() }, diff --git a/crates/theme/src/themes/rose_pine.rs b/crates/theme/src/themes/rose_pine.rs index f654e4d9953cb5418eb3838b3ce27b8691a92913..4f68d606478afc9c6c3be7333780183ff4c1946b 100644 --- a/crates/theme/src/themes/rose_pine.rs +++ b/crates/theme/src/themes/rose_pine.rs @@ -76,22 +76,33 @@ pub fn rose_pine() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x9cced71a).into()), editor_document_highlight_write_background: Some(rgba(0x28253c66).into()), terminal_background: Some(rgba(0x191724ff).into()), - terminal_ansi_bright_black: Some(rgba(0x403d55ff).into()), - terminal_ansi_bright_red: Some(rgba(0x7e3647ff).into()), - terminal_ansi_bright_green: Some(rgba(0x31614fff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x8a653bff).into()), - terminal_ansi_bright_blue: Some(rgba(0x566c70ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x4c3b47ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x203a46ff).into()), - terminal_ansi_bright_white: Some(rgba(0xe0def4ff).into()), + terminal_foreground: Some(rgba(0xe0def4ff).into()), + terminal_bright_foreground: Some(rgba(0xe0def4ff).into()), + terminal_dim_foreground: Some(rgba(0x191724ff).into()), terminal_ansi_black: Some(rgba(0x191724ff).into()), + terminal_ansi_bright_black: Some(rgba(0x403d55ff).into()), + terminal_ansi_dim_black: Some(rgba(0xe0def4ff).into()), terminal_ansi_red: Some(rgba(0xea6f92ff).into()), + terminal_ansi_bright_red: Some(rgba(0x7e3647ff).into()), + terminal_ansi_dim_red: Some(rgba(0xfab9c7ff).into()), terminal_ansi_green: Some(rgba(0x5dc2a3ff).into()), + terminal_ansi_bright_green: Some(rgba(0x31614fff).into()), + terminal_ansi_dim_green: Some(rgba(0xb3e1d1ff).into()), terminal_ansi_yellow: Some(rgba(0xf5c177ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x8a653bff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xfedfbbff).into()), terminal_ansi_blue: Some(rgba(0x9cced7ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x566c70ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xcfe7ebff).into()), terminal_ansi_magenta: Some(rgba(0x9d7691ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x4c3b47ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xceb9c7ff).into()), terminal_ansi_cyan: Some(rgba(0x32748fff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x203a46ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x9cb7c6ff).into()), terminal_ansi_white: Some(rgba(0xe0def4ff).into()), + terminal_ansi_bright_white: Some(rgba(0xe0def4ff).into()), + terminal_ansi_dim_white: Some(rgba(0x514e68ff).into()), link_text_hover: Some(rgba(0x9cced7ff).into()), ..Default::default() }, @@ -534,22 +545,33 @@ pub fn rose_pine() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x57949f1a).into()), editor_document_highlight_write_background: Some(rgba(0x9691a466).into()), terminal_background: Some(rgba(0xfaf4edff).into()), - terminal_ansi_bright_black: Some(rgba(0xb8b2baff).into()), - terminal_ansi_bright_red: Some(rgba(0xdcb0bbff).into()), - terminal_ansi_bright_green: Some(rgba(0xa5d5c5ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xfccd9bff).into()), - terminal_ansi_bright_blue: Some(rgba(0xacc9ceff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xbcb1bdff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x97b1c0ff).into()), - terminal_ansi_bright_white: Some(rgba(0x575279ff).into()), + terminal_foreground: Some(rgba(0x575279ff).into()), + terminal_bright_foreground: Some(rgba(0x575279ff).into()), + terminal_dim_foreground: Some(rgba(0xfaf4edff).into()), terminal_ansi_black: Some(rgba(0xfaf4edff).into()), + terminal_ansi_bright_black: Some(rgba(0xb8b2baff).into()), + terminal_ansi_dim_black: Some(rgba(0x575279ff).into()), terminal_ansi_red: Some(rgba(0xb4647aff).into()), + terminal_ansi_bright_red: Some(rgba(0xdcb0bbff).into()), + terminal_ansi_dim_red: Some(rgba(0x57333dff).into()), terminal_ansi_green: Some(rgba(0x3eaa8eff).into()), + terminal_ansi_bright_green: Some(rgba(0xa5d5c5ff).into()), + terminal_ansi_dim_green: Some(rgba(0x265245ff).into()), terminal_ansi_yellow: Some(rgba(0xe99d35ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xfccd9bff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x854a1fff).into()), terminal_ansi_blue: Some(rgba(0x57949fff).into()), + terminal_ansi_bright_blue: Some(rgba(0xacc9ceff).into()), + terminal_ansi_dim_blue: Some(rgba(0x2f484dff).into()), terminal_ansi_magenta: Some(rgba(0x7c697fff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xbcb1bdff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x3e353fff).into()), terminal_ansi_cyan: Some(rgba(0x2a6983ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x97b1c0ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x1c3641ff).into()), terminal_ansi_white: Some(rgba(0x575279ff).into()), + terminal_ansi_bright_white: Some(rgba(0x575279ff).into()), + terminal_ansi_dim_white: Some(rgba(0x827e98ff).into()), link_text_hover: Some(rgba(0x57949fff).into()), ..Default::default() }, @@ -992,22 +1014,33 @@ pub fn rose_pine() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x9cced71a).into()), editor_document_highlight_write_background: Some(rgba(0x59557166).into()), terminal_background: Some(rgba(0x232136ff).into()), - terminal_ansi_bright_black: Some(rgba(0x3f3b58ff).into()), - terminal_ansi_bright_red: Some(rgba(0x7e3647ff).into()), - terminal_ansi_bright_green: Some(rgba(0x31614fff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x8a653bff).into()), - terminal_ansi_bright_blue: Some(rgba(0x566c70ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x51414eff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x264654ff).into()), - terminal_ansi_bright_white: Some(rgba(0xe0def4ff).into()), + terminal_foreground: Some(rgba(0xe0def4ff).into()), + terminal_bright_foreground: Some(rgba(0xe0def4ff).into()), + terminal_dim_foreground: Some(rgba(0x232136ff).into()), terminal_ansi_black: Some(rgba(0x232136ff).into()), + terminal_ansi_bright_black: Some(rgba(0x3f3b58ff).into()), + terminal_ansi_dim_black: Some(rgba(0xe0def4ff).into()), terminal_ansi_red: Some(rgba(0xea6f92ff).into()), + terminal_ansi_bright_red: Some(rgba(0x7e3647ff).into()), + terminal_ansi_dim_red: Some(rgba(0xfab9c7ff).into()), terminal_ansi_green: Some(rgba(0x5dc2a3ff).into()), + terminal_ansi_bright_green: Some(rgba(0x31614fff).into()), + terminal_ansi_dim_green: Some(rgba(0xb3e1d1ff).into()), terminal_ansi_yellow: Some(rgba(0xf5c177ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x8a653bff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xfedfbbff).into()), terminal_ansi_blue: Some(rgba(0x9cced7ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x566c70ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xcfe7ebff).into()), terminal_ansi_magenta: Some(rgba(0xa784a1ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x51414eff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xd3c0cfff).into()), terminal_ansi_cyan: Some(rgba(0x3f8fb0ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x264654ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xa5c6d7ff).into()), terminal_ansi_white: Some(rgba(0xe0def4ff).into()), + terminal_ansi_bright_white: Some(rgba(0xe0def4ff).into()), + terminal_ansi_dim_white: Some(rgba(0x75718eff).into()), link_text_hover: Some(rgba(0x9cced7ff).into()), ..Default::default() }, diff --git a/crates/theme/src/themes/sandcastle.rs b/crates/theme/src/themes/sandcastle.rs index ccf49061014ccf4dbfe4c71393aa9d433e1f63f3..a672f702e13f4f1316c29d1dae32ee4c3f5c6edf 100644 --- a/crates/theme/src/themes/sandcastle.rs +++ b/crates/theme/src/themes/sandcastle.rs @@ -75,22 +75,33 @@ pub fn sandcastle() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x528b8b1a).into()), editor_document_highlight_write_background: Some(rgba(0x7c6f6466).into()), terminal_background: Some(rgba(0x282c34ff).into()), - terminal_ansi_bright_black: Some(rgba(0x5e5753ff).into()), - terminal_ansi_bright_red: Some(rgba(0x57333dff).into()), - terminal_ansi_bright_green: Some(rgba(0x414f4aff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x4e3f22ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x2c4444ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x523a18ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x414f4aff).into()), - terminal_ansi_bright_white: Some(rgba(0xfdf4c1ff).into()), + terminal_foreground: Some(rgba(0xfdf4c1ff).into()), + terminal_bright_foreground: Some(rgba(0xfdf4c1ff).into()), + terminal_dim_foreground: Some(rgba(0x282c34ff).into()), terminal_ansi_black: Some(rgba(0x282c34ff).into()), + terminal_ansi_bright_black: Some(rgba(0x5e5753ff).into()), + terminal_ansi_dim_black: Some(rgba(0xfdf4c1ff).into()), terminal_ansi_red: Some(rgba(0xb4637aff).into()), + terminal_ansi_bright_red: Some(rgba(0x57333dff).into()), + terminal_ansi_dim_red: Some(rgba(0xdcb0bbff).into()), terminal_ansi_green: Some(rgba(0x83a598ff).into()), + terminal_ansi_bright_green: Some(rgba(0x414f4aff).into()), + terminal_ansi_dim_green: Some(rgba(0xc0d2cbff).into()), terminal_ansi_yellow: Some(rgba(0xa07e3bff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x4e3f22ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xd3bd9aff).into()), terminal_ansi_blue: Some(rgba(0x528b8bff).into()), + terminal_ansi_bright_blue: Some(rgba(0x2c4444ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xa8c4c4ff).into()), terminal_ansi_magenta: Some(rgba(0xa87323ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x523a18ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xdab78eff).into()), terminal_ansi_cyan: Some(rgba(0x83a598ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x414f4aff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xc0d2cbff).into()), terminal_ansi_white: Some(rgba(0xfdf4c1ff).into()), + terminal_ansi_bright_white: Some(rgba(0xfdf4c1ff).into()), + terminal_ansi_dim_white: Some(rgba(0x968777ff).into()), link_text_hover: Some(rgba(0x528b8bff).into()), ..Default::default() }, diff --git a/crates/theme/src/themes/solarized.rs b/crates/theme/src/themes/solarized.rs index b903d645396e78c9a2a3a1ebfe0c0f714b59e7d5..ddf6ae8e081faae5d43a2b6750cda2e7198f9293 100644 --- a/crates/theme/src/themes/solarized.rs +++ b/crates/theme/src/themes/solarized.rs @@ -76,22 +76,33 @@ pub fn solarized() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x288bd11a).into()), editor_document_highlight_write_background: Some(rgba(0x6d828866).into()), terminal_background: Some(rgba(0x002b36ff).into()), - terminal_ansi_bright_black: Some(rgba(0x5c7279ff).into()), - terminal_ansi_bright_red: Some(rgba(0x7d181cff).into()), - terminal_ansi_bright_green: Some(rgba(0x434a11ff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x5d4310ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x214465ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x6f1f40ff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x204e4aff).into()), - terminal_ansi_bright_white: Some(rgba(0xfdf6e3ff).into()), + terminal_foreground: Some(rgba(0xfdf6e3ff).into()), + terminal_bright_foreground: Some(rgba(0xfdf6e3ff).into()), + terminal_dim_foreground: Some(rgba(0x002b36ff).into()), terminal_ansi_black: Some(rgba(0x002b36ff).into()), + terminal_ansi_bright_black: Some(rgba(0x5c7279ff).into()), + terminal_ansi_dim_black: Some(rgba(0xfdf6e3ff).into()), terminal_ansi_red: Some(rgba(0xdc3330ff).into()), + terminal_ansi_bright_red: Some(rgba(0x7d181cff).into()), + terminal_ansi_dim_red: Some(rgba(0xfaa091ff).into()), terminal_ansi_green: Some(rgba(0x859904ff).into()), + terminal_ansi_bright_green: Some(rgba(0x434a11ff).into()), + terminal_ansi_dim_green: Some(rgba(0xc6cb8bff).into()), terminal_ansi_yellow: Some(rgba(0xb58903ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x5d4310ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xe1c28aff).into()), terminal_ansi_blue: Some(rgba(0x288bd1ff).into()), + terminal_ansi_bright_blue: Some(rgba(0x214465ff).into()), + terminal_ansi_dim_blue: Some(rgba(0xa5c3e9ff).into()), terminal_ansi_magenta: Some(rgba(0xd33782ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x6f1f40ff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xf0a2bfff).into()), terminal_ansi_cyan: Some(rgba(0x2ca198ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x204e4aff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x9fd0cbff).into()), terminal_ansi_white: Some(rgba(0xfdf6e3ff).into()), + terminal_ansi_bright_white: Some(rgba(0xfdf6e3ff).into()), + terminal_ansi_dim_white: Some(rgba(0x7b8e91ff).into()), link_text_hover: Some(rgba(0x288bd1ff).into()), ..Default::default() }, @@ -520,22 +531,33 @@ pub fn solarized() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x298bd11a).into()), editor_document_highlight_write_background: Some(rgba(0x6d828866).into()), terminal_background: Some(rgba(0xfdf6e3ff).into()), - terminal_ansi_bright_black: Some(rgba(0x7b8e91ff).into()), - terminal_ansi_bright_red: Some(rgba(0xfaa091ff).into()), - terminal_ansi_bright_green: Some(rgba(0xc6cb8bff).into()), - terminal_ansi_bright_yellow: Some(rgba(0xe1c28aff).into()), - terminal_ansi_bright_blue: Some(rgba(0xa5c3e9ff).into()), - terminal_ansi_bright_magenta: Some(rgba(0xf0a2bfff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x9fd0cbff).into()), - terminal_ansi_bright_white: Some(rgba(0x002b36ff).into()), + terminal_foreground: Some(rgba(0x002b36ff).into()), + terminal_bright_foreground: Some(rgba(0x002b36ff).into()), + terminal_dim_foreground: Some(rgba(0xfdf6e3ff).into()), terminal_ansi_black: Some(rgba(0xfdf6e3ff).into()), + terminal_ansi_bright_black: Some(rgba(0x7b8e91ff).into()), + terminal_ansi_dim_black: Some(rgba(0x002b36ff).into()), terminal_ansi_red: Some(rgba(0xdc3330ff).into()), + terminal_ansi_bright_red: Some(rgba(0xfaa091ff).into()), + terminal_ansi_dim_red: Some(rgba(0x7d181cff).into()), terminal_ansi_green: Some(rgba(0x859904ff).into()), + terminal_ansi_bright_green: Some(rgba(0xc6cb8bff).into()), + terminal_ansi_dim_green: Some(rgba(0x434a11ff).into()), terminal_ansi_yellow: Some(rgba(0xb58904ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0xe1c28aff).into()), + terminal_ansi_dim_yellow: Some(rgba(0x5d4310ff).into()), terminal_ansi_blue: Some(rgba(0x298bd1ff).into()), + terminal_ansi_bright_blue: Some(rgba(0xa5c3e9ff).into()), + terminal_ansi_dim_blue: Some(rgba(0x214465ff).into()), terminal_ansi_magenta: Some(rgba(0xd33882ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0xf0a2bfff).into()), + terminal_ansi_dim_magenta: Some(rgba(0x6f1f40ff).into()), terminal_ansi_cyan: Some(rgba(0x2ca198ff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x9fd0cbff).into()), + terminal_ansi_dim_cyan: Some(rgba(0x204e4aff).into()), terminal_ansi_white: Some(rgba(0x002b36ff).into()), + terminal_ansi_bright_white: Some(rgba(0x002b36ff).into()), + terminal_ansi_dim_white: Some(rgba(0x5c7279ff).into()), link_text_hover: Some(rgba(0x298bd1ff).into()), ..Default::default() }, diff --git a/crates/theme/src/themes/summercamp.rs b/crates/theme/src/themes/summercamp.rs index 0a580e6893578d846b475493897e294aafaf74eb..5f5a922b0b2cf47ed10570a5748c765c79a2631a 100644 --- a/crates/theme/src/themes/summercamp.rs +++ b/crates/theme/src/themes/summercamp.rs @@ -75,22 +75,33 @@ pub fn summercamp() -> UserThemeFamily { editor_document_highlight_read_background: Some(rgba(0x499bef1a).into()), editor_document_highlight_write_background: Some(rgba(0x49443366).into()), terminal_background: Some(rgba(0x1c1810ff).into()), - terminal_ansi_bright_black: Some(rgba(0x3b3627ff).into()), - terminal_ansi_bright_red: Some(rgba(0x7f2724ff).into()), - terminal_ansi_bright_green: Some(rgba(0x28842cff).into()), - terminal_ansi_bright_yellow: Some(rgba(0x8c9a10ff).into()), - terminal_ansi_bright_blue: Some(rgba(0x234b7fff).into()), - terminal_ansi_bright_magenta: Some(rgba(0x88487eff).into()), - terminal_ansi_bright_cyan: Some(rgba(0x298462ff).into()), - terminal_ansi_bright_white: Some(rgba(0xf8f5deff).into()), + terminal_foreground: Some(rgba(0xf8f5deff).into()), + terminal_bright_foreground: Some(rgba(0xf8f5deff).into()), + terminal_dim_foreground: Some(rgba(0x1c1810ff).into()), terminal_ansi_black: Some(rgba(0x1c1810ff).into()), + terminal_ansi_bright_black: Some(rgba(0x3b3627ff).into()), + terminal_ansi_dim_black: Some(rgba(0xf8f5deff).into()), terminal_ansi_red: Some(rgba(0xe35142ff).into()), + terminal_ansi_bright_red: Some(rgba(0x7f2724ff).into()), + terminal_ansi_dim_red: Some(rgba(0xfbab9cff).into()), terminal_ansi_green: Some(rgba(0x5dea5aff).into()), + terminal_ansi_bright_green: Some(rgba(0x28842cff).into()), + terminal_ansi_dim_green: Some(rgba(0xb9f7aeff).into()), terminal_ansi_yellow: Some(rgba(0xf1fe29ff).into()), + terminal_ansi_bright_yellow: Some(rgba(0x8c9a10ff).into()), + terminal_ansi_dim_yellow: Some(rgba(0xffffa2ff).into()), terminal_ansi_blue: Some(rgba(0x499befff).into()), + terminal_ansi_bright_blue: Some(rgba(0x234b7fff).into()), + terminal_ansi_dim_blue: Some(rgba(0xb1ccf8ff).into()), terminal_ansi_magenta: Some(rgba(0xf59be6ff).into()), + terminal_ansi_bright_magenta: Some(rgba(0x88487eff).into()), + terminal_ansi_dim_magenta: Some(rgba(0xfccef3ff).into()), terminal_ansi_cyan: Some(rgba(0x5beabcff).into()), + terminal_ansi_bright_cyan: Some(rgba(0x298462ff).into()), + terminal_ansi_dim_cyan: Some(rgba(0xb7f6ddff).into()), terminal_ansi_white: Some(rgba(0xf8f5deff).into()), + terminal_ansi_bright_white: Some(rgba(0xf8f5deff).into()), + terminal_ansi_dim_white: Some(rgba(0x57533fff).into()), link_text_hover: Some(rgba(0x499befff).into()), ..Default::default() }, diff --git a/crates/theme_importer/src/theme_printer.rs b/crates/theme_importer/src/theme_printer.rs index f708e4305edf71eb914bf445370758bf0d624e42..88a860034d6cd6c6bf3f124f7788cade0ed78953 100644 --- a/crates/theme_importer/src/theme_printer.rs +++ b/crates/theme_importer/src/theme_printer.rs @@ -244,43 +244,60 @@ impl<'a> Debug for ThemeColorsRefinementPrinter<'a> { self.0.editor_document_highlight_write_background, ), ("terminal_background", self.0.terminal_background), + ("terminal_foreground", self.0.terminal_foreground), + ( + "terminal_bright_foreground", + self.0.terminal_bright_foreground, + ), + ("terminal_dim_foreground", self.0.terminal_dim_foreground), + ("terminal_ansi_black", self.0.terminal_ansi_black), ( "terminal_ansi_bright_black", self.0.terminal_ansi_bright_black, ), + ("terminal_ansi_dim_black", self.0.terminal_ansi_dim_black), + ("terminal_ansi_red", self.0.terminal_ansi_red), ("terminal_ansi_bright_red", self.0.terminal_ansi_bright_red), + ("terminal_ansi_dim_red", self.0.terminal_ansi_dim_red), + ("terminal_ansi_green", self.0.terminal_ansi_green), ( "terminal_ansi_bright_green", self.0.terminal_ansi_bright_green, ), + ("terminal_ansi_dim_green", self.0.terminal_ansi_dim_green), + ("terminal_ansi_yellow", self.0.terminal_ansi_yellow), ( "terminal_ansi_bright_yellow", self.0.terminal_ansi_bright_yellow, ), + ("terminal_ansi_dim_yellow", self.0.terminal_ansi_dim_yellow), + ("terminal_ansi_blue", self.0.terminal_ansi_blue), ( "terminal_ansi_bright_blue", self.0.terminal_ansi_bright_blue, ), + ("terminal_ansi_dim_blue", self.0.terminal_ansi_dim_blue), + ("terminal_ansi_magenta", self.0.terminal_ansi_magenta), ( "terminal_ansi_bright_magenta", self.0.terminal_ansi_bright_magenta, ), + ( + "terminal_ansi_dim_magenta", + self.0.terminal_ansi_dim_magenta, + ), + ("terminal_ansi_cyan", self.0.terminal_ansi_cyan), ( "terminal_ansi_bright_cyan", self.0.terminal_ansi_bright_cyan, ), + ("terminal_ansi_dim_cyan", self.0.terminal_ansi_dim_cyan), + ("terminal_ansi_white", self.0.terminal_ansi_white), ( "terminal_ansi_bright_white", self.0.terminal_ansi_bright_white, ), - ("terminal_ansi_black", self.0.terminal_ansi_black), - ("terminal_ansi_red", self.0.terminal_ansi_red), - ("terminal_ansi_green", self.0.terminal_ansi_green), - ("terminal_ansi_yellow", self.0.terminal_ansi_yellow), - ("terminal_ansi_blue", self.0.terminal_ansi_blue), - ("terminal_ansi_magenta", self.0.terminal_ansi_magenta), - ("terminal_ansi_cyan", self.0.terminal_ansi_cyan), - ("terminal_ansi_white", self.0.terminal_ansi_white), + ("terminal_ansi_dim_white", self.0.terminal_ansi_dim_white), ("link_text_hover", self.0.link_text_hover), ]; diff --git a/crates/theme_importer/src/zed1/converter.rs b/crates/theme_importer/src/zed1/converter.rs index 2f640c799f99ddf21989890c2e7a37a2a332b791..3c5f2498404242505ea10a2da505e23ac06cb82a 100644 --- a/crates/theme_importer/src/zed1/converter.rs +++ b/crates/theme_importer/src/zed1/converter.rs @@ -250,22 +250,33 @@ impl Zed1ThemeConverter { editor.document_highlight_write_background, ), terminal_background: convert(terminal.background), - terminal_ansi_bright_black: convert(terminal.bright_black), - terminal_ansi_bright_red: convert(terminal.bright_red), - terminal_ansi_bright_green: convert(terminal.bright_green), - terminal_ansi_bright_yellow: convert(terminal.bright_yellow), - terminal_ansi_bright_blue: convert(terminal.bright_blue), - terminal_ansi_bright_magenta: convert(terminal.bright_magenta), - terminal_ansi_bright_cyan: convert(terminal.bright_cyan), - terminal_ansi_bright_white: convert(terminal.bright_white), + terminal_foreground: convert(terminal.foreground), + terminal_bright_foreground: convert(terminal.bright_foreground), + terminal_dim_foreground: convert(terminal.dim_foreground), terminal_ansi_black: convert(terminal.black), + terminal_ansi_bright_black: convert(terminal.bright_black), + terminal_ansi_dim_black: convert(terminal.dim_black), terminal_ansi_red: convert(terminal.red), + terminal_ansi_bright_red: convert(terminal.bright_red), + terminal_ansi_dim_red: convert(terminal.dim_red), terminal_ansi_green: convert(terminal.green), + terminal_ansi_bright_green: convert(terminal.bright_green), + terminal_ansi_dim_green: convert(terminal.dim_green), terminal_ansi_yellow: convert(terminal.yellow), + terminal_ansi_bright_yellow: convert(terminal.bright_yellow), + terminal_ansi_dim_yellow: convert(terminal.dim_yellow), terminal_ansi_blue: convert(terminal.blue), + terminal_ansi_bright_blue: convert(terminal.bright_blue), + terminal_ansi_dim_blue: convert(terminal.dim_blue), terminal_ansi_magenta: convert(terminal.magenta), + terminal_ansi_bright_magenta: convert(terminal.bright_magenta), + terminal_ansi_dim_magenta: convert(terminal.dim_magenta), terminal_ansi_cyan: convert(terminal.cyan), + terminal_ansi_bright_cyan: convert(terminal.bright_cyan), + terminal_ansi_dim_cyan: convert(terminal.dim_cyan), terminal_ansi_white: convert(terminal.white), + terminal_ansi_bright_white: convert(terminal.bright_white), + terminal_ansi_dim_white: convert(terminal.dim_white), link_text_hover: convert(highest.accent.default.foreground), }) } From 00e46fdde09ea9a88a89da5fd05a83a85f84375a Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Fri, 19 Jan 2024 12:51:59 -0700 Subject: [PATCH 042/104] Fix positioning of windows on secondary displays CGDisplayBounds returns data in "global display coordinates" (which are the same as Zed's coordinates), different from the NS APIs which use "screen coordinates" (which have the Y axis inverted) Also remove some transmutes while we're at it --- crates/gpui/src/platform/mac/display.rs | 45 +++++++++++++++---------- crates/gpui/src/platform/mac/window.rs | 16 ++++----- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/crates/gpui/src/platform/mac/display.rs b/crates/gpui/src/platform/mac/display.rs index 95ec83cd5a9d120fbcbe531a5cec3c9dafa3c95a..1f6023ed147364ca891a8b90f6db870e21420d51 100644 --- a/crates/gpui/src/platform/mac/display.rs +++ b/crates/gpui/src/platform/mac/display.rs @@ -3,13 +3,10 @@ use anyhow::Result; use cocoa::{ appkit::NSScreen, base::{id, nil}, - foundation::{NSDictionary, NSString}, + foundation::{NSDictionary, NSPoint, NSRect, NSSize, NSString}, }; use core_foundation::uuid::{CFUUIDGetUUIDBytes, CFUUIDRef}; -use core_graphics::{ - display::{CGDirectDisplayID, CGDisplayBounds, CGGetActiveDisplayList}, - geometry::{CGPoint, CGRect, CGSize}, -}; +use core_graphics::display::{CGDirectDisplayID, CGDisplayBounds, CGGetActiveDisplayList}; use objc::{msg_send, sel, sel_impl}; use uuid::Uuid; @@ -77,14 +74,14 @@ extern "C" { fn CGDisplayCreateUUIDFromDisplayID(display: CGDirectDisplayID) -> CFUUIDRef; } -/// Convert the given rectangle from CoreGraphics' native coordinate space to GPUI's coordinate space. +/// Convert the given rectangle from Cocoa's coordinate space to GPUI's coordinate space. /// -/// CoreGraphics' coordinate space has its origin at the bottom left of the primary screen, +/// Cocoa's coordinate space has its origin at the bottom left of the primary screen, /// with the Y axis pointing upwards. /// /// Conversely, in GPUI's coordinate system, the origin is placed at the top left of the primary -/// screen, with the Y axis pointing downwards. -pub(crate) fn display_bounds_from_native(rect: CGRect) -> Bounds { +/// screen, with the Y axis pointing downwards (matching CoreGraphics) +pub(crate) fn global_bounds_from_ns_rect(rect: NSRect) -> Bounds { let primary_screen_size = unsafe { CGDisplayBounds(MacDisplay::primary().id().0) }.size; Bounds { @@ -101,22 +98,22 @@ pub(crate) fn display_bounds_from_native(rect: CGRect) -> Bounds { } } -/// Convert the given rectangle from GPUI's coordinate system to CoreGraphics' native coordinate space. +/// Convert the given rectangle from GPUI's coordinate system to Cocoa's native coordinate space. /// -/// CoreGraphics' coordinate space has its origin at the bottom left of the primary screen, +/// Cocoa's coordinate space has its origin at the bottom left of the primary screen, /// with the Y axis pointing upwards. /// /// Conversely, in GPUI's coordinate system, the origin is placed at the top left of the primary -/// screen, with the Y axis pointing downwards. -pub(crate) fn display_bounds_to_native(bounds: Bounds) -> CGRect { +/// screen, with the Y axis pointing downwards (matching CoreGraphics) +pub(crate) fn global_bounds_to_ns_rect(bounds: Bounds) -> NSRect { let primary_screen_height = MacDisplay::primary().bounds().size.height; - CGRect::new( - &CGPoint::new( + NSRect::new( + NSPoint::new( bounds.origin.x.into(), (primary_screen_height - bounds.origin.y - bounds.size.height).into(), ), - &CGSize::new(bounds.size.width.into(), bounds.size.height.into()), + NSSize::new(bounds.size.width.into(), bounds.size.height.into()), ) } @@ -155,8 +152,20 @@ impl PlatformDisplay for MacDisplay { fn bounds(&self) -> Bounds { unsafe { - let native_bounds = CGDisplayBounds(self.0); - display_bounds_from_native(native_bounds) + // CGDisplayBounds is in "global display" coordinates, where 0 is + // the top left of the primary display. + let bounds = CGDisplayBounds(self.0); + + Bounds { + origin: point( + GlobalPixels(bounds.origin.x as f32), + GlobalPixels(bounds.origin.y as f32), + ), + size: size( + GlobalPixels(bounds.size.width as f32), + GlobalPixels(bounds.size.height as f32), + ), + } } } } diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index 134390bb79900b0cc09efba720b373303d8cd26b..e1277e3a09e7add9d3de60ac99a6ebd3796523d1 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -1,6 +1,6 @@ -use super::{display_bounds_from_native, ns_string, MacDisplay, MetalRenderer, NSRange}; +use super::{global_bounds_from_ns_rect, ns_string, MacDisplay, MetalRenderer, NSRange}; use crate::{ - display_bounds_to_native, point, px, size, AnyWindowHandle, Bounds, ExternalPaths, + global_bounds_to_ns_rect, point, px, size, AnyWindowHandle, Bounds, ExternalPaths, FileDropEvent, ForegroundExecutor, GlobalPixels, KeyDownEvent, Keystroke, Modifiers, ModifiersChangedEvent, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent, Pixels, PlatformAtlas, PlatformDisplay, PlatformInput, PlatformInputHandler, PlatformWindow, Point, @@ -411,10 +411,8 @@ impl MacWindowState { } fn frame(&self) -> Bounds { - unsafe { - let frame = NSWindow::frame(self.native_window); - display_bounds_from_native(mem::transmute::(frame)) - } + let frame = unsafe { NSWindow::frame(self.native_window) }; + global_bounds_from_ns_rect(frame) } fn content_size(&self) -> Size { @@ -527,11 +525,11 @@ impl MacWindow { WindowBounds::Fixed(bounds) => { let display_bounds = display.bounds(); let frame = if bounds.intersects(&display_bounds) { - display_bounds_to_native(bounds) + global_bounds_to_ns_rect(bounds) } else { - display_bounds_to_native(display_bounds) + global_bounds_to_ns_rect(display_bounds) }; - native_window.setFrame_display_(mem::transmute::(frame), YES); + native_window.setFrame_display_(frame, YES); } } From 1ceccdf03bd9a8749cf006ad8542c274338614bb Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 19 Jan 2024 11:49:18 -0800 Subject: [PATCH 043/104] Move the details of completion-resolution logic into Project Co-authored-by: Conrad --- crates/editor/src/editor.rs | 239 ++++------------------------------ crates/project/src/project.rs | 174 ++++++++++++++++++++++++- 2 files changed, 192 insertions(+), 221 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index b31dd54208a52df335e7b1af55f163d758e91293..9a12827dbd5f14c7e6de56cbb5a63c107e03b3c4 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -40,7 +40,7 @@ pub(crate) use actions::*; use aho_corasick::AhoCorasick; use anyhow::{anyhow, Context as _, Result}; use blink_manager::BlinkManager; -use client::{Client, Collaborator, ParticipantIndex}; +use client::{Collaborator, ParticipantIndex}; use clock::ReplicaId; use collections::{BTreeMap, Bound, HashMap, HashSet, VecDeque}; use convert_case::{Case, Casing}; @@ -71,8 +71,7 @@ use language::{ language_settings::{self, all_language_settings, InlayHintSettings}, markdown, point_from_lsp, AutoindentMode, BracketPair, Buffer, Capability, CodeAction, CodeLabel, Completion, CursorShape, Diagnostic, Documentation, IndentKind, IndentSize, - Language, LanguageRegistry, LanguageServerName, OffsetRangeExt, Point, Selection, - SelectionGoal, TransactionId, + Language, LanguageServerName, OffsetRangeExt, Point, Selection, SelectionGoal, TransactionId, }; use link_go_to_definition::{GoToDefinitionLink, InlayHighlight, LinkGoToDefinitionState}; @@ -88,7 +87,7 @@ use ordered_float::OrderedFloat; use parking_lot::RwLock; use project::{FormatTrigger, Location, Project, ProjectPath, ProjectTransaction}; use rand::prelude::*; -use rpc::proto::{self, *}; +use rpc::proto::*; use scroll::{Autoscroll, OngoingScroll, ScrollAnchor, ScrollManager, ScrollbarAutoHide}; use selections_collection::{resolve_multiple, MutableSelectionsCollection, SelectionsCollection}; use serde::{Deserialize, Serialize}; @@ -735,81 +734,19 @@ impl CompletionsMenu { return None; }; - let client = project.read(cx).client(); - let language_registry = project.read(cx).languages().clone(); - - let is_remote = project.read(cx).is_remote(); - let project_id = project.read(cx).remote_id(); - - let completions = self.completions.clone(); - let completion_indices: Vec<_> = self.matches.iter().map(|m| m.candidate_id).collect(); - - Some(cx.spawn(move |this, mut cx| async move { - if is_remote { - let Some(project_id) = project_id else { - log::error!("Remote project without remote_id"); - return; - }; - - for completion_index in completion_indices { - let completions_guard = completions.read(); - let completion = &completions_guard[completion_index]; - if completion.documentation.is_some() { - continue; - } - - let server_id = completion.server_id; - let completion = completion.lsp_completion.clone(); - drop(completions_guard); - - Self::resolve_completion_documentation_remote( - project_id, - server_id, - completions.clone(), - completion_index, - completion, - client.clone(), - language_registry.clone(), - ) - .await; - - _ = this.update(&mut cx, |_, cx| cx.notify()); - } - } else { - for completion_index in completion_indices { - let completions_guard = completions.read(); - let completion = &completions_guard[completion_index]; - if completion.documentation.is_some() { - continue; - } - - let server_id = completion.server_id; - let completion = completion.lsp_completion.clone(); - drop(completions_guard); - - let server = project - .read_with(&mut cx, |project, _| { - project.language_server_for_id(server_id) - }) - .ok() - .flatten(); - let Some(server) = server else { - return; - }; - - Self::resolve_completion_documentation_local( - server, - completions.clone(), - completion_index, - completion, - language_registry.clone(), - ) - .await; + let resolve_task = project.update(cx, |project, cx| { + project.resolve_completions( + self.matches.iter().map(|m| m.candidate_id).collect(), + self.completions.clone(), + cx, + ) + }); - _ = this.update(&mut cx, |_, cx| cx.notify()); - } + return Some(cx.spawn(move |this, mut cx| async move { + if let Some(true) = resolve_task.await.log_err() { + this.update(&mut cx, |_, cx| cx.notify()).ok(); } - })) + })); } fn attempt_resolve_selected_completion_documentation( @@ -826,146 +763,16 @@ impl CompletionsMenu { let Some(project) = project else { return; }; - let language_registry = project.read(cx).languages().clone(); - - let completions = self.completions.clone(); - let completions_guard = completions.read(); - let completion = &completions_guard[completion_index]; - if completion.documentation.is_some() { - return; - } - - let server_id = completion.server_id; - let completion = completion.lsp_completion.clone(); - drop(completions_guard); - - if project.read(cx).is_remote() { - let Some(project_id) = project.read(cx).remote_id() else { - log::error!("Remote project without remote_id"); - return; - }; - - let client = project.read(cx).client(); - - cx.spawn(move |this, mut cx| async move { - Self::resolve_completion_documentation_remote( - project_id, - server_id, - completions.clone(), - completion_index, - completion, - client, - language_registry.clone(), - ) - .await; - - _ = this.update(&mut cx, |_, cx| cx.notify()); - }) - .detach(); - } else { - let Some(server) = project.read(cx).language_server_for_id(server_id) else { - return; - }; - - cx.spawn(move |this, mut cx| async move { - Self::resolve_completion_documentation_local( - server, - completions, - completion_index, - completion, - language_registry, - ) - .await; - - _ = this.update(&mut cx, |_, cx| cx.notify()); - }) - .detach(); - } - } - - async fn resolve_completion_documentation_remote( - project_id: u64, - server_id: LanguageServerId, - completions: Arc>>, - completion_index: usize, - completion: lsp::CompletionItem, - client: Arc, - language_registry: Arc, - ) { - let request = proto::ResolveCompletionDocumentation { - project_id, - language_server_id: server_id.0 as u64, - lsp_completion: serde_json::to_string(&completion).unwrap().into_bytes(), - }; - - let Some(response) = client - .request(request) - .await - .context("completion documentation resolve proto request") - .log_err() - else { - return; - }; - - if response.text.is_empty() { - let mut completions = completions.write(); - let completion = &mut completions[completion_index]; - completion.documentation = Some(Documentation::Undocumented); - } - let documentation = if response.is_markdown { - Documentation::MultiLineMarkdown( - markdown::parse_markdown(&response.text, &language_registry, None).await, - ) - } else if response.text.lines().count() <= 1 { - Documentation::SingleLine(response.text) - } else { - Documentation::MultiLinePlainText(response.text) - }; - - let mut completions = completions.write(); - let completion = &mut completions[completion_index]; - completion.documentation = Some(documentation); - } - - async fn resolve_completion_documentation_local( - server: Arc, - completions: Arc>>, - completion_index: usize, - completion: lsp::CompletionItem, - language_registry: Arc, - ) { - let can_resolve = server - .capabilities() - .completion_provider - .as_ref() - .and_then(|options| options.resolve_provider) - .unwrap_or(false); - if !can_resolve { - return; - } - - let request = server.request::(completion); - let Some(completion_item) = request.await.log_err() else { - return; - }; - - if let Some(lsp_documentation) = completion_item.documentation { - let documentation = language::prepare_completion_documentation( - &lsp_documentation, - &language_registry, - None, // TODO: Try to reasonably work out which language the completion is for - ) - .await; - - let mut completions = completions.write(); - let completion = &mut completions[completion_index]; - completion.documentation = Some(documentation); - } else { - let mut completions = completions.write(); - let completion = &mut completions[completion_index]; - completion.documentation = Some(Documentation::Undocumented); - } + let resolve_task = project.update(cx, |project, cx| { + project.resolve_completions(vec![completion_index], self.completions.clone(), cx) + }); + cx.spawn(move |this, mut cx| async move { + if let Some(true) = resolve_task.await.log_err() { + this.update(&mut cx, |_, cx| cx.notify()).ok(); + } + }) + .detach(); } fn visible(&self) -> bool { diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 2088fcbdaa1fc6cc8a744fcf987e4491d6ac05ca..4d4c6a7f8bf69ddca8c7a386e4fbdaaf5f693e28 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -34,16 +34,16 @@ use gpui::{ use itertools::Itertools; use language::{ language_settings::{language_settings, FormatOnSave, Formatter, InlayHintKind}, - point_to_lsp, + markdown, point_to_lsp, proto::{ deserialize_anchor, deserialize_fingerprint, deserialize_line_ending, deserialize_version, serialize_anchor, serialize_version, split_operations, }, range_from_lsp, range_to_lsp, Bias, Buffer, BufferSnapshot, CachedLspAdapter, Capability, CodeAction, CodeLabel, Completion, Diagnostic, DiagnosticEntry, DiagnosticSet, Diff, - Event as BufferEvent, File as _, Language, LanguageRegistry, LanguageServerName, LocalFile, - LspAdapterDelegate, OffsetRangeExt, Operation, Patch, PendingLanguageServer, PointUtf16, - TextBufferSnapshot, ToOffset, ToPointUtf16, Transaction, Unclipped, + Documentation, Event as BufferEvent, File as _, Language, LanguageRegistry, LanguageServerName, + LocalFile, LspAdapterDelegate, OffsetRangeExt, Operation, Patch, PendingLanguageServer, + PointUtf16, TextBufferSnapshot, ToOffset, ToPointUtf16, Transaction, Unclipped, }; use log::error; use lsp::{ @@ -52,7 +52,7 @@ use lsp::{ }; use lsp_command::*; use node_runtime::NodeRuntime; -use parking_lot::Mutex; +use parking_lot::{Mutex, RwLock}; use postage::watch; use prettier_support::{DefaultPrettier, PrettierInstance}; use project_settings::{LspSettings, ProjectSettings}; @@ -4828,6 +4828,170 @@ impl Project { } } + pub fn resolve_completions( + &self, + completion_indices: Vec, + completions: Arc>>, + cx: &mut ModelContext, + ) -> Task> { + let client = self.client(); + let language_registry = self.languages().clone(); + + let is_remote = self.is_remote(); + let project_id = self.remote_id(); + + cx.spawn(move |this, mut cx| async move { + let mut did_resolve = false; + if is_remote { + let project_id = + project_id.ok_or_else(|| anyhow!("Remote project without remote_id"))?; + + for completion_index in completion_indices { + let completions_guard = completions.read(); + let completion = &completions_guard[completion_index]; + if completion.documentation.is_some() { + continue; + } + + did_resolve = true; + let server_id = completion.server_id; + let completion = completion.lsp_completion.clone(); + drop(completions_guard); + + Self::resolve_completion_documentation_remote( + project_id, + server_id, + completions.clone(), + completion_index, + completion, + client.clone(), + language_registry.clone(), + ) + .await; + } + } else { + for completion_index in completion_indices { + let completions_guard = completions.read(); + let completion = &completions_guard[completion_index]; + if completion.documentation.is_some() { + continue; + } + + let server_id = completion.server_id; + let completion = completion.lsp_completion.clone(); + drop(completions_guard); + + let server = this + .read_with(&mut cx, |project, _| { + project.language_server_for_id(server_id) + }) + .ok() + .flatten(); + let Some(server) = server else { + continue; + }; + + did_resolve = true; + Self::resolve_completion_documentation_local( + server, + completions.clone(), + completion_index, + completion, + language_registry.clone(), + ) + .await; + } + } + + Ok(did_resolve) + }) + } + + async fn resolve_completion_documentation_local( + server: Arc, + completions: Arc>>, + completion_index: usize, + completion: lsp::CompletionItem, + language_registry: Arc, + ) { + let can_resolve = server + .capabilities() + .completion_provider + .as_ref() + .and_then(|options| options.resolve_provider) + .unwrap_or(false); + if !can_resolve { + return; + } + + let request = server.request::(completion); + let Some(completion_item) = request.await.log_err() else { + return; + }; + + if let Some(lsp_documentation) = completion_item.documentation { + let documentation = language::prepare_completion_documentation( + &lsp_documentation, + &language_registry, + None, // TODO: Try to reasonably work out which language the completion is for + ) + .await; + + let mut completions = completions.write(); + let completion = &mut completions[completion_index]; + completion.documentation = Some(documentation); + } else { + let mut completions = completions.write(); + let completion = &mut completions[completion_index]; + completion.documentation = Some(Documentation::Undocumented); + } + } + + async fn resolve_completion_documentation_remote( + project_id: u64, + server_id: LanguageServerId, + completions: Arc>>, + completion_index: usize, + completion: lsp::CompletionItem, + client: Arc, + language_registry: Arc, + ) { + let request = proto::ResolveCompletionDocumentation { + project_id, + language_server_id: server_id.0 as u64, + lsp_completion: serde_json::to_string(&completion).unwrap().into_bytes(), + }; + + let Some(response) = client + .request(request) + .await + .context("completion documentation resolve proto request") + .log_err() + else { + return; + }; + + if response.text.is_empty() { + let mut completions = completions.write(); + let completion = &mut completions[completion_index]; + completion.documentation = Some(Documentation::Undocumented); + } + + let documentation = if response.is_markdown { + Documentation::MultiLineMarkdown( + markdown::parse_markdown(&response.text, &language_registry, None).await, + ) + } else if response.text.lines().count() <= 1 { + Documentation::SingleLine(response.text) + } else { + Documentation::MultiLinePlainText(response.text) + }; + + let mut completions = completions.write(); + let completion = &mut completions[completion_index]; + completion.documentation = Some(documentation); + } + pub fn apply_additional_edits_for_completion( &self, buffer_handle: Model, From 139986d080d3e9a8961e9d92ca9ad26d0bd4d3d8 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 19 Jan 2024 13:12:33 -0800 Subject: [PATCH 044/104] Start work on autocomplete for chat mentions Co-authored-by: Conrad Co-authored-by: Nathan Co-authored-by: Marshall --- Cargo.lock | 1 + crates/collab_ui/Cargo.toml | 1 + .../src/chat_panel/message_editor.rs | 110 +++++++++++++++++- crates/editor/src/editor.rs | 67 ++++++++--- crates/editor/src/element.rs | 6 +- crates/language/src/language.rs | 2 + 6 files changed, 165 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 010e7763e490515c7a47f3fada4ffa24a612e522..00d254ef450194106e69216b58d2c00b0fc3f5d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1548,6 +1548,7 @@ dependencies = [ "log", "menu", "notifications", + "parking_lot 0.11.2", "picker", "postage", "pretty_assertions", diff --git a/crates/collab_ui/Cargo.toml b/crates/collab_ui/Cargo.toml index 84c1810bc841d904a7a534fb562671dc9d7232c9..0fbf7deb7836c36be047a10f14cec419eadc5d8d 100644 --- a/crates/collab_ui/Cargo.toml +++ b/crates/collab_ui/Cargo.toml @@ -60,6 +60,7 @@ anyhow.workspace = true futures.workspace = true lazy_static.workspace = true log.workspace = true +parking_lot.workspace = true schemars.workspace = true postage.workspace = true serde.workspace = true diff --git a/crates/collab_ui/src/chat_panel/message_editor.rs b/crates/collab_ui/src/chat_panel/message_editor.rs index 7999db529a43985ae2b52cdde9f2108f9620b35c..05a9ad5c085e2272c4a4719789b0947bd96e44f1 100644 --- a/crates/collab_ui/src/chat_panel/message_editor.rs +++ b/crates/collab_ui/src/chat_panel/message_editor.rs @@ -1,17 +1,22 @@ -use std::{sync::Arc, time::Duration}; - +use anyhow::Result; use channel::{ChannelId, ChannelMembership, ChannelStore, MessageParams}; use client::UserId; use collections::HashMap; -use editor::{AnchorRangeExt, Editor, EditorElement, EditorStyle}; +use editor::{AnchorRangeExt, CompletionProvider, Editor, EditorElement, EditorStyle}; +use fuzzy::StringMatchCandidate; use gpui::{ AsyncWindowContext, FocusableView, FontStyle, FontWeight, HighlightStyle, IntoElement, Model, Render, SharedString, Task, TextStyle, View, ViewContext, WeakView, WhiteSpace, }; -use language::{language_settings::SoftWrap, Buffer, BufferSnapshot, LanguageRegistry}; +use language::{ + language_settings::SoftWrap, Anchor, Buffer, BufferSnapshot, CodeLabel, Completion, + LanguageRegistry, LanguageServerId, ToOffset, +}; use lazy_static::lazy_static; +use parking_lot::RwLock; use project::search::SearchQuery; use settings::Settings; +use std::{sync::Arc, time::Duration}; use theme::ThemeSettings; use ui::prelude::*; @@ -31,6 +36,33 @@ pub struct MessageEditor { channel_id: Option, } +struct MessageEditorCompletionProvider(WeakView); + +impl CompletionProvider for MessageEditorCompletionProvider { + fn completions( + &self, + buffer: &Model, + buffer_position: language::Anchor, + cx: &mut ViewContext, + ) -> Task>> { + let Some(handle) = self.0.upgrade() else { + return Task::ready(Ok(Vec::new())); + }; + handle.update(cx, |message_editor, cx| { + message_editor.completions(buffer, buffer_position, cx) + }) + } + + fn resolve_completions( + &self, + _completion_indices: Vec, + _completions: Arc>>, + _cx: &mut ViewContext, + ) -> Task> { + Task::ready(Ok(false)) + } +} + impl MessageEditor { pub fn new( language_registry: Arc, @@ -38,8 +70,10 @@ impl MessageEditor { editor: View, cx: &mut ViewContext, ) -> Self { + let this = cx.view().downgrade(); editor.update(cx, |editor, cx| { editor.set_soft_wrap_mode(SoftWrap::EditorWidth, cx); + editor.set_completion_provider(Box::new(MessageEditorCompletionProvider(this))); }); let buffer = editor @@ -149,6 +183,71 @@ impl MessageEditor { } } + fn completions( + &mut self, + buffer: &Model, + end_anchor: Anchor, + cx: &mut ViewContext, + ) -> Task>> { + let end_offset = end_anchor.to_offset(buffer.read(cx)); + + let Some(query) = buffer.update(cx, |buffer, _| { + let mut query = String::new(); + for ch in buffer.reversed_chars_at(end_offset).take(100) { + if ch == '@' { + return Some(query.chars().rev().collect::()); + } + if ch.is_whitespace() || !ch.is_ascii() { + break; + } + query.push(ch); + } + return None; + }) else { + return Task::ready(Ok(vec![])); + }; + + let start_offset = end_offset - query.len(); + let start_anchor = buffer.read(cx).anchor_before(start_offset); + + let candidates = self + .users + .keys() + .map(|user| StringMatchCandidate { + id: 0, + string: user.clone(), + char_bag: user.chars().collect(), + }) + .collect::>(); + cx.spawn(|_, cx| async move { + let matches = fuzzy::match_strings( + &candidates, + &query, + true, + 10, + &Default::default(), + cx.background_executor().clone(), + ) + .await; + + Ok(matches + .into_iter() + .map(|mat| Completion { + old_range: start_anchor..end_anchor, + new_text: mat.string.clone(), + label: CodeLabel { + filter_range: 1..mat.string.len() + 1, + text: format!("@{}", mat.string), + runs: Vec::new(), + }, + server_id: LanguageServerId(0), // TODO: Make this optional or something? + documentation: None, + lsp_completion: Default::default(), // TODO: Make this optional or something? + }) + .collect()) + }) + } + async fn find_mentions( this: WeakView, buffer: BufferSnapshot, @@ -227,6 +326,7 @@ impl Render for MessageEditor { div() .w_full() + .h(px(500.)) .px_2() .py_1() .bg(cx.theme().colors().editor_background) @@ -260,7 +360,7 @@ mod tests { MessageEditor::new( language_registry, ChannelStore::global(cx), - cx.new_view(|cx| Editor::auto_height(4, cx)), + cx.new_view(|cx| Editor::auto_height(25, cx)), cx, ) }); diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 9a12827dbd5f14c7e6de56cbb5a63c107e03b3c4..d716284efbc1ba73ff431b3f5129d4f73fdbb401 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -364,6 +364,7 @@ pub struct Editor { active_diagnostics: Option, soft_wrap_mode_override: Option, project: Option>, + completion_provider: Option>, collaboration_hub: Option>, blink_manager: Model, show_cursor_names: bool, @@ -730,17 +731,15 @@ impl CompletionsMenu { return None; } - let Some(project) = editor.project.clone() else { + let Some(provider) = editor.completion_provider.as_ref() else { return None; }; - let resolve_task = project.update(cx, |project, cx| { - project.resolve_completions( - self.matches.iter().map(|m| m.candidate_id).collect(), - self.completions.clone(), - cx, - ) - }); + let resolve_task = provider.resolve_completions( + self.matches.iter().map(|m| m.candidate_id).collect(), + self.completions.clone(), + cx, + ); return Some(cx.spawn(move |this, mut cx| async move { if let Some(true) = resolve_task.await.log_err() { @@ -1381,6 +1380,7 @@ impl Editor { ime_transaction: Default::default(), active_diagnostics: None, soft_wrap_mode_override, + completion_provider: project.clone().map(|project| Box::new(project) as _), collaboration_hub: project.clone().map(|project| Box::new(project) as _), project, blink_manager: blink_manager.clone(), @@ -1613,6 +1613,10 @@ impl Editor { self.collaboration_hub = Some(hub); } + pub fn set_completion_provider(&mut self, hub: Box) { + self.completion_provider = Some(hub); + } + pub fn placeholder_text(&self) -> Option<&str> { self.placeholder_text.as_deref() } @@ -3059,9 +3063,7 @@ impl Editor { return; } - let project = if let Some(project) = self.project.clone() { - project - } else { + let Some(provider) = self.completion_provider.as_ref() else { return; }; @@ -3077,9 +3079,7 @@ impl Editor { }; let query = Self::completion_query(&self.buffer.read(cx).read(cx), position.clone()); - let completions = project.update(cx, |project, cx| { - project.completions(&buffer, buffer_position, cx) - }); + let completions = provider.completions(&buffer, buffer_position, cx); let id = post_inc(&mut self.next_completion_id); let task = cx.spawn(|this, mut cx| { @@ -8904,6 +8904,45 @@ impl CollaborationHub for Model { } } +pub trait CompletionProvider { + fn completions( + &self, + buffer: &Model, + buffer_position: text::Anchor, + cx: &mut ViewContext, + ) -> Task>>; + fn resolve_completions( + &self, + completion_indices: Vec, + completions: Arc>>, + cx: &mut ViewContext, + ) -> Task>; +} + +impl CompletionProvider for Model { + fn completions( + &self, + buffer: &Model, + buffer_position: text::Anchor, + cx: &mut ViewContext, + ) -> Task>> { + self.update(cx, |project, cx| { + project.completions(&buffer, buffer_position, cx) + }) + } + + fn resolve_completions( + &self, + completion_indices: Vec, + completions: Arc>>, + cx: &mut ViewContext, + ) -> Task> { + self.update(cx, |project, cx| { + project.resolve_completions(completion_indices, completions, cx) + }) + } +} + fn inlay_hint_settings( location: Anchor, snapshot: &MultiBufferSnapshot, diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 1c4fafb26898ec0ed05ed1ef9f5e98ce8b3fe3bd..c5aaf983d58579f45e4b8b193d04624dee40729a 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1177,9 +1177,9 @@ impl EditorElement { list_origin.x = (cx.viewport_size().width - list_width).max(Pixels::ZERO); } - if list_origin.y + list_height > text_bounds.lower_right().y { - list_origin.y -= layout.position_map.line_height + list_height; - } + // if list_origin.y + list_height > text_bounds.lower_right().y { + // list_origin.y -= layout.position_map.line_height + list_height; + // } cx.break_content_mask(|cx| context_menu.draw(list_origin, available_space, cx)); } diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 7d44250a0f21b289ff51b4ef88b589aed8bc62c3..ad283d90777b561e2d4173d206dc682a65f555df 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -380,7 +380,9 @@ pub trait LspAdapter: 'static + Send + Sync { #[derive(Clone, Debug, PartialEq, Eq)] pub struct CodeLabel { pub text: String, + /// Determines the syntax highlighting for the label pub runs: Vec<(Range, HighlightId)>, + /// Which part of the label participates pub filter_range: Range, } From af30a9b81418c136b840b208f93ddfd1634e58fa Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Fri, 19 Jan 2024 14:38:17 -0700 Subject: [PATCH 045/104] Show cursors sligthly longer --- crates/editor/src/editor.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index b31dd54208a52df335e7b1af55f163d758e91293..9c7e1e1f10f026856e4017980287fa3a6c5e4bf0 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -3907,7 +3907,7 @@ impl Editor { self.show_cursor_names = true; cx.notify(); cx.spawn(|this, mut cx| async move { - cx.background_executor().timer(Duration::from_secs(2)).await; + cx.background_executor().timer(Duration::from_secs(3)).await; this.update(&mut cx, |this, cx| { this.show_cursor_names = false; cx.notify() From 7620feb8b2ca979a6bc7da451c0a1e66c0b66b43 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Fri, 19 Jan 2024 17:21:24 -0500 Subject: [PATCH 046/104] Prevent many call participants from overflowing the title bar (#4173) This PR fixes an issue where having a lot of participants in a call could cause the avatars/facepiles to overflow the title bar, pushing the call controls off-screen. The participant list will now scroll when it would otherwise exceed the available space: https://github.com/zed-industries/zed/assets/1486634/806c77e6-bd4c-4864-8567-92e0960734ee Release Notes: - Fixed participant list overflowing the title bar. --- crates/collab_ui/src/collab_titlebar_item.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 32ab64f77eedb869fdb25d538762ce1538d53715..43a749ec9536a4a420a81b17f7e00ffb94846998 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -85,7 +85,14 @@ impl Render for CollabTitlebarItem { .gap_1() .children(self.render_project_host(cx)) .child(self.render_project_name(cx)) - .child(div().pr_1().children(self.render_project_branch(cx))) + .children(self.render_project_branch(cx)), + ) + .child( + h_flex() + .id("collaborator-list") + .w_full() + .gap_1() + .overflow_x_scroll() .when_some( current_user.clone().zip(client.peer_id()).zip(room.clone()), |this, ((current_user, peer_id), room)| { From 5dee8914ed1b65df7750bbb0ac3184280294db64 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Fri, 19 Jan 2024 15:27:05 -0700 Subject: [PATCH 047/104] Make chat font sizes consistently small --- crates/collab_ui/src/chat_panel.rs | 12 +++++------- crates/collab_ui/src/chat_panel/message_editor.rs | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/crates/collab_ui/src/chat_panel.rs b/crates/collab_ui/src/chat_panel.rs index ba8c71fb1e969c539b35aa8cec23eaa0df12f148..2bb16637adf32a8e3d48998ec6df4545dc8a6008 100644 --- a/crates/collab_ui/src/chat_panel.rs +++ b/crates/collab_ui/src/chat_panel.rs @@ -349,15 +349,13 @@ impl ChatPanel { .when(!is_continuation_from_previous, |this| { this.pt_3().child( h_flex() - .child( - div().absolute().child( - Avatar::new(message.sender.avatar_uri.clone()) - .size(cx.rem_size() * 1.5), - ), - ) + .text_ui_sm() + .child(div().absolute().child( + Avatar::new(message.sender.avatar_uri.clone()).size(cx.rem_size()), + )) .child( div() - .pl(cx.rem_size() * 1.5 + px(6.0)) + .pl(cx.rem_size() + px(6.0)) .pr(px(8.0)) .font_weight(FontWeight::BOLD) .child(Label::new(message.sender.github_login.clone())), diff --git a/crates/collab_ui/src/chat_panel/message_editor.rs b/crates/collab_ui/src/chat_panel/message_editor.rs index 7999db529a43985ae2b52cdde9f2108f9620b35c..43b432cfb2ee4bf15ca85a23c1f6243659deb5ff 100644 --- a/crates/collab_ui/src/chat_panel/message_editor.rs +++ b/crates/collab_ui/src/chat_panel/message_editor.rs @@ -13,7 +13,7 @@ use lazy_static::lazy_static; use project::search::SearchQuery; use settings::Settings; use theme::ThemeSettings; -use ui::prelude::*; +use ui::{prelude::*, UiTextSize}; const MENTIONS_DEBOUNCE_INTERVAL: Duration = Duration::from_millis(50); @@ -216,7 +216,7 @@ impl Render for MessageEditor { }, font_family: settings.ui_font.family.clone(), font_features: settings.ui_font.features, - font_size: rems(0.875).into(), + font_size: UiTextSize::Small.rems().into(), font_weight: FontWeight::NORMAL, font_style: FontStyle::Normal, line_height: relative(1.3).into(), From eaa0e93112b1174ac5bf07a51619b9bcdf9c3db3 Mon Sep 17 00:00:00 2001 From: Mikayla Date: Fri, 19 Jan 2024 14:52:49 -0800 Subject: [PATCH 048/104] Fix hover popovers showing up over zoomed panels --- crates/editor/src/element.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 1c4fafb26898ec0ed05ed1ef9f5e98ce8b3fe3bd..aed6c55668a1143d1076e950bae4b328a3aca786 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1218,9 +1218,11 @@ impl EditorElement { popover_origin.x = popover_origin.x + x_out_of_bounds; } - cx.break_content_mask(|cx| { - hover_popover.draw(popover_origin, available_space, cx) - }); + if cx.was_top_layer(&popover_origin, cx.stacking_order()) { + cx.break_content_mask(|cx| { + hover_popover.draw(popover_origin, available_space, cx) + }); + } current_y = popover_origin.y - HOVER_POPOVER_GAP; } From 25f78a2ed14b8fbb9e3ddfaa6d1327dcdc43d3c7 Mon Sep 17 00:00:00 2001 From: Mikayla Date: Fri, 19 Jan 2024 15:02:10 -0800 Subject: [PATCH 049/104] Fix terminal selection firing when dragging anywhere --- crates/terminal/src/terminal.rs | 4 ++++ crates/terminal_view/src/terminal_element.rs | 12 ++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index 502706eb5b30bebe35507e1a9fddeb951d674c53..d9bdc17744810a59cb1c7b3303b1ddefc19e59ca 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -599,6 +599,10 @@ impl Terminal { } } + pub fn selection_started(&self) -> bool { + self.selection_phase == SelectionPhase::Selecting + } + /// Updates the cached process info, returns whether the Zed-relevant info has changed fn update_process_info(&mut self) -> bool { let mut pid = unsafe { libc::tcgetpgrp(self.shell_fd as i32) }; diff --git a/crates/terminal_view/src/terminal_element.rs b/crates/terminal_view/src/terminal_element.rs index 78235c3579624d510d47c64fd854ab46b82c8b96..29944b54d7729d7cf257c515339234db9f666751 100644 --- a/crates/terminal_view/src/terminal_element.rs +++ b/crates/terminal_view/src/terminal_element.rs @@ -621,9 +621,17 @@ impl TerminalElement { } if e.pressed_button.is_some() && !cx.has_active_drag() { + let visibly_contains = interactive_bounds.visibly_contains(&e.position, cx); terminal.update(cx, |terminal, cx| { - terminal.mouse_drag(e, origin, bounds); - cx.notify(); + if !terminal.selection_started() { + if visibly_contains { + terminal.mouse_drag(e, origin, bounds); + cx.notify(); + } + } else { + terminal.mouse_drag(e, origin, bounds); + cx.notify(); + } }) } From 24de848fdf2a32f14dbd36364d9901156b27f3d9 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Fri, 19 Jan 2024 18:23:14 -0500 Subject: [PATCH 050/104] Prevent breadcrumbs from overflowing the toolbar (#4177) This PR prevents the breadcrumbs from overflowing the toolbar when its contents are long: Screenshot 2024-01-19 at 6 15 58 PM Release Notes: - Fixed an issue where long breadcrumbs would overflow the toolbar. --- crates/workspace/src/toolbar.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/workspace/src/toolbar.rs b/crates/workspace/src/toolbar.rs index 3d5df3294e1fc84faab10c69c46c7ce424682aad..b127de8de5bea535658750e95bc181d5883cc1e2 100644 --- a/crates/workspace/src/toolbar.rs +++ b/crates/workspace/src/toolbar.rs @@ -112,18 +112,22 @@ impl Render for Toolbar { .child( h_flex() .justify_between() + .gap_2() .when(has_left_items, |this| { this.child( h_flex() - .flex_1() + .flex_auto() .justify_start() + .overflow_x_hidden() .children(self.left_items().map(|item| item.to_any())), ) }) .when(has_right_items, |this| { this.child( h_flex() - .flex_1() + // We're using `flex_none` here to prevent some flickering that can occur when the + // size of the left items container changes. + .flex_none() .justify_end() .children(self.right_items().map(|item| item.to_any())), ) From 4fb3e6d812f854c56b64adf34d5f7ba04917e7ba Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 19 Jan 2024 15:47:42 -0800 Subject: [PATCH 051/104] Ensure editors context menus get at least 3 lines of height --- crates/collab_ui/src/chat_panel/message_editor.rs | 5 ++--- crates/editor/src/element.rs | 14 ++++++++++---- crates/language/src/language.rs | 5 +++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/crates/collab_ui/src/chat_panel/message_editor.rs b/crates/collab_ui/src/chat_panel/message_editor.rs index 05a9ad5c085e2272c4a4719789b0947bd96e44f1..c19d19085c97d9fd2e3702885c446faef19d7970 100644 --- a/crates/collab_ui/src/chat_panel/message_editor.rs +++ b/crates/collab_ui/src/chat_panel/message_editor.rs @@ -240,8 +240,8 @@ impl MessageEditor { text: format!("@{}", mat.string), runs: Vec::new(), }, - server_id: LanguageServerId(0), // TODO: Make this optional or something? documentation: None, + server_id: LanguageServerId(0), // TODO: Make this optional or something? lsp_completion: Default::default(), // TODO: Make this optional or something? }) .collect()) @@ -326,7 +326,6 @@ impl Render for MessageEditor { div() .w_full() - .h(px(500.)) .px_2() .py_1() .bg(cx.theme().colors().editor_background) @@ -360,7 +359,7 @@ mod tests { MessageEditor::new( language_registry, ChannelStore::global(cx), - cx.new_view(|cx| Editor::auto_height(25, cx)), + cx.new_view(|cx| Editor::auto_height(4, cx)), cx, ) }); diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index c5aaf983d58579f45e4b8b193d04624dee40729a..cb2eb4e49c13c9eb94e233ca26dbf5a3ee0ad1fd 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1177,9 +1177,9 @@ impl EditorElement { list_origin.x = (cx.viewport_size().width - list_width).max(Pixels::ZERO); } - // if list_origin.y + list_height > text_bounds.lower_right().y { - // list_origin.y -= layout.position_map.line_height + list_height; - // } + if list_origin.y + list_height > text_bounds.lower_right().y { + list_origin.y -= layout.position_map.line_height + list_height; + } cx.break_content_mask(|cx| context_menu.draw(list_origin, available_space, cx)); } @@ -2128,7 +2128,13 @@ impl EditorElement { if let Some(newest_selection_head) = newest_selection_head { if (start_row..end_row).contains(&newest_selection_head.row()) { if editor.context_menu_visible() { - let max_height = (12. * line_height).min((bounds.size.height - line_height) / 2.); + let max_height = cmp::min( + 12. * line_height, + cmp::max( + 3. * line_height, + (bounds.size.height - line_height) / 2., + ) + ); context_menu = editor.render_context_menu(newest_selection_head, &self.style, max_height, cx); } diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index ad283d90777b561e2d4173d206dc682a65f555df..59f8d79d84a3333fa2de06719b2559fa6baaed3a 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -379,10 +379,11 @@ pub trait LspAdapter: 'static + Send + Sync { #[derive(Clone, Debug, PartialEq, Eq)] pub struct CodeLabel { + /// The text to display. pub text: String, - /// Determines the syntax highlighting for the label + /// Syntax highlighting runs. pub runs: Vec<(Range, HighlightId)>, - /// Which part of the label participates + /// The portion of the text that should be used in fuzzy filtering. pub filter_range: Range, } From 23d991962a91fc7519e418709c43c4e24c121f54 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Fri, 19 Jan 2024 16:59:17 -0700 Subject: [PATCH 052/104] Link previews in chat --- Cargo.lock | 1 + crates/gpui/src/elements/div.rs | 6 +- crates/gpui/src/elements/text.rs | 128 ++++++++++++++++++++++++++-- crates/rich_text/Cargo.toml | 1 + crates/rich_text/src/rich_text.rs | 13 +++ crates/ui/src/components/tooltip.rs | 91 +++++++++++++++----- 6 files changed, 209 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 010e7763e490515c7a47f3fada4ffa24a612e522..e513df4e63a580e015d8d9e5701ba86c5738ee39 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6144,6 +6144,7 @@ dependencies = [ "smol", "sum_tree", "theme", + "ui", "util", ] diff --git a/crates/gpui/src/elements/div.rs b/crates/gpui/src/elements/div.rs index aa912eadbe9c986969dd197927af8963a3c58d0c..70b2df10cca158ac3095a8165c5293942c5ef01e 100644 --- a/crates/gpui/src/elements/div.rs +++ b/crates/gpui/src/elements/div.rs @@ -24,7 +24,7 @@ use taffy::style::Overflow; use util::ResultExt; const DRAG_THRESHOLD: f64 = 2.; -const TOOLTIP_DELAY: Duration = Duration::from_millis(500); +pub(crate) const TOOLTIP_DELAY: Duration = Duration::from_millis(500); pub struct GroupStyle { pub group: SharedString, @@ -1718,8 +1718,8 @@ pub struct InteractiveElementState { } pub struct ActiveTooltip { - tooltip: Option, - _task: Option>, + pub(crate) tooltip: Option, + pub(crate) _task: Option>, } /// Whether or not the element or a group that contains it is clicked by the mouse. diff --git a/crates/gpui/src/elements/text.rs b/crates/gpui/src/elements/text.rs index f72b7c6fa9111c4735fe95241ab9b63d25e39a37..8ab847bf6b6911499aca5457243ac1ec2f8690db 100644 --- a/crates/gpui/src/elements/text.rs +++ b/crates/gpui/src/elements/text.rs @@ -1,12 +1,18 @@ use crate::{ - Bounds, DispatchPhase, Element, ElementId, HighlightStyle, IntoElement, LayoutId, - MouseDownEvent, MouseUpEvent, Pixels, Point, SharedString, Size, TextRun, TextStyle, - WhiteSpace, WindowContext, WrappedLine, + ActiveTooltip, AnyTooltip, AnyView, Bounds, DispatchPhase, Element, ElementId, HighlightStyle, + IntoElement, LayoutId, MouseDownEvent, MouseMoveEvent, MouseUpEvent, Pixels, Point, + SharedString, Size, TextRun, TextStyle, WhiteSpace, WindowContext, WrappedLine, TOOLTIP_DELAY, }; use anyhow::anyhow; use parking_lot::{Mutex, MutexGuard}; use smallvec::SmallVec; -use std::{cell::Cell, mem, ops::Range, rc::Rc, sync::Arc}; +use std::{ + cell::{Cell, RefCell}, + mem, + ops::Range, + rc::Rc, + sync::Arc, +}; use util::ResultExt; impl Element for &'static str { @@ -289,6 +295,8 @@ pub struct InteractiveText { text: StyledText, click_listener: Option], InteractiveTextClickEvent, &mut WindowContext<'_>)>>, + hover_listener: Option, MouseMoveEvent, &mut WindowContext<'_>)>>, + tooltip_builder: Option) -> Option>>, clickable_ranges: Vec>, } @@ -300,18 +308,25 @@ struct InteractiveTextClickEvent { pub struct InteractiveTextState { text_state: TextState, mouse_down_index: Rc>>, + hovered_index: Rc>>, + active_tooltip: Rc>>, } +/// InteractiveTest is a wrapper around StyledText that adds mouse interactions. impl InteractiveText { pub fn new(id: impl Into, text: StyledText) -> Self { Self { element_id: id.into(), text, click_listener: None, + hover_listener: None, + tooltip_builder: None, clickable_ranges: Vec::new(), } } + /// on_click is called when the user clicks on one of the given ranges, passing the index of + /// the clicked range. pub fn on_click( mut self, ranges: Vec>, @@ -328,6 +343,25 @@ impl InteractiveText { self.clickable_ranges = ranges; self } + + /// on_hover is called when the mouse moves over a character within the text, passing the + /// index of the hovered character, or None if the mouse leaves the text. + pub fn on_hover( + mut self, + listener: impl Fn(Option, MouseMoveEvent, &mut WindowContext<'_>) + 'static, + ) -> Self { + self.hover_listener = Some(Box::new(listener)); + self + } + + /// tooltip lets you specify a tooltip for a given character index in the string. + pub fn tooltip( + mut self, + builder: impl Fn(usize, &mut WindowContext<'_>) -> Option + 'static, + ) -> Self { + self.tooltip_builder = Some(Rc::new(builder)); + self + } } impl Element for InteractiveText { @@ -339,13 +373,18 @@ impl Element for InteractiveText { cx: &mut WindowContext, ) -> (LayoutId, Self::State) { if let Some(InteractiveTextState { - mouse_down_index, .. + mouse_down_index, + hovered_index, + active_tooltip, + .. }) = state { let (layout_id, text_state) = self.text.request_layout(None, cx); let element_state = InteractiveTextState { text_state, mouse_down_index, + hovered_index, + active_tooltip, }; (layout_id, element_state) } else { @@ -353,6 +392,8 @@ impl Element for InteractiveText { let element_state = InteractiveTextState { text_state, mouse_down_index: Rc::default(), + hovered_index: Rc::default(), + active_tooltip: Rc::default(), }; (layout_id, element_state) } @@ -408,6 +449,83 @@ impl Element for InteractiveText { }); } } + if let Some(hover_listener) = self.hover_listener.take() { + let text_state = state.text_state.clone(); + let hovered_index = state.hovered_index.clone(); + cx.on_mouse_event(move |event: &MouseMoveEvent, phase, cx| { + if phase == DispatchPhase::Bubble { + let current = hovered_index.get(); + let updated = text_state.index_for_position(bounds, event.position); + if current != updated { + hovered_index.set(updated); + hover_listener(updated, event.clone(), cx); + cx.refresh(); + } + } + }); + } + if let Some(tooltip_builder) = self.tooltip_builder.clone() { + let active_tooltip = state.active_tooltip.clone(); + let pending_mouse_down = state.mouse_down_index.clone(); + let text_state = state.text_state.clone(); + + cx.on_mouse_event(move |event: &MouseMoveEvent, phase, cx| { + let position = text_state.index_for_position(bounds, event.position); + let is_hovered = position.is_some() && pending_mouse_down.get().is_none(); + if !is_hovered { + active_tooltip.take(); + return; + } + let position = position.unwrap(); + + if phase != DispatchPhase::Bubble { + return; + } + + if active_tooltip.borrow().is_none() { + let task = cx.spawn({ + let active_tooltip = active_tooltip.clone(); + let tooltip_builder = tooltip_builder.clone(); + + move |mut cx| async move { + cx.background_executor().timer(TOOLTIP_DELAY).await; + cx.update(|_, cx| { + let new_tooltip = + tooltip_builder(position, cx).map(|tooltip| ActiveTooltip { + tooltip: Some(AnyTooltip { + view: tooltip, + cursor_offset: cx.mouse_position(), + }), + _task: None, + }); + *active_tooltip.borrow_mut() = new_tooltip; + cx.refresh(); + }) + .ok(); + } + }); + *active_tooltip.borrow_mut() = Some(ActiveTooltip { + tooltip: None, + _task: Some(task), + }); + } + }); + + let active_tooltip = state.active_tooltip.clone(); + cx.on_mouse_event(move |_: &MouseDownEvent, _, _| { + active_tooltip.take(); + }); + + if let Some(tooltip) = state + .active_tooltip + .clone() + .borrow() + .as_ref() + .and_then(|at| at.tooltip.clone()) + { + cx.set_tooltip(tooltip); + } + } self.text.paint(bounds, &mut state.text_state, cx) } diff --git a/crates/rich_text/Cargo.toml b/crates/rich_text/Cargo.toml index 609272cdf3de733b47c104d90c016e43c1047459..efec13c7601cb6698e01d71d45621e3e0b7228f5 100644 --- a/crates/rich_text/Cargo.toml +++ b/crates/rich_text/Cargo.toml @@ -21,6 +21,7 @@ sum_tree = { path = "../sum_tree" } theme = { path = "../theme" } language = { path = "../language" } util = { path = "../util" } +ui = { path = "../ui" } anyhow.workspace = true futures.workspace = true lazy_static.workspace = true diff --git a/crates/rich_text/src/rich_text.rs b/crates/rich_text/src/rich_text.rs index 8bc0d73fd4dc80c583ac532896004f97c1365e94..dc626ccdd15fd751387afdfa00427c4f9fcb778e 100644 --- a/crates/rich_text/src/rich_text.rs +++ b/crates/rich_text/src/rich_text.rs @@ -6,6 +6,7 @@ use gpui::{ use language::{HighlightId, Language, LanguageRegistry}; use std::{ops::Range, sync::Arc}; use theme::ActiveTheme; +use ui::LinkPreview; use util::RangeExt; #[derive(Debug, Clone, PartialEq, Eq)] @@ -84,6 +85,18 @@ impl RichText { let link_urls = self.link_urls.clone(); move |ix, cx| cx.open_url(&link_urls[ix]) }) + .tooltip({ + let link_ranges = self.link_ranges.clone(); + let link_urls = self.link_urls.clone(); + move |idx, cx| { + for (ix, range) in link_ranges.iter().enumerate() { + if range.contains(&idx) { + return Some(LinkPreview::new(&link_urls[ix], cx)); + } + } + None + } + }) .into_any_element() } } diff --git a/crates/ui/src/components/tooltip.rs b/crates/ui/src/components/tooltip.rs index f76085daa35ccfa37131b44bca2d83b9532cffb5..6db1804740c265dbcdb1162663137b8c683db8a8 100644 --- a/crates/ui/src/components/tooltip.rs +++ b/crates/ui/src/components/tooltip.rs @@ -69,29 +69,74 @@ impl Tooltip { impl Render for Tooltip { fn render(&mut self, cx: &mut ViewContext) -> impl IntoElement { - let ui_font = ThemeSettings::get_global(cx).ui_font.family.clone(); - overlay().child( - // padding to avoid mouse cursor - div().pl_2().pt_2p5().child( - v_flex() - .elevation_2(cx) - .font(ui_font) - .text_ui() - .text_color(cx.theme().colors().text) - .py_1() - .px_2() - .child( - h_flex() - .gap_4() - .child(self.title.clone()) - .when_some(self.key_binding.clone(), |this, key_binding| { - this.justify_between().child(key_binding) - }), - ) - .when_some(self.meta.clone(), |this, meta| { - this.child(Label::new(meta).size(LabelSize::Small).color(Color::Muted)) + tooltip_container(cx, |el, _| { + el.child( + h_flex() + .gap_4() + .child(self.title.clone()) + .when_some(self.key_binding.clone(), |this, key_binding| { + this.justify_between().child(key_binding) }), - ), - ) + ) + .when_some(self.meta.clone(), |this, meta| { + this.child(Label::new(meta).size(LabelSize::Small).color(Color::Muted)) + }) + }) + } +} + +fn tooltip_container( + cx: &mut ViewContext, + f: impl FnOnce(Div, &mut ViewContext) -> Div, +) -> impl IntoElement { + let ui_font = ThemeSettings::get_global(cx).ui_font.family.clone(); + overlay().child( + // padding to avoid mouse cursor + div().pl_2().pt_2p5().child( + v_flex() + .elevation_2(cx) + .font(ui_font) + .text_ui() + .text_color(cx.theme().colors().text) + .py_1() + .px_2() + .map(|el| f(el, cx)), + ), + ) +} + +pub struct LinkPreview { + link: SharedString, +} + +impl LinkPreview { + pub fn new(url: &str, cx: &mut WindowContext) -> AnyView { + let mut wrapped_url = String::new(); + for (i, ch) in url.chars().enumerate() { + if i == 500 { + wrapped_url.push('…'); + break; + } + if i % 100 == 0 && i != 0 { + wrapped_url.push('\n'); + } + wrapped_url.push(ch); + } + cx.new_view(|_cx| LinkPreview { + link: wrapped_url.into(), + }) + .into() + } +} + +impl Render for LinkPreview { + fn render(&mut self, cx: &mut ViewContext) -> impl IntoElement { + tooltip_container(cx, |el, _| { + el.child( + Label::new(self.link.clone()) + .size(LabelSize::XSmall) + .color(Color::Muted), + ) + }) } } From 739d1179e3fd6c24f4974e31794e42ed85ebe503 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 19 Jan 2024 16:02:51 -0800 Subject: [PATCH 053/104] Stop propagation when confirming a completion --- crates/editor/src/editor.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index d716284efbc1ba73ff431b3f5129d4f73fdbb401..55090d75d95902bea93f1fe2fbb2687fa27c273e 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -3188,6 +3188,7 @@ impl Editor { let buffer_handle = completions_menu.buffer; let completions = completions_menu.completions.read(); let completion = completions.get(mat.candidate_id)?; + cx.stop_propagation(); let snippet; let text; From c8adde32ded7283bfb8a5f62485ab903ef6e0a19 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 19 Jan 2024 16:03:08 -0800 Subject: [PATCH 054/104] Add shift-enter binding for newline in auto-height editors --- assets/keymaps/default.json | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/keymaps/default.json b/assets/keymaps/default.json index cd353d776749c6da998821ec20e68672e79aa835..8679296733559a03c51a94d1f133c6bd922eadf9 100644 --- a/assets/keymaps/default.json +++ b/assets/keymaps/default.json @@ -183,6 +183,7 @@ "context": "Editor && mode == auto_height", "bindings": { "ctrl-enter": "editor::Newline", + "shift-enter": "editor::Newline", "ctrl-shift-enter": "editor::NewlineBelow" } }, From 8fb0270b4a052c6ac48bf0356dee899d58b32c8a Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 19 Jan 2024 16:56:28 -0800 Subject: [PATCH 055/104] Make applying of additional completion edits go through the CompletionProvider --- .../src/chat_panel/message_editor.rs | 10 +++++ crates/editor/src/editor.rs | 37 ++++++++++++++----- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/crates/collab_ui/src/chat_panel/message_editor.rs b/crates/collab_ui/src/chat_panel/message_editor.rs index c19d19085c97d9fd2e3702885c446faef19d7970..48d3f31aa90ece128bbb22a206ef746706a2c977 100644 --- a/crates/collab_ui/src/chat_panel/message_editor.rs +++ b/crates/collab_ui/src/chat_panel/message_editor.rs @@ -61,6 +61,16 @@ impl CompletionProvider for MessageEditorCompletionProvider { ) -> Task> { Task::ready(Ok(false)) } + + fn apply_additional_edits_for_completion( + &self, + _buffer: Model, + _completion: Completion, + _push_to_history: bool, + _cx: &mut ViewContext, + ) -> Task>> { + Task::ready(Ok(None)) + } } impl MessageEditor { diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 55090d75d95902bea93f1fe2fbb2687fa27c273e..47e4acdedf73b7f3e86ddd1b3837aeac80dfa417 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -3285,15 +3285,13 @@ impl Editor { this.refresh_copilot_suggestions(true, cx); }); - let project = self.project.clone()?; - let apply_edits = project.update(cx, |project, cx| { - project.apply_additional_edits_for_completion( - buffer_handle, - completion.clone(), - true, - cx, - ) - }); + let provider = self.completion_provider.as_ref()?; + let apply_edits = provider.apply_additional_edits_for_completion( + buffer_handle, + completion.clone(), + true, + cx, + ); Some(cx.foreground_executor().spawn(async move { apply_edits.await?; Ok(()) @@ -8912,12 +8910,21 @@ pub trait CompletionProvider { buffer_position: text::Anchor, cx: &mut ViewContext, ) -> Task>>; + fn resolve_completions( &self, completion_indices: Vec, completions: Arc>>, cx: &mut ViewContext, ) -> Task>; + + fn apply_additional_edits_for_completion( + &self, + buffer: Model, + completion: Completion, + push_to_history: bool, + cx: &mut ViewContext, + ) -> Task>>; } impl CompletionProvider for Model { @@ -8942,6 +8949,18 @@ impl CompletionProvider for Model { project.resolve_completions(completion_indices, completions, cx) }) } + + fn apply_additional_edits_for_completion( + &self, + buffer: Model, + completion: Completion, + push_to_history: bool, + cx: &mut ViewContext, + ) -> Task>> { + self.update(cx, |project, cx| { + project.apply_additional_edits_for_completion(buffer, completion, push_to_history, cx) + }) + } } fn inlay_hint_settings( From 33105486aa7c49cb68dd4c916bc64f07e1405fea Mon Sep 17 00:00:00 2001 From: Mikayla Date: Sat, 20 Jan 2024 06:56:04 -0800 Subject: [PATCH 056/104] Make platform input handler private Automatically record the context on non-view input handlers Simplify the async window context update() method --- crates/command_palette/src/command_palette.rs | 2 +- crates/copilot_ui/src/copilot_button.rs | 2 +- crates/editor/src/editor.rs | 11 +- crates/editor/src/element.rs | 7 +- crates/editor/src/hover_popover.rs | 2 +- crates/gpui/src/app/async_context.rs | 7 +- crates/gpui/src/elements/div.rs | 2 +- crates/gpui/src/input.rs | 82 ++++++------- crates/gpui/src/platform.rs | 110 +++++++++++++++--- crates/gpui/src/platform/mac/window.rs | 18 +-- crates/gpui/src/window.rs | 29 +++-- crates/journal/src/journal.rs | 2 +- crates/terminal_view/src/terminal_element.rs | 79 +++++++------ crates/terminal_view/src/terminal_view.rs | 2 +- crates/workspace/src/notifications.rs | 2 +- crates/workspace/src/pane.rs | 6 +- crates/workspace/src/workspace.rs | 14 +-- 17 files changed, 229 insertions(+), 148 deletions(-) diff --git a/crates/command_palette/src/command_palette.rs b/crates/command_palette/src/command_palette.rs index c90e44886568b6def4e7c66cced834553cf5bb96..a130947793717934c33c233a989e20abe4093196 100644 --- a/crates/command_palette/src/command_palette.rs +++ b/crates/command_palette/src/command_palette.rs @@ -311,7 +311,7 @@ impl PickerDelegate for CommandPaletteDelegate { let action = command.action; cx.focus(&self.previous_focus_handle); cx.window_context() - .spawn(move |mut cx| async move { cx.update(|_, cx| cx.dispatch_action(action)) }) + .spawn(move |mut cx| async move { cx.update(|cx| cx.dispatch_action(action)) }) .detach_and_log_err(cx); self.dismissed(cx); } diff --git a/crates/copilot_ui/src/copilot_button.rs b/crates/copilot_ui/src/copilot_button.rs index 9dc4e75cb1cced8c5097bb3b7ee474fba9ed2249..28b28ffe9afec835eb5d6877aad0dfef2f05c017 100644 --- a/crates/copilot_ui/src/copilot_button.rs +++ b/crates/copilot_ui/src/copilot_button.rs @@ -355,7 +355,7 @@ fn initiate_sign_in(cx: &mut WindowContext) { cx.spawn(|mut cx| async move { task.await; - if let Some(copilot) = cx.update(|_, cx| Copilot::global(cx)).ok().flatten() { + if let Some(copilot) = cx.update(|cx| Copilot::global(cx)).ok().flatten() { workspace .update(&mut cx, |workspace, cx| match copilot.read(cx).status() { Status::Authorized => workspace.show_toast( diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 4dc505a84120a4aaf825facbae2c8fb85ffee0da..409148f59d702b873647821cf255268e2c2bf193 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -57,9 +57,10 @@ use gpui::{ div, impl_actions, point, prelude::*, px, relative, rems, size, uniform_list, Action, AnyElement, AppContext, AsyncWindowContext, BackgroundExecutor, Bounds, ClipboardItem, Context, DispatchPhase, ElementId, EventEmitter, FocusHandle, FocusableView, FontStyle, FontWeight, - HighlightStyle, Hsla, InputHandler, InteractiveText, KeyContext, Model, MouseButton, - ParentElement, Pixels, Render, SharedString, Styled, StyledText, Subscription, Task, TextStyle, - UniformListScrollHandle, View, ViewContext, VisualContext, WeakView, WhiteSpace, WindowContext, + HighlightStyle, Hsla, InteractiveText, KeyContext, Model, MouseButton, ParentElement, Pixels, + Render, SharedString, Styled, StyledText, Subscription, Task, TextStyle, + UniformListScrollHandle, View, ViewContext, ViewInputHandler, VisualContext, WeakView, + WhiteSpace, WindowContext, }; use highlight_matching_bracket::refresh_matching_bracket_highlights; use hover_popover::{hide_hover, HoverState}; @@ -3378,7 +3379,7 @@ impl Editor { let replica_id = this.update(&mut cx, |this, cx| this.replica_id(cx))?; let mut entries = transaction.0.into_iter().collect::>(); - cx.update(|_, cx| { + cx.update(|cx| { entries.sort_unstable_by_key(|(buffer, _)| { buffer.read(cx).file().map(|f| f.path().clone()) }); @@ -9166,7 +9167,7 @@ impl Render for Editor { } } -impl InputHandler for Editor { +impl ViewInputHandler for Editor { fn text_for_range( &mut self, range_utf16: Range, diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 4c6efcb02a470f53c61d4907889c4d1721f61036..ad166bb42babf91fbb052ccad138ce3f3d8e1b81 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -2951,9 +2951,10 @@ impl Element for EditorElement { self.register_key_listeners(cx); cx.with_content_mask(Some(ContentMask { bounds }), |cx| { - let input_handler = - ElementInputHandler::new(bounds, self.editor.clone(), cx); - cx.handle_input(&focus_handle, input_handler); + cx.handle_input( + &focus_handle, + ElementInputHandler::new(bounds, self.editor.clone()), + ); self.paint_background(gutter_bounds, text_bounds, &layout, cx); if layout.gutter_size.width > Pixels::ZERO { diff --git a/crates/editor/src/hover_popover.rs b/crates/editor/src/hover_popover.rs index 609c20ac680819ff738f4a4f3ab08ffa58762146..9268c6de4e4e845899259959ad49734ffd259490 100644 --- a/crates/editor/src/hover_popover.rs +++ b/crates/editor/src/hover_popover.rs @@ -247,7 +247,7 @@ fn show_hover( }; // query the LSP for hover info - let hover_request = cx.update(|_, cx| { + let hover_request = cx.update(|cx| { project.update(cx, |project, cx| { project.hover(&buffer, buffer_position, cx) }) diff --git a/crates/gpui/src/app/async_context.rs b/crates/gpui/src/app/async_context.rs index 1ee01d90dfac22632f718088bbd7bbe54364136c..7c36aebf57b0236d54f286789d03b60ec547cab5 100644 --- a/crates/gpui/src/app/async_context.rs +++ b/crates/gpui/src/app/async_context.rs @@ -213,7 +213,12 @@ impl AsyncWindowContext { } /// A convenience method for [WindowContext::update()] - pub fn update( + pub fn update(&mut self, update: impl FnOnce(&mut WindowContext) -> R) -> Result { + self.app.update_window(self.window, |_, cx| update(cx)) + } + + /// A convenience method for [WindowContext::update()] + pub fn update_root( &mut self, update: impl FnOnce(AnyView, &mut WindowContext) -> R, ) -> Result { diff --git a/crates/gpui/src/elements/div.rs b/crates/gpui/src/elements/div.rs index aa912eadbe9c986969dd197927af8963a3c58d0c..fe069a9b6c9bc1124bfa005011ca648f8d0b8c28 100644 --- a/crates/gpui/src/elements/div.rs +++ b/crates/gpui/src/elements/div.rs @@ -1420,7 +1420,7 @@ impl Interactivity { move |mut cx| async move { cx.background_executor().timer(TOOLTIP_DELAY).await; - cx.update(|_, cx| { + cx.update(|cx| { active_tooltip.borrow_mut().replace( ActiveTooltip { tooltip: Some(AnyTooltip { diff --git a/crates/gpui/src/input.rs b/crates/gpui/src/input.rs index 7290b48abd7157cdbf11ffa74e6eed294bcc271e..3440d08ef3825d004c72a25f87f66654091e0e2a 100644 --- a/crates/gpui/src/input.rs +++ b/crates/gpui/src/input.rs @@ -1,13 +1,11 @@ -use crate::{ - AsyncWindowContext, Bounds, Pixels, PlatformInputHandler, View, ViewContext, WindowContext, -}; +use crate::{Bounds, InputHandler, Pixels, View, ViewContext, WindowContext}; use std::ops::Range; /// Implement this trait to allow views to handle textual input when implementing an editor, field, etc. /// /// Once your view `V` implements this trait, you can use it to construct an [`ElementInputHandler`]. /// This input handler can then be assigned during paint by calling [`WindowContext::handle_input`]. -pub trait InputHandler: 'static + Sized { +pub trait ViewInputHandler: 'static + Sized { fn text_for_range(&mut self, range: Range, cx: &mut ViewContext) -> Option; fn selected_text_range(&mut self, cx: &mut ViewContext) -> Option>; @@ -39,7 +37,6 @@ pub trait InputHandler: 'static + Sized { pub struct ElementInputHandler { view: View, element_bounds: Bounds, - cx: AsyncWindowContext, } impl ElementInputHandler { @@ -47,45 +44,42 @@ impl ElementInputHandler { /// containing view. /// /// [element_paint]: crate::Element::paint - pub fn new(element_bounds: Bounds, view: View, cx: &mut WindowContext) -> Self { + pub fn new(element_bounds: Bounds, view: View) -> Self { ElementInputHandler { view, element_bounds, - cx: cx.to_async(), } } } -impl PlatformInputHandler for ElementInputHandler { - fn selected_text_range(&mut self) -> Option> { +impl InputHandler for ElementInputHandler { + fn selected_text_range(&mut self, cx: &mut WindowContext) -> Option> { self.view - .update(&mut self.cx, |view, cx| view.selected_text_range(cx)) - .ok() - .flatten() + .update(cx, |view, cx| view.selected_text_range(cx)) } - fn marked_text_range(&mut self) -> Option> { - self.view - .update(&mut self.cx, |view, cx| view.marked_text_range(cx)) - .ok() - .flatten() + fn marked_text_range(&mut self, cx: &mut WindowContext) -> Option> { + self.view.update(cx, |view, cx| view.marked_text_range(cx)) } - fn text_for_range(&mut self, range_utf16: Range) -> Option { + fn text_for_range( + &mut self, + range_utf16: Range, + cx: &mut WindowContext, + ) -> Option { self.view - .update(&mut self.cx, |view, cx| { - view.text_for_range(range_utf16, cx) - }) - .ok() - .flatten() + .update(cx, |view, cx| view.text_for_range(range_utf16, cx)) } - fn replace_text_in_range(&mut self, replacement_range: Option>, text: &str) { - self.view - .update(&mut self.cx, |view, cx| { - view.replace_text_in_range(replacement_range, text, cx) - }) - .ok(); + fn replace_text_in_range( + &mut self, + replacement_range: Option>, + text: &str, + cx: &mut WindowContext, + ) { + self.view.update(cx, |view, cx| { + view.replace_text_in_range(replacement_range, text, cx) + }); } fn replace_and_mark_text_in_range( @@ -93,26 +87,24 @@ impl PlatformInputHandler for ElementInputHandler { range_utf16: Option>, new_text: &str, new_selected_range: Option>, + cx: &mut WindowContext, ) { - self.view - .update(&mut self.cx, |view, cx| { - view.replace_and_mark_text_in_range(range_utf16, new_text, new_selected_range, cx) - }) - .ok(); + self.view.update(cx, |view, cx| { + view.replace_and_mark_text_in_range(range_utf16, new_text, new_selected_range, cx) + }); } - fn unmark_text(&mut self) { - self.view - .update(&mut self.cx, |view, cx| view.unmark_text(cx)) - .ok(); + fn unmark_text(&mut self, cx: &mut WindowContext) { + self.view.update(cx, |view, cx| view.unmark_text(cx)); } - fn bounds_for_range(&mut self, range_utf16: Range) -> Option> { - self.view - .update(&mut self.cx, |view, cx| { - view.bounds_for_range(range_utf16, self.element_bounds, cx) - }) - .ok() - .flatten() + fn bounds_for_range( + &mut self, + range_utf16: Range, + cx: &mut WindowContext, + ) -> Option> { + self.view.update(cx, |view, cx| { + view.bounds_for_range(range_utf16, self.element_bounds, cx) + }) } } diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index e08d7a85521c9f24d4c25ab6decb1f3fb99d9882..cbf5908b067de51d6e487aa644a7afbdabb3393d 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -6,10 +6,10 @@ mod mac; mod test; use crate::{ - Action, AnyWindowHandle, BackgroundExecutor, Bounds, DevicePixels, Font, FontId, FontMetrics, - FontRun, ForegroundExecutor, GlobalPixels, GlyphId, Keymap, LineLayout, Pixels, PlatformInput, - Point, RenderGlyphParams, RenderImageParams, RenderSvgParams, Result, Scene, SharedString, - Size, TaskLabel, + Action, AnyWindowHandle, AsyncWindowContext, BackgroundExecutor, Bounds, DevicePixels, Font, + FontId, FontMetrics, FontRun, ForegroundExecutor, GlobalPixels, GlyphId, Keymap, LineLayout, + Pixels, PlatformInput, Point, RenderGlyphParams, RenderImageParams, RenderSvgParams, Result, + Scene, SharedString, Size, TaskLabel, WindowContext, }; use anyhow::anyhow; use async_task::Runnable; @@ -149,8 +149,8 @@ pub(crate) trait PlatformWindow { fn mouse_position(&self) -> Point; fn modifiers(&self) -> Modifiers; fn as_any_mut(&mut self) -> &mut dyn Any; - fn set_input_handler(&mut self, input_handler: Box); - fn take_input_handler(&mut self) -> Option>; + fn set_input_handler(&mut self, input_handler: PlatformInputHandler); + fn take_input_handler(&mut self) -> Option; fn prompt(&self, level: PromptLevel, msg: &str, answers: &[&str]) -> oneshot::Receiver; fn activate(&self); fn set_title(&mut self, title: &str); @@ -325,19 +325,103 @@ impl From for etagere::AllocId { } } -pub trait PlatformInputHandler: 'static { - fn selected_text_range(&mut self) -> Option>; - fn marked_text_range(&mut self) -> Option>; - fn text_for_range(&mut self, range_utf16: Range) -> Option; - fn replace_text_in_range(&mut self, replacement_range: Option>, text: &str); +pub(crate) struct PlatformInputHandler { + cx: AsyncWindowContext, + handler: Box, +} + +impl PlatformInputHandler { + pub fn new(cx: AsyncWindowContext, handler: Box) -> Self { + Self { cx, handler } + } + + fn selected_text_range(&mut self) -> Option> { + self.cx + .update(|cx| self.handler.selected_text_range(cx)) + .ok() + .flatten() + } + + fn marked_text_range(&mut self) -> Option> { + self.cx + .update(|cx| self.handler.marked_text_range(cx)) + .ok() + .flatten() + } + + fn text_for_range(&mut self, range_utf16: Range) -> Option { + self.cx + .update(|cx| self.handler.text_for_range(range_utf16, cx)) + .ok() + .flatten() + } + + fn replace_text_in_range(&mut self, replacement_range: Option>, text: &str) { + self.cx + .update(|cx| { + self.handler + .replace_text_in_range(replacement_range, text, cx) + }) + .ok(); + } + fn replace_and_mark_text_in_range( &mut self, range_utf16: Option>, new_text: &str, new_selected_range: Option>, + ) { + self.cx + .update(|cx| { + self.handler.replace_and_mark_text_in_range( + range_utf16, + new_text, + new_selected_range, + cx, + ) + }) + .ok(); + } + + fn unmark_text(&mut self) { + self.cx.update(|cx| self.handler.unmark_text(cx)).ok(); + } + + fn bounds_for_range(&mut self, range_utf16: Range) -> Option> { + self.cx + .update(|cx| self.handler.bounds_for_range(range_utf16, cx)) + .ok() + .flatten() + } +} + +pub trait InputHandler: 'static { + fn selected_text_range(&mut self, cx: &mut WindowContext) -> Option>; + fn marked_text_range(&mut self, cx: &mut WindowContext) -> Option>; + fn text_for_range( + &mut self, + range_utf16: Range, + cx: &mut WindowContext, + ) -> Option; + fn replace_text_in_range( + &mut self, + replacement_range: Option>, + text: &str, + cx: &mut WindowContext, ); - fn unmark_text(&mut self); - fn bounds_for_range(&mut self, range_utf16: Range) -> Option>; + fn replace_and_mark_text_in_range( + &mut self, + range_utf16: Option>, + new_text: &str, + new_selected_range: Option>, + cx: &mut WindowContext, + ); + fn unmark_text(&mut self, cx: &mut WindowContext); + fn bounds_for_range( + &mut self, + range_utf16: Range, + cx: &mut WindowContext, + ) -> Option>; } #[derive(Debug)] diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index 814b8cc788cc2c607fc3cf3dd7f943d1868ecb25..fcfd02aa411f3cc8d6fe2fc422e8c1ba56e41baf 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -1,9 +1,9 @@ use super::{global_bounds_from_ns_rect, ns_string, MacDisplay, MetalRenderer, NSRange}; use crate::{ - global_bounds_to_ns_rect, point, px, size, AnyWindowHandle, Bounds, ExternalPaths, - FileDropEvent, ForegroundExecutor, GlobalPixels, KeyDownEvent, Keystroke, Modifiers, - ModifiersChangedEvent, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent, Pixels, - PlatformAtlas, PlatformDisplay, PlatformInput, PlatformInputHandler, PlatformWindow, Point, + global_bounds_to_ns_rect, platform::PlatformInputHandler, point, px, size, AnyWindowHandle, + Bounds, ExternalPaths, FileDropEvent, ForegroundExecutor, GlobalPixels, KeyDownEvent, + Keystroke, Modifiers, ModifiersChangedEvent, MouseButton, MouseDownEvent, MouseMoveEvent, + MouseUpEvent, Pixels, PlatformAtlas, PlatformDisplay, PlatformInput, PlatformWindow, Point, PromptLevel, Size, Timer, WindowAppearance, WindowBounds, WindowKind, WindowOptions, }; use block::ConcreteBlock; @@ -327,7 +327,7 @@ struct MacWindowState { should_close_callback: Option bool>>, close_callback: Option>, appearance_changed_callback: Option>, - input_handler: Option>, + input_handler: Option, pending_key_down: Option<(KeyDownEvent, Option)>, last_key_equivalent: Option, synthetic_drag_counter: usize, @@ -764,11 +764,11 @@ impl PlatformWindow for MacWindow { self } - fn set_input_handler(&mut self, input_handler: Box) { + fn set_input_handler(&mut self, input_handler: PlatformInputHandler) { self.0.as_ref().lock().input_handler = Some(input_handler); } - fn take_input_handler(&mut self) -> Option> { + fn take_input_handler(&mut self) -> Option { self.0.as_ref().lock().input_handler.take() } @@ -1761,13 +1761,13 @@ fn drag_event_position(window_state: &Mutex, dragging_info: id) fn with_input_handler(window: &Object, f: F) -> Option where - F: FnOnce(&mut dyn PlatformInputHandler) -> R, + F: FnOnce(&mut PlatformInputHandler) -> R, { let window_state = unsafe { get_window_state(window) }; let mut lock = window_state.as_ref().lock(); if let Some(mut input_handler) = lock.input_handler.take() { drop(lock); - let result = f(input_handler.as_mut()); + let result = f(&mut input_handler); window_state.lock().input_handler = Some(input_handler); Some(result) } else { diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 4e7ba2001a373e1a66406373ade0182fedd9fe34..81bd8b55b30a14b368581fcd9506bd44fe4c6696 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -5,13 +5,13 @@ use crate::{ AsyncWindowContext, AvailableSpace, Bounds, BoxShadow, Context, Corners, CursorStyle, DevicePixels, DispatchActionListener, DispatchNodeId, DispatchTree, DisplayId, Edges, Effect, Entity, EntityId, EventEmitter, FileDropEvent, Flatten, FontId, GlobalElementId, GlyphId, Hsla, - ImageData, IsZero, KeyBinding, KeyContext, KeyDownEvent, KeyEvent, KeystrokeEvent, LayoutId, - Model, ModelContext, Modifiers, MonochromeSprite, MouseButton, MouseEvent, MouseMoveEvent, - MouseUpEvent, Path, Pixels, PlatformAtlas, PlatformDisplay, PlatformInput, - PlatformInputHandler, PlatformWindow, Point, PolychromeSprite, PromptLevel, Quad, Render, - RenderGlyphParams, RenderImageParams, RenderSvgParams, ScaledPixels, Scene, Shadow, - SharedString, Size, Style, SubscriberSet, Subscription, Surface, TaffyLayoutEngine, Task, - Underline, UnderlineStyle, View, VisualContext, WeakView, WindowBounds, WindowOptions, + ImageData, InputHandler, IsZero, KeyBinding, KeyContext, KeyDownEvent, KeyEvent, + KeystrokeEvent, LayoutId, Model, ModelContext, Modifiers, MonochromeSprite, MouseButton, + MouseEvent, MouseMoveEvent, MouseUpEvent, Path, Pixels, PlatformAtlas, PlatformDisplay, + PlatformInput, PlatformInputHandler, PlatformWindow, Point, PolychromeSprite, PromptLevel, + Quad, Render, RenderGlyphParams, RenderImageParams, RenderSvgParams, ScaledPixels, Scene, + Shadow, SharedString, Size, Style, SubscriberSet, Subscription, Surface, TaffyLayoutEngine, + Task, Underline, UnderlineStyle, View, VisualContext, WeakView, WindowBounds, WindowOptions, SUBPIXEL_VARIANTS, }; use anyhow::{anyhow, Context as _, Result}; @@ -298,7 +298,7 @@ pub(crate) struct ElementStateBox { struct RequestedInputHandler { view_id: EntityId, - handler: Option>, + handler: Option, } struct TooltipRequest { @@ -2188,16 +2188,15 @@ impl<'a> WindowContext<'a> { /// rendered. /// /// [element_input_handler]: crate::ElementInputHandler - pub fn handle_input( - &mut self, - focus_handle: &FocusHandle, - input_handler: impl PlatformInputHandler, - ) { + pub fn handle_input(&mut self, focus_handle: &FocusHandle, input_handler: impl InputHandler) { if focus_handle.is_focused(self) { let view_id = self.parent_view_id(); self.window.next_frame.requested_input_handler = Some(RequestedInputHandler { view_id, - handler: Some(Box::new(input_handler)), + handler: Some(PlatformInputHandler::new( + self.to_async(), + Box::new(input_handler), + )), }) } } @@ -2209,7 +2208,7 @@ impl<'a> WindowContext<'a> { self.window .platform_window .on_should_close(Box::new(move || { - this.update(|_, cx| { + this.update(|cx| { // Ensure that the window is removed from the app if it's been closed // by always pre-empting the system close event. if f(cx) { diff --git a/crates/journal/src/journal.rs b/crates/journal/src/journal.rs index b15da05e1737d3e21a7c3e84fb2a8e5184330be9..7383a0ee55a61a8cfb8bab62e1c8b1c816813f10 100644 --- a/crates/journal/src/journal.rs +++ b/crates/journal/src/journal.rs @@ -102,7 +102,7 @@ pub fn new_journal_entry(app_state: Arc, cx: &mut WindowContext) { cx.spawn(|mut cx| async move { let (journal_dir, entry_path) = create_entry.await?; let (workspace, _) = cx - .update(|_, cx| workspace::open_paths(&[journal_dir], &app_state, None, cx))? + .update(|cx| workspace::open_paths(&[journal_dir], &app_state, None, cx))? .await?; let opened = workspace diff --git a/crates/terminal_view/src/terminal_element.rs b/crates/terminal_view/src/terminal_element.rs index 29944b54d7729d7cf257c515339234db9f666751..9ab62947fd46f96b43eafddaab5a86952ed714e6 100644 --- a/crates/terminal_view/src/terminal_element.rs +++ b/crates/terminal_view/src/terminal_element.rs @@ -1,11 +1,11 @@ use editor::{Cursor, HighlightedRange, HighlightedRangeLine}; use gpui::{ - div, fill, point, px, relative, AnyElement, AsyncWindowContext, AvailableSpace, BorrowWindow, - Bounds, DispatchPhase, Element, ElementId, FocusHandle, Font, FontStyle, FontWeight, - HighlightStyle, Hsla, InteractiveBounds, InteractiveElement, InteractiveElementState, + div, fill, point, px, relative, AnyElement, AvailableSpace, BorrowWindow, Bounds, + DispatchPhase, Element, ElementId, FocusHandle, Font, FontStyle, FontWeight, HighlightStyle, + Hsla, InputHandler, InteractiveBounds, InteractiveElement, InteractiveElementState, Interactivity, IntoElement, LayoutId, Model, ModelContext, ModifiersChangedEvent, MouseButton, - MouseMoveEvent, Pixels, PlatformInputHandler, Point, ShapedLine, StatefulInteractiveElement, - Styled, TextRun, TextStyle, TextSystem, UnderlineStyle, WeakView, WhiteSpace, WindowContext, + MouseMoveEvent, Pixels, Point, ShapedLine, StatefulInteractiveElement, Styled, TextRun, + TextStyle, TextSystem, UnderlineStyle, WeakView, WhiteSpace, WindowContext, }; use itertools::Itertools; use language::CursorShape; @@ -749,7 +749,6 @@ impl Element for TerminalElement { let origin = bounds.origin + Point::new(layout.gutter, px(0.)); let terminal_input_handler = TerminalInputHandler { - cx: cx.to_async(), terminal: self.terminal.clone(), cursor_bounds: layout .cursor @@ -838,37 +837,35 @@ impl IntoElement for TerminalElement { } struct TerminalInputHandler { - cx: AsyncWindowContext, terminal: Model, workspace: WeakView, cursor_bounds: Option>, } -impl PlatformInputHandler for TerminalInputHandler { - fn selected_text_range(&mut self) -> Option> { - self.cx - .update(|_, cx| { - if self - .terminal - .read(cx) - .last_content - .mode - .contains(TermMode::ALT_SCREEN) - { - None - } else { - Some(0..0) - } - }) - .ok() - .flatten() +impl InputHandler for TerminalInputHandler { + fn selected_text_range(&mut self, cx: &mut WindowContext) -> Option> { + if self + .terminal + .read(cx) + .last_content + .mode + .contains(TermMode::ALT_SCREEN) + { + None + } else { + Some(0..0) + } } - fn marked_text_range(&mut self) -> Option> { + fn marked_text_range(&mut self, _: &mut WindowContext) -> Option> { None } - fn text_for_range(&mut self, _: std::ops::Range) -> Option { + fn text_for_range( + &mut self, + _: std::ops::Range, + _: &mut WindowContext, + ) -> Option { None } @@ -876,19 +873,16 @@ impl PlatformInputHandler for TerminalInputHandler { &mut self, _replacement_range: Option>, text: &str, + cx: &mut WindowContext, ) { - self.cx - .update(|_, cx| { - self.terminal.update(cx, |terminal, _| { - terminal.input(text.into()); - }); + self.terminal.update(cx, |terminal, _| { + terminal.input(text.into()); + }); - self.workspace - .update(cx, |this, cx| { - let telemetry = this.project().read(cx).client().telemetry().clone(); - telemetry.log_edit_event("terminal"); - }) - .ok(); + self.workspace + .update(cx, |this, cx| { + let telemetry = this.project().read(cx).client().telemetry().clone(); + telemetry.log_edit_event("terminal"); }) .ok(); } @@ -898,12 +892,17 @@ impl PlatformInputHandler for TerminalInputHandler { _range_utf16: Option>, _new_text: &str, _new_selected_range: Option>, + _: &mut WindowContext, ) { } - fn unmark_text(&mut self) {} + fn unmark_text(&mut self, _: &mut WindowContext) {} - fn bounds_for_range(&mut self, _range_utf16: std::ops::Range) -> Option> { + fn bounds_for_range( + &mut self, + _range_utf16: std::ops::Range, + _: &mut WindowContext, + ) -> Option> { self.cursor_bounds } } diff --git a/crates/terminal_view/src/terminal_view.rs b/crates/terminal_view/src/terminal_view.rs index 25e67aa8f472c14c2943f55b75a0909ec831426d..180667b113816f0928a23882fb40222824136bbc 100644 --- a/crates/terminal_view/src/terminal_view.rs +++ b/crates/terminal_view/src/terminal_view.rs @@ -772,7 +772,7 @@ impl Item for TerminalView { .log_err() .flatten() .or_else(|| { - cx.update(|_, cx| { + cx.update(|cx| { let strategy = TerminalSettings::get_global(cx).working_directory.clone(); workspace .upgrade() diff --git a/crates/workspace/src/notifications.rs b/crates/workspace/src/notifications.rs index 6e7590c7d3886493f00d2b43728326549e5665f8..1b41b7040ceb00eacbcc38890018e852f446d95a 100644 --- a/crates/workspace/src/notifications.rs +++ b/crates/workspace/src/notifications.rs @@ -281,7 +281,7 @@ where Ok(value) => Some(value), Err(err) => { log::error!("TODO {err:?}"); - cx.update(|view, cx| { + cx.update_root(|view, cx| { if let Ok(workspace) = view.downcast::() { workspace.update(cx, |workspace, cx| workspace.show_error(&err, cx)) } diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index 17001ed76f084275ac2b93304e8e5bcad152b650..306ffab90f6b02a23026e2d95c3eeb800b088bd3 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -1092,7 +1092,7 @@ impl Pane { return Ok(true); } - let (mut has_conflict, mut is_dirty, mut can_save, can_save_as) = cx.update(|_, cx| { + let (mut has_conflict, mut is_dirty, mut can_save, can_save_as) = cx.update(|cx| { ( item.has_conflict(cx), item.is_dirty(cx), @@ -1132,7 +1132,7 @@ impl Pane { } } else if is_dirty && (can_save || can_save_as) { if save_intent == SaveIntent::Close { - let will_autosave = cx.update(|_, cx| { + let will_autosave = cx.update(|cx| { matches!( WorkspaceSettings::get_global(cx).autosave, AutosaveSetting::OnFocusChange | AutosaveSetting::OnWindowChange @@ -1166,7 +1166,7 @@ impl Pane { })? .unwrap_or_else(|| Path::new("").into()); - let abs_path = cx.update(|_, cx| cx.prompt_for_new_path(&start_abs_path))?; + let abs_path = cx.update(|cx| cx.prompt_for_new_path(&start_abs_path))?; if let Some(abs_path) = abs_path.await.ok().flatten() { pane.update(cx, |_, cx| item.save_as(project, abs_path, cx))? .await?; diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index a0f42cec29fd904bd1dd5df4dbbad3e8b60efad0..bb7ba143d6063c4e2b46bb193fb8c249c657934a 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -1233,7 +1233,7 @@ impl Workspace { } for (pane, item) in dirty_items { let (singleton, project_entry_ids) = - cx.update(|_, cx| (item.is_singleton(cx), item.project_entry_ids(cx)))?; + cx.update(|cx| (item.is_singleton(cx), item.project_entry_ids(cx)))?; if singleton || !project_entry_ids.is_empty() { if let Some(ix) = pane.update(&mut cx, |pane, _| pane.index_for_item(item.as_ref()))? @@ -1307,7 +1307,7 @@ impl Workspace { } else { None }; - cx.update(|_, cx| open_paths(&paths, &app_state, window_to_replace, cx))? + cx.update(|cx| open_paths(&paths, &app_state, window_to_replace, cx))? .await?; Ok(()) }) @@ -1912,7 +1912,7 @@ impl Workspace { let project_item = project.update(cx, |project, cx| project.open_path(path, cx)); cx.spawn(|_, mut cx| async move { let (project_entry_id, project_item) = project_item.await?; - let build_item = cx.update(|_, cx| { + let build_item = cx.update(|cx| { cx.default_global::() .get(&project_item.entity_type()) .ok_or_else(|| anyhow!("no item builder for project item")) @@ -2709,7 +2709,7 @@ impl Workspace { ) -> Result<()> { let this = this.upgrade().context("workspace dropped")?; - let item_builders = cx.update(|_, cx| { + let item_builders = cx.update(|cx| { cx.default_global::() .values() .map(|b| b.0) @@ -2728,7 +2728,7 @@ impl Workspace { Err(anyhow!("missing view variant"))?; } for build_item in &item_builders { - let task = cx.update(|_, cx| { + let task = cx.update(|cx| { build_item(pane.clone(), this.clone(), id, &mut variant, cx) })?; if let Some(task) = task { @@ -3141,7 +3141,7 @@ impl Workspace { center_group = Some((group, active_pane)) } - let mut items_by_project_path = cx.update(|_, cx| { + let mut items_by_project_path = cx.update(|cx| { center_items .unwrap_or_default() .into_iter() @@ -3407,7 +3407,7 @@ fn open_items( let restored_project_paths = restored_items .iter() .filter_map(|item| { - cx.update(|_, cx| item.as_ref()?.project_path(cx)) + cx.update(|cx| item.as_ref()?.project_path(cx)) .ok() .flatten() }) From 87be105af7669c04d3c844a1aaaf316e6a74c87b Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Sat, 20 Jan 2024 16:29:59 +0100 Subject: [PATCH 057/104] When searching in visual mode switch to normal mode This matches Neovim behaviour by setting the mode to `Normal` when using search while in visual mode. Co-authored-by: Conrad --- crates/gpui/src/keymap/matcher.rs | 4 +--- crates/vim/src/normal/search.rs | 21 ++++++++++++++++++- .../src/test/neovim_backed_test_context.rs | 18 ++++++++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/crates/gpui/src/keymap/matcher.rs b/crates/gpui/src/keymap/matcher.rs index 934becb0d1520ae747845f94d22d066cac6fc59f..be7204aa67932427a599385ea6d91c1d393c29e9 100644 --- a/crates/gpui/src/keymap/matcher.rs +++ b/crates/gpui/src/keymap/matcher.rs @@ -73,9 +73,7 @@ impl KeystrokeMatcher { if !found_actions.is_empty() { self.pending_keystrokes.clear(); return KeyMatch::Some(found_actions); - } - - if let Some(pending_key) = pending_key { + } else if let Some(pending_key) = pending_key { self.pending_keystrokes.push(pending_key); KeyMatch::Pending } else { diff --git a/crates/vim/src/normal/search.rs b/crates/vim/src/normal/search.rs index 31fda7788f01bbaf6799b5e6468c41236b12d025..68a8ada984301aad8e9211672de86738ba01fb60 100644 --- a/crates/vim/src/normal/search.rs +++ b/crates/vim/src/normal/search.rs @@ -3,7 +3,12 @@ use search::{buffer_search, BufferSearchBar, SearchMode, SearchOptions}; use serde_derive::Deserialize; use workspace::{searchable::Direction, Workspace}; -use crate::{motion::Motion, normal::move_cursor, state::SearchState, Vim}; +use crate::{ + motion::Motion, + normal::move_cursor, + state::{Mode, SearchState}, + Vim, +}; #[derive(Clone, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] @@ -145,6 +150,7 @@ pub fn move_to_internal( Vim::update(cx, |vim, cx| { let pane = workspace.active_pane().clone(); let count = vim.take_count(cx).unwrap_or(1); + pane.update(cx, |pane, cx| { if let Some(search_bar) = pane.toolbar().read(cx).item_of_type::() { let search = search_bar.update(cx, |search_bar, cx| { @@ -176,6 +182,11 @@ pub fn move_to_internal( } } }); + + if vim.state().mode.is_visual() { + vim.switch_mode(Mode::Normal, false, cx) + } + vim.clear_operator(cx); }); } @@ -465,6 +476,13 @@ mod test { cx.simulate_keystrokes(["/", "b"]); cx.simulate_keystrokes(["enter"]); cx.assert_state("aa\nˇbb\ndd\ncc\nbb\n", Mode::Normal); + + // check that searching switches to normal mode if in visual mode + cx.set_state("ˇone two one", Mode::Normal); + cx.simulate_keystrokes(["v", "l", "l"]); + cx.assert_editor_state("«oneˇ» two one"); + cx.simulate_keystrokes(["*"]); + cx.assert_state("one two ˇone", Mode::Normal); } #[gpui::test] @@ -488,5 +506,6 @@ mod test { cx.set_shared_state("ˇa.c. abcd a.c. abcd").await; cx.simulate_shared_keystrokes(["v", "3", "l", "*"]).await; cx.assert_shared_state("a.c. abcd ˇa.c. abcd").await; + cx.assert_shared_mode(Mode::Normal).await; } } diff --git a/crates/vim/src/test/neovim_backed_test_context.rs b/crates/vim/src/test/neovim_backed_test_context.rs index 384722286cdfa3768320c0810655c4ca06c9b012..7753a4e850e37a8fc32831ba35f720058956931f 100644 --- a/crates/vim/src/test/neovim_backed_test_context.rs +++ b/crates/vim/src/test/neovim_backed_test_context.rs @@ -277,6 +277,24 @@ impl NeovimBackedTestContext { self.neovim.mode().await.unwrap() } + pub async fn assert_shared_mode(&mut self, mode: Mode) { + let neovim = self.neovim_mode().await; + let editor = self.cx.mode(); + + if neovim != mode || editor != mode { + panic!( + indoc! {"Test failed (zed does not match nvim behaviour) + # desired mode: + {:?} + # neovim mode: + {:?} + # zed mode: + {:?}"}, + mode, neovim, editor, + ) + } + } + pub async fn assert_state_matches(&mut self) { self.is_dirty = false; let neovim = self.neovim_state().await; From a811b1503c407da29e63539d59dff173161095cc Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Sat, 20 Jan 2024 17:27:37 +0100 Subject: [PATCH 058/104] Resize Nightly icons to same scale as Stable/Preview --- crates/zed/resources/app-icon-nightly.png | Bin 191195 -> 239870 bytes crates/zed/resources/app-icon-nightly@2x.png | Bin 551531 -> 716288 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/crates/zed/resources/app-icon-nightly.png b/crates/zed/resources/app-icon-nightly.png index 35b3173478a9fbb58d380dd7bc70f1a16b99ce01..5f1304a6af8d57bbf7414d175611829989d122da 100644 GIT binary patch literal 239870 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

+?Wo|0z4^sw5h|6Krp9oiT}4cG`b*XgkRaS%$;c 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:}) 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 !Ao2I*Keyj7hIk8AHAaK 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