diff --git a/src/completion.rs b/src/completion.rs
index f319d65..88b706b 100644
--- a/src/completion.rs
+++ b/src/completion.rs
@@ -1,7 +1,7 @@
 //! Completion API
 use std::collections::BTreeSet;
 use std::fs;
-use std::path::{self,Path};
+use std::path::{self, Path};
 
 use super::Result;
 
@@ -23,7 +23,7 @@
         let mut buf = String::with_capacity(start + elected.len() + line.len() - pos);
         buf.push_str(&line[..start]);
         buf.push_str(elected);
-        //buf.push(' ');
+        // buf.push(' ');
         let new_pos = buf.len();
         buf.push_str(&line[pos..]);
         (buf, new_pos)
@@ -31,11 +31,11 @@
 }
 
 pub struct FilenameCompleter {
-    break_chars: BTreeSet<char>
+    break_chars: BTreeSet<char>,
 }
 
-static DEFAULT_BREAK_CHARS : [char; 18] = [ ' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$',
-            '>', '<', '=', ';', '|', '&', '{', '(', '\0' ];
+static DEFAULT_BREAK_CHARS: [char; 18] = [' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$', '>',
+                                          '<', '=', ';', '|', '&', '{', '(', '\0'];
 
 impl FilenameCompleter {
     pub fn new() -> FilenameCompleter {
@@ -52,25 +52,27 @@
 }
 
 fn filename_complete(path: &str) -> Result<Vec<String>> {
-    use std::env::{current_dir,home_dir};
+    use std::env::{current_dir, home_dir};
 
     let sep = path::MAIN_SEPARATOR;
     let (dir_name, file_name) = match path.rfind(sep) {
-        Some(idx) => path.split_at(idx+sep.len_utf8()),
-        None => ("", path)
+        Some(idx) => path.split_at(idx + sep.len_utf8()),
+        None => ("", path),
     };
 
     let dir_path = Path::new(dir_name);
-    let dir = if dir_path.starts_with("~") { // ~[/...]
+    let dir = if dir_path.starts_with("~") {
+        // ~[/...]
         if let Some(home) = home_dir() {
             match dir_path.relative_from("~") {
                 Some(rel_path) => home.join(rel_path),
-                None => home
+                None => home,
             }
         } else {
             dir_path.to_path_buf()
         }
-    } else if dir_path.is_relative() { // TODO ~user[/...] (https://crates.io/crates/users)
+    } else if dir_path.is_relative() {
+        // TODO ~user[/...] (https://crates.io/crates/users)
         if let Ok(cwd) = current_dir() {
             cwd.join(dir_path)
         } else {
@@ -96,17 +98,20 @@
     Ok(entries)
 }
 
-pub fn extract_word<'l>(line: &'l str, pos: usize, break_chars: &BTreeSet<char>) -> (usize, &'l str) {
+pub fn extract_word<'l>(line: &'l str,
+                        pos: usize,
+                        break_chars: &BTreeSet<char>)
+                        -> (usize, &'l str) {
     let line = &line[..pos];
     if line.is_empty() {
         return (0, line);
     }
     match line.char_indices().rev().find(|&(_, c)| break_chars.contains(&c)) {
         Some((i, c)) => {
-            let start = i+c.len_utf8();
+            let start = i + c.len_utf8();
             (start, &line[start..])
-        },
-        None => (0, line)
+        }
+        None => (0, line),
     }
 }
 
@@ -118,6 +123,7 @@
     pub fn extract_word() {
         let break_chars: BTreeSet<char> = super::DEFAULT_BREAK_CHARS.iter().cloned().collect();
         let line = "ls '/usr/local/b";
-        assert_eq!((4, "/usr/local/b"), super::extract_word(line, line.len(), &break_chars));
+        assert_eq!((4, "/usr/local/b"),
+                   super::extract_word(line, line.len(), &break_chars));
     }
-}
\ No newline at end of file
+}
diff --git a/src/consts.rs b/src/consts.rs
index 7584d79..d35a162 100644
--- a/src/consts.rs
+++ b/src/consts.rs
@@ -31,29 +31,29 @@
 
 pub fn char_to_key_press(c: char) -> KeyPress {
     match c {
-        '\x00'  => KeyPress::NULL,
-        '\x01'  => KeyPress::CTRL_A,
-        '\x02'  => KeyPress::CTRL_B,
-        '\x03'  => KeyPress::CTRL_C,
-        '\x04'  => KeyPress::CTRL_D,
-        '\x05'  => KeyPress::CTRL_E,
-        '\x06'  => KeyPress::CTRL_F,
-        '\x07'  => KeyPress::CTRL_G,
-        '\x08'  => KeyPress::CTRL_H,
-        '\x09'  => KeyPress::TAB,
-        '\x0a'  => KeyPress::CTRL_J,
-        '\x0b'  => KeyPress::CTRL_K,
-        '\x0c'  => KeyPress::CTRL_L,
-        '\x0d'  => KeyPress::ENTER,
-        '\x0e'  => KeyPress::CTRL_N,
-        '\x10'  => KeyPress::CTRL_P,
-        '\x12'  => KeyPress::CTRL_R,
-        '\x13'  => KeyPress::CTRL_S,
-        '\x14'  => KeyPress::CTRL_T,
-        '\x15'  => KeyPress::CTRL_U,
-        '\x17'  => KeyPress::CTRL_W,
-        '\x1b'  => KeyPress::ESC,
+        '\x00' => KeyPress::NULL,
+        '\x01' => KeyPress::CTRL_A,
+        '\x02' => KeyPress::CTRL_B,
+        '\x03' => KeyPress::CTRL_C,
+        '\x04' => KeyPress::CTRL_D,
+        '\x05' => KeyPress::CTRL_E,
+        '\x06' => KeyPress::CTRL_F,
+        '\x07' => KeyPress::CTRL_G,
+        '\x08' => KeyPress::CTRL_H,
+        '\x09' => KeyPress::TAB,
+        '\x0a' => KeyPress::CTRL_J,
+        '\x0b' => KeyPress::CTRL_K,
+        '\x0c' => KeyPress::CTRL_L,
+        '\x0d' => KeyPress::ENTER,
+        '\x0e' => KeyPress::CTRL_N,
+        '\x10' => KeyPress::CTRL_P,
+        '\x12' => KeyPress::CTRL_R,
+        '\x13' => KeyPress::CTRL_S,
+        '\x14' => KeyPress::CTRL_T,
+        '\x15' => KeyPress::CTRL_U,
+        '\x17' => KeyPress::CTRL_W,
+        '\x1b' => KeyPress::ESC,
         '\x7f' => KeyPress::BACKSPACE,
-        _   => KeyPress::NULL
+        _ => KeyPress::NULL,
     }
 }
