Понял, задача — сделать процесс создания классов в Java максимально автоматизированным, чтобы он не требовал ручного ввода путей и минимизировал количество действий, как это реализовано в IntelliJ IDEA. Попробуем усовершенствовать процесс.

Решение с помощью nvim-jdtls

Плагин nvim-jdtls на самом деле поддерживает возможность создания классов и интерфейсов, аналогичную IntelliJ, но для этого нужно задействовать встроенные функции сервера jdtls.

1. Команда для создания Java класса через LSP

jdtls предоставляет возможность вызывать стандартные команды LSP, включая создание классов и интерфейсов. Мы можем использовать функционал, встроенный в jdtls, чтобы сделать это.

Попробуйте следующее:

  1. Создание команды LSP для нового класса или интерфейса

    Добавьте в вашу конфигурацию Lua следующее:

    local jdtls = require('jdtls')
    
    -- Функция для создания нового класса
    function CreateJavaClass()
      local class_name = vim.fn.input('Class Name: ')
      local params = {
        command = 'java.project.new',
        arguments = { 'class', class_name }
      }
      jdtls.execute_command(params)
    end
    
    -- Функция для создания нового интерфейса
    function CreateJavaInterface()
      local interface_name = vim.fn.input('Interface Name: ')
      local params = {
        command = 'java.project.new',
        arguments = { 'interface', interface_name }
      }
      jdtls.execute_command(params)
    end
    
    -- Привязка команд к клавишам
    vim.api.nvim_set_keymap('n', '<leader>jc', ':lua CreateJavaClass()<CR>', { noremap = true, silent = true })
    vim.api.nvim_set_keymap('n', '<leader>ji', ':lua CreateJavaInterface()<CR>', { noremap = true, silent = true })
    
  2. Настройка правильного расположения файла
    Чтобы файл создавался в нужном пакете, рекомендуется использовать функцию java.project.new с корректной настройкой root_dir и структуры проекта.

2. Настройка структуры проекта

Чтобы это работало корректно, структура вашего проекта должна быть правильно определена:

  • root_dir должен быть установлен на корень проекта (там, где находится pom.xml или build.gradle).
  • Убедитесь, что jdtls понимает, где ваш корень проекта. Это можно сделать с помощью настройки:
    1
    2
    3
    4
    5
    local config = {
      cmd = { 'java-lsp.sh' },
      root_dir = require('jdtls.setup').find_root({'.git', 'mvnw', 'gradlew', 'pom.xml'}),
      ...
    }
    

3. Использование nvim-telescope для выбора пакета

Для удобного выбора пакета можно использовать Telescope в связке с командой создания класса:

  1. Установите telescope-file-browser.nvim:
    1
    2
    3
    4
    use {
      'nvim-telescope/telescope-file-browser.nvim',
      requires = { 'nvim-telescope/telescope.nvim', 'nvim-lua/plenary.nvim' }
    }
    
  2. Настройте Telescope для поиска по пакетам и создания класса в нужном месте:
    require('telescope').load_extension('file_browser')
    
    function CreateClassWithPackage()
      require('telescope').extensions.file_browser.file_browser {
        path = 'src/main/java',
        prompt_title = 'Select Package',
        attach_mappings = function(_, map)
          map('i', '<CR>', function(prompt_bufnr)
            local package_path = require('telescope.actions.state').get_selected_entry().path
            local class_name = vim.fn.input('Class Name: ')
            local file_path = package_path .. '/' .. class_name .. '.java'
    
            -- Создание нового файла класса
            local file = io.open(file_path, 'w')
            file:write('package ' .. package_path:gsub('src/main/java/', ''):gsub('/', '.') .. ';\n\n')
            file:write('public class ' .. class_name .. ' {\n\n')
            file:write('}\n')
            file:close()
    
            vim.cmd('e ' .. file_path)
            require('telescope.actions').close(prompt_bufnr)
          end)
          return true
        end
      }
    end
    
    vim.api.nvim_set_keymap('n', '<leader>jc', ':lua CreateClassWithPackage()<CR>', { noremap = true, silent = true })
    

Теперь комбинация клавиш откроет окно Telescope, где можно выбрать нужный пакет, после чего в выбранном пакете создастся Java класс.

Итог

Эти шаги позволят вам автоматически создавать файлы классов и интерфейсов в нужном пакете без ручного ввода путей. Если вас интересует более глубокая интеграция, например, с возможностью использовать шаблоны классов или интерфейсов, дайте знать — это тоже можно реализовать с помощью дополнительных Lua-скриптов.

Edit Report
Pub: 25 Oct 2024 06:35 UTC
Views: 42