{-# LANGUAGE NamedFieldPuns #-}
module Plugin.GhcTags.Vim
( formatVimTag
, formatVimTagFile
) where
import Data.ByteString.Builder (Builder)
import qualified Data.ByteString.Builder as BS
import Data.Version (showVersion)
import Text.Printf (printf)
import Paths_ghc_tags_plugin (version)
import Plugin.GhcTags.Generate
import Plugin.GhcTags.Parser
formatVimTag :: Tag -> Builder
formatVimTag Tag { tagName, tagFile, tagLine, tagKind } =
BS.byteString (getTagName tagName)
<> BS.charUtf8 '\t'
<> BS.byteString (getTagFile tagFile)
<> BS.charUtf8 '\t'
<> BS.intDec tagLine
<> case tagKind of
Just k ->
BS.stringUtf8 ";\"\t"
<> BS.charUtf8 (tagKindToChar k)
Nothing -> mempty
<> BS.charUtf8 '\n'
formatVimTagFile :: [Tag] -> Builder
formatVimTagFile tags =
BS.stringUtf8 (formatHeader "TAG_FILE_FORMAT" "2")
<> BS.stringUtf8 (formatHeader "TAG_FILE_SORTED" "1")
<> BS.stringUtf8 (formatHeader "TAG_FILE_ENCODING" "utf-8")
<> BS.stringUtf8 (formatHeader "TAG_PROGRAM_AUTHOR" "Marcin Szamotulski")
<> BS.stringUtf8 (formatHeader "TAG_PROGRAM_NAME" "ghc-tags-pluginn")
<> BS.stringUtf8 (formatHeader "TAG_PROGRAM_URL"
"https://hackage.haskell.org/package/ghc-tags-plugin")
<> BS.stringUtf8 (formatHeader "TAG_PROGRAM_VERSION" (showVersion version))
<> foldMap formatVimTag tags
where
formatHeader :: String -> String -> String
formatHeader header arg = printf ("!_" ++ header ++ "\t%s\t\n") arg