Merge branch 'helix-editor:master' into master

pull/12311/head
Salman Farooq 2024-12-03 23:29:15 +05:00 committed by GitHub
commit fc72600497
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
35 changed files with 123 additions and 67 deletions

View File

@ -8,6 +8,9 @@ on:
schedule:
- cron: "00 01 * * *"
env:
MSRV: "1.76"
jobs:
check:
name: Check (msrv)
@ -18,7 +21,9 @@ jobs:
uses: actions/checkout@v4
- name: Install MSRV toolchain
uses: dtolnay/rust-toolchain@1.76
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.MSRV }}
- uses: Swatinem/rust-cache@v2
with:
@ -39,7 +44,9 @@ jobs:
uses: actions/checkout@v4
- name: Install MSRV toolchain
uses: dtolnay/rust-toolchain@1.76
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.MSRV }}
- uses: Swatinem/rust-cache@v2
with:
@ -71,8 +78,9 @@ jobs:
uses: actions/checkout@v4
- name: Install MSRV toolchain
uses: dtolnay/rust-toolchain@1.76
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.MSRV }}
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
@ -99,7 +107,9 @@ jobs:
uses: actions/checkout@v4
- name: Install MSRV toolchain
uses: dtolnay/rust-toolchain@1.76
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.MSRV }}
- uses: Swatinem/rust-cache@v2
with:

12
Cargo.lock generated
View File

