diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,7 +1,15 @@
 * Hackage: <http://hackage.haskell.org/package/crackNum>
 * GitHub:  <http://github.com/LeventErkok/crackNum/>
 
-* Latest Hackage released version: 2.0, 2018-03-17
+* Latest Hackage released version: 2.1, 2018-07-20
+
+### Version 2.1, 2018-07-20
+
+  * Support for vi-editor bindings. See the file "crackNum.vim" in the
+    distribution or in the github repo You can put "so ~/.vim/crackNum.vim"
+    (use the correct path!) and have vi crack numbers directly from inside
+    your editor. Simply locate your cursor on a binary/hex stream of digits
+    and type ":CrackNum".  See the "crackNum.vim" file for binding details.
 
 ### Version 2.0, 2018-03-17
 
diff --git a/Data/Numbers/CrackNum/Main.hs b/Data/Numbers/CrackNum/Main.hs
--- a/Data/Numbers/CrackNum/Main.hs
+++ b/Data/Numbers/CrackNum/Main.hs
@@ -36,6 +36,7 @@
           | ToIEEE String        -- ^ Convert to IEEE SP/DP value
           | Lanes  String        -- ^ Number of lanes present in the input, crackNum can guess but it can also be specified.
           | Help                 -- ^ Help
+          | VIM                  -- ^ Are we being called from VIM?
           | Version              -- ^ Version
           deriving Eq
 
@@ -54,6 +55,7 @@
     , Option ""   ["uq"]      (NoArg (IType  W64)) "64 bit unsigned quad"
     , Option ""   ["toIEEE"]  (ReqArg ToIEEE "n")  "Convert from decimal to IEEE SP/DP formats."
     , Option "l"  ["lanes"]   (ReqArg Lanes  "n")  "number of lanes"
+    , Option ""   ["vim"]     (NoArg VIM)          "output in vim friendly format"
     , Option "h?" ["help"]    (NoArg Help)         "print help, with examples"
     , Option "v"  ["version"] (NoArg Version)      "print version info"
     ]
@@ -95,9 +97,42 @@
               putStrLn "               * ulp: The minimum subnormal value"
               exitFailure
 
+-- instead of dealing with vimscript, munge our args here.. heh
+vimpret :: [String] -> [String]
+vimpret args = case break (== "--bv") args of
+                 ([p], "--bv":rest) -> case mkArgs p of
+                                         Nothing -> ["--help"]
+                                         Just pr -> ("--" ++ pr) : rest
+                 _                  -> ["--help"]
+  where bad = (`elem` ["lanes", "vim", "help"])
+        validPrecs   = filter (not . bad) $ concat [xs | Option _ xs _ _ <- options]
+        dvalidPrecs  = map ('-':) validPrecs
+        ddvalidPrecs = map ('-':) dvalidPrecs
+        mkArgs p
+          | p `elem` validPrecs   = Just p
+          | p `elem` dvalidPrecs  = Just (drop 1 p)
+          | p `elem` ddvalidPrecs = Just (drop 2 p)
+          | True                  = Nothing
+
 main :: IO ()
-main = do argv <- getArgs
-          pn   <- getProgName
+main = do origArgs <- getArgs
+          origPN <- getProgName
+
+          let -- bugger.. make the args a bit more friendly
+              friendly :: String -> String
+              friendly ('-':ns)   -- -2/-3 etc become lane stuff
+                | all isDigit ns
+                = "-l" ++ ns
+              friendly ('-':c:cs)
+                | c `notElem` "-l" = "--" ++ (c:cs)
+              friendly s = s
+
+              cleanArgs = map friendly origArgs
+
+
+              (argv, pn) | "--vim" `elem` cleanArgs = ("--vim" : vimpret (filter (/= "--vim") cleanArgs), "CrackNum")
+                         | True                     = (cleanArgs, origPN)
+
           case getOpt Permute options argv of
             (os, rs, [])   -> if Version `elem` os
                               then putStrLn $ pn ++ " v" ++ showVersion version ++ ", " ++ copyRight
@@ -114,7 +149,7 @@
           | Just v <- listToMaybe [s | ToIEEE s <- os], null rs, Just (FPType p) <- mbPrec
           = putStrLn $ displayFP $ stringToFP p v
           | all isDigit lcs && lc > 0, Just p <- mbPrec
-          = lane pn lc p rs
+          = lane pn (VIM `elem` os) lc p rs
           | True
           = putStr $ helpStr pn
          where mbPrec = getChosenPrec os
@@ -153,9 +188,9 @@
         (q, r)  = l `quotRem` sz
 
 -- | Do the lane..
-lane :: String -> Int -> Flag -> [String] -> IO ()
-lane pn 1 f rs = dispatch pn f rs
-lane pn n f rs
+lane :: String -> Bool -> Int -> Flag -> [String] -> IO ()
+lane pn _   1 f rs = dispatch pn f rs
+lane pn vim n f rs
   | ls `mod` n /= 0
   = help $ "Input length " ++ show ls ++ " is not a multiple of lane count: " ++ show n
   | True
@@ -164,8 +199,12 @@
         ls = length s
         help m = do putStrLn $ pn ++ ": " ++ m
                     usage pn
-        cvt i r = do putStrLn $ mkHeader (Just i) f
+        cvt i r = do putStrLn $ vimMarker vim ++ mkHeader (Just i) f
                      dispatch pn f [r]
