diff --git a/src/plugins/fakevim/handler.cpp b/src/plugins/fakevim/handler.cpp
index 4facddabdff384cc77a5daff0ddfab71def1510f..b51851cd3c3cbf4300bd42a4daf57a450bede60b 100644
--- a/src/plugins/fakevim/handler.cpp
+++ b/src/plugins/fakevim/handler.cpp
@@ -167,7 +167,7 @@ public:
     void moveToNextWord(bool simple);
     void moveToWordBoundary(bool simple, bool forward);
     void handleFfTt(int key);
-    void handleCommand(const QString &cmd);
+    void handleExCommand(const QString &cmd);
 
     // helper function for handleCommand. return 1 based line index.
     int readLineCode(QString &cmd);
@@ -734,8 +734,7 @@ void FakeVimHandler::Private::handleExMode(int key, const QString &text)
         if (!m_commandBuffer.isEmpty()) {
             m_commandHistory.takeLast();
             m_commandHistory.append(m_commandBuffer);
-            handleCommand(m_commandBuffer);
-            m_commandBuffer.clear();
+            handleExCommand(m_commandBuffer);
             m_commandCode = 0;
         }
         m_mode = CommandMode;
@@ -745,7 +744,6 @@ void FakeVimHandler::Private::handleExMode(int key, const QString &text)
             m_searchHistory.append(m_commandBuffer);
             m_lastSearchForward = (m_commandCode == '/');
             search(lastSearchString(), m_lastSearchForward);
-            m_commandBuffer.clear();
             m_commandCode = 0;
         }
         m_mode = CommandMode;
@@ -839,7 +837,7 @@ QTextCursor FakeVimHandler::Private::selectRange(int beginLine, int endLine)
     return tc;
 }
 
-void FakeVimHandler::Private::handleCommand(const QString &cmd0)
+void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
 {
     QString cmd = cmd0;
     if (cmd.startsWith("%"))
@@ -850,6 +848,7 @@ void FakeVimHandler::Private::handleCommand(const QString &cmd0)
 
     int line = readLineCode(cmd);
     if (line != -1)
+        m_mode = CommandMode;
         beginLine = line;
     
     if (cmd.startsWith(',')) {
@@ -881,6 +880,7 @@ void FakeVimHandler::Private::handleCommand(const QString &cmd0)
             m_registers[reg.at(0).unicode()] = tc.selection().toPlainText();
         tc.removeSelectedText();
     } else if (reWrite.indexIn(cmd) != -1) { // :w
+        bool noArgs = (beginLine == -1);
         if (beginLine == -1)
             beginLine = 0;
         if (endLine == -1)
@@ -891,7 +891,7 @@ void FakeVimHandler::Private::handleCommand(const QString &cmd0)
             fileName = m_currentFileName;
         QFile file(fileName);
         bool exists = file.exists();
-        if (exists && !forced) {
+        if (exists && !forced && !noArgs) {
             showMessage("E13: File exists (add ! to override)");
         } else {
             file.open(QIODevice::ReadWrite);
@@ -905,6 +905,7 @@ void FakeVimHandler::Private::handleCommand(const QString &cmd0)
             m_commandBuffer = QString("\"%1\" %2 %3L, %4C written")
                 .arg(fileName).arg(exists ? " " : " [New] ")
                 .arg(ba.count('\n')).arg(ba.size());
+            m_mode = CommandMode;
             updateMiniBuffer();
         }
     } else if (cmd.startsWith("r ")) { // :r
@@ -916,6 +917,7 @@ void FakeVimHandler::Private::handleCommand(const QString &cmd0)
         EDITOR(setPlainText(data));
         m_commandBuffer = QString("\"%1\" %2L, %3C")
             .arg(m_currentFileName).arg(data.count('\n')).arg(data.size());
+        m_mode = CommandMode;
         updateMiniBuffer();
     } else {
         showMessage("E492: Not an editor command: " + cmd0);
@@ -1281,6 +1283,6 @@ void FakeVimHandler::handleCommand(QWidget *widget, const QString &cmd)
 {
     d->m_textedit = qobject_cast<QTextEdit *>(widget);
     d->m_plaintextedit = qobject_cast<QPlainTextEdit *>(widget);
-    d->handleCommand(cmd);
+    d->handleExCommand(cmd);
 }