summaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/commands.rs3
-rw-r--r--helix-term/tests/test/commands/write.rs38
2 files changed, 40 insertions, 1 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 88393ff4..882a8a1d 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -5111,7 +5111,8 @@ async fn shell_impl_async(
let output = if let Some(mut stdin) = process.stdin.take() {
let input_task = tokio::spawn(async move {
if let Some(input) = input {
- helix_view::document::to_writer(&mut stdin, encoding::UTF_8, &input).await?;
+ helix_view::document::to_writer(&mut stdin, (encoding::UTF_8, false), &input)
+ .await?;
}
Ok::<_, anyhow::Error>(())
});
diff --git a/helix-term/tests/test/commands/write.rs b/helix-term/tests/test/commands/write.rs
index 26515b7a..f33c8aaf 100644
--- a/helix-term/tests/test/commands/write.rs
+++ b/helix-term/tests/test/commands/write.rs
@@ -407,3 +407,41 @@ async fn test_write_fail_new_path() -> anyhow::Result<()> {
Ok(())
}
+
+#[tokio::test(flavor = "multi_thread")]
+async fn test_write_utf_bom_file() -> anyhow::Result<()> {
+ // "ABC" with utf8 bom
+ const UTF8_FILE: [u8; 6] = [0xef, 0xbb, 0xbf, b'A', b'B', b'C'];
+
+ // "ABC" in UTF16 with bom
+ const UTF16LE_FILE: [u8; 8] = [0xff, 0xfe, b'A', 0x00, b'B', 0x00, b'C', 0x00];
+ const UTF16BE_FILE: [u8; 8] = [0xfe, 0xff, 0x00, b'A', 0x00, b'B', 0x00, b'C'];
+
+ edit_file_with_content(&UTF8_FILE).await?;
+ edit_file_with_content(&UTF16LE_FILE).await?;
+ edit_file_with_content(&UTF16BE_FILE).await?;
+
+ Ok(())
+}
+
+async fn edit_file_with_content(file_content: &[u8]) -> anyhow::Result<()> {
+ let mut file = tempfile::NamedTempFile::new()?;
+
+ file.as_file_mut().write_all(&file_content)?;
+
+ helpers::test_key_sequence(
+ &mut helpers::AppBuilder::new().build()?,
+ Some(&format!(":o {}<ret>:x<ret>", file.path().to_string_lossy())),
+ None,
+ true,
+ )
+ .await?;
+
+ file.rewind()?;
+ let mut new_file_content: Vec<u8> = Vec::new();
+ file.read_to_end(&mut new_file_content)?;
+
+ assert_eq!(file_content, new_file_content);
+
+ Ok(())
+}