return {
  'johmsalas/text-case.nvim',
  config = function()
    local textcase = require('textcase')
    require("telescope").load_extension("textcase")
    textcase.setup({
      default_keymappings_enabled = false,
      enable_methods = {
        'to_upper_case',
        'to_lower_case',
        'to_snake_case',
        'to_dash_case',
        'to_title_dash_case',
        'to_constant_case',
        'to_dot_case',
        'to_phrase_case',
        'to_camel_case',
        'to_pascal_case',
        'to_title_case',
        'to_path_case',
        'to_upper_phrase_case',
        'to_lower_phrase_case',
      },
    })

    local changes = {
      -- 'to_upper_case',
      -- 'to_lower_case',
      { type = 'to_snake_case',      keys = 's',  lsp = true },
      { type = 'to_dash_case',       keys = '-',  lsp = false },
      { type = 'to_title_dash_case', keys = 't-', lsp = false },
      { type = 'to_constant_case',   keys = 'u',  lsp = true },
      { type = 'to_dot_case',        keys = '.',  lsp = false },
      -- 'to_phrase_case',
      { type = 'to_camel_case',      keys = 'c',  lsp = true },
      { type = 'to_pascal_case',     keys = 'm',  lsp = true },
      -- 'to_title_case',
      { type = 'to_path_case',       keys = '/',  lsp = false },
      -- 'to_upper_phrase_case',
      -- 'to_lower_phrase_case',
    }

    for _, change in ipairs(changes) do
      -- normal mode current word
      vim.keymap.set('n', 'cr' .. change.keys, function()
        textcase.current_word(change.type)
      end, { noremap = true })

      -- normal mode lsp rename
      if change.lsp then
        vim.keymap.set('n', 'cr' .. string.upper(change.keys), function()
          textcase.lsp_rename(change.type)
        end, { noremap = true })
      end

      -- visual mode selection
      vim.keymap.set('v', 'T' .. string.upper(change.keys), function()
        textcase.visual(change.type)
      end, { noremap = true })
    end
  end
}