Skip to content

Commit 611392b

Browse files
committed
Add basic modeline support (#4762)
vim and emacs support "modelines", a comment at the beginning of the file that allows the file type to be explicitly specified along with per-file specific settings. Release Notes: - Add basic emacs/vim modeline support. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
1 parent 431899d commit 611392b

File tree

46 files changed

+383
-82
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+383
-82
lines changed

crates/acp_thread/src/acp_thread.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2145,6 +2145,7 @@ impl AcpThread {
21452145

21462146
let settings = language::language_settings::language_settings(
21472147
buffer.language().map(|l| l.name()),
2148+
buffer.modeline().map(Arc::as_ref),
21482149
buffer.file(),
21492150
cx,
21502151
);

crates/acp_thread/src/diff.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,7 @@ async fn build_buffer_diff(
383383
old_text_rope,
384384
buffer.language().cloned(),
385385
language_registry,
386+
buffer.modeline().cloned(),
386387
cx,
387388
)
388389
})?

crates/agent/src/tools/edit_file_tool.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ impl AgentTool for EditFileTool {
417417
.read_with(cx, |buffer, cx| {
418418
let settings = language_settings::language_settings(
419419
buffer.language().map(|l| l.name()),
420+
buffer.modeline().map(Arc::as_ref),
420421
buffer.file(),
421422
cx,
422423
);

crates/buffer_diff/src/buffer_diff.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,13 @@ impl BufferDiffSnapshot {
237237
if let Some(text) = &base_text {
238238
let base_text_rope = Rope::from(text.as_str());
239239
base_text_pair = Some((text.clone(), base_text_rope.clone()));
240-
let snapshot =
241-
language::Buffer::build_snapshot(base_text_rope, language, language_registry, cx);
240+
let snapshot = language::Buffer::build_snapshot(
241+
base_text_rope,
242+
language,
243+
language_registry,
244+
None,
245+
cx,
246+
);
242247
base_text_snapshot = cx.background_spawn(snapshot);
243248
base_text_exists = true;
244249
} else {
@@ -855,7 +860,7 @@ fn build_diff_options(
855860
}
856861
}
857862

858-
language_settings(language, file, cx)
863+
language_settings(language, None, file, cx)
859864
.word_diff_enabled
860865
.then_some(DiffOptions {
861866
language_scope,

crates/collab/src/tests/remote_editing_collaboration_tests.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,10 @@ async fn test_sharing_an_ssh_remote_project(
161161

162162
cx_b.read(|cx| {
163163
let file = buffer_b.read(cx).file();
164+
let modeline = buffer_b.read(cx).modeline();
164165
assert_eq!(
165-
language_settings(Some("Rust".into()), file, cx).language_servers,
166+
language_settings(Some("Rust".into()), modeline.map(Arc::as_ref), file, cx)
167+
.language_servers,
166168
["override-rust-analyzer".to_string()]
167169
)
168170
});

crates/copilot/src/copilot.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,7 @@ impl Copilot {
968968
let position = position.to_point_utf16(buffer);
969969
let settings = language_settings(
970970
buffer.language_at(position).map(|l| l.name()),
971+
buffer.modeline().map(Arc::as_ref),
971972
buffer.file(),
972973
cx,
973974
);

crates/debugger_ui/src/new_process_modal.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,22 +1277,28 @@ impl PickerDelegate for DebugDelegate {
12771277
};
12781278
let file = location.buffer.read(cx).file();
12791279
let language = location.buffer.read(cx).language();
1280+
let modeline = location.buffer.read(cx).modeline();
12801281
let language_name = language.as_ref().map(|l| l.name());
12811282
let Some(adapter): Option<DebugAdapterName> =
1282-
language::language_settings::language_settings(language_name, file, cx)
1283-
.debuggers
1284-
.first()
1285-
.map(SharedString::from)
1286-
.map(Into::into)
1287-
.or_else(|| {
1288-
language.and_then(|l| {
1289-
l.config()
1290-
.debuggers
1291-
.first()
1292-
.map(SharedString::from)
1293-
.map(Into::into)
1294-
})
1283+
language::language_settings::language_settings(
1284+
language_name,
1285+
modeline.map(Arc::as_ref),
1286+
file,
1287+
cx,
1288+
)
1289+
.debuggers
1290+
.first()
1291+
.map(SharedString::from)
1292+
.map(Into::into)
1293+
.or_else(|| {
1294+
language.and_then(|l| {
1295+
l.config()
1296+
.debuggers
1297+
.first()
1298+
.map(SharedString::from)
1299+
.map(Into::into)
12951300
})
1301+
})
12961302
else {
12971303
return;
12981304
};

crates/edit_prediction_context/src/edit_prediction_context_tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ pub(crate) fn rust_lang() -> Arc<Language> {
517517
matcher: LanguageMatcher {
518518
path_suffixes: vec!["rs".to_string()],
519519
first_line_pattern: None,
520+
..LanguageMatcher::default()
520521
},
521522
..Default::default()
522523
},

crates/edit_prediction_ui/src/edit_prediction_button.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ impl EditPredictionButton {
694694
let language_state = self.language.as_ref().map(|language| {
695695
(
696696
language.clone(),
697-
language_settings::language_settings(Some(language.name()), None, cx)
697+
language_settings::language_settings(Some(language.name()), None, None, cx)
698698
.show_edit_predictions,
699699
)
700700
});

crates/editor/src/bracket_colorization.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
//! and theme accents to colorize those.
44
55
use std::ops::Range;
6+
use std::sync::Arc;
67

78
use crate::Editor;
89
use collections::HashMap;
@@ -49,6 +50,7 @@ impl Editor {
4950
let buffer_snapshot = buffer.read(cx).snapshot();
5051
if language_settings::language_settings(
5152
buffer_snapshot.language().map(|language| language.name()),
53+
buffer_snapshot.modeline().map(Arc::as_ref),
5254
buffer_snapshot.file(),
5355
cx,
5456
)

0 commit comments

Comments
 (0)