mirror of
				https://github.com/NotAShelf/nvf.git
				synced 2025-10-26 09:20:08 +00:00 
			
		
		
		
	Merge pull request #142 from NotAShelf/bash-lsp
languages/bash: add LSP
This commit is contained in:
		
				commit
				
					
						6546362c55
					
				
			
		
					 7 changed files with 214 additions and 11 deletions
				
			
		|  | @ -72,6 +72,7 @@ inputs: let | ||||||
|         python.enable = isMaximal; |         python.enable = isMaximal; | ||||||
|         dart.enable = isMaximal; |         dart.enable = isMaximal; | ||||||
|         elixir.enable = false; |         elixir.enable = false; | ||||||
|  |         bash.enable = isMaximal; | ||||||
|       }; |       }; | ||||||
| 
 | 
 | ||||||
|       vim.visuals = { |       vim.visuals = { | ||||||
|  |  | ||||||
|  | @ -22,4 +22,11 @@ | ||||||
|         value = diagnostics.${type}.nullConfig package; |         value = diagnostics.${type}.nullConfig package; | ||||||
|       }) |       }) | ||||||
|       config); |       config); | ||||||
|  | 
 | ||||||
|  |   mkEnable = desc: | ||||||
|  |     lib.mkOption { | ||||||
|  |       description = "Turn on ${desc} for enabled languages by default"; | ||||||
|  |       type = lib.types.bool; | ||||||
|  |       default = false; | ||||||
|  |     }; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| {lib}: | {lib}: | ||||||
| with lib; let | with lib; let | ||||||
|   diagnosticSubmodule = {...}: { |   diagnosticSubmodule = _: { | ||||||
|     options = { |     options = { | ||||||
|       type = mkOption { |       type = mkOption { | ||||||
|         description = "Type of diagnostic to enable"; |         description = "Type of diagnostic to enable"; | ||||||
|  |  | ||||||
							
								
								
									
										114
									
								
								modules/languages/bash/bash.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								modules/languages/bash/bash.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,114 @@ | ||||||
|  | { | ||||||
|  |   pkgs, | ||||||
|  |   config, | ||||||
|  |   lib, | ||||||
|  |   ... | ||||||
|  | }: | ||||||
|  | with builtins; let | ||||||
|  |   inherit (lib) mkOption mkEnableOption types; | ||||||
|  | 
 | ||||||
|  |   cfg = config.vim.languages.bash; | ||||||
|  | 
 | ||||||
|  |   defaultServer = "bash-ls"; | ||||||
|  |   servers = { | ||||||
|  |     bash-ls = { | ||||||
|  |       package = pkgs.nodePackages.bash-language-server; | ||||||
|  |       lspConfig = '' | ||||||
|  |         lspconfig.bashls.setup{ | ||||||
|  |           capabilities = capabilities; | ||||||
|  |           on_attach = default_on_attach; | ||||||
|  |           cmd = ${ | ||||||
|  |           if isList cfg.lsp.package | ||||||
|  |           then nvim.lua.expToLua cfg.lsp.package | ||||||
|  |           else ''{"${cfg.lsp.package}/bin/bash-language-server",  "start"}'' | ||||||
|  |         }; | ||||||
|  |         } | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   defaultFormat = "shfmt"; | ||||||
|  |   formats = { | ||||||
|  |     shfmt = { | ||||||
|  |       package = pkgs.shfmt; | ||||||
|  |       nullConfig = '' | ||||||
|  |         table.insert( | ||||||
|  |           ls_sources, | ||||||
|  |           null_ls.builtins.formatting.shfmt.with({ | ||||||
|  |             command = "${pkgs.shfmt}/bin/shfmt", | ||||||
|  |           }) | ||||||
|  |         ) | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   defaultDiagnostics = ["shellcheck"]; | ||||||
|  |   diagnostics = { | ||||||
|  |     shellcheck = { | ||||||
|  |       package = pkgs.shellcheck; | ||||||
|  |       nullConfig = pkg: '' | ||||||
|  |         table.insert( | ||||||
|  |           ls_sources, | ||||||
|  |           null_ls.builtins.diagnostics.shellcheck.with({ | ||||||
|  |             command = "${pkg}/bin/shellcheck", | ||||||
|  |           }) | ||||||
|  |         ) | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | in { | ||||||
|  |   options.vim.languages.bash = { | ||||||
|  |     enable = mkEnableOption "Bash language support"; | ||||||
|  | 
 | ||||||
|  |     treesitter = { | ||||||
|  |       enable = mkEnableOption "Bash treesitter" // {default = config.vim.languages.enableTreesitter;}; | ||||||
|  |       package = lib.nvim.types.mkGrammarOption pkgs "bash"; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     lsp = { | ||||||
|  |       enable = mkEnableOption "Enable Bash LSP support" // {default = config.vim.languages.enableLSP;}; | ||||||
|  | 
 | ||||||
|  |       server = mkOption { | ||||||
|  |         description = "Bash LSP server to use"; | ||||||
|  |         type = with types; enum (attrNames servers); | ||||||
|  |         default = defaultServer; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       package = mkOption { | ||||||
|  |         description = "bash-language-server package, or the command to run as a list of strings"; | ||||||
|  |         example = lib.literalExpression ''[lib.getExe pkgs.nodePackages.bash-language-server "start"]''; | ||||||
|  |         type = with types; either package (listOf str); | ||||||
|  |         default = pkgs.nodePackages.bash-language-server; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     format = { | ||||||
|  |       enable = mkOption { | ||||||
|  |         description = "Enable Bash formatting"; | ||||||
|  |         type = types.bool; | ||||||
|  |         default = config.vim.languages.enableFormat; | ||||||
|  |       }; | ||||||
|  |       type = mkOption { | ||||||
|  |         description = "Bash formatter to use"; | ||||||
|  |         type = with types; enum (attrNames formats); | ||||||
|  |         default = defaultFormat; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       package = mkOption { | ||||||
|  |         description = "Bash formatter package"; | ||||||
|  |         type = types.package; | ||||||
|  |         default = formats.${cfg.format.type}.package; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     extraDiagnostics = { | ||||||
|  |       enable = mkEnableOption "extra Bash diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;}; | ||||||
|  | 
 | ||||||
|  |       types = lib.nvim.types.diagnostics { | ||||||
|  |         langDesc = "Bash"; | ||||||
|  |         inherit diagnostics; | ||||||
|  |         inherit defaultDiagnostics; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										80
									
								
								modules/languages/bash/config.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								modules/languages/bash/config.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,80 @@ | ||||||
|  | { | ||||||
|  |   pkgs, | ||||||
|  |   config, | ||||||
|  |   lib, | ||||||
|  |   ... | ||||||
|  | }: | ||||||
|  | with lib; | ||||||
|  | with builtins; let | ||||||
|  |   cfg = config.vim.languages.bash; | ||||||
|  |   diagnostics = { | ||||||
|  |     shellcheck = { | ||||||
|  |       package = pkgs.shellcheck; | ||||||
|  |       nullConfig = pkg: '' | ||||||
|  |         table.insert( | ||||||
|  |           ls_sources, | ||||||
|  |           null_ls.builtins.diagnostics.shellcheck.with({ | ||||||
|  |             command = "${pkg}/bin/shellcheck", | ||||||
|  |           }) | ||||||
|  |         ) | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   formats = { | ||||||
|  |     shfmt = { | ||||||
|  |       package = pkgs.shfmt; | ||||||
|  |       nullConfig = '' | ||||||
|  |         table.insert( | ||||||
|  |           ls_sources, | ||||||
|  |           null_ls.builtins.formatting.shfmt.with({ | ||||||
|  |             command = "${pkgs.shfmt}/bin/shfmt", | ||||||
|  |           }) | ||||||
|  |         ) | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   servers = { | ||||||
|  |     bash-ls = { | ||||||
|  |       package = pkgs.nodePackages.bash-language-server; | ||||||
|  |       lspConfig = '' | ||||||
|  |         lspconfig.bashls.setup{ | ||||||
|  |           capabilities = capabilities; | ||||||
|  |           on_attach = default_on_attach; | ||||||
|  |           cmd = ${ | ||||||
|  |           if isList cfg.lsp.package | ||||||
|  |           then nvim.lua.expToLua cfg.lsp.package | ||||||
|  |           else ''{"${cfg.lsp.package}/bin/bash-language-server",  "start"}'' | ||||||
|  |         }; | ||||||
|  |         } | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | in { | ||||||
|  |   config = mkIf cfg.enable (mkMerge [ | ||||||
|  |     (mkIf cfg.treesitter.enable { | ||||||
|  |       vim.treesitter.enable = true; | ||||||
|  |       vim.treesitter.grammars = [cfg.treesitter.package]; | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     (mkIf cfg.lsp.enable { | ||||||
|  |       vim.lsp.lspconfig.enable = true; | ||||||
|  |       vim.lsp.lspconfig.sources.bash-lsp = servers.${cfg.lsp.server}.lspConfig; | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     (mkIf cfg.format.enable { | ||||||
|  |       vim.lsp.null-ls.enable = true; | ||||||
|  |       vim.lsp.null-ls.sources.bash-format = formats.${cfg.format.type}.nullConfig; | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     (mkIf cfg.extraDiagnostics.enable { | ||||||
|  |       vim.lsp.null-ls.enable = true; | ||||||
|  |       vim.lsp.null-ls.sources = lib.nvim.languages.diagnosticsToLua { | ||||||
|  |         lang = "bash"; | ||||||
|  |         config = cfg.extraDiagnostics.types; | ||||||
|  |         inherit diagnostics; | ||||||
|  |       }; | ||||||
|  |     }) | ||||||
|  |   ]); | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								modules/languages/bash/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								modules/languages/bash/default.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | _: { | ||||||
|  |   imports = [ | ||||||
|  |     ./bash.nix | ||||||
|  |     ./config.nix | ||||||
|  |   ]; | ||||||
|  | } | ||||||
|  | @ -1,17 +1,12 @@ | ||||||
| {lib, ...}: | {lib, ...}: let | ||||||
| with lib; let |   inherit (lib.nvim.languages) mkEnable; | ||||||
|   mkEnable = desc: |  | ||||||
|     mkOption { |  | ||||||
|       description = "Turn on ${desc} for enabled languages by default"; |  | ||||||
|       type = types.bool; |  | ||||||
|       default = false; |  | ||||||
|     }; |  | ||||||
| in { | in { | ||||||
|   imports = [ |   imports = [ | ||||||
|     ./markdown |     ./markdown | ||||||
|     ./tidal |     ./tidal | ||||||
|     ./dart |     ./dart | ||||||
|     ./elixir |     ./elixir | ||||||
|  |     ./bash | ||||||
| 
 | 
 | ||||||
|     ./clang.nix |     ./clang.nix | ||||||
|     ./go.nix |     ./go.nix | ||||||
|  | @ -31,8 +26,8 @@ in { | ||||||
|   options.vim.languages = { |   options.vim.languages = { | ||||||
|     enableLSP = mkEnable "LSP"; |     enableLSP = mkEnable "LSP"; | ||||||
|     enableDAP = mkEnable "Debug Adapter"; |     enableDAP = mkEnable "Debug Adapter"; | ||||||
|     enableTreesitter = mkEnable "treesitter"; |     enableTreesitter = mkEnable "Treesitter"; | ||||||
|     enableFormat = mkEnable "formatting"; |     enableFormat = mkEnable "Formatting"; | ||||||
|     enableExtraDiagnostics = mkEnable "extra diagnostics"; |     enableExtraDiagnostics = mkEnable "extra diagnostics"; | ||||||
|   }; |   }; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 GitHub
					GitHub