194e964efSNik Silver.. _ctags-lang-elm(7): 294e964efSNik Silver 394e964efSNik Silver============================================================== 494e964efSNik Silverctags-lang-elm 594e964efSNik Silver============================================================== 694e964efSNik Silver------------------------------------------------------------------- 794e964efSNik SilverRandom notes about tagging Elm source code with Universal Ctags 894e964efSNik Silver------------------------------------------------------------------- 994e964efSNik Silver:Version: @VERSION@ 1094e964efSNik Silver:Manual group: Universal Ctags 1194e964efSNik Silver:Manual section: 7 1294e964efSNik Silver 1394e964efSNik SilverSYNOPSIS 1494e964efSNik Silver-------- 1594e964efSNik Silver| **@CTAGS_NAME_EXECUTABLE@** ... --languages=+Elm ... 1694e964efSNik Silver| **@CTAGS_NAME_EXECUTABLE@** ... --language-force=Elm ... 1794e964efSNik Silver| **@CTAGS_NAME_EXECUTABLE@** ... --map-Elm=+.elm ... 1894e964efSNik Silver 1994e964efSNik SilverDESCRIPTION 2094e964efSNik Silver----------- 2194e964efSNik SilverThe Elm parser is a PEG parser using PackCC, which is part of the 2294e964efSNik Silverctags infrastructure. It should correctly process all top level 2394e964efSNik Silverstatements, however there is a limitation with functions embedded 2494e964efSNik Silverin let/in blocks. They will mostly be fine, but sometimes a 2594e964efSNik Silverfunction in a let/in block will be omitted. 2694e964efSNik Silver 2794e964efSNik SilverEXAMPLES 2894e964efSNik Silver-------- 2994e964efSNik Silver 3094e964efSNik SilverImports 3194e964efSNik Silver~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3294e964efSNik Silver 33*8959a9c3SNik SilverImported modules are tagged, and their role is "imported", not "def". 34*8959a9c3SNik SilverTypes, functions, etc which are exposed via imported module have their 35*8959a9c3SNik Silverrole as "exposed". 3694e964efSNik Silver 37*8959a9c3SNik SilverExposed items are marked as being in the scope of their own module, 3894e964efSNik Silvernot the module that's doing the importing. 3994e964efSNik Silver 4094e964efSNik Silver"input.elm" 4194e964efSNik Silver 4294e964efSNik Silver.. code-block:: Elm 4394e964efSNik Silver 4494e964efSNik Silver module SomeMod exposing (..) 4594e964efSNik Silver 4694e964efSNik Silver import MyMod exposing 4794e964efSNik Silver ( map 4894e964efSNik Silver , Maybe 4994e964efSNik Silver , Result(..) 5094e964efSNik Silver , MyList(Empty) 5194e964efSNik Silver ) 5294e964efSNik Silver 5394e964efSNik Silver"output.tags" 5494e964efSNik Silverwith "--options=NONE -o - --sort=no --extras=+r --fields=+r input.elm" 5594e964efSNik Silver 5694e964efSNik Silver.. code-block:: tags 5794e964efSNik Silver 5894e964efSNik Silver SomeMod input.elm /^module SomeMod exposing (..)$/;" m roles:def 5994e964efSNik Silver MyMod input.elm /^import MyMod exposing$/;" m roles:imported 60*8959a9c3SNik Silver map input.elm /^ ( map$/;" f module:MyMod roles:exposed 61*8959a9c3SNik Silver Maybe input.elm /^ , Maybe$/;" t module:MyMod roles:exposed 62*8959a9c3SNik Silver Result input.elm /^ , Result(..)$/;" t module:MyMod roles:exposed 63*8959a9c3SNik Silver MyList input.elm /^ , MyList(Empty)$/;" t module:MyMod roles:exposed 64*8959a9c3SNik Silver Empty input.elm /^ , MyList(Empty)$/;" c type:MyMod.MyList roles:exposed 6594e964efSNik Silver 6694e964efSNik SilverNamespaces 6794e964efSNik Silver~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6894e964efSNik Silver 6994e964efSNik SilverNamespaces are tagged and their role is "def". 7094e964efSNik Silver 7194e964efSNik Silver"input.elm" 7294e964efSNik Silver 7394e964efSNik Silver.. code-block:: Elm 7494e964efSNik Silver 7594e964efSNik Silver module AMod exposing (..) 7694e964efSNik Silver 7794e964efSNik Silver import MyImport as NSpace exposing (impFunc) 7894e964efSNik Silver 7994e964efSNik Silver"output.tags" 8094e964efSNik Silverwith "--options=NONE -o - --sort=no --extras=+r --fields=+r input.elm" 8194e964efSNik Silver 8294e964efSNik Silver.. code-block:: tags 8394e964efSNik Silver 8494e964efSNik Silver AMod input.elm /^module AMod exposing (..)$/;" m roles:def 8594e964efSNik Silver NSpace input.elm /^import MyImport as NSpace exposing (impFunc)$/;" n module:AMod roles:def moduleName:MyImport 8694e964efSNik Silver MyImport input.elm /^import MyImport as NSpace exposing (impFunc)$/;" m roles:imported 87*8959a9c3SNik Silver impFunc input.elm /^import MyImport as NSpace exposing (impFunc)$/;" f module:MyImport roles:exposed 8894e964efSNik Silver 8994e964efSNik SilverType names 9094e964efSNik Silver~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 9194e964efSNik Silver 9294e964efSNik SilverConstructors top level functions will have type names. 9394e964efSNik Silver 9494e964efSNik Silver"input.elm" 9594e964efSNik Silver 9694e964efSNik Silver.. code-block:: Elm 9794e964efSNik Silver 9894e964efSNik Silver funcA : Int -> Int 9994e964efSNik Silver funcA a = a + 1 10094e964efSNik Silver 10194e964efSNik Silver type B 10294e964efSNik Silver = B1Cons 10394e964efSNik Silver { x : Float 10494e964efSNik Silver , y : Float 10594e964efSNik Silver } 10694e964efSNik Silver | B2Cons String Integer 10794e964efSNik Silver | B3Cons 10894e964efSNik Silver 10994e964efSNik Silver"output.tags" 11094e964efSNik Silverwith "--options=NONE -o - --sort=no --extras=+r --fields=+r input.elm" 11194e964efSNik Silver 11294e964efSNik Silver.. code-block:: tags 11394e964efSNik Silver 11494e964efSNik Silver funcA input.elm /^funcA a = a + 1$/;" f typeref:typename:Int -> Int roles:def 11594e964efSNik Silver B input.elm /^type B$/;" t roles:def 11694e964efSNik Silver B1Cons input.elm /^ = B1Cons$/;" c type:B typeref:typename:{ x : Float , y : Float } -> B roles:def 11794e964efSNik Silver B2Cons input.elm /^ | B2Cons String Integer$/;" c type:B typeref:typename:String -> Integer -> B roles:def 11894e964efSNik Silver B3Cons input.elm /^ | B3Cons$/;" c type:B typeref:typename:B roles:def 11994e964efSNik Silver 12094e964efSNik SilverFunction parameter lists 12194e964efSNik Silver~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 12294e964efSNik Silver 12394e964efSNik SilverFunction parameter lists can be extracted into the tags file 12494e964efSNik Silversignature field. They are not really function signatures, but 12594e964efSNik Silverit's the closest concept available in ctags. 12694e964efSNik SilverUse "--fields=+S". 12794e964efSNik Silver 12894e964efSNik Silver.. code-block:: Elm 12994e964efSNik Silver 13094e964efSNik Silver funcA a1 a2 = 13194e964efSNik Silver a1 + a2 13294e964efSNik Silver 13394e964efSNik Silver"output.tags" 13494e964efSNik Silverwith "--sort=no --extras=+r --fields=+rS" 13594e964efSNik Silver 13694e964efSNik Silver.. code-block:: tags 13794e964efSNik Silver 13894e964efSNik Silver funcA input.elm /^funcA a1 a2 =$/;" f signature:a1 a2 roles:def 13994e964efSNik Silver 14094e964efSNik SilverKNOWN LIMITATIONS 14194e964efSNik Silver----------------- 14294e964efSNik SilverThe ctags signature field is used for function parameter lists, even 14394e964efSNik Silverthough it's not an idea field. See above. 14494e964efSNik Silver 14594e964efSNik SilverElm requires all statements at the same logical level to have the 14694e964efSNik Silversame indentation. If there is additional indentation that line is part 14794e964efSNik Silverof the previous one. Therefore without over-complicating the 14894e964efSNik SilverPEG parser we have the following limitations... 14994e964efSNik Silver 15094e964efSNik SilverSometimes functions in let/in blocks will be omitted. 15194e964efSNik Silver 15294e964efSNik SilverFunctions in let/in blocks will be marked as being in the scope of their 15394e964efSNik Silverouter function, regardless of how deeply nested the let/in block is. 15494e964efSNik Silver 15594e964efSNik SilverFunctions in let/in blocks won't have type names. 15694e964efSNik Silver 15794e964efSNik SilverSEE ALSO 15894e964efSNik Silver-------- 15994e964efSNik Silverctags(1), ctags-client-tools(7) 160