diff --git a/src/plugins/fakevim/fakevimactions.cpp b/src/plugins/fakevim/fakevimactions.cpp
index 84573b335b6f50dea3162d2f51768b354468d89b..58dd810ae8764c51ca39b7f2601d7f5bc8799544 100644
--- a/src/plugins/fakevim/fakevimactions.cpp
+++ b/src/plugins/fakevim/fakevimactions.cpp
@@ -205,7 +205,7 @@ FakeVimSettings *theFakeVimSettings()
     instance->insertItem(ConfigBackspace, item, _("backspace"), _("bs"));
 
     item = new SavedAction(instance);
-    item->setDefaultValue(_("@,48-57,_,192-255"));
+    item->setDefaultValue(_("@,48-57,_,192-255,a-z,A-Z"));
     item->setSettingsKey(group, _("IsKeyword"));
     instance->insertItem(ConfigIsKeyword, item, _("iskeyword"), _("isk"));
 
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 7a04b1ac76590cf7c25bde5b78f58e90661a6699..cd9a4a37a2d37b1a234978d3fb619a510262243d 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -713,6 +713,10 @@ public:
 
     void timerEvent(QTimerEvent *ev);
     int m_inputTimer;
+
+    void setupCharClass();
+    int charClass(QChar c, bool simple) const;
+    signed char m_charClass[256];
 };
 
 QStringList FakeVimHandler::Private::m_searchHistory;
@@ -722,7 +726,7 @@ FakeVimHandler::Private::Mappings FakeVimHandler::Private::m_mappings;
 
 FakeVimHandler::Private::Private(FakeVimHandler *parent, QWidget *widget)
 {
-    static PythonHighlighterRules pythonRules;
+    //static PythonHighlighterRules pythonRules;
     q = parent;
     m_textedit = qobject_cast<QTextEdit *>(widget);
     m_plaintextedit = qobject_cast<QPlainTextEdit *>(widget);
@@ -753,6 +757,8 @@ void FakeVimHandler::Private::init()
     m_rangemode = RangeCharMode;
     m_beginEditBlock = true;
     m_inputTimer = -1;
+
+    setupCharClass();
 }
 
 bool FakeVimHandler::Private::wantsOverride(QKeyEvent *ev)
@@ -909,6 +915,8 @@ void FakeVimHandler::Private::updateEditor()
 {
     const int charWidth = QFontMetrics(EDITOR(font())).width(QChar(' '));
     EDITOR(setTabStopWidth(charWidth * config(ConfigTabStop).toInt()));
+
+    setupCharClass();
 }
 
 void FakeVimHandler::Private::restoreWidget(int tabSize)
@@ -3351,15 +3359,54 @@ void FakeVimHandler::Private::moveToTargetColumn()
  *  class 1: non-space-or-letter-or-number
  *  class 2: letter-or-number
  */
-static int charClass(QChar c, bool simple)
+
+
+int FakeVimHandler::Private::charClass(QChar c, bool simple) const
 {
     if (simple)
         return c.isSpace() ? 0 : 1;
+    // FIXME: This means that only characters < 256 in the
+    // ConfigIsKeyword setting are handled properly.
+    if (c.unicode() < 256) {
+        //int old = (c.isLetterOrNumber() || c.unicode() == '_') ? 2
+        //    :  c.isSpace() ? 0 : 1;
+        //qDebug() << c.unicode() << old << m_charClass[c.unicode()];
+        return m_charClass[c.unicode()];
+    }
     if (c.isLetterOrNumber() || c.unicode() == '_')
         return 2;
     return c.isSpace() ? 0 : 1;
 }
 
+// Helper to parse a-z,A-Z,48-57,_
+static int someInt(const QString &str)
+{
+    if (str.toInt())
+        return str.toInt();
+    if (str.size())
+        return str.at(0).unicode();
+    return 0;
+}
+
+void FakeVimHandler::Private::setupCharClass()
+{
+    for (int i = 0; i < 256; ++i) {
+        const QChar c = QChar(QLatin1Char(i));
+        m_charClass[i] = c.isSpace() ? 0 : 1;
+    }
+    const QString conf = config(ConfigIsKeyword).toString();
+    foreach (const QString &part, conf.split(QLatin1Char(','))) {
+        if (part.contains(QLatin1Char('-'))) {
+            const int from = someInt(part.section(QLatin1Char('-'), 0, 0));
+            const int to = someInt(part.section(QLatin1Char('-'), 1, 1));
+            for (int i = qMax(0, from); i <= qMin(255, to); ++i)
+                m_charClass[i] = 2;
+        } else {
+            m_charClass[qMin(255, someInt(part))] = 2;
+        }
+    }
+}
+
 void FakeVimHandler::Private::moveToWordBoundary(bool simple, bool forward, bool changeWord)
 {
     int repeat = count();