packages feed

yi-0.8.0: example-configs/yi-vim-snippets.hs

module Main where

import Control.Applicative ((<|>))
import Control.Lens.Getter (use)

import Yi
import Yi.Keymap
import Yi.Keymap.Vim
import Yi.Snippets

main :: IO ()
main = yi $ defaultVimConfig {
    defaultKm = myVimKeymap

    -- install update handler for dependent snippet regions
  , bufferUpdateHandler = [updateUpdatedMarks]
}

deleteSnippets = False

myVimKeymap =
  mkKeymap $ defKeymap `override` \super self -> super {
    v_ins_char = (v_ins_char super ||> tabKeymap)
                 <|> (ctrlCh 's' ?>>! moveToNextBufferMark deleteSnippets)
        , v_ex_cmds = myExCmds
        }

myExCmds = exCmds [ ("sd", const $ withEditor showDepMarks, Nothing) ]

showDepMarks = withBuffer0 (use bufferDynamicValueA >>=
                            mapM markRegion . concat . marks) >>=
               printMsg . show

tabKeymap = superTab True $ fromSnippets deleteSnippets $
    [ ("test", testSnippet)
    , ("hc", haskellComment)
    , ("ts2", testSnippet2)
    , ("ts3", testSnippet3)
    , ("ts4", testSnippet4)
    ]

haskellComment :: SnippetCmd ()
haskellComment = snippet $
    "{-" & (cursor 1) & "\n-}"

testSnippet :: SnippetCmd ()
testSnippet = snippet $
    "if ( " & (cursorWith 1 "...") & " ) {\n" &
    "\t" & (cursorWith 2 "/* code */") &
    "\n}\n" & (cursor 3)

testSnippet2 :: SnippetCmd ()
testSnippet2 = snippet $
  (cursorWith 2 "abcdef") & "\n" &
  (dep 2) & "\ndef" &
  (cursor 1)

testSnippet3 :: SnippetCmd ()
testSnippet3 = snippet $
    "for(int " & (cursorWith 2 "ab") & " = 0; " &
         (dep 2) & " < " & (cursorWith 1 "arr") & ".length;" &
         (dep 2) & "++) {\n" &
    "\t" & (cursorWith 3 "/* code */") &
    "\n}\n" & (cursor 4)

testSnippet4 :: SnippetCmd ()
testSnippet4 = snippet $
    "for(int " & (cursorWith 1 "ab") & " = 0; " &
         (dep 1) & " < " & (cursorWith 2 "arr") & ".length;" &
         (dep 1) & "++) {\n" &
    "\t" & (cursorWith 3 "/* code */") &
    "\n}\n" & (cursor 4)