terminal: Make CursorShape configurable (#18530)

This builds on top of @Yevgen's #15840 and combines it with the settings
names introduced in #17572.

Closes #4731.

Release Notes:

- Added a setting for the terminal's default cursor shape. The setting
is `{"terminal": {"cursor_shape": "block"}}``. Possible values: `block`,
`bar`, `hollow`, `underline`.

Demo:


https://github.com/user-attachments/assets/96ed28c2-c222-436b-80cb-7cd63eeb47dd
This commit is contained in:
Thorsten Ball 2024-09-30 12:38:57 +02:00 committed by GitHub
parent 57ad5778fa
commit 533416c5a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 88 additions and 4 deletions

View file

@ -1,3 +1,6 @@
use alacritty_terminal::vte::ansi::{
CursorShape as AlacCursorShape, CursorStyle as AlacCursorStyle,
};
use collections::HashMap;
use gpui::{
px, AbsoluteLength, AppContext, FontFallbacks, FontFeatures, FontWeight, Pixels, SharedString,
@ -32,6 +35,7 @@ pub struct TerminalSettings {
pub font_weight: Option<FontWeight>,
pub line_height: TerminalLineHeight,
pub env: HashMap<String, String>,
pub cursor_shape: Option<CursorShape>,
pub blinking: TerminalBlink,
pub alternate_scroll: AlternateScroll,
pub option_as_meta: bool,
@ -129,6 +133,11 @@ pub struct TerminalSettingsContent {
///
/// Default: {}
pub env: Option<HashMap<String, String>>,
/// Default cursor shape for the terminal.
/// Can be "bar", "block", "underscore", or "hollow".
///
/// Default: None
pub cursor_shape: Option<CursorShape>,
/// Sets the cursor blinking behavior in the terminal.
///
/// Default: terminal_controlled
@ -282,3 +291,37 @@ pub struct ToolbarContent {
/// Default: true
pub title: Option<bool>,
}
#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum CursorShape {
/// Cursor is a block like `█`.
#[default]
Block,
/// Cursor is an underscore like `_`.
Underline,
/// Cursor is a vertical bar like `⎸`.
Bar,
/// Cursor is a hollow box like `▯`.
Hollow,
}
impl From<CursorShape> for AlacCursorShape {
fn from(value: CursorShape) -> Self {
match value {
CursorShape::Block => AlacCursorShape::Block,
CursorShape::Underline => AlacCursorShape::Underline,
CursorShape::Bar => AlacCursorShape::Beam,
CursorShape::Hollow => AlacCursorShape::HollowBlock,
}
}
}
impl From<CursorShape> for AlacCursorStyle {
fn from(value: CursorShape) -> Self {
AlacCursorStyle {
shape: value.into(),
blinking: false,
}
}
}