@ -136,9 +136,9 @@ checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
[[package]]
name = "cc"
version = "1.2.1"
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47"
checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc"
dependencies = [
"shlex",
]
@ -1757,15 +1757,15 @@ dependencies = [
[[package]]
name = "libc"
version = "0.2.165"
version = "0.2.167"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcb4d3d38eab6c5239a362fa8bae48c03baf980a6e7079f063942d563ef3533e"
checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc"
[[package]]
name = "libloading"
version = "0.8.5"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
dependencies = [
"cfg-if",
"windows-targets 0.52.6",

View File

@ -225,6 +225,7 @@
| uxntal | ✓ | | | |
| v | ✓ | ✓ | ✓ | `v-analyzer` |
| vala | ✓ | ✓ | | `vala-language-server` |
| vento | ✓ | | | |
| verilog | ✓ | ✓ | | `svlangserver` |
| vhdl | ✓ | | | `vhdl_ls` |
| vhs | ✓ | | | |

View File

@ -59,10 +59,16 @@ the default value (e.g. to `10240` from `256`) by running `ulimit -n 10240`.
## Minimum Stable Rust Version (MSRV) Policy
Helix follows the MSRV of Firefox.
The current MSRV and future changes to the MSRV are listed in the [Firefox documentation].
Helix keeps an intentionally low MSRV for the sake of easy building and packaging
downstream. We follow [Firefox's MSRV policy]. Once Firefox's MSRV increases we
may bump ours as well, but be sure to check that popular distributions like Ubuntu
package the new MSRV version. When increasing the MSRV, update these three places:
[Firefox documentation]: https://firefox-source-docs.mozilla.org/writing-rust-code/update-policy.html
* the `workspace.package.rust-version` key in `Cargo.toml` in the repository root
* the `env.MSRV` key at the top of `.github/workflows/build.yml`
* the `toolchain.channel` key in `rust-toolchain.toml`
[Firefox's MSRV policy]: https://firefox-source-docs.mozilla.org/writing-rust-code/update-policy.html
[good-first-issue]: https://github.com/helix-editor/helix/labels/E-easy
[log-file]: https://github.com/helix-editor/helix/wiki/FAQ#access-the-log-file
[architecture.md]: ./architecture.md

View File

@ -147,10 +147,7 @@ pub fn find_block_comments(
let mut only_whitespace = true;
let mut comment_changes = Vec::with_capacity(selection.len());
let default_tokens = tokens.first().cloned().unwrap_or_default();
// TODO: check if this can be removed on MSRV bump
#[allow(clippy::redundant_clone)]
let mut start_token = default_tokens.start.clone();
#[allow(clippy::redundant_clone)]
let mut end_token = default_tokens.end.clone();
let mut tokens = tokens.to_vec();

View File

@ -346,7 +346,7 @@ pub struct RopeGraphemes<'a> {
cursor: GraphemeCursor,
}
impl<'a> fmt::Debug for RopeGraphemes<'a> {
impl fmt::Debug for RopeGraphemes<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("RopeGraphemes")
.field("text", &self.text)
@ -358,7 +358,7 @@ impl<'a> fmt::Debug for RopeGraphemes<'a> {
}
}
impl<'a> RopeGraphemes<'a> {
impl RopeGraphemes<'_> {
#[must_use]
pub fn new(slice: RopeSlice) -> RopeGraphemes {
let mut chunks = slice.chunks();
@ -423,7 +423,7 @@ pub struct RevRopeGraphemes<'a> {
cursor: GraphemeCursor,
}
impl<'a> fmt::Debug for RevRopeGraphemes<'a> {
impl fmt::Debug for RevRopeGraphemes<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("RevRopeGraphemes")
.field("text", &self.text)
@ -435,7 +435,7 @@ impl<'a> fmt::Debug for RevRopeGraphemes<'a> {
}
}
impl<'a> RevRopeGraphemes<'a> {
impl RevRopeGraphemes<'_> {
#[must_use]
pub fn new(slice: RopeSlice) -> RevRopeGraphemes {
let (mut chunks, mut cur_chunk_start, _, _) = slice.chunks_at_byte(slice.len_bytes());
@ -542,7 +542,7 @@ impl<'a> From<&'a str> for GraphemeStr<'a> {
}
}
impl<'a> From<String> for GraphemeStr<'a> {
impl From<String> for GraphemeStr<'_> {
fn from(g: String) -> Self {
let len = g.len();
let ptr = Box::into_raw(g.into_bytes().into_boxed_slice()) as *mut u8;

View File

@ -386,7 +386,7 @@ enum IndentCaptureType<'a> {
Align(RopeSlice<'a>),
}
impl<'a> IndentCaptureType<'a> {
impl IndentCaptureType<'_> {
fn default_scope(&self) -> IndentScope {
match self {
IndentCaptureType::Indent | IndentCaptureType::IndentAlways => IndentScope::Tail,

View File

@ -660,7 +660,7 @@ impl Selection {
pub fn fragments<'a>(
&'a self,
text: RopeSlice<'a>,
) -> impl DoubleEndedIterator<Item = Cow<'a, str>> + ExactSizeIterator<Item = Cow<str>> + 'a
) -> impl DoubleEndedIterator<Item = Cow<'a, str>> + ExactSizeIterator<Item = Cow<'a, str>>
{
self.ranges.iter().map(move |range| range.fragment(text))
}
@ -744,7 +744,7 @@ pub struct LineRangeIter<'a> {
text: RopeSlice<'a>,
}
impl<'a> Iterator for LineRangeIter<'a> {
impl Iterator for LineRangeIter<'_> {
type Item = (usize, usize);
fn next(&mut self) -> Option<Self::Item> {

View File

@ -619,7 +619,7 @@ pub enum CapturedNode<'a> {
Grouped(Vec<Node<'a>>),
}
impl<'a> CapturedNode<'a> {
impl CapturedNode<'_> {
pub fn start_byte(&self) -> usize {
match self {
Self::Single(n) => n.start_byte(),
@ -1852,7 +1852,7 @@ struct HighlightIterLayer<'a> {
depth: u32,
}
impl<'a> fmt::Debug for HighlightIterLayer<'a> {
impl fmt::Debug for HighlightIterLayer<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("HighlightIterLayer").finish()
}
@ -2109,7 +2109,7 @@ impl HighlightConfiguration {
}
}
impl<'a> HighlightIterLayer<'a> {
impl HighlightIterLayer<'_> {
// First, sort scope boundaries by their byte offset in the document. At a
// given position, emit scope endings before scope beginnings. Finally, emit
// scope boundaries from deeper layers first.
@ -2247,7 +2247,7 @@ fn intersect_ranges(
result
}
impl<'a> HighlightIter<'a> {
impl HighlightIter<'_> {
fn emit_event(
&mut self,
offset: usize,
@ -2302,7 +2302,7 @@ impl<'a> HighlightIter<'a> {
}
}
impl<'a> Iterator for HighlightIter<'a> {
impl Iterator for HighlightIter<'_> {
type Item = Result<HighlightEvent, Error>;
fn next(&mut self) -> Option<Self::Item> {

View File

@ -217,7 +217,7 @@ impl<'a> TreeCursor<'a> {
/// Returns an iterator over the children of the node the TreeCursor is on
/// at the time this is called.
pub fn children(&'a mut self) -> ChildIter {
pub fn children(&'a mut self) -> ChildIter<'a> {
let parent = self.node();
ChildIter {
@ -229,7 +229,7 @@ impl<'a> TreeCursor<'a> {
/// Returns an iterator over the named children of the node the TreeCursor is on
/// at the time this is called.
pub fn named_children(&'a mut self) -> ChildIter {
pub fn named_children(&'a mut self) -> ChildIter<'a> {
let parent = self.node();
ChildIter {

View File

@ -211,7 +211,7 @@ impl<A, M> Layer<'_, A, M> {
}
impl<'a, A, M> From<(&'a [A], M)> for Layer<'a, A, M> {
fn from((annotations, metadata): (&'a [A], M)) -> Layer<A, M> {
fn from((annotations, metadata): (&'a [A], M)) -> Layer<'a, A, M> {
Layer {
annotations,
current_index: Cell::new(0),

View File

@ -769,7 +769,7 @@ impl<'a> ChangeIterator<'a> {
}
}
impl<'a> Iterator for ChangeIterator<'a> {
impl Iterator for ChangeIterator<'_> {
type Item = Change;
fn next(&mut self) -> Option<Self::Item> {

View File

@ -497,7 +497,6 @@ pub struct CompletionItem {
/// insertText is ignored.
///
/// Most editors support two different operation when accepting a completion item. One is to insert a
/// completion text and the other is to replace an existing text with a completion text. Since this can
/// usually not predetermined by a server it can report both ranges. Clients need to signal support for
/// `InsertReplaceEdits` via the `textDocument.completion.insertReplaceSupport` client capability

View File

@ -137,7 +137,7 @@ impl Serialize for Version {
struct VersionVisitor;
impl<'v> Visitor<'v> for VersionVisitor {
impl Visitor<'_> for VersionVisitor {
type Value = Version;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {

View File

@ -43,7 +43,7 @@ pub trait Parser<'a> {
#[doc(hidden)]
impl<'a, F, T> Parser<'a> for F
where
F: Fn(&'a str) -> ParseResult<T>,
F: Fn(&'a str) -> ParseResult<'a, T>,
{
type Output = T;

View File

@ -74,7 +74,7 @@ grep-searcher = "0.1.14"
[target.'cfg(not(windows))'.dependencies] # https://github.com/vorner/signal-hook/issues/100
signal-hook-tokio = { version = "0.3", features = ["futures-v0_3"] }
libc = "0.2.165"
libc = "0.2.167"
[target.'cfg(target_os = "macos")'.dependencies]
crossterm = { version = "0.28", features = ["event-stream", "use-dev-tty", "libc"] }

View File

@ -98,7 +98,7 @@ pub struct Context<'a> {
pub jobs: &'a mut Jobs,
}
impl<'a> Context<'a> {
impl Context<'_> {
/// Push a new component onto the compositor.
pub fn push_layer(&mut self, component: Box<dyn Component>) {
self.callback

View File

@ -27,7 +27,7 @@ pub struct Context<'a> {
pub jobs: &'a mut Jobs,
}
impl<'a> Context<'a> {
impl Context<'_> {
/// Waits on all pending jobs, and then tries to flush all pending write
/// operations for all documents.
pub fn block_try_flush_writes(&mut self) -> anyhow::Result<()> {

View File

@ -346,10 +346,6 @@ impl<T: Item + 'static> Component for Menu<T> {
let win_height = area.height as usize;
const fn div_ceil(a: usize, b: usize) -> usize {
(a + b - 1) / b
}
let rows = options
.iter()
.map(|option| option.format(&self.editor_data));
@ -390,7 +386,7 @@ impl<T: Item + 'static> Component for Menu<T> {
let scroll_style = theme.get("ui.menu.scroll");
if !fits {
let scroll_height = div_ceil(win_height.pow(2), len).min(win_height);
let scroll_height = win_height.pow(2).div_ceil(len).min(win_height);
let scroll_line = (win_height - scroll_height) * scroll
/ std::cmp::max(1, len.saturating_sub(win_height));

View File

@ -72,7 +72,7 @@ impl<'a> From<&'a Path> for PathOrId<'a> {
}
}
impl<'a> From<DocumentId> for PathOrId<'a> {
impl From<DocumentId> for PathOrId<'_> {
fn from(v: DocumentId) -> Self {
Self::Id(v)
}

View File

@ -344,12 +344,8 @@ impl<T: Component> Component for Popup<T> {
let fits = len <= win_height;
let scroll_style = cx.editor.theme.get("ui.menu.scroll");
const fn div_ceil(a: usize, b: usize) -> usize {
(a + b - 1) / b
}
if !fits {
let scroll_height = div_ceil(win_height.pow(2), len).min(win_height);
let scroll_height = win_height.pow(2).div_ceil(len).min(win_height);
let scroll_line = (win_height - scroll_height) * scroll
/ std::cmp::max(1, len.saturating_sub(win_height));

View File

@ -415,7 +415,8 @@ impl Prompt {
let cols = std::cmp::max(1, area.width / max_len);
let col_width = (area.width.saturating_sub(cols)) / cols;
let height = ((self.completion.len() as u16 + cols - 1) / cols)
let height = (self.completion.len() as u16)
.div_ceil(cols)
.min(10) // at most 10 rows (or less)
.min(area.height.saturating_sub(1));

View File

@ -212,7 +212,7 @@ impl<'a> From<Cow<'a, str>> for Span<'a> {
#[derive(Debug, Default, Clone, PartialEq, Eq)]
pub struct Spans<'a>(pub Vec<Span<'a>>);
impl<'a> Spans<'a> {
impl Spans<'_> {
/// Returns the width of the underlying string.
///
/// ## Examples

View File

@ -123,7 +123,7 @@ impl<'a> Block<'a> {
}
}
impl<'a> Widget for Block<'a> {
impl Widget for Block<'_> {
fn render(self, area: Rect, buf: &mut Buffer) {
if area.area() == 0 {
return;

View File

@ -129,7 +129,7 @@ impl<'a> Paragraph<'a> {
}
}
impl<'a> Widget for Paragraph<'a> {
impl Widget for Paragraph<'_> {
fn render(mut self, area: Rect, buf: &mut Buffer) {
buf.set_style(area, self.style);
let text_area = match self.block.take() {

View File

@ -39,7 +39,7 @@ impl<'a, 'b> WordWrapper<'a, 'b> {
}
}
impl<'a, 'b> LineComposer<'a> for WordWrapper<'a, 'b> {
impl<'a> LineComposer<'a> for WordWrapper<'a, '_> {
fn next_line(&mut self) -> Option<(&[StyledGrapheme<'a>], u16)> {
if self.max_line_width == 0 {
return None;
@ -152,7 +152,7 @@ impl<'a, 'b> LineTruncator<'a, 'b> {
}
}
impl<'a, 'b> LineComposer<'a> for LineTruncator<'a, 'b> {
impl<'a> LineComposer<'a> for LineTruncator<'a, '_> {
fn next_line(&mut self) -> Option<(&[StyledGrapheme<'a>], u16)> {
if self.max_line_width == 0 {
return None;

View File

@ -34,7 +34,7 @@ pub struct Cell<'a> {
style: Style,
}
impl<'a> Cell<'a> {
impl Cell<'_> {
/// Set the `Style` of this cell.
pub fn style(mut self, style: Style) -> Self {
self.style = style;
@ -351,7 +351,7 @@ impl TableState {
}
// impl<'a> StatefulWidget for Table<'a> {
impl<'a> Table<'a> {
impl Table<'_> {
// type State = TableState;
pub fn render_table(
@ -486,7 +486,7 @@ fn render_cell(buf: &mut Buffer, cell: &Cell, area: Rect, truncate: bool) {
}
}
impl<'a> Widget for Table<'a> {
impl Widget for Table<'_> {
fn render(self, area: Rect, buf: &mut Buffer) {
let mut state = TableState::default();
Table::render_table(self, area, buf, &mut state, false);

View File

@ -5,7 +5,7 @@ use arc_swap::access::DynAccess;
use helix_core::NATIVE_LINE_ENDING;
use crate::{
clipboard::{ClipboardProvider, ClipboardType},
clipboard::{ClipboardError, ClipboardProvider, ClipboardType},
Editor,
};
@ -238,6 +238,10 @@ fn read_from_clipboard<'a>(
RegisterValues::new(iter::once(contents.into()))
}
}
Err(ClipboardError::ReadingNotSupported) => match saved_values {
Some(values) => RegisterValues::new(values.iter().map(Cow::from).rev()),
None => RegisterValues::new(iter::empty()),
},
Err(err) => {
log::error!(
"Failed to read {} clipboard: {err}",
@ -307,13 +311,13 @@ impl<'a> Iterator for RegisterValues<'a> {
}
}
impl<'a> DoubleEndedIterator for RegisterValues<'a> {
impl DoubleEndedIterator for RegisterValues<'_> {
fn next_back(&mut self) -> Option<Self::Item> {
self.iter.next_back()
}
}
impl<'a> ExactSizeIterator for RegisterValues<'a> {
impl ExactSizeIterator for RegisterValues<'_> {
fn len(&self) -> usize {
self.iter.len()
}

View File

@ -705,7 +705,7 @@ impl<'a> Iterator for Traverse<'a> {
}
}
impl<'a> DoubleEndedIterator for Traverse<'a> {
impl DoubleEndedIterator for Traverse<'_> {
fn next_back(&mut self) -> Option<Self::Item> {
loop {
let key = self.stack.pop()?;

View File

@ -3168,7 +3168,7 @@ indent = { tab-width = 4, unit = " " }
[[grammar]]
name = "just"
source = { git = "https://github.com/poliorcetics/tree-sitter-just", rev = "6e28fa6cba511c694247cd802d1c3b14f8d34dbb" }
source = { git = "https://github.com/poliorcetics/tree-sitter-just", rev = "180bb15d64c63585c4f65c551350048f21987bcb" }
[[language]]
name = "gn"
@ -3463,7 +3463,11 @@ source = { git = "https://github.com/urbit-pilled/tree-sitter-hoon", rev = "1d5d
[[language]]
name = "hocon"
scope = "source.conf"
file-types = ["conf"]
file-types = [
{ glob = "**/src/*/resources/**/*.conf" },
{ glob = "*scalafmt*.conf" },
{ glob = "*scalafix*.conf" },
]
comment-token = "#"
auto-format = true
indent = { tab-width = 2, unit = " " }
@ -3956,3 +3960,14 @@ language-servers = ["ada-gpr-language-server"]
[[grammar]]
name = "gpr"
source = { git = "https://github.com/brownts/tree-sitter-gpr", rev = "cea857d3c18d1385d1f5b66cd09ea1e44173945c" }
[[language]]
name = "vento"
scope = "text.html.vto"
file-types = ["vto"]
block-comment-tokens = { start = "{{#", end = "#}}" }
indent = { tab-width = 4, unit = " " }
[[grammar]]
name = "vento"
source = { git = "https://github.com/ventojs/tree-sitter-vento", rev = "3321077d7446c1b3b017c294fd56ce028ed817fe" }

View File

@ -3,6 +3,7 @@
[
"export"
"import"
"unexport"
] @keyword.control.import
"mod" @keyword.directive
@ -18,6 +19,11 @@
"else"
] @keyword.control.conditional
[
"&&"
"||"
] @operator
; Variables
(value
@ -31,6 +37,9 @@
(shell_variable_name) @variable
(unexport
name: (identifier) @variable)
; Functions
(recipe

View File

@ -0,0 +1,13 @@
(comment) @comment
(keyword) @keyword
(tag
[
"{{"
"{{-"
"}}"
"-}}"
] @punctuation.bracket)
"|>" @operator

View File

@ -0,0 +1,6 @@
((content) @injection.content
(#set! injection.language "html")
(#set! injection.combined))
((code) @injection.content
(#set! injection.language "javascript"))

View File

@ -52,6 +52,8 @@
"markup.list" = "mauve"
"markup.bold" = { modifiers = ["bold"] }
"markup.italic" = { modifiers = ["italic"] }
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.link.url" = { fg = "blue", modifiers = ["italic", "underlined"] }
"markup.link.text" = "blue"
"markup.raw" = "flamingo"

View File

@ -26,6 +26,8 @@
"ui.menu.selected" = { bg = "ui", fg = "tx" }
"ui.debug" = { fg = "or", bg = "bg" }
"ui.highlight.frameline" = { bg = "ye" }
"ui.bufferline" = { fg = "tx-2", bg = "bg-2"}
"ui.bufferline.active" = { fg = "ye", bg = "bg-2" }
"diagnostic.hint" = { underline = { color = "bl", style = "curl" } }
"diagnostic.info" = { underline = { color = "bl", style = "curl" } }
"diagnostic.warning" = { underline = { color = "ye", style = "curl" } }
@ -36,7 +38,6 @@
"info" = { fg = "ye", modifiers = ["bold"] }
"warning" = { fg = "or", modifiers = ["bold"] }
"error" = { fg = "re", modifiers = ["bold"] }
"attribute" = "ye"
"type" = "ye"
"constructor" = "gr"
@ -62,7 +63,6 @@
"function" = "or"
"tag" = "bl"
"namespace" = "re"
"markup.heading" = "or"
"markup.list" = "ye"
"markup.bold" = { fg = "or", modifiers = ["bold"] }
@ -88,6 +88,7 @@ ui = "#E6E4D9"
bg-2 = "#F2F0E5"
bg = "#FFFCF0"
re = "#AF3029"
or = "#BC5215"
ye = "#AD8301"