diff --git a/src/buffer.rs b/src/buffer.rs
index 5cec7f7..1bd77f7 100644
--- a/src/buffer.rs
+++ b/src/buffer.rs
@@ -1,5 +1,5 @@
 use crate::enums::Address;
-use std::fs::OpenOptions;
+use std::fs::File;
 use std::io;
 use std::io::Write;
 
@@ -36,10 +36,27 @@ impl Buffer {
         self.current_line = new;
     }
 
-    pub fn save(&mut self) {
-        if let Ok(mut file) = OpenOptions::new().write(true).open(&self.file_name) {
+    pub fn save(&mut self, range: Address) {
+        let len = self.buffer.len();
+        let curr = self.current_line.saturating_sub(1);
+        match range {
+            Address::Actual => self.save_range(curr, curr),
+            Address::Empty | Address::All => self.save_range(0, len),
+            Address::Last => self.save_range(len.saturating_sub(1), len),
+            Address::Line(l) => self.save_range(l.saturating_sub(1), l),
+            Address::FromStartTo(l) => self.save_range(0, l),
+            Address::FromToEnd(l) => self.save_range(l.saturating_sub(1), len),
+            Address::FromTo(a, b) => self.save_range(a.saturating_sub(1), b),
+            Address::FromActTo(l) => self.save_range(curr, l),
+            Address::FromActToEnd => self.save_range(curr, len),
+            _ => (),
+        }
+    }
+
+    fn save_range(&mut self, start: usize, end: usize) {
+        if let Ok(mut file) = File::create(&self.file_name) {
             let mut tmp = String::new();
-            for line in self.buffer.iter().flatten() {
+            for line in self.buffer[start..end].iter().flatten() {
                 tmp.push_str(line);
                 tmp.push('\n');
             }
diff --git a/src/enums.rs b/src/enums.rs
index 4bd3141..5cb5a68 100644
--- a/src/enums.rs
+++ b/src/enums.rs
@@ -4,6 +4,9 @@ use std::str::FromStr;
 #[derive(Debug)]
 pub enum Address {
     Actual,
+    // utile pour write qui considère une adresse nulle comme l'ensemble du
+    // fichier par défaut
+    Empty,
     Last,
     Line(usize),
     FromStartTo(usize),
@@ -19,7 +22,7 @@ impl Address {
     pub fn is_multi_line(&self) -> bool {
         !matches!(
             self,
-            Address::Null | Address::Actual | Address::Last | Address::Line(_)
+            Address::Null | Address::Actual | Address::Last | Address::Line(_) | Address::Empty
         )
     }
 }
@@ -30,7 +33,7 @@ pub fn parse_address(addr: &str) -> Address {
     let addr = tmp.as_str();
 
     if addr.is_empty() {
-        Address::Actual
+        Address::Empty
     } else if addr.contains(',') || addr.contains(';') {
         parse_multi_addr(addr)
     } else if let Ok(l) = usize::from_str(addr) {
@@ -120,8 +123,9 @@ pub enum Command {
     Substitute,
     // TODO
     CopyLines,
-    Undo,
     // TODO
+    Undo,
+    // TODO nom de fichier
     Write(Address),
     // TODO
     Line,
diff --git a/src/main.rs b/src/main.rs
index 443b450..3d6cd2b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -81,8 +81,8 @@ fn execute_command(buffer: &mut Buffer, c: Command) -> Exit {
                 ret = Exit::Quit;
             }
         }
-        Command::Write(_) => {
-            buffer.save();
+        Command::Write(a) => {
+            buffer.save(a);
             ret = Exit::Continue;
         }
         _ => (),