diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
 Usage
 -----
 
-Cgrep 6.6.4. Usage: cgrep [OPTION] [PATTERN] files...
+Cgrep 6.6.7. Usage: cgrep [OPTION] [PATTERN] files...
 
 cgrep [OPTIONS] [ITEM]
 
@@ -79,7 +79,8 @@
                                #1... e.g. "#f:#n #0 #1"
        --json                  Format output as json object
        --xml                   Format output as xml document
-
+       --vim                   Invoke vim program by passing the files that
+                               match
 
 Concurrency:
 
diff --git a/cgrep.cabal b/cgrep.cabal
--- a/cgrep.cabal
+++ b/cgrep.cabal
@@ -1,6 +1,6 @@
 Name:                cgrep
 Description:         Cgrep: a context-aware grep for source codes
-Version:             6.6.4
+Version:             6.6.7
 Synopsis:            Command line tool
 Homepage:            http://awgn.github.io/cgrep/
 License:             GPL-2
diff --git a/src/CGrep/Output.hs b/src/CGrep/Output.hs
--- a/src/CGrep/Output.hs
+++ b/src/CGrep/Output.hs
@@ -15,7 +15,7 @@
 -- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 --
 
-module CGrep.Output (Output(),
+module CGrep.Output (Output(..),
                      mkOutput,
                      putPrettyHeader,
                      putPrettyFooter,
@@ -44,7 +44,12 @@
 import Options
 
 
-data Output = Output FilePath Int Text8 [Token]
+data Output = Output
+    { outFilePath :: FilePath
+    , outLineNo   :: Int
+    , outLine     :: Text8
+    , outTokens   :: [Token]
+    }
     deriving (Show)
 
 
diff --git a/src/CGrep/Parser/Cpp/Token.hs b/src/CGrep/Parser/Cpp/Token.hs
--- a/src/CGrep/Parser/Cpp/Token.hs
+++ b/src/CGrep/Parser/Cpp/Token.hs
@@ -86,65 +86,65 @@
 
 
 tokenFilter :: TokenFilter -> Token -> Bool
-tokenFilter filt (TokenIdentifier{})  = filtIdentifier filt
-tokenFilter filt (TokenDirective{})   = filtDirective  filt
-tokenFilter filt (TokenKeyword{})     = filtKeyword    filt
-tokenFilter filt (TokenHeaderName{})  = filtHeader     filt
-tokenFilter filt (TokenNumber{})      = filtNumber     filt
-tokenFilter filt (TokenString{})      = filtString     filt
-tokenFilter filt (TokenChar{})        = filtChar       filt
-tokenFilter filt (TokenOperOrPunct{}) = filtOper       filt
+tokenFilter filt TokenIdentifier{}  = filtIdentifier filt
+tokenFilter filt TokenDirective{}   = filtDirective  filt
+tokenFilter filt TokenKeyword{}     = filtKeyword    filt
+tokenFilter filt TokenHeaderName{}  = filtHeader     filt
+tokenFilter filt TokenNumber{}      = filtNumber     filt
+tokenFilter filt TokenString{}      = filtString     filt
+tokenFilter filt TokenChar{}        = filtChar       filt
+tokenFilter filt TokenOperOrPunct{} = filtOper       filt
 
 
 tokenCompare :: Token -> Token -> Bool
-tokenCompare (TokenIdentifier { toString = l }) (TokenIdentifier { toString = r }) = l == r
-tokenCompare (TokenDirective  { toString = l }) (TokenDirective  { toString = r }) = l == r
-tokenCompare (TokenKeyword    { toString = l }) (TokenKeyword    { toString = r }) = l == r
-tokenCompare (TokenNumber     { toString = l }) (TokenNumber     { toString = r }) = l == r
-tokenCompare (TokenHeaderName { toString = l }) (TokenHeaderName { toString = r }) = l == r
-tokenCompare (TokenString     { toString = l }) (TokenString     { toString = r }) = l == r
-tokenCompare (TokenChar       { toString = l }) (TokenChar       { toString = r }) = l == r
-tokenCompare (TokenOperOrPunct{ toString = l }) (TokenOperOrPunct{ toString = r }) = l == r
+tokenCompare TokenIdentifier { toString = l } TokenIdentifier { toString = r } = l == r
+tokenCompare TokenDirective  { toString = l } TokenDirective  { toString = r } = l == r
+tokenCompare TokenKeyword    { toString = l } TokenKeyword    { toString = r } = l == r
+tokenCompare TokenNumber     { toString = l } TokenNumber     { toString = r } = l == r
+tokenCompare TokenHeaderName { toString = l } TokenHeaderName { toString = r } = l == r
+tokenCompare TokenString     { toString = l } TokenString     { toString = r } = l == r
+tokenCompare TokenChar       { toString = l } TokenChar       { toString = r } = l == r
+tokenCompare TokenOperOrPunct{ toString = l } TokenOperOrPunct{ toString = r } = l == r
 tokenCompare _ _ = False
 
 
 isIdentifier :: Token -> Bool
-isIdentifier (TokenIdentifier {})  = True
+isIdentifier TokenIdentifier{}  = True
 isIdentifier _ = False
 
 
 isKeyword :: Token -> Bool
-isKeyword (TokenKeyword {})  = True
+isKeyword TokenKeyword{}  = True
 isKeyword _ = False
 
 
 isDirective :: Token -> Bool
-isDirective (TokenDirective {})  = True
+isDirective TokenDirective {}  = True
 isDirective _ = False
 
 
 isLiteralNumber :: Token -> Bool
-isLiteralNumber (TokenNumber {}) = True
+isLiteralNumber TokenNumber {} = True
 isLiteralNumber _ = False
 
 
 isHeaderName :: Token -> Bool
-isHeaderName (TokenHeaderName {})  = True
+isHeaderName TokenHeaderName {}  = True
 isHeaderName _ = False
 
 
 isString :: Token -> Bool
-isString (TokenString {}) = True
+isString TokenString {} = True
 isString _ = False
 
 
 isChar :: Token -> Bool
-isChar (TokenChar {}) = True
+isChar TokenChar{} = True
 isChar _ = False
 
 
 isOperOrPunct :: Token -> Bool
-isOperOrPunct (TokenOperOrPunct {})  = True
+isOperOrPunct TokenOperOrPunct {}  = True
 isOperOrPunct _ = False
 
 
diff --git a/src/CGrep/Parser/Generic/Token.hs b/src/CGrep/Parser/Generic/Token.hs
--- a/src/CGrep/Parser/Generic/Token.hs
+++ b/src/CGrep/Parser/Generic/Token.hs
@@ -84,11 +84,11 @@
 
 
 tokenCompare :: Token -> Token -> Bool
-tokenCompare (TokenAlpha   { toString = l }) (TokenAlpha   { toString = r }) = l == r
-tokenCompare (TokenDigit   { toString = l }) (TokenDigit   { toString = r }) = l == r
-tokenCompare (TokenLiteral { toString = l }) (TokenLiteral { toString = r }) = l == r
-tokenCompare (TokenBracket { toString = l }) (TokenBracket { toString = r }) = l == r
-tokenCompare (TokenOther   { toString = l }) (TokenOther   { toString = r }) = l == r
+tokenCompare TokenAlpha  { toString = l } TokenAlpha  { toString = r } = l == r
+tokenCompare TokenDigit  { toString = l } TokenDigit  { toString = r } = l == r
+tokenCompare TokenLiteral{ toString = l } TokenLiteral{ toString = r } = l == r
+tokenCompare TokenBracket{ toString = l } TokenBracket{ toString = r } = l == r
+tokenCompare TokenOther  { toString = l } TokenOther  { toString = r } = l == r
 tokenCompare _ _ = False
 
 
diff --git a/src/CmdOptions.hs b/src/CmdOptions.hs
--- a/src/CmdOptions.hs
+++ b/src/CmdOptions.hs
@@ -63,6 +63,8 @@
           ,     no_linenumber= False        &= help "Suppress the line number on output lines" &= explicit &= name "N" &= name "no-linenumber"
           ,     count = False               &= help "Print only a count of matching lines per file" &= explicit &= name "count"
           ,     filename_only = False       &= help "Print only the name of files containing matches" &= explicit &= name "filename-only"
+          ,     editor = False              &= help "Run the editor specified by EDITOR var., passing the files that match" &= explicit &=name "editor"
+          ,     vim = False                 &= help "Run vim the editor passing the files that match" &= explicit &=name "vim"
 #ifdef ENABLE_HINT
           ,     hint = Nothing  &= typ "STRING" &= help "Haskell interpreter output. Var: file, row, line, tokens.\ne.g. \"file ++ show (tokens)\"" &= explicit &= name "hint"
 #endif
diff --git a/src/Config.hs b/src/Config.hs
--- a/src/Config.hs
+++ b/src/Config.hs
@@ -52,7 +52,7 @@
     confs <- filterM doesFileExist [cgreprc, "." ++ cgreprc, home </> "." ++ cgreprc, "/etc" </> cgreprc]
     if notNull confs
         then liftM dropComments (readFile (head confs)) >>= \xs ->
-              return ((prettyRead xs "Config error" :: Config), Just (head confs))
-        else return $ (Config [] [] False, Nothing)
+              return (prettyRead xs "Config error" :: Config, Just (head confs))
+        else return (Config [] [] False, Nothing)
 
 
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -24,6 +24,8 @@
 import Data.Maybe
 import Data.Char
 import Data.Data()
+
+import Data.IORef
 import Data.Version(showVersion)
 import Data.Function
 import qualified Data.Set as Set
@@ -48,7 +50,7 @@
 import System.PosixCompat.Files as PosixCompat
 import System.IO
 import System.Exit
-import System.Process (readProcess)
+import System.Process (readProcess, runProcess, waitForProcess)
 
 import CGrep.CGrep
 import CGrep.Lang
@@ -170,6 +172,8 @@
 
     let stop = jobs opts
 
+    matchingFiles <- liftIO $ newIORef Set.empty
+
     fix (\action n m ->
          unless (n == stop) $ do
                  out <- liftIO $ atomically $ readTChan out_chan
@@ -180,12 +184,22 @@
                             _ | json opts -> when m $ liftIO $ putStrLn ","
                               | otherwise -> return ()
                           prettyOutput out >>= mapM_ (liftIO . putStrLn)
+                          liftIO $ when (vim opts || editor opts) $ mapM_ (modifyIORef matchingFiles . Set.insert . outFilePath) out
                           action n True
         )  0 False
 
     putPrettyFooter
 
+    -- run editor...
 
+    liftIO $ when (vim opts || editor opts) $ do
+        editor' <- if vim opts
+                    then return (Just "vim")
+                    else lookupEnv "EDITOR"
+        files   <- readIORef matchingFiles
+        void (runProcess (fromJust $ editor' <|> Just "vi") (Set.toList files) Nothing Nothing (Just stdin) (Just stdout) (Just stderr) >>= waitForProcess)
+
+
 main :: IO ()
 main = do
 
@@ -237,7 +251,7 @@
     -- display the configuration in use
 
     when (isJust confpath) $
-      hPutStrLn stderr $ showBold opts ("Using '" ++ (fromJust confpath) ++ "' configuration file...")
+      hPutStrLn stderr $ showBold opts ("Using '" ++ fromJust confpath ++ "' configuration file...")
 
     -- load files to parse:
 
diff --git a/src/Options.hs b/src/Options.hs
--- a/src/Options.hs
+++ b/src/Options.hs
@@ -72,6 +72,8 @@
     ,   format              :: Maybe String
     ,   json                :: Bool
     ,   xml                 :: Bool
+    ,   editor              :: Bool
+    ,   vim                 :: Bool
     -- Parallel:
     ,   jobs                :: Int
     ,   cores               :: Int
