diff --git a/modules/plugins/languages/tex/build/builders/default.nix b/modules/plugins/languages/tex/build/builders/default.nix index 0e4eb8d8..4586b768 100644 --- a/modules/plugins/languages/tex/build/builders/default.nix +++ b/modules/plugins/languages/tex/build/builders/default.nix @@ -3,15 +3,14 @@ pkgs, lib, ... -}: -let +}: let inherit (lib.options) mkOption; inherit (lib.types) enum listOf package str; - inherit (builtins) attrNames; + inherit (lib.nvim.config) mkBool; + inherit (builtins) attrNames filter isAttrs hasAttr elemAt length; cfg = config.vim.languages.tex; -in -{ +in { imports = [ ./latexmk.nix ./tectonic.nix @@ -27,6 +26,8 @@ in This is just the default custom option. By setting any of the builders to true, this will be overwritten by that builder's parameters. + Setting this parameter to the name of a declared builder will + not automatically enable that builder. ''; }; args = mkOption { @@ -45,7 +46,7 @@ in }; package = mkOption { type = package; - default = (pkgs.texlive.withPackages (ps: [ ps.latexmk ])); + default = pkgs.texlive.withPackages (ps: [ps.latexmk]); description = '' The tex builder package to use. @@ -67,4 +68,3 @@ in }; }; } - diff --git a/modules/plugins/languages/tex/build/default.nix b/modules/plugins/languages/tex/build/default.nix index cbc9dca7..fe07775b 100644 --- a/modules/plugins/languages/tex/build/default.nix +++ b/modules/plugins/languages/tex/build/default.nix @@ -4,34 +4,71 @@ ... }: let inherit (lib.options) mkOption; - inherit (lib.types) bool str; + inherit (lib.types) str nullOr; + inherit (builtins) filter isAttrs hasAttr attrNames length elemAt; + inherit (lib.nvim.config) mkBool; cfg = config.vim.languages.tex; + + enabledBuildersCount = let + # This function will sort through the builder options and count how many + # builders have been enabled. + getEnabledBuildersCount = { + enabledBuildersCount ? 0, + index ? 0, + builderNamesList ? ( + filter ( + x: let + y = cfg.build.builders.${x}; + in (isAttrs y && hasAttr "enable" y) + ) (attrNames cfg.build.builders) + ), + }: let + currentBuilderName = elemAt builderNamesList index; + currentBuilder = cfg.build.builders.${currentBuilderName}; + nextIndex = index + 1; + newEnabledBuildersCount = + if currentBuilder.enable + then enabledBuildersCount + 1 + else enabledBuildersCount; + in + if length builderNamesList > nextIndex + then + getEnabledBuildersCount { + inherit builderNamesList; + enabledBuildersCount = newEnabledBuildersCount; + index = nextIndex; + } + else newEnabledBuildersCount; + in (getEnabledBuildersCount {}); in { imports = [ ./builders ]; options.vim.languages.tex.build = { - forwardSearchAfter = mkOption { - type = bool; - default = false; - description = "Set this property to true if you want to execute a forward search after a build."; - }; - onSave = mkOption { - type = bool; - default = false; - description = "Set this property to true if you want to compile the project after saving a file."; - }; - useFileList = mkOption { - type = bool; - default = false; - description = '' - When set to true, the server will use the .fls files produced by the TeX engine as an additional input for the project detection. + enable = + mkBool ( + if enabledBuildersCount > 1 + then throw "nvf-tex-language does not support having more than 1 builders enabled!" + else (enabledBuildersCount == 1) + ) '' + Whether to enable configuring the builder. - Note that enabling this property might have an impact on performance. + By enabling any of the builders, this option will be automatically set. + If you enable more than one builder then an error will be thrown. ''; - }; + + forwardSearchAfter = mkBool false "Set this property to true if you want to execute a forward search after a build."; + + onSave = mkBool false "Set this property to true if you want to compile the project after saving a file."; + + useFileList = mkBool false '' + When set to true, the server will use the .fls files produced by the TeX engine as an additional input for the project detection. + + Note that enabling this property might have an impact on performance. + ''; + auxDirectory = mkOption { type = str; default = "."; @@ -42,6 +79,7 @@ in { When using a latexmkrc file, texlab will automatically infer the correct setting. ''; }; + logDirectory = mkOption { type = str; default = "."; @@ -52,6 +90,7 @@ in { When using a latexmkrc file, texlab will automatically infer the correct setting. ''; }; + pdfDirectory = mkOption { type = str; default = "."; @@ -62,9 +101,10 @@ in { When using a latexmkrc file, texlab will automatically infer the correct setting. ''; }; + filename = mkOption { - type = str; - default = ""; + type = nullOr str; + default = null; description = '' Allows overriding the default file name of the build artifact. This setting is used to find the correct PDF file to open during forward search. ''; diff --git a/modules/plugins/languages/tex/lsp/texlab.nix b/modules/plugins/languages/tex/lsp/texlab.nix index e5dea908..dcd05615 100644 --- a/modules/plugins/languages/tex/lsp/texlab.nix +++ b/modules/plugins/languages/tex/lsp/texlab.nix @@ -19,7 +19,7 @@ }: let inherit (lib.options) mkOption; inherit (lib.modules) mkIf; - inherit (lib.types) listOf package str; + inherit (lib.types) listOf package str attrs; inherit (builtins) attrNames @@ -36,8 +36,8 @@ inherit (lib.nvim.config) mkBool; cfg = config.vim.languages.tex; - - # --- Enable Options --- + texlabCfg = cfg.lsp.texlab; + builderCfg = cfg.build.builder; in { options.vim.languages.tex.lsp.texlab = { enable = mkBool config.vim.languages.enableLSP "Whether to enable Tex LSP support (texlab)"; @@ -50,13 +50,13 @@ in { forwardSearch = { enable = mkBool false '' - Whether to enable forward search. + Whether to enable forward search. - Enable this option if you want to have the compiled document appear in your chosen PDF viewer. + Enable this option if you want to have the compiled document appear in your chosen PDF viewer. - For some options see [here](https://github.com/latex-lsp/texlab/wiki/Previewing). - Note this is not all the options, but can act as a guide to help you allong with custom configs. - ''; + For some options see [here](https://github.com/latex-lsp/texlab/wiki/Previewing). + Note this is not all the options, but can act as a guide to help you allong with custom configs. + ''; package = mkOption { type = package; default = pkgs.okular; @@ -91,11 +91,11 @@ in { }; extraLuaSettings = mkOption { - type = str; - default = ""; - example = '' - formatterLineLength = 80, - ''; + type = attrs; + default = {}; + example = { + formatterLineLength = 80; + }; description = '' For any options that do not have options provided through nvf this can be used to add them. Options already declared in nvf config will NOT be overridden. @@ -119,97 +119,47 @@ in { config = mkIf (cfg.enable && (cfg.lsp.texlab.enable)) ( let - tl = cfg.lsp.texlab; - builder = cfg.build.builder; + # ----- Setup Config ----- + # Command to start the LSP + setupConfig.cmd = ["${texlabCfg.package}/bin/texlab"]; - listToLua = list: nullOnEmpty: - if length list == 0 - then - if nullOnEmpty - then "null" - else "{ }" - else "{ ${concatStringsSep ", " (map (x: ''"${toString x}"'') list)} }"; - - stringToLua = string: nullOnEmpty: - if string == "" - then - if nullOnEmpty - then "null" - else "" - else ''"${string}"''; - - boolToLua = boolean: - if boolean - then "true" - else "false"; - - # -- Build -- - buildConfig = let - # This function will sort through the builder options and count how many - # builders have been enabled. - getEnabledBuildersCount = { - enabledBuildersCount ? 0, - index ? 0, - builderNamesList ? ( - filter ( - x: let - y = cfg.build.builders.${x}; - in (isAttrs y && hasAttr "enable" y) - ) (attrNames cfg.build.builders) - ), - }: let - currentBuilderName = elemAt builderNamesList index; - currentBuilder = cfg.build.builders.${currentBuilderName}; - nextIndex = index + 1; - newEnabledBuildersCount = - if currentBuilder.enable - then enabledBuildersCount + 1 - else enabledBuildersCount; - in - if length builderNamesList > nextIndex - then - getEnabledBuildersCount { - inherit builderNamesList; - enabledBuildersCount = newEnabledBuildersCount; - index = nextIndex; - } - else newEnabledBuildersCount; - - enabledBuildersCount = getEnabledBuildersCount {}; - in - if enabledBuildersCount == 0 - then "" - else if enabledBuildersCount > 1 - then throw "Texlab does not support having more than 1 builders enabled!" - else '' - build = { - executable = "${builder.package}/bin/${builder.executable}", - args = ${listToLua builder.args false}, - forwardSearchAfter = ${boolToLua cfg.build.forwardSearchAfter}, - onSave = ${boolToLua cfg.build.onSave}, - useFileList = ${boolToLua cfg.build.useFileList}, - auxDirectory = ${stringToLua cfg.build.auxDirectory true}, - logDirectory = ${stringToLua cfg.build.logDirectory true}, - pdfDirectory = ${stringToLua cfg.build.pdfDirectory true}, - filename = ${stringToLua cfg.build.filename true}, - }, - ''; - in { - vim.lsp.lspconfig.sources.texlab = '' - lspconfig.texlab.setup { - cmd = { "${tl.package}/bin/texlab" }, - settings = { - texlab = { - ${buildConfig} - forwardSearch = { - executable = "${tl.forwardSearch.package}/bin/${tl.forwardSearch.executable}", - args = ${listToLua tl.forwardSearch.args true} - }, - ${tl.extraLuaSettings} - } + # Create texlab settings section + setupConfig.settings.texlab = ( + {} + # -- Forward Search -- + // ( + if texlabCfg.forwardSearch.enable + then { + forwardSearch = { + executable = "${texlabCfg.forwardSearch.package}/bin/${texlabCfg.forwardSearch.executable}"; + args = texlabCfg.forwardSearch.args; + }; } - } - ''; + else {} + ) + # -- Build -- + // ( + if cfg.build.enable + then { + build = { + executable = "${builderCfg.package}/bin/${builderCfg.executable}"; + args = builderCfg.args; + forwardSearchAfter = cfg.build.forwardSearchAfter; + onSave = cfg.build.onSave; + useFileList = cfg.build.useFileList; + auxDirectory = cfg.build.auxDirectory; + logDirectory = cfg.build.logDirectory; + pdfDirectory = cfg.build.pdfDirectory; + filename = cfg.build.filename; + }; + } + else {} + ) + # -- Extra -- + // texlabCfg.extraLuaSettings + ); + in { + vim.lsp.lspconfig.sources.texlab = "lspconfig.texlab.setup(${lib.nvim.lua.toLuaObject setupConfig})"; } ); }