mirror of
				https://github.com/NotAShelf/nvf.git
				synced 2025-10-31 02:52:37 +00:00 
			
		
		
		
	languages/html: add advanced support
Add advanced features to the `vim.languages.html` module, including lsp, formatting, and extra diagnostics.
This commit is contained in:
		
					parent
					
						
							
								f30d31c5ba
							
						
					
				
			
			
				commit
				
					
						2ab2669143
					
				
			
		
					 2 changed files with 112 additions and 3 deletions
				
			
		|  | @ -480,9 +480,14 @@ | ||||||
| [roslyn-ls]: https://github.com/dotnet/vscode-csharp | [roslyn-ls]: https://github.com/dotnet/vscode-csharp | ||||||
| [jsonls]: https://github.com/microsoft/vscode/tree/1.101.2/extensions/json-language-features/server | [jsonls]: https://github.com/microsoft/vscode/tree/1.101.2/extensions/json-language-features/server | ||||||
| [jsonfmt]: https://github.com/caarlos0/jsonfmt | [jsonfmt]: https://github.com/caarlos0/jsonfmt | ||||||
|  | [superhtml]: https://github.com/kristoff-it/superhtml | ||||||
|  | [htmlHTML]: https://github.com/htmlhint/HTMLHint | ||||||
| 
 | 
 | ||||||
| - Add just support under `vim.languages.just` using [just-lsp]. | - Add just support under `vim.languages.just` using [just-lsp]. | ||||||
| 
 | 
 | ||||||
| - Add [roslyn-ls] to the `vim.languages.csharp` module. | - Add [roslyn-ls] to the `vim.languages.csharp` module. | ||||||
| 
 | 
 | ||||||
| - Added json support under `vim.languages.json` using [jsonls] and [jsonfmt]. | - Added json support under `vim.languages.json` using [jsonls] and [jsonfmt]. | ||||||
|  | 
 | ||||||
|  | - Added advanced HTML support with [superhtml] for lsp and formatting and | ||||||
|  |   [htmlHINT] for diagnostics. | ||||||
|  |  | ||||||
|  | @ -4,14 +4,53 @@ | ||||||
|   lib, |   lib, | ||||||
|   ... |   ... | ||||||
| }: let | }: let | ||||||
|  |   inherit (builtins) attrNames; | ||||||
|  |   inherit (lib.meta) getExe; | ||||||
|   inherit (lib.options) mkEnableOption mkOption; |   inherit (lib.options) mkEnableOption mkOption; | ||||||
|   inherit (lib.modules) mkIf mkMerge; |   inherit (lib.modules) mkIf mkMerge; | ||||||
|   inherit (lib.types) bool; |   inherit (lib.types) bool enum package; | ||||||
|   inherit (lib.lists) optional; |   inherit (lib.lists) optional; | ||||||
|   inherit (lib.nvim.types) mkGrammarOption; |   inherit (lib.nvim.types) mkGrammarOption diagnostics singleOrListOf; | ||||||
|   inherit (lib.nvim.dag) entryAnywhere; |   inherit (lib.nvim.dag) entryAnywhere; | ||||||
|  |   inherit (lib.nvim.attrsets) mapListToAttrs; | ||||||
| 
 | 
 | ||||||
|   cfg = config.vim.languages.html; |   cfg = config.vim.languages.html; | ||||||
|  | 
 | ||||||
