Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,15 @@ jobs:
build: [x86_64-linux, aarch64-linux, x86_64-macos, x86_64-windows] #, x86_64-win-gnu, win32-msvc
include:
- build: x86_64-linux
os: ubuntu-24.04
# WARN: When changing this to a newer version, make sure that the GLIBC isnt too new, as this can cause issues
# with portablity on older systems that dont follow ubuntus more rapid release cadence.
os: ubuntu-22.04
rust: stable
target: x86_64-unknown-linux-gnu
cross: false
- build: aarch64-linux
os: ubuntu-24.04-arm
# Version should be kept in lockstep with the x86_64 version
os: ubuntu-22.04-arm
rust: stable
target: aarch64-unknown-linux-gnu
cross: false
Expand Down Expand Up @@ -291,7 +294,7 @@ jobs:
file_glob: true
tag: ${{ github.ref_name }}
overwrite: true

- name: Upload binaries as artifact
uses: actions/upload-artifact@v4
if: env.preview == 'true'
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ Updated languages and queries:
Packaging:
-->

# 25.07.1 (2025-07-18)

This is a patch release which lowers the GLIBC requirements of the release artifacts published to GitHub ([#13983](https://github.com/helix-editor/helix/pull/13983))

# 25.07 (2025-07-15)

As always, a big thank you to all of the contributors! This release saw changes from 195 contributors.
Expand Down
24 changes: 12 additions & 12 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ futures-util = { version = "0.3", features = ["std", "async-await"], default-fea
tokio-stream = "0.1.17"

[workspace.package]
version = "25.7.0"
version = "25.7.1"
edition = "2021"
authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
categories = ["editor"]
Expand Down
6 changes: 6 additions & 0 deletions book/src/generated/static-cmd.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,12 @@
| `goto_last_diag` | Goto last diagnostic | normal: `` ]D ``, select: `` ]D `` |
| `goto_next_diag` | Goto next diagnostic | normal: `` ]d ``, select: `` ]d `` |
| `goto_prev_diag` | Goto previous diagnostic | normal: `` [d ``, select: `` [d `` |
| `goto_first_diag_workspace` | Goto first diagnostic in workspace | |
| `goto_first_error_workspace` | Goto first Error diagnostic in workspace | |
| `goto_first_warning_workspace` | Goto first Warning diagnostic in workspace | |
| `goto_next_diag_workspace` | Goto next diagnostic in workspace | |
| `goto_next_error_workspace` | Goto next Error diagnostic in workspace | |
| `goto_next_warning_workspace` | Goto next Warning diagnostic in workspace | |
| `goto_next_change` | Goto next change | normal: `` ]g ``, select: `` ]g `` |
| `goto_prev_change` | Goto previous change | normal: `` [g ``, select: `` [g `` |
| `goto_first_change` | Goto first change | normal: `` [G ``, select: `` [G `` |
Expand Down
3 changes: 3 additions & 0 deletions contrib/Helix.appdata.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@
<content_rating type="oars-1.1" />

<releases>
<release version="25.07.1" date="2025-07-18">
<url>https://github.com/helix-editor/helix/releases/tag/25.07.1</url>
</release>
<release version="25.07" date="2025-07-15">
<url>https://helix-editor.com/news/release-25-07-highlights/</url>
</release>
Expand Down
12 changes: 12 additions & 0 deletions helix-core/src/diagnostic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ use std::{fmt, sync::Arc};
pub use helix_stdx::range::Range;
use serde::{Deserialize, Serialize};

use crate::Selection;

/// Describes the severity level of a [`Diagnostic`].
#[derive(Debug, Clone, Copy, Eq, PartialEq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
Expand Down Expand Up @@ -99,4 +101,14 @@ impl Diagnostic {
pub fn severity(&self) -> Severity {
self.severity.unwrap_or(Severity::Warning)
}

/// Returns a single selection spanning the range of the diagnostic.
pub fn single_selection(&self) -> Selection {
Selection::single(self.range.start, self.range.end)
}

/// Returns a single reversed selection spanning the range of the diagnostic.
pub fn single_selection_rev(&self) -> Selection {
Selection::single(self.range.end, self.range.start)
}
}
62 changes: 55 additions & 7 deletions helix-term/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,12 @@ impl MappableCommand {
goto_last_diag, "Goto last diagnostic",
goto_next_diag, "Goto next diagnostic",
goto_prev_diag, "Goto previous diagnostic",
goto_first_diag_workspace, "Goto first diagnostic in workspace",
goto_first_error_workspace, "Goto first Error diagnostic in workspace",
goto_first_warning_workspace, "Goto first Warning diagnostic in workspace",
goto_next_diag_workspace, "Goto next diagnostic in workspace",
goto_next_error_workspace, "Goto next Error diagnostic in workspace",
goto_next_warning_workspace, "Goto next Warning diagnostic in workspace",
goto_next_change, "Goto next change",
goto_prev_change, "Goto previous change",
goto_first_change, "Goto first change",
Expand Down Expand Up @@ -2982,13 +2988,7 @@ fn flip_selections(cx: &mut Context) {

fn ensure_selections_forward(cx: &mut Context) {
let (view, doc) = current!(cx.editor);

let selection = doc
.selection(view.id)
.clone()
.transform(|r| r.with_direction(Direction::Forward));

doc.set_selection(view.id, selection);
helix_view::ensure_selections_forward(view, doc);
}

fn enter_insert_mode(cx: &mut Context) {
Expand Down Expand Up @@ -3998,6 +3998,54 @@ fn goto_prev_diag(cx: &mut Context) {
cx.editor.apply_motion(motion)
}

fn goto_next_diag_workspace(cx: &mut Context) {
goto_next_diag_workspace_impl(cx, None)
}

fn goto_next_error_workspace(cx: &mut Context) {
goto_next_diag_workspace_impl(cx, Some(helix_core::diagnostic::Severity::Error))
}

fn goto_next_warning_workspace(cx: &mut Context) {
goto_next_diag_workspace_impl(cx, Some(helix_core::diagnostic::Severity::Warning))
}

fn goto_next_diag_workspace_impl(
cx: &mut Context,
severity_filter: Option<helix_core::diagnostic::Severity>,
) {
let diag = helix_view::next_diagnostic_in_workspace(cx.editor, severity_filter);

// wrap around
let diag =
diag.or_else(|| helix_view::first_diagnostic_in_workspace(cx.editor, severity_filter));

if let Some(diag) = diag {
lsp::jump_to_diagnostic(cx, diag.into_owned());
}
}

fn goto_first_diag_workspace(cx: &mut Context) {
goto_first_diag_workspace_impl(cx, None)
}

fn goto_first_error_workspace(cx: &mut Context) {
goto_first_diag_workspace_impl(cx, Some(helix_core::diagnostic::Severity::Error))
}

fn goto_first_warning_workspace(cx: &mut Context) {
goto_first_diag_workspace_impl(cx, Some(helix_core::diagnostic::Severity::Warning))
}

fn goto_first_diag_workspace_impl(
cx: &mut Context,
severity_filter: Option<helix_core::diagnostic::Severity>,
) {
if let Some(diag) = helix_view::first_diagnostic_in_workspace(cx.editor, severity_filter) {
lsp::jump_to_diagnostic(cx, diag.into_owned());
}
}

fn goto_first_change(cx: &mut Context) {
goto_first_change_impl(cx, false);
}
Expand Down
15 changes: 14 additions & 1 deletion helix-term/src/commands/lsp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ fn jump_to_location(editor: &mut Editor, location: &Location, action: Action) {
);
}

fn jump_to_position(
pub fn jump_to_position(
editor: &mut Editor,
path: &Path,
range: lsp::Range,
Expand Down Expand Up @@ -159,6 +159,19 @@ fn jump_to_position(
}
}

pub fn jump_to_diagnostic(cx: &mut Context, diagnostic: helix_view::WorkspaceDiagnostic<'static>) {
let path = diagnostic.path;
let range = diagnostic.diagnostic.range;
let offset_encoding = diagnostic.offset_encoding;

let motion = move |editor: &mut Editor| {
jump_to_position(editor, &path, range, offset_encoding, Action::Replace);
let (view, doc) = current!(editor);
helix_view::ensure_selections_forward(view, doc);
};
cx.editor.apply_motion(motion);
}

fn display_symbol_kind(kind: lsp::SymbolKind) -> &'static str {
match kind {
lsp::SymbolKind::FILE => "file",
Expand Down
29 changes: 18 additions & 11 deletions helix-view/src/document.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2020,14 +2020,30 @@ impl Document {
)
}

pub fn lsp_severity_to_severity(
severity: lsp::DiagnosticSeverity,
) -> Option<helix_core::diagnostic::Severity> {
use helix_core::diagnostic::Severity::*;
match severity {
lsp::DiagnosticSeverity::ERROR => Some(Error),
lsp::DiagnosticSeverity::WARNING => Some(Warning),
lsp::DiagnosticSeverity::INFORMATION => Some(Info),
lsp::DiagnosticSeverity::HINT => Some(Hint),
severity => {
log::error!("unrecognized diagnostic severity: {:?}", severity);
None
}
}
}

pub fn lsp_diagnostic_to_diagnostic(
text: &Rope,
language_config: Option<&LanguageConfiguration>,
diagnostic: &helix_lsp::lsp::Diagnostic,
provider: DiagnosticProvider,
offset_encoding: helix_lsp::OffsetEncoding,
) -> Option<Diagnostic> {
use helix_core::diagnostic::{Range, Severity::*};
use helix_core::diagnostic::Range;

// TODO: convert inside server
let start =
Expand All @@ -2045,16 +2061,7 @@ impl Document {
return None;
};

let severity = diagnostic.severity.and_then(|severity| match severity {
lsp::DiagnosticSeverity::ERROR => Some(Error),
lsp::DiagnosticSeverity::WARNING => Some(Warning),
lsp::DiagnosticSeverity::INFORMATION => Some(Info),
lsp::DiagnosticSeverity::HINT => Some(Hint),
severity => {
log::error!("unrecognized diagnostic severity: {:?}", severity);
None
}
});
let severity = diagnostic.severity.and_then(Self::lsp_severity_to_severity);

if let Some(lang_conf) = language_config {
if let Some(severity) = severity {
Expand Down
Loading
Loading