diff --git a/src/error.rs b/src/error.rs
index 71659ce..d4654a0 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -17,7 +17,7 @@
     /// EOF (Ctrl-d)
     Eof,
     /// Ctrl-C
-    Interrupted
+    Interrupted,
 }
 
 impl fmt::Display for ReadlineError {
@@ -60,4 +60,4 @@
     fn from(err: io::CharsError) -> ReadlineError {
         ReadlineError::Char(err)
     }
-}
\ No newline at end of file
+}
diff --git a/src/history.rs b/src/history.rs
index 4736cf1..2e9b9ea 100644
--- a/src/history.rs
+++ b/src/history.rs
@@ -15,12 +15,15 @@
 
 impl History {
     pub fn new() -> History {
-        History { entries: VecDeque::new(), max_len: DEFAULT_HISTORY_MAX_LEN }
+        History {
+            entries: VecDeque::new(),
+            max_len: DEFAULT_HISTORY_MAX_LEN,
+        }
     }
 
     /// Return the history entry at position `index`, starting from 0.
-    pub fn get(& self, index: usize) -> Option<&String> {
-        return self.entries.get(index)
+    pub fn get(&self, index: usize) -> Option<&String> {
+        return self.entries.get(index);
     }
 
     /// Add a new entry in the history.
@@ -28,11 +31,13 @@
         if self.max_len == 0 {
             return false;
         }
-        if line.len() == 0 || line.chars().next().map_or(true, |c| c.is_whitespace()) { // ignorespace
+        if line.len() == 0 || line.chars().next().map_or(true, |c| c.is_whitespace()) {
+            // ignorespace
             return false;
         }
         if let Some(s) = self.entries.back() {
-            if s == line { // ignoredups
+            if s == line {
+                // ignoredups
                 return false;
             }
         }
@@ -66,7 +71,7 @@
     }
 
     /// Save the history in the specified file.
-    pub fn save<P: AsRef<Path>+?Sized>(&self, path: &P) -> Result<()> {
+    pub fn save<P: AsRef<Path> + ?Sized>(&self, path: &P) -> Result<()> {
         use std::io::{BufWriter, Write};
 
         if self.entries.len() == 0 {
@@ -82,7 +87,7 @@
     }
 
     /// Load the history from the specified file.
-    pub fn load<P: AsRef<Path>+?Sized>(&mut self, path: &P) -> Result<()> {
+    pub fn load<P: AsRef<Path> + ?Sized>(&mut self, path: &P) -> Result<()> {
         use std::io::{BufRead, BufReader};
 
         let file = try!(File::open(&path));
@@ -104,7 +109,11 @@
             return None;
         }
         if reverse {
-            let index = self.entries.iter().rev().skip(self.entries.len() - 1 - start).position(|entry| entry.contains(term));
+            let index = self.entries
+                            .iter()
+                            .rev()
+                            .skip(self.entries.len() - 1 - start)
+                            .position(|entry| entry.contains(term));
             index.and_then(|index| Some(start - index))
         } else {
             let index = self.entries.iter().skip(start).position(|entry| entry.contains(term));
@@ -138,9 +147,9 @@
         let mut history = super::History::new();
         assert!(history.add("line1"));
         assert!(history.add("line2"));
-        assert!(! history.add("line2"));
-        assert!(! history.add(""));
-        assert!(! history.add(" line3"));
+        assert!(!history.add("line2"));
+        assert!(!history.add(""));
+        assert!(!history.add(" line3"));
     }
 
     #[test]
@@ -185,4 +194,4 @@
         assert_eq!(Some(1), history.search("line", 1, true));
         assert_eq!(Some(0), history.search("line1", 1, true));
     }
-}
\ No newline at end of file
+}
diff --git a/src/lib.rs b/src/lib.rs
index f021bfa..4fd966e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,20 +1,19 @@
-//!Readline for Rust
+//! Readline for Rust
 //!
-//!This implementation is based on [Antirez's Linenoise](https://github.com/antirez/linenoise)
+//! This implementation is based on [Antirez's Linenoise](https://github.com/antirez/linenoise)
 //!
-//!# Example
+//! # Example
 //!
-//!Usage
+//! Usage
 //!
-//!```
-//!let mut rl = rustyline::Editor::new();
-//!let readline = rl.readline(">> ");
-//!match readline {
+//! ```
+//! let mut rl = rustyline::Editor::new();
+//! let readline = rl.readline(">> ");
+//! match readline {
 //!     Ok(line) => println!("Line: {:?}",line),
 //!     Err(_)   => println!("No input"),
 //! }
-//!```
-#![feature(drain)]
+//! ```
 #![feature(io)]
 #![feature(path_relative_from)]
 #![feature(str_char)]
@@ -30,7 +29,7 @@
 pub mod history;
 
 use std::fmt;
-use std::io::{self,Read, Write};
+use std::io::{self, Read, Write};
 use std::path::Path;
 use std::result;
 use nix::errno::Errno;
@@ -57,7 +56,12 @@
 }
 
 impl<'out, 'prompt> State<'out, 'prompt> {
-    fn new(out: &'out mut Write, prompt: &'prompt str, capacity: usize, cols: usize, history_index: usize) -> State<'out, 'prompt> {
+    fn new(out: &'out mut Write,
+           prompt: &'prompt str,
+           capacity: usize,
+           cols: usize,
+           history_index: usize)
+           -> State<'out, 'prompt> {
         State {
             out: out,
             prompt: prompt,
@@ -129,16 +133,16 @@
 impl<'out, 'prompt> fmt::Debug for State<'out, 'prompt> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         f.debug_struct("State")
-            .field("prompt", &self.prompt)
-            .field("prompt_width", &self.prompt_width)
-            .field("buf", &self.buf)
-            .field("buf length", &self.buf.len())
-            .field("buf capacity", &self.buf.capacity())
-            .field("pos", &self.pos)
-            .field("cols", &self.cols)
-            .field("history_index", &self.history_index)
-            .field("history_end", &self.history_end)
-            .finish()
+         .field("prompt", &self.prompt)
+         .field("prompt_width", &self.prompt_width)
+         .field("buf", &self.buf)
+         .field("buf length", &self.buf.len())
+         .field("buf capacity", &self.buf.capacity())
+         .field("pos", &self.pos)
+         .field("cols", &self.cols)
+         .field("history_index", &self.history_index)
+         .field("history_end", &self.history_end)
+         .finish()
     }
 }
 
@@ -146,7 +150,7 @@
 static MAX_LINE: usize = 4096;
 
 /// Unsupported Terminals that don't support RAW mode
-static UNSUPPORTED_TERM: [&'static str; 3] = ["dumb","cons25","emacs"];
+static UNSUPPORTED_TERM: [&'static str; 3] = ["dumb", "cons25", "emacs"];
 
 /// Check to see if STDIN is a TTY
 fn is_a_tty() -> bool {
@@ -165,7 +169,7 @@
             }
             unsupported
         }
-        Err(_) => false
+        Err(_) => false,
     }
 }
 
@@ -175,7 +179,8 @@
 
 /// Enable raw mode for the TERM
 fn enable_raw_mode() -> Result<termios::Termios> {
-    use nix::sys::termios::{BRKINT, ICRNL, INPCK, ISTRIP, IXON, OPOST, CS8, ECHO, ICANON, IEXTEN, ISIG, VMIN, VTIME};
+    use nix::sys::termios::{BRKINT, ICRNL, INPCK, ISTRIP, IXON, OPOST, CS8, ECHO, ICANON, IEXTEN,
+                            ISIG, VMIN, VTIME};
     if !is_a_tty() {
         Err(from_errno(Errno::ENOTTY))
     } else {
@@ -194,9 +199,7 @@
 
 /// Disable Raw mode for the term
 fn disable_raw_mode(original_termios: termios::Termios) -> Result<()> {
-    try!(termios::tcsetattr(libc::STDIN_FILENO,
-                            termios::TCSAFLUSH,
-                            &original_termios));
+    try!(termios::tcsetattr(libc::STDIN_FILENO, termios::TCSAFLUSH, &original_termios));
     Ok(())
 }
 
@@ -223,7 +226,7 @@
             ws_row: c_ushort,
             ws_col: c_ushort,
             ws_xpixel: c_ushort,
-            ws_ypixel: c_ushort
+            ws_ypixel: c_ushort,
         }
 
         let mut size: winsize = zeroed();
@@ -367,13 +370,14 @@
 
 /// Exchange the char before cursor with the character at cursor.
 fn edit_transpose_chars(s: &mut State) -> Result<()> {
-    if s.pos > 0 && s.pos < s.buf.len() { // TODO should work even if s.pos == s.buf.len()
+    if s.pos > 0 && s.pos < s.buf.len() {
+        // TODO should work even if s.pos == s.buf.len()
         let ch = s.buf.remove(s.pos);
         let size = ch.len_utf8();
         let och = s.buf.char_at_reverse(s.pos);
         let osize = och.len_utf8();
         s.buf.insert(s.pos - osize, ch);
-        if s.pos != s.buf.len()-size {
+        if s.pos != s.buf.len() - size {
             s.pos += size;
         } else {
             if size >= osize {
@@ -445,7 +449,10 @@
 }
 
 /// Completes the line/word
-fn complete_line<R: io::Read>(chars: &mut io::Chars<R>, s: &mut State, completer: &Completer) -> Result<Option<char>> {
+fn complete_line<R: io::Read>(chars: &mut io::Chars<R>,
+                              s: &mut State,
+                              completer: &Completer)
+                              -> Result<Option<char>> {
     let (start, candidates) = try!(completer.complete(&s.buf, s.pos));
     if candidates.is_empty() {
         try!(beep());
@@ -472,24 +479,26 @@
             let key = char_to_key_press(ch);
             match key {
                 KeyPress::TAB => {
-                    i = (i+1) % (candidates.len()+1); // Circular
+                    i = (i + 1) % (candidates.len() + 1); // Circular
                     if i == candidates.len() {
                         try!(beep());
                     }
-                },
-                KeyPress::ESC => { // Re-show original buffer
+                }
+                KeyPress::ESC => {
+                    // Re-show original buffer
                     if i < candidates.len() {
                         try!(s.refresh_line());
                     }
-                    return Ok(None)
-                },
-                _ => { // Update buffer and return
+                    return Ok(None);
+                }
+                _ => {
+                    // Update buffer and return
                     if i < candidates.len() {
                         let (buf, pos) = completer.update(&s.buf, s.pos, start, &candidates[i]);
                         s.update_buf(buf);
                         s.pos = pos;
                     }
-                    break
+                    break;
                 }
             }
         }
@@ -498,7 +507,10 @@
 }
 
 /// Incremental search
-fn reverse_incremental_search<R: io::Read>(chars: &mut io::Chars<R>, s: &mut State, history: &History) -> Result<Option<KeyPress>> {
+fn reverse_incremental_search<R: io::Read>(chars: &mut io::Chars<R>,
+                                           s: &mut State,
+                                           history: &History)
+                                           -> Result<Option<KeyPress>> {
     // Save the current edited line (and cursor position) before to overwrite it
     let original_buf = s.buf.clone();
     let original_pos = s.pos;
@@ -513,7 +525,7 @@
     loop {
         let prompt = match success {
             true => format!("(reverse-i-search)`{}': ", search_buf),
-            false => format!("(failed reverse-i-search)`{}': ", search_buf)
+            false => format!("(failed reverse-i-search)`{}': ", search_buf),
         };
         try!(s.refresh_prompt_and_line(&prompt));
 
@@ -528,8 +540,8 @@
             match key {
                 KeyPress::CTRL_H | KeyPress::BACKSPACE => {
                     search_buf.pop();
-                    continue
-                },
+                    continue;
+                }
                 KeyPress::CTRL_R => {
                     if history_idx > 0 {
                         history_idx -= 1;
@@ -537,14 +549,14 @@
                         success = false;
                         continue;
                     }
-                },
+                }
                 KeyPress::CTRL_G => {
                     s.update_buf(original_buf);
                     s.pos = original_pos;
                     try!(s.refresh_line());
-                    return Ok(None)
-                },
-                _ => break
+                    return Ok(None);
+                }
+                _ => break,
             }
         }
         success = match history.search(&search_buf, history_idx, true) {
@@ -555,7 +567,7 @@
                 s.pos = entry.find(&search_buf).unwrap();
                 true
             }
-            _ => false
+            _ => false,
         };
     }
     Ok(Some(key))
@@ -564,9 +576,11 @@
 fn escape_sequence<R: io::Read>(chars: &mut io::Chars<R>) -> Result<KeyPress> {
     // Read the next two bytes representing the escape sequence.
     let seq1 = try!(chars.next().unwrap());
-    if seq1 == '[' { // ESC [ sequences.
+    if seq1 == '[' {
+        // ESC [ sequences.
         let seq2 = try!(chars.next().unwrap());
-        if seq2.is_digit(10) { // Extended escape, read additional byte.
+        if seq2.is_digit(10) {
+            // Extended escape, read additional byte.
             let seq3 = try!(chars.next().unwrap());
             if seq3 == '~' {
                 match seq2 {
@@ -586,15 +600,16 @@
                 'D' => Ok(KeyPress::CTRL_B), // Left
                 'F' => Ok(KeyPress::CTRL_E), // End
                 'H' => Ok(KeyPress::CTRL_A), // Home
-                _ => Ok(KeyPress::UNKNOWN_ESC_SEQ)
+                _ => Ok(KeyPress::UNKNOWN_ESC_SEQ),
             }
         }
-    } else if seq1 == 'O' { // ESC O sequences.
+    } else if seq1 == 'O' {
+        // ESC O sequences.
         let seq2 = try!(chars.next().unwrap());
         match seq2 {
             'F' => Ok(KeyPress::CTRL_E),
             'H' => Ok(KeyPress::CTRL_A),
-            _ => Ok(KeyPress::UNKNOWN_ESC_SEQ)
+            _ => Ok(KeyPress::UNKNOWN_ESC_SEQ),
         }
     } else {
         // TODO ESC-B (b): move backward a word (https://github.com/antirez/linenoise/pull/64, https://github.com/antirez/linenoise/pull/6)
@@ -619,7 +634,10 @@
 /// Handles reading and editting the readline buffer.
 /// It will also handle special inputs in an appropriate fashion
 /// (e.g., C-c will exit readline)
-fn readline_edit(prompt: &str, history: &mut History, completer: Option<&Completer>) -> Result<String> {
+fn readline_edit(prompt: &str,
+                 history: &mut History,
+                 completer: Option<&Completer>)
+                 -> Result<String> {
     let mut stdout = io::stdout();
     try!(write_and_flush(&mut stdout, prompt.as_bytes()));
 
@@ -647,14 +665,16 @@
             } else {
                 continue;
             }
-        } else if key == KeyPress::CTRL_R { // Search history backward
-             let next = try!(reverse_incremental_search(&mut chars, &mut s, history));
-             if next.is_some() {
+        } else if key == KeyPress::CTRL_R {
+            // Search history backward
+            let next = try!(reverse_incremental_search(&mut chars, &mut s, history));
+            if next.is_some() {
                 key = next.unwrap();
-             } else {
+            } else {
                 continue;
-             }
-        } else if key == KeyPress::ESC { // escape sequence
+            }
+        } else if key == KeyPress::ESC {
+            // escape sequence
             key = try!(escape_sequence(&mut chars));
             if key == KeyPress::UNKNOWN_ESC_SEQ {
                 continue;
@@ -664,31 +684,33 @@
         match key {
             KeyPress::CTRL_A => try!(edit_move_home(&mut s)), // Move to the beginning of line.
             KeyPress::CTRL_B => try!(edit_move_left(&mut s)), // Move back a character.
-            KeyPress::CTRL_C => {
-                return Err(error::ReadlineError::Interrupted)
-            },
+            KeyPress::CTRL_C => return Err(error::ReadlineError::Interrupted),
             KeyPress::CTRL_D => {
-                if s.buf.len() > 0 { // Delete (forward) one character at point.
+                if s.buf.len() > 0 {
+                    // Delete (forward) one character at point.
                     try!(edit_delete(&mut s))
                 } else {
-                    return Err(error::ReadlineError::Eof)
+                    return Err(error::ReadlineError::Eof);
                 }
-            },
+            }
             KeyPress::CTRL_E => try!(edit_move_end(&mut s)), // Move to the end of line.
             KeyPress::CTRL_F => try!(edit_move_right(&mut s)), // Move forward a character.
             KeyPress::CTRL_H | KeyPress::BACKSPACE => try!(edit_backspace(&mut s)), // Delete one character backward.
             KeyPress::CTRL_J => break, // like ENTER
             KeyPress::CTRL_K => try!(edit_kill_line(&mut s)), // Kill the text from point to the end of the line.
-            KeyPress::CTRL_L => { // Clear the screen leaving the current line at the top of the screen.
+            KeyPress::CTRL_L => {
+                // Clear the screen leaving the current line at the top of the screen.
                 try!(clear_screen(s.out));
                 try!(s.refresh_line())
-            },
-            KeyPress::CTRL_N => { // Fetch the next command from the history list.
+            }
+            KeyPress::CTRL_N => {
+                // Fetch the next command from the history list.
                 try!(edit_history_next(&mut s, history, false))
-            },
-            KeyPress::CTRL_P => { // Fetch the previous command from the history list.
+            }
+            KeyPress::CTRL_P => {
+                // Fetch the previous command from the history list.
                 try!(edit_history_next(&mut s, history, true))
-            },
+            }
             KeyPress::CTRL_T => try!(edit_transpose_chars(&mut s)), // Exchange the char before cursor with the character at cursor.
             KeyPress::CTRL_U => try!(edit_discard_line(&mut s)), // Kill backward from point to the beginning of the line.
             // TODO CTRL_V // Quoted insert
@@ -696,8 +718,8 @@
             // TODO CTRL_Y // retrieve (yank) last item killed
             // TODO CTRL-_ // undo
             KeyPress::ESC_SEQ_DELETE => try!(edit_delete(&mut s)),
-            KeyPress::ENTER  => break, // Accept the line regardless of where the cursor is.
-            _      => try!(edit_insert(&mut s, ch)), // Insert the character typed.
+            KeyPress::ENTER => break, // Accept the line regardless of where the cursor is.
+            _ => try!(edit_insert(&mut s, ch)), // Insert the character typed.
         }
     }
     Ok(s.buf)
@@ -705,7 +727,10 @@
 
 /// Readline method that will enable RAW mode, call the ```readline_edit()```
 /// method and disable raw mode
-fn readline_raw(prompt: &str, history: &mut History, completer: Option<&Completer>) -> Result<String> {
+fn readline_raw(prompt: &str,
+                history: &mut History,
+                completer: Option<&Completer>)
+                -> Result<String> {
     let original_termios = try!(enable_raw_mode());
     let user_input = readline_edit(prompt, history, completer);
     try!(disable_raw_mode(original_termios));
@@ -726,7 +751,7 @@
 pub struct Editor<'completer> {
     unsupported_term: bool,
     stdin_isatty: bool,
-    //cols: usize, // Number of columns in terminal
+    // cols: usize, // Number of columns in terminal
     history: History,
     completer: Option<&'completer Completer>,
 }
@@ -736,11 +761,12 @@
         // TODO check what is done in rl_initialize()
         // if the number of columns is stored here, we need a SIGWINCH handler...
         // if enable_raw_mode is called here, we need to implement Drop to reset the terminal in its original state...
-        Editor{
+        Editor {
             unsupported_term: is_unsupported_term(),
             stdin_isatty: is_a_tty(),
             history: History::new(),
-            completer: None}
+            completer: None,
+        }
     }
 
     /// This method will read a line from STDIN and will display a `prompt`
@@ -751,7 +777,8 @@
             try!(write_and_flush(&mut stdout, prompt.as_bytes()));
 
             readline_direct()
-        } else if !self.stdin_isatty { // Not a tty: read from file / pipe.
+        } else if !self.stdin_isatty {
+            // Not a tty: read from file / pipe.
             readline_direct()
         } else {
             readline_raw(prompt, &mut self.history, self.completer)
@@ -759,11 +786,11 @@
     }
 
     /// Load the history from the specified file.
-    pub fn load_history<P: AsRef<Path>+?Sized>(&mut self, path: &P) -> Result<()> {
+    pub fn load_history<P: AsRef<Path> + ?Sized>(&mut self, path: &P) -> Result<()> {
         self.history.load(path)
     }
     /// Save the history in the specified file.
-    pub fn save_history<P: AsRef<Path>+?Sized>(&self, path: &P) -> Result<()> {
+    pub fn save_history<P: AsRef<Path> + ?Sized>(&self, path: &P) -> Result<()> {
         self.history.save(path)
     }
     /// Add a new entry in the history.
@@ -788,9 +815,9 @@
 impl<'completer> fmt::Debug for Editor<'completer> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         f.debug_struct("State")
-            .field("unsupported_term", &self.unsupported_term)
-            .field("stdin_isatty", &self.stdin_isatty)
-            .finish()
+         .field("unsupported_term", &self.unsupported_term)
+         .field("stdin_isatty", &self.stdin_isatty)
+         .finish()
     }
 }
 
@@ -802,9 +829,13 @@
     use State;
     use super::Result;
 
-    fn init_state<'out>(out: &'out mut Write, line: &str, pos: usize, cols: usize) -> State<'out, 'static> {
+    fn init_state<'out>(out: &'out mut Write,
+                        line: &str,
+                        pos: usize,
+                        cols: usize)
+                        -> State<'out, 'static> {
         State {
-            out : out,
+            out: out,
             prompt: "",
             prompt_width: 0,
             buf: String::from(line),
@@ -948,7 +979,7 @@
     struct SimpleCompleter;
     impl Completer for SimpleCompleter {
         fn complete(&self, line: &str, _pos: usize) -> Result<(usize, Vec<String>)> {
-            Ok((0, vec!(line.to_string() + "t")))
+            Ok((0, vec![line.to_string() + "t"]))
         }
     }
 
