Repository: neovim/neovim
File: runtime/lua/vim/ui.lua (Lua)

Code before:
    return { 'cmd.exe', '/c', 'start', '' }, nil
  elseif vim.fn.executable('xdg-open') == 1 then
    return { 'xdg-open' }, nil
  elseif vim.fn.executable('wslview') == 1 then
    return { 'wslview' }, nil
  elseif vim.fn.executable('explorer.exe') == 1 then
    return { 'explorer.exe' }, nil
  elseif vim.fn.executable('lemonade') == 1 then
    return { 'lemonade', 'open' }, nil
  else
    return nil, 'vim.ui.open: no handler found (tried: wslview, explorer.exe, xdg-open, lemonade)'
  end
end

--- Returns all URLs at cursor, if any.
--- @return string[]
function M._get_urls()
  local urls = {} ---@type string[]

  local bufnr = vim.api.nvim_get_current_buf()
  local cursor = vim.api.nvim_win_get_cursor(0)
  local row = cursor[1] - 1
  local col = cursor[2]

  local params = { textDocument = vim.lsp.util.make_text_document_params(bufnr) }
  local results = vim.lsp.buf_request_sync(bufnr, 'textDocument/documentLink', params)

  for client_id, result in pairs(results or {}) do
    if result.error then
      vim.lsp.log.error(result.error)
    else
      local client = assert(vim.lsp.get_client_by_id(client_id))
      local position = vim.lsp.util.make_position_params(0, client.offset_encoding).position
      ---@param document_link lsp.DocumentLink
      local link = vim.iter(result.result):find(function(document_link)
        local range = document_link.range
        return (position.line > range.start.line and position.line < range['end'].line)
          or (position.line == range.start.line and position.character >= range.start.character)
          or (position.line == range['end'].line and position.character <= range['end'].character)
      end)

      if link then
        ---@type string
        local target = link.target
        if vim.startswith(target, 'file://') then
          target = vim.uri_to_fname(target)
        end
        table.insert(urls, target)
      end
    end
  end

Review comment (suggestion):
could this one be treated like document color? decoration with links encoded as `url` in the extmark?

then no code needed here: existing code for "gx" would just work, and the links could also be opened in the terminal via osc 8.

Code after:
    return { 'cmd.exe', '/c', 'start', '' }, nil
  elseif vim.fn.executable('xdg-open') == 1 then
    return { 'xdg-open' }, nil
  elseif vim.fn.executable('wslview') == 1 then
    return { 'wslview' }, nil
  elseif vim.fn.executable('explorer.exe') == 1 then
    return { 'explorer.exe' }, nil
  elseif vim.fn.executable('lemonade') == 1 then
    return { 'lemonade', 'open' }, nil
  else
    return nil, 'vim.ui.open: no handler found (tried: wslview, explorer.exe, xdg-open, lemonade)'
  end
end

--- Returns all URLs at cursor, if any.
--- @return string[]
function M._get_urls()
  local urls = {} ---@type string[]

  local bufnr = vim.api.nvim_get_current_buf()
  local cursor = vim.api.nvim_win_get_cursor(0)
  local row = cursor[1] - 1
  local col = cursor[2]

  -- Find LSP document links under the cursor.
  local params = { textDocument = vim.lsp.util.make_text_document_params(bufnr) }
  local results = vim.lsp.buf_request_sync(bufnr, 'textDocument/documentLink', params)

  for client_id, result in pairs(results or {}) do
    if result.error then
      vim.lsp.log.error(result.error)
    else
      local client = assert(vim.lsp.get_client_by_id(client_id))
      local lsp_position = vim.lsp.util.make_position_params(0, client.offset_encoding).position
      local position = vim.pos.lsp(bufnr, lsp_position, client.offset_encoding)

      local document_links = result.result or {} ---@type lsp.DocumentLink[]
      for _, document_link in ipairs(document_links) do
        local range = vim.range.lsp(bufnr, document_link.range, client.offset_encoding)
        if document_link.target and range:has(position) then
          local target = document_link.target ---@type string
          if vim.startswith(target, 'file://') then
            target = vim.uri_to_fname(target)
          end
          table.insert(urls, target)
        end
      end
    end
  end

  local extmarks = vim.api.nvim_buf_get_extmarks(bufnr, -1, { row, col }, { row, col }, {