+
+vimMarker :: Bool -> String
+vimMarker False = ""
+vimMarker True  = "VIM "
 
 -- | Display the ruler..
 mkHeader :: Maybe Int -> Flag -> String
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -3,9 +3,11 @@
 [![Hackage version](http://img.shields.io/hackage/v/crackNum.svg?label=Hackage)](http://hackage.haskell.org/package/crackNum)
 [![Build Status](http://img.shields.io/travis/LeventErkok/crackNum.svg?label=Build)](http://travis-ci.org/LeventErkok/crackNum)
 
+CrackNum now comes with vim bindings, see http://github.com/LeventErkok/crackNum/blob/master/crackNum.vim
+
 ### Command line options:
 
-    crackNum v1.9, (c) Levent Erkok. Released with a BSD3 license.
+    crackNum v2.1, (c) Levent Erkok. Released with a BSD3 license.
     Usage: crackNum precision bit/hex-pattern
               --hp        16 bit half     precision
               --sp        32 bit single   precision
@@ -20,6 +22,7 @@
               --uq        64 bit unsigned quad
               --toIEEE=n  Convert from decimal to IEEE SP/DP formats.
       -l n    --lanes=n   number of lanes
+              --vim       output in vim friendly format
       -h, -?  --help      print help, with examples
       -v      --version   print version info
     
diff --git a/crackNum.cabal b/crackNum.cabal
--- a/crackNum.cabal
+++ b/crackNum.cabal
@@ -1,5 +1,5 @@
 Name:                crackNum
-Version:             2.0
+Version:             2.1
 Synopsis:            Crack various integer, floating-point data formats
 Description:         Crack HP, SP and DP floats and 8, 16, 32, 64 bit words and integers.
                      .
@@ -7,12 +7,13 @@
 License:             BSD3
 License-file:        LICENSE
 Author:              Levent Erkok
+Homepage:            http://github.com/LeventErkok/CrackNum
 Maintainer:          erkokl@gmail.com
 Copyright:           Levent Erkok
 Category:            Tools
 Build-type:          Simple
-Cabal-version:       >= 1.10
-Extra-Source-Files:  INSTALL, README.md, COPYRIGHT, CHANGES.md
+Cabal-version:       1.14
+Extra-Source-Files:  INSTALL, README.md, COPYRIGHT, CHANGES.md, crackNum.vim
 
 source-repository head
     type:       git
@@ -26,6 +27,7 @@
    other-modules: Data.Numbers.CrackNum
                 , Data.Numbers.CrackNum.Utils
                 , Data.Numbers.CrackNum.Data
+                , Paths_crackNum
 
 Library
   ghc-options     : -Wall
diff --git a/crackNum.vim b/crackNum.vim
new file mode 100644
--- /dev/null
+++ b/crackNum.vim
@@ -0,0 +1,80 @@
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" VI interface to crackNum
+"
+" Copyright   :  (c) Levent Erkok
+" License     :  BSD3
+" Maintainer  :  erkokl@gmail.com
+"
+" INSTALLATION: Put this file in a convenient location (typically your .vim directory),
+" and put "so crackNum.vim" in your .vimrc file. (With the appropriate path.)
+"
+" Once you restart vim, locate your cursor over a stream of binary/hex digits, and
+" enter the command :CrackNum to see further options.
+"
+" See https://github.com/LeventErkok/CrackNum for details.
+
+let g:crackNumPrecisions = ["hp","sp","dp","sb","sw","sd","sq","ub","uw","ud","uq"]
+function! CrackNumComplete(A, L, P)
+    if empty(a:A)
+	return g:crackNumPrecisions
+    else
+    	let out = filter(copy(g:crackNumPrecisions), 'v:val =~ "^' . a:A . '.*"')
+	if empty(out)
+	    return g:crackNumPrecisions
+	else
+	    return out
+    endif
+endfunction
+function! CrackNum(...)
+    redraw
+    let curWord = expand("<cword>")
+    if empty(curWord)
+	echoerr "Place the cursor on a bin/hex number to crack!"
+	return
+    endif
+    if empty(a:000)
+	echo "Cracking \"" . curWord . "\".. Use TAB to see precisions supported."
+	call inputsave()
+	let prec = input("Precision> ", "", "customlist,CrackNumComplete")
+	call inputrestore()
+	let args = [prec] + copy(a:000)
+    else
+	echo "Cracking \""  . curWord . "\".."
+	let prec = a:1
+	let args = copy(a:000)
+    endif
+
+    if index(g:crackNumPrecisions, prec) < 0
+	echoerr "Unknown precision: \"" . prec . "\"" . ". Must be one of: " . join(g:crackNumPrecisions, ' ')
+	return
+    endif
+
+    let l:grepargs = join(['--vim'] + copy(args) + ['--bv', curWord], ' ')
+    let grepprg_bak=&grepprg
+    let grepformat_bak=&grepformat
+    try
+        let &grepprg="crackNum"
+        let &grepformat="VIM %m"
+        silent execute "grep" . " " . l:grepargs
+    finally
+        let &grepprg=grepprg_bak
+        let &grepformat=grepformat_bak
+    endtry
+
+    botright copen
+
+    redraw!
+endfunction
+command! -nargs=* -complete=customlist,CrackNumComplete CrackNum call CrackNum(<f-args>)
+map @nhp   :silent call CrackNum('hp')<CR>
+map @nsp   :silent call CrackNum('sp')<CR>
+map @ndp   :silent call CrackNum('dp')<CR>
+map @nsb   :silent call CrackNum('sb')<CR>
+map @nsw   :silent call CrackNum('sw')<CR>
+map @nsd   :silent call CrackNum('sd')<CR>
+map @nsq   :silent call CrackNum('sq')<CR>
+map @nub   :silent call CrackNum('ub')<CR>
+map @nuw   :silent call CrackNum('uw')<CR>
+map @nud   :silent call CrackNum('ud')<CR>
+map @nuq   :silent call CrackNum('uq')<CR>
+" end crackNum interface
