mirror of
				https://github.com/NotAShelf/nvf.git
				synced 2025-10-31 11:02:37 +00:00 
			
		
		
		
	nvim util
This commit is contained in:
		
					parent
					
						
							
								c4bf1b63cc
							
						
					
				
			
			
				commit
				
					
						a45cd326ec
					
				
			
		
					 3 changed files with 180 additions and 1 deletions
				
			
		|  | @ -8,5 +8,6 @@ | |||
|     ./highlight.nix | ||||
|     ./lsp.nix | ||||
|     ./spellcheck.nix | ||||
|     ./util.nix | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
| 
 | ||||
|   cfg = config.vim.lsp; | ||||
| 
 | ||||
|   # TODO: lspConfigurations filter on enabledServers instead of cfg.servers? | ||||
|   lspConfigurations = | ||||
|     mapAttrsToList ( | ||||
|       name: value: '' | ||||
|  | @ -81,7 +82,6 @@ in { | |||
|     } | ||||
| 
 | ||||
|     (mkIf (cfg.servers != {}) { | ||||
|       # Enable lspconfig in order to merge in the predefined opts | ||||
|       vim.luaConfigRC.lsp-servers = entryAnywhere '' | ||||
|         -- Individual LSP configurations managed by nvf. | ||||
|         ${concatLines lspConfigurations} | ||||
|  |  | |||
							
								
								
									
										178
									
								
								modules/neovim/init/util.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								modules/neovim/init/util.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,178 @@ | |||
| { | ||||
|   config, | ||||
|   lib, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (builtins) filter; | ||||
|   inherit (lib.modules) mkIf mkMerge; | ||||
|   inherit (lib.nvim.dag) entryBefore; | ||||
| 
 | ||||
|   cfg = config.vim.lsp; | ||||
| in { | ||||
|   config = mkMerge [ | ||||
|     (mkIf (cfg.servers != {}) { | ||||
|       vim.luaConfigRC.lsp-util = | ||||
|         entryBefore ["lsp-servers"] | ||||
|         /* | ||||
|         lua | ||||
|         */ | ||||
|         '' | ||||
|           -- Port of nvim-lspconfig util | ||||
|           local util = { path = {} } | ||||
| 
 | ||||
|           util.default_config = { | ||||
|             log_level = vim.lsp.protocol.MessageType.Warning, | ||||
|             message_level = vim.lsp.protocol.MessageType.Warning, | ||||
|             settings = vim.empty_dict(), | ||||
|             init_options = vim.empty_dict(), | ||||
|             handlers = {}, | ||||
|             autostart = true, | ||||
|             capabilities = vim.lsp.protocol.make_client_capabilities(), | ||||
|           } | ||||
| 
 | ||||
|           -- global on_setup hook | ||||
|           util.on_setup = nil | ||||
| 
 | ||||
|           do | ||||
|             local validate = vim.validate | ||||
|             local api = vim.api | ||||
|             local lsp = vim.lsp | ||||
|             local nvim_eleven = vim.fn.has 'nvim-0.11' == 1 | ||||
| 
 | ||||
|             local iswin = vim.uv.os_uname().version:match 'Windows' | ||||
| 
 | ||||
|             local function escape_wildcards(path) | ||||
|               return path:gsub('([%[%]%?%*])', '\\%1') | ||||
|             end | ||||
| 
 | ||||
|             local function is_fs_root(path) | ||||
|               if iswin then | ||||
|                 return path:match '^%a:$' | ||||
|               else | ||||
|                 return path == '/' | ||||
|               end | ||||
|             end | ||||
| 
 | ||||
|             local function traverse_parents(path, cb) | ||||
|               path = vim.uv.fs_realpath(path) | ||||
|               local dir = path | ||||
|               -- Just in case our algo is buggy, don't infinite loop. | ||||
|               for _ = 1, 100 do | ||||
|                 dir = vim.fs.dirname(dir) | ||||
|                 if not dir then | ||||
|                   return | ||||
|                 end | ||||
|                 -- If we can't ascend further, then stop looking. | ||||
|                 if cb(dir, path) then | ||||
|                   return dir, path | ||||
|                 end | ||||
|                 if is_fs_root(dir) then | ||||
|                   break | ||||
|                 end | ||||
|               end | ||||
|             end | ||||
| 
 | ||||
|             util.root_pattern = function(...) | ||||
|               local patterns = util.tbl_flatten { ... } | ||||
|               return function(startpath) | ||||
|                 startpath = util.strip_archive_subpath(startpath) | ||||
|                 for _, pattern in ipairs(patterns) do | ||||
|                   local match = util.search_ancestors(startpath, function(path) | ||||
|                     for _, p in ipairs(vim.fn.glob(table.concat({ escape_wildcards(path), pattern }, '/'), true, true)) do | ||||
|                       if vim.uv.fs_stat(p) then | ||||
|                         return path | ||||
|                       end | ||||
|                     end | ||||
|                   end) | ||||
| 
 | ||||
|                   if match ~= nil then | ||||
|                     return match | ||||
|                   end | ||||
|                 end | ||||
|               end | ||||
|             end | ||||
| 
 | ||||
|             util.root_markers_with_field = function(root_files, new_names, field, fname) | ||||
|               local path = vim.fn.fnamemodify(fname, ':h') | ||||
|               local found = vim.fs.find(new_names, { path = path, upward = true }) | ||||
| 
 | ||||
|               for _, f in ipairs(found or {}) do | ||||
|                 -- Match the given `field`. | ||||
|                 for line in io.lines(f) do | ||||
|                   if line:find(field) then | ||||
|                     root_files[#root_files + 1] = vim.fs.basename(f) | ||||
|                     break | ||||
|                   end | ||||
|                 end | ||||
|               end | ||||
| 
 | ||||
|               return root_files | ||||
|             end | ||||
| 
 | ||||
|             util.insert_package_json = function(root_files, field, fname) | ||||
|               return util.root_markers_with_field(root_files, { 'package.json', 'package.json5' }, field, fname) | ||||
|             end | ||||
| 
 | ||||
|             util.strip_archive_subpath = function(path) | ||||
|               -- Matches regex from zip.vim / tar.vim | ||||
|               path = vim.fn.substitute(path, 'zipfile://\\(.\\{-}\\)::[^\\\\].*$', '\\1', ''') | ||||
|               path = vim.fn.substitute(path, 'tarfile:\\(.\\{-}\\)::.*$', '\\1', ''') | ||||
|               return path | ||||
|             end | ||||
| 
 | ||||
|             util.get_typescript_server_path = function(root_dir) | ||||
|               local project_roots = vim.fs.find('node_modules', { path = root_dir, upward = true, limit = math.huge }) | ||||
|               for _, project_root in ipairs(project_roots) do | ||||
|                 local typescript_path = project_root .. '/typescript' | ||||
|                 local stat = vim.loop.fs_stat(typescript_path) | ||||
|                 if stat and stat.type == 'directory' then | ||||
|                   return typescript_path .. '/lib' | ||||
|                 end | ||||
|               end | ||||
|               return ''' | ||||
|             end | ||||
| 
 | ||||
|             util.search_ancestors = function(startpath, func) | ||||
|               if nvim_eleven then | ||||
|                 validate('func', func, 'function') | ||||
|               end | ||||
|               if func(startpath) then | ||||
|                 return startpath | ||||
|               end | ||||
|               local guard = 100 | ||||
|               for path in vim.fs.parents(startpath) do | ||||
|                 -- Prevent infinite recursion if our algorithm breaks | ||||
|                 guard = guard - 1 | ||||
|                 if guard == 0 then | ||||
|                   return | ||||
|                 end | ||||
| 
 | ||||
|                 if func(path) then | ||||
|                   return path | ||||
|                 end | ||||
|               end | ||||
|             end | ||||
| 
 | ||||
|             util.path.is_descendant = function(root, path) | ||||
|               if not path then | ||||
|                 return false | ||||
|               end | ||||
| 
 | ||||
|               local function cb(dir, _) | ||||
|                 return dir == root | ||||
|               end | ||||
| 
 | ||||
|               local dir, _ = traverse_parents(path, cb) | ||||
| 
 | ||||
|               return dir == root | ||||
|             end | ||||
| 
 | ||||
|             util.tbl_flatten = function(t) | ||||
|               --- @diagnostic disable-next-line:deprecated | ||||
|               return nvim_eleven and vim.iter(t):flatten(math.huge):totable() or vim.tbl_flatten(t) | ||||
|             end | ||||
|           end | ||||
|         ''; | ||||
|     }) | ||||
|   ]; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 sjcobb
				sjcobb