From 0e257c624a53fb0c3c0ad44d33f9f160f2b9fec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20kallstad?= Date: Fri, 13 Feb 2026 15:52:30 +0100 Subject: [PATCH 1/7] Add support for PowerShellEditorServices settings --- Cargo.lock | 2 +- Cargo.toml | 2 +- extension.toml | 2 +- src/powershell.rs | 42 ++++++++++++++++++++++++++++++------------ 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 691eb29..e80d1ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -394,7 +394,7 @@ dependencies = [ [[package]] name = "powershell" -version = "0.4.0" +version = "0.5.0" dependencies = [ "zed_extension_api", ] diff --git a/Cargo.toml b/Cargo.toml index eae926a..87afcb8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "powershell" -version = "0.4.0" +version = "0.5.0" edition = "2021" [lib] diff --git a/extension.toml b/extension.toml index 32eb333..746f717 100644 --- a/extension.toml +++ b/extension.toml @@ -1,6 +1,6 @@ id = "powershell" name = "PowerShell" -version = "0.4.0" +version = "0.5.0" schema_version = 1 authors = ["Thanabodee Charoenpiriyakij "] description = "PowerShell support" diff --git a/src/powershell.rs b/src/powershell.rs index d49f5df..2b73be1 100644 --- a/src/powershell.rs +++ b/src/powershell.rs @@ -1,6 +1,7 @@ -use std::env; use std::fs; +use std::path; use zed_extension_api::{self as zed, Result}; +use zed_extension_api::settings::LspSettings; struct PowerShellExtension { /// The PowerShell binary, default to `pwsh`. @@ -27,7 +28,7 @@ impl zed::Extension for PowerShellExtension { let bundle_path = self .language_server_path(language_server_id) - .map_err(|err| format!("failed to get editor services: {err}"))?; + .map_err(|err| format!("failed to get editor services: {}", err))?; let command = format!( "Import-Module ( \ @@ -56,18 +57,36 @@ impl zed::Extension for PowerShellExtension { env: Default::default(), }) } + + fn language_server_initialization_options( + &mut self, + language_server_id: &zed_extension_api::LanguageServerId, + worktree: &zed_extension_api::Worktree, + ) -> zed_extension_api::Result> { + let settings = LspSettings::for_worktree(language_server_id.as_ref(), worktree)?; + Ok(settings.initialization_options) + } + + fn language_server_workspace_configuration( + &mut self, + language_server_id: &zed_extension_api::LanguageServerId, + worktree: &zed_extension_api::Worktree, + ) -> zed_extension_api::Result> { + let settings = LspSettings::for_worktree(language_server_id.as_ref(), worktree)?; + Ok(settings.settings) + } } impl PowerShellExtension { fn powershell_binary_path(&mut self, worktree: &zed::Worktree) -> Result { let pwsh_path = match &self.powershell_bin { - Some(path) if fs::metadata(path).is_ok_and(|stat| stat.is_file()) => path.clone(), + Some(path) if fs::metadata(path).map_or(false, |stat| stat.is_file()) => path.clone(), Some(path) => worktree .which(path.clone().as_str()) - .ok_or("PowerShell must be installed for PowerShell Extension")?, + .ok_or_else(|| "PowerShell must be installed for PowerShell Extension")?, None => worktree .which("pwsh") - .ok_or("PowerShell must be installed for PowerShell Extension")?, + .ok_or_else(|| "PowerShell must be installed for PowerShell Extension")?, }; self.powershell_bin = Some(pwsh_path.clone()); Ok(pwsh_path) @@ -94,15 +113,15 @@ impl PowerShellExtension { .assets .iter() .find(|asset| asset.name == "PowerShellEditorServices.zip") - .ok_or_else(|| "no PowerShellEditorServices.zip found".to_string())?; + .ok_or_else(|| format!("no PowerShellEditorServices.zip found"))?; let version_dir = format!("powershell-es-{}", release.version); let lsp_path = format!("{version_dir}/PowerShellEditorServices/Start-EditorServices.ps1"); - if !fs::metadata(&lsp_path).is_ok_and(|stat| stat.is_file()) { + if !fs::metadata(&lsp_path).map_or(false, |stat| stat.is_file()) { // Download the asset zed::set_language_server_installation_status( - language_server_id, + &language_server_id, &zed::LanguageServerInstallationStatus::Downloading, ); zed::download_file( @@ -110,7 +129,7 @@ impl PowerShellExtension { &version_dir, zed::DownloadedFileType::Zip, ) - .map_err(|err| format!("download error {err}"))?; + .map_err(|err| format!("download error {}", err))?; // Ensure the binary exists let entries = @@ -123,9 +142,8 @@ impl PowerShellExtension { } } - let abs_path = env::current_dir() - .map_err(|_| "Failed to get current path".to_string())? - .join(version_dir); + let abs_path = + path::absolute(&version_dir).map_err(|e| format!("failed to get absolute path {e}"))?; Ok(abs_path.display().to_string()) } } From cf48f188e37d35260e68d635b47a3957214707dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20kallstad?= Date: Wed, 18 Feb 2026 07:10:05 +0100 Subject: [PATCH 2/7] Revert version back to 0.4.0 --- extension.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension.toml b/extension.toml index 746f717..32eb333 100644 --- a/extension.toml +++ b/extension.toml @@ -1,6 +1,6 @@ id = "powershell" name = "PowerShell" -version = "0.5.0" +version = "0.4.0" schema_version = 1 authors = ["Thanabodee Charoenpiriyakij "] description = "PowerShell support" From de0d85adc950d7e0a77db7fb649af55594a8c42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20kallstad?= Date: Wed, 18 Feb 2026 07:14:32 +0100 Subject: [PATCH 3/7] Update readme with info about config --- README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/README.md b/README.md index 88a43bb..8dfb731 100644 --- a/README.md +++ b/README.md @@ -15,3 +15,28 @@ to set the bundle path through `lsp` configuration: } } } +``` + +Configure PowerShellEditorServices settings like this: + +```json +"languages": { + "PowerShell": { + "formatter": "language_server", + }, + }, +"lsp": { + "powershell-es": { + "settings": { + "powershell": { + "codeFormatting": { + "openBraceOnSameLine": true, + "addWhitespaceAroundPipe": true, + "trimWhitespaceAroundPipe": true, + "ignoreOneLineBlock": true, + }, + }, + }, + }, + }, +``` \ No newline at end of file From 3b66a524014e46c3d0c75e03a41cb06f3574777c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20kallstad?= Date: Wed, 18 Feb 2026 07:15:42 +0100 Subject: [PATCH 4/7] Revert back to initial state and re-implemented changes --- src/powershell.rs | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/powershell.rs b/src/powershell.rs index 2b73be1..9925299 100644 --- a/src/powershell.rs +++ b/src/powershell.rs @@ -1,5 +1,5 @@ +use std::env; use std::fs; -use std::path; use zed_extension_api::{self as zed, Result}; use zed_extension_api::settings::LspSettings; @@ -28,7 +28,7 @@ impl zed::Extension for PowerShellExtension { let bundle_path = self .language_server_path(language_server_id) - .map_err(|err| format!("failed to get editor services: {}", err))?; + .map_err(|err| format!("failed to get editor services: {err}"))?; let command = format!( "Import-Module ( \ @@ -63,8 +63,8 @@ impl zed::Extension for PowerShellExtension { language_server_id: &zed_extension_api::LanguageServerId, worktree: &zed_extension_api::Worktree, ) -> zed_extension_api::Result> { - let settings = LspSettings::for_worktree(language_server_id.as_ref(), worktree)?; - Ok(settings.initialization_options) + LspSettings::for_worktree(language_server_id.as_ref(), worktree) + .map(|settings| settings.initialization_options) } fn language_server_workspace_configuration( @@ -72,21 +72,22 @@ impl zed::Extension for PowerShellExtension { language_server_id: &zed_extension_api::LanguageServerId, worktree: &zed_extension_api::Worktree, ) -> zed_extension_api::Result> { - let settings = LspSettings::for_worktree(language_server_id.as_ref(), worktree)?; - Ok(settings.settings) + LspSettings::for_worktree(language_server_id.as_ref(), worktree) + .map(|settings| settings.settings) } + } impl PowerShellExtension { fn powershell_binary_path(&mut self, worktree: &zed::Worktree) -> Result { let pwsh_path = match &self.powershell_bin { - Some(path) if fs::metadata(path).map_or(false, |stat| stat.is_file()) => path.clone(), + Some(path) if fs::metadata(path).is_ok_and(|stat| stat.is_file()) => path.clone(), Some(path) => worktree .which(path.clone().as_str()) - .ok_or_else(|| "PowerShell must be installed for PowerShell Extension")?, + .ok_or("PowerShell must be installed for PowerShell Extension")?, None => worktree .which("pwsh") - .ok_or_else(|| "PowerShell must be installed for PowerShell Extension")?, + .ok_or("PowerShell must be installed for PowerShell Extension")?, }; self.powershell_bin = Some(pwsh_path.clone()); Ok(pwsh_path) @@ -113,15 +114,15 @@ impl PowerShellExtension { .assets .iter() .find(|asset| asset.name == "PowerShellEditorServices.zip") - .ok_or_else(|| format!("no PowerShellEditorServices.zip found"))?; + .ok_or_else(|| "no PowerShellEditorServices.zip found".to_string())?; let version_dir = format!("powershell-es-{}", release.version); let lsp_path = format!("{version_dir}/PowerShellEditorServices/Start-EditorServices.ps1"); - if !fs::metadata(&lsp_path).map_or(false, |stat| stat.is_file()) { + if !fs::metadata(&lsp_path).is_ok_and(|stat| stat.is_file()) { // Download the asset zed::set_language_server_installation_status( - &language_server_id, + language_server_id, &zed::LanguageServerInstallationStatus::Downloading, ); zed::download_file( @@ -129,7 +130,7 @@ impl PowerShellExtension { &version_dir, zed::DownloadedFileType::Zip, ) - .map_err(|err| format!("download error {}", err))?; + .map_err(|err| format!("download error {err}"))?; // Ensure the binary exists let entries = @@ -142,10 +143,12 @@ impl PowerShellExtension { } } - let abs_path = - path::absolute(&version_dir).map_err(|e| format!("failed to get absolute path {e}"))?; + let abs_path = env::current_dir() + .map_err(|_| "Failed to get current path".to_string())? + .join(version_dir); Ok(abs_path.display().to_string()) } } zed::register_extension!(PowerShellExtension); + From ed3bab334d2051eed6b2fd328ca57353b97d9112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20kallstad?= Date: Wed, 18 Feb 2026 07:22:03 +0100 Subject: [PATCH 5/7] Revert version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 87afcb8..eae926a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "powershell" -version = "0.5.0" +version = "0.4.0" edition = "2021" [lib] From fd943f7a1091e8798d73766c7561965ada9cdc85 Mon Sep 17 00:00:00 2001 From: MrSubidubi Date: Wed, 18 Feb 2026 13:54:41 +0100 Subject: [PATCH 6/7] Some cleanup --- Cargo.lock | 14 ++++++------ Cargo.toml | 2 +- README.md | 63 +++++++++++++++++++++++++++--------------------------- 3 files changed, 40 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e80d1ca..ae078c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -392,13 +392,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "powershell" -version = "0.5.0" -dependencies = [ - "zed_extension_api", -] - [[package]] name = "prettyplease" version = "0.2.37" @@ -765,6 +758,13 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "zed_powershell" +version = "0.4.0" +dependencies = [ + "zed_extension_api", +] + [[package]] name = "zerofrom" version = "0.1.6" diff --git a/Cargo.toml b/Cargo.toml index eae926a..5010d05 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "powershell" +name = "zed_powershell" version = "0.4.0" edition = "2021" diff --git a/README.md b/README.md index 8dfb731..0fc6e75 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,43 @@ -# PowerShell extension for Zed editor +# PowerShell support for Zed -## Setting up language server +This extension provides syntax highlighting as well as language server support for PowerShell files -Currently, the extension didn't support automatic installation (it'll soon land). You need -to set the bundle path through `lsp` configuration: +## Configuring your language server + +The extension requires PowerShell to be available in your environment. If that is the case, +the extension will auto-download the language server and start it. + +If you wish to specify a custom path to your language server, you can do so via your settings: ```json { - "lsp": { - "powershell-es": { - "binary": { - "path": "" - } + "lsp": { + "powershell-es": { + "binary": { + "path": "" + } + } } - } } ``` -Configure PowerShellEditorServices settings like this: +Additionally, you can configure settings for your language server as well as initialization options +to pass to the language server on start. + +An example for this: ```json -"languages": { - "PowerShell": { - "formatter": "language_server", - }, - }, -"lsp": { - "powershell-es": { - "settings": { - "powershell": { - "codeFormatting": { - "openBraceOnSameLine": true, - "addWhitespaceAroundPipe": true, - "trimWhitespaceAroundPipe": true, - "ignoreOneLineBlock": true, - }, - }, - }, - }, - }, -``` \ No newline at end of file +"lsp":{ + "powershell-es":{ + "settings":{ + "powershell":{ + "codeFormatting":{ + "openBraceOnSameLine":true, + "addWhitespaceAroundPipe":true, + "trimWhitespaceAroundPipe":true, + "ignoreOneLineBlock":true + } + } + } + } +``` From 2c4241559c268de14a9abe01ec841770a13f0396 Mon Sep 17 00:00:00 2001 From: MrSubidubi Date: Wed, 18 Feb 2026 14:23:03 +0100 Subject: [PATCH 7/7] fmt --- src/powershell.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/powershell.rs b/src/powershell.rs index 9925299..6b50132 100644 --- a/src/powershell.rs +++ b/src/powershell.rs @@ -1,7 +1,7 @@ use std::env; use std::fs; -use zed_extension_api::{self as zed, Result}; use zed_extension_api::settings::LspSettings; +use zed_extension_api::{self as zed, Result}; struct PowerShellExtension { /// The PowerShell binary, default to `pwsh`. @@ -75,7 +75,6 @@ impl zed::Extension for PowerShellExtension { LspSettings::for_worktree(language_server_id.as_ref(), worktree) .map(|settings| settings.settings) } - } impl PowerShellExtension { @@ -151,4 +150,3 @@ impl PowerShellExtension { } zed::register_extension!(PowerShellExtension); -