|  |   defaultServers = ["superhtml"]; | ||||||
|  |   servers = { | ||||||
|  |     superhtml = { | ||||||
|  |       cmd = [(getExe pkgs.superhtml) "lsp"]; | ||||||
|  |       filetypes = ["html" "shtml" "htm"]; | ||||||
|  |       root_markers = ["index.html" ".git"]; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   defaultFormat = "superhtml"; | ||||||
|  |   formats = { | ||||||
|  |     superhtml = { | ||||||
|  |       package = pkgs.writeShellApplication { | ||||||
|  |         name = "superhtml_fmt"; | ||||||
|  |         runtimeInputs = [pkgs.superhtml]; | ||||||
|  |         text = "superhtml fmt -"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  |    | ||||||
|  |   defaultDiagnosticsProvider = ["htmlhint"]; | ||||||
|  |   diagnosticsProviders = { | ||||||
|  |     htmlhint = { | ||||||
|  |       package = pkgs.htmlhint; | ||||||
|  |       nullConfig = pkg: '' | ||||||
|  |         table.insert( | ||||||
|  |           ls_sources, | ||||||
|  |           null_ls.builtins.diagnostics.htmlhint.with({ | ||||||
|  |             command = "${pkg}/bin/htmlhint" | ||||||
|  |           }) | ||||||
|  |         ) | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
| in { | in { | ||||||
|   options.vim.languages.html = { |   options.vim.languages.html = { | ||||||
|     enable = mkEnableOption "HTML language support"; |     enable = mkEnableOption "HTML language support"; | ||||||
|  | @ -24,6 +63,41 @@ in { | ||||||
|         default = true; |         default = true; | ||||||
|       }; |       }; | ||||||
|     }; |     }; | ||||||
|  | 
 | ||||||
|  |     lsp = { | ||||||
|  |       enable = mkEnableOption "HTML LSP support" // {default = config.vim.lsp.enable;}; | ||||||
|  |       servers = mkOption { | ||||||
|  |         type = singleOrListOf (enum (attrNames servers)); | ||||||
|  |         default = defaultServers; | ||||||
|  |         description = "HTML LSP server to use"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     format = { | ||||||
|  |       enable = mkEnableOption "HTML formatting" // {default = config.vim.languages.enableFormat;}; | ||||||
|  | 
 | ||||||
|  |       type = mkOption { | ||||||
|  |         description = "HTML formatter to use"; | ||||||
|  |         type = enum (attrNames formats); | ||||||
|  |         default = defaultFormat; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       package = mkOption { | ||||||
|  |         description = "HTML formatter package"; | ||||||
|  |         type = package; | ||||||
|  |         default = formats.${cfg.format.type}.package; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     extraDiagnostics = { | ||||||
|  |       enable = mkEnableOption "extra HTML diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;}; | ||||||
|  |        | ||||||
|  |       types = diagnostics { | ||||||
|  |         langDesc = "HTML"; | ||||||
|  |         inherit diagnosticsProviders; | ||||||
|  |         inherit defaultDiagnosticsProvider; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|   }; |   }; | ||||||
|      |      | ||||||
|   config = mkIf cfg.enable (mkMerge [ |   config = mkIf cfg.enable (mkMerge [ | ||||||
|  | @ -41,5 +115,35 @@ in { | ||||||
|         ''); |         ''); | ||||||
|       }; |       }; | ||||||
|     }) |     }) | ||||||
|  | 
 | ||||||
|  |     (mkIf cfg.lsp.enable { | ||||||
|  |       vim.lsp.servers =  | ||||||
|  |         mapListToAttrs (n: { | ||||||
|  |           name = n; | ||||||
|  |           value = servers.${n}; | ||||||
|  |         }) | ||||||
|  |         cfg.lsp.servers; | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     (mkIf (cfg.format.enable && !cfg.lsp.enable) { | ||||||
|  |       vim.formatter.conform-nvim = { | ||||||
|  |         enable = true; | ||||||
|  |         setupOpts.formatters_by_ft.html = [cfg.format.type]; | ||||||
|  |         setupOpts.formatters.${cfg.format.type} = { | ||||||
|  |           command = getExe cfg.format.package; | ||||||
|  |         }; | ||||||
|  |       }; | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     (mkIf cfg.extraDiagnostics.enable { | ||||||
|  |       vim.diagnostics.nvim-lint = { | ||||||
|  |         enable = true; | ||||||
|  |         linters_by_ft.html = cfg.extraDiagnostics.types; | ||||||
|  |         linters = mkMerge (map (name: { | ||||||
|  |           ${name}.cmd = getExe diagnosticsProviders.${name}.package; | ||||||
|  |         }) | ||||||
|  |         cfg.extraDiagnostics.types); | ||||||
|  |       }; | ||||||
|  |     }) | ||||||
|   ]); |   ]); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Cool-Game-Dev
				Cool-Game-Dev