Wansmer / langmapper.nvim

A plugin that makes Neovim more friendly to non-English input methods 🤝
MIT License
128 stars 7 forks source link

Delay in insert mode when leader key is space #15

Closed andvarfolomeev closed 1 year ago

andvarfolomeev commented 1 year ago

Plugin works great when leader key is not space. Otherwise, there is a delay.

In addition, I can say that when you press the space in insert mode, a window of which-key plugin appears. You can see it on the screenshot.

image

Following Which-key settings:

{
  'folke/which-key.nvim',
  enabled = true,
  keys = { '<leader>', '[', ']', 's' },
  dependencies = { 'wansmer/langmapper.nvim' },
  config = function()
    vim.o.timeout = true
    vim.o.timeoutlen = 300
    local lmu = require('langmapper.utils')
    local view = require('which-key.view')
    local execute = view.execute

    -- wrap `execute()` and translate sequence back
    view.execute = function(prefix_i, mode, buf)
      -- translate back to english characters
      prefix_i = lmu.translate_keycode(prefix_i, 'default', 'ru')
      execute(prefix_i, mode, buf)
    end

    -- if you want to see translated operators, text objects and motions in
    -- which-key prompt
    -- local presets = require('which-key.plugins.presets')
    -- presets.operators = lmu.trans_dict(presets.operators)
    -- presets.objects = lmu.trans_dict(presets.objects)
    -- presets.motions = lmu.trans_dict(presets.motions)
    -- etc

    require('which-key').setup()
  end,
}

Following langmapper settings:

{
  'Wansmer/langmapper.nvim',
  lazy = false,
  priority = 1, -- High priority is needed if you will use `autoremap()`
  config = function()
    require('langmapper').setup({})
  end,
}
andvarfolomeev commented 1 year ago

I found recipe to avoid which-key, but delay is staying anyway

vim.api.nvim_create_autocmd('VimEnter', {
  desc = 'Translate global keybindings',
  callback = function()
    local ok, lm = pcall(require, 'langmapper')
    if ok then
      lm.automapping({ buffer = false })
    end
  end,
})
Wansmer commented 1 year ago

The delay in insert mode is not because of `langmapper', but because you have insert mode mappings that start with a space. (By the way, the leader key is not normally used for insert mode mappings and command line mode mappings).

Disable langmapper and check - the delay remains.

The which-key window probably appears in insert mode for the same reason.

andvarfolomeev commented 1 year ago

I runned following commands without langmapper and with.

:redir! > vim_keys.txt
:imap
:redir END

Without langmapper:


i  <C-Space>   * <Lua 331: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <Up>        * <Lua 329: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-N>       * <Lua 327: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <Down>      * <Lua 325: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-K>       * <Lua 322: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-P>       * <Lua 318: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-J>       * <Lua 315: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-Y>       * <Lua 313: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <S-Tab>     * <Lua 310: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-E>       * <Lua 308: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-D>       * <Lua 69: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <Plug>(vsnip-jump-prev) * <Esc>:<C-U>call <SNR>29_jump(-1)<CR>
i  <Plug>(vsnip-jump-next) * <Esc>:<C-U>call <SNR>29_jump(1)<CR>
i  <Plug>(vsnip-expand) * <Esc>:<C-U>call <SNR>29_expand()<CR>
i  <Plug>(vsnip-expand-or-jump) * <Esc>:<C-U>call <SNR>29_expand_or_jump()<CR>
i  <BS>        * v:lua.MiniPairs.bs()
                 MiniPairs <BS>
i  <C-W>       * <C-G>u<C-W>
                 Nvim builtin
i  <C-U>       * <Lua 304: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <Tab>       * <Lua 307: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <CR>        * <Lua 320: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  "           * v:lua.MiniPairs.closeopen('""', "[^\\].")
                 Closeopen action for '""' pair
i  '           * v:lua.MiniPairs.closeopen("''", "[^%a\\].")
                 Closeopen action for "''" pair
i  (           * v:lua.MiniPairs.open("()", "[^\\].")
                 Open action for "()" pair
i  )           * v:lua.MiniPairs.close("()", "[^\\].")
                 Close action for "()" pair
i  [           * v:lua.MiniPairs.open("[]", "[^\\].")
                 Open action for "[]" pair
i  ]           * v:lua.MiniPairs.close("[]", "[^\\].")
                 Close action for "[]" pair
i  `           * v:lua.MiniPairs.closeopen("``", "[^\\].")
                 Closeopen action for "``" pair
i  {           * v:lua.MiniPairs.open("{}", "[^\\].")
                 Open action for "{}" pair
i  }           * v:lua.MiniPairs.close("{}", "[^\\].")
                 Close action for "{}" pair

With langmapper:

i  <S-Tab>     * <Lua 958: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-Space>   * <Lua 1176: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <Down>      * <Lua 268: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <Up>        * <Lua 1223: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <BS>        * v:lua.MiniPairs.bs()
                 MiniPairs <BS>
i  <Plug>(vsnip-jump-prev) * <Esc>:<C-U>call <SNR>29_jump(-1)<CR>
i  <Plug>(vsnip-jump-next) * <Esc>:<C-U>call <SNR>29_jump(1)<CR>
i  <Plug>(vsnip-expand) * <Esc>:<C-U>call <SNR>29_expand()<CR>
i  <Plug>(vsnip-expand-or-jump) * <Esc>:<C-U>call <SNR>29_expand_or_jump()<CR>
i  <C-ю>       * <Lua 442: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-.>")
i  <C-б>       * <Lua 436: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-,>")
i  <C-ь>       * <Lua 430: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-m>")
i  <C-т>       * <Lua 1177: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-и>       * <Lua 418: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-b>")
i  <C-м>       * <Lua 412: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-v>")
i  <C-с>       * <Lua 406: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-c>")
i  <C-ч>       * <Lua 400: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-x>")
i  <C-я>       * <Lua 394: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-z>")
i  <C-э>       * <Lua 388: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-'>")
i  <C-ж>       * <Lua 382: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-;>")
i  <C-д>       * <Lua 376: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-l>")
i  <C-л>       * <Lua 370: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-k>")
i  <C-о>       * <Lua 364: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-j>")
i  <C-р>       * <Lua 358: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-h>")
i  <C-п>       * <Lua 352: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-g>")
i  <C-а>       * <Lua 346: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-f>")
i  <C-в>       * <Lua 1174: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-ы>       * <Lua 334: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-s>")
i  <C-ф>       * <Lua 328: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-a>")
i  <C-ъ>       * <Lua 322: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-]>")
i  <C-х>       * <Lua 316: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-[>")
i  <C-з>       * <Lua 1190: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-щ>       * <Lua 304: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-o>")
i  <C-ш>       * <Lua 298: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-i>")
i  <C-г>       * <Lua 1218: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-н>       * <Lua 1193: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-е>       * <Lua 280: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-t>")
i  <C-к>       * <Lua 274: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-r>")
i  <C-у>       * <Lua 1188: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <C-ц>       * <Lua 262: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-w>")
i  <C-й>       * <Lua 256: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-q>")
i  <C-ё>       * <Lua 250: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-`>")
i  <C-Ю>       * <Lua 244: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C->>")
i  <C-Б>       * <Lua 238: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-<>")
i  <C-Э>       * <Lua 232: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-">")
i  <C-Ж>       * <Lua 226: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-:>")
i  <C-Ъ>       * <Lua 220: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-}>")
i  <C-Х>       * <Lua 214: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-{>")
i  <C-Ë>       * <Lua 208: ~/.local/share/nvim/lazy/langmapper.nvim/lua/langmapper/utils.lua:188>
                 LM (feedkeys "<C-~>")
i  <C-W>       * <C-G>u<C-W>
                 Nvim builtin
i  <C-U>       * <C-G>u<C-U>
                 Nvim builtin
i  <Tab>       * <Lua 1243: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <CR>        * <Lua 1178: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <Space>з    * <Lua 1180: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <Space>ры   * <Lua 1182: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  <Space>рк   * <Lua 1192: ~/.local/share/nvim/lazy/nvim-cmp/lua/cmp/utils/keymap.lua:127>
                 cmp.utils.keymap.set_map
i  "           * v:lua.MiniPairs.closeopen('""', "[^\\].")
                 Closeopen action for '""' pair
i  '           * v:lua.MiniPairs.closeopen("''", "[^%a\\].")
                 Closeopen action for "''" pair
i  (           * v:lua.MiniPairs.open("()", "[^\\].")
                 Open action for "()" pair
i  )           * v:lua.MiniPairs.close("()", "[^\\].")
                 Close action for "()" pair
i  [           * v:lua.MiniPairs.open("[]", "[^\\].")
                 Open action for "[]" pair
i  ]           * v:lua.MiniPairs.close("[]", "[^\\].")
                 Close action for "[]" pair
i  `           * v:lua.MiniPairs.closeopen("``", "[^\\].")
                 Closeopen action for "``" pair
i  {           * v:lua.MiniPairs.open("{}", "[^\\].")
                 Open action for "{}" pair
i  }           * v:lua.MiniPairs.close("{}", "[^\\].")
                 Close action for "{}" pair

As you can see Additional mappings in insert mode appears when langmapper and cmp is enabled. Later I will try to find reason

Wansmer commented 1 year ago

Unfortunately, I can't reproduce these bugs in insert mode. Also, when outputting imap I don't have <space>з, <space>ры and <space>рк registered by nvim-cmp.

Maybe you have some additional bindings in the cmp config?

If you find the problem, please, let me know.

andvarfolomeev commented 1 year ago

The reason of this behavior is my options of cmp plugin. In particular, It is mappings (<Tab>, S-<Tab>, <C-j>, <C-k>).

But I tried your cmp configuration and I get the same behavior. You can try to reproduce the bug. Add this mapping to your config. Note that the delay happens when leader is space and map in visual mode.

map({ 'v' }, '<leader>y', [["+y]], { desc = 'Yank to system clipboard', noremap = false })
    opts = function()
      local has_words_before = function()
        unpack = unpack or table.unpack
        local line, col = unpack(vim.api.nvim_win_get_cursor(0))
        return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match('%s') == nil
      -- end
      local feedkey = function(key, mode)
        vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true)
      end
      local cmp = require('cmp')
      local lspkind = require('lspkind')
      return {
        snippet = {
          expand = function(args)
            vim.fn['vsnip#anonymous'](args.body)
          end,
        },
        window = {
          completion = {
            winhighlight = 'Normal:Pmenu,FloatBorder:Pmenu,Search:None',
            scrollbar = true,
            col_offset = -3,
            side_padding = 0,
          },
          documentation = {
            winhighlight = 'Normal:CmpDoc',
          },
        },
        performance = {
          debounce = 50,
          fetching_timeout = 100,
        },
        mapping = {
          ['<C-u>'] = cmp.mapping.scroll_docs(-4),
          ['<C-d>'] = cmp.mapping.scroll_docs(4),
          ['<C-Space>'] = cmp.mapping.complete(),
          ['<C-e>'] = cmp.mapping.abort(),
          ['<CR>'] = cmp.mapping.confirm({ select = true }),
          ['<Tab>'] = cmp.mapping(function(fallback)
            if cmp.visible() then
              cmp.select_next_item()
            elseif has_words_before() then
              cmp.complete()
            else
              fallback()
            end
          end, { 'i', 's' }),
          ['<S-Tab>'] = cmp.mapping(function()
            if cmp.visible() then
              cmp.select_prev_item()
            end
          end, { 'i', 's' }),
          ['<C-j>'] = cmp.mapping(function(fallback)
            if vim.fn['vsnip#available'](1) == 1 then
              feedkey('<Plug>(vsnip-expand-or-jump)', '')
            else
              --fallback()
            end
          end, { 'i', 's' }),
          ['<C-k>'] = cmp.mapping(function()
            if vim.fn['vsnip#jumpable'](-1) == 1 then
              feedkey('<Plug>(vsnip-jump-prev)', '')
            end
          end, { 'i', 's' }),
        },

        sorting = {
          priority_weight = 2,
          comparators = {
            cmp.config.compare.offset,
            cmp.config.compare.exact,
            cmp.config.compare.score,
            cmp.config.compare.recently_used,
            cmp.config.compare.locality,
            cmp.config.compare.kind,
            cmp.config.compare.length,
            cmp.config.compare.order,
          },
        },
        sources = cmp.config.sources({
          -- { name = 'nvim_lsp' },
          -- { name = 'vsnip' },
          -- { name = 'path' },
          -- { name = 'nvim_lsp_signature_help' },
        }),
        formatting = {
          fields = { 'kind', 'abbr', 'menu' },
          format = function(entry, vim_item)
            local kind = lspkind.cmp_format({
              mode = 'symbol_text',
              maxwidth = 50,
            })(entry, vim_item)
            local strings = vim.split(kind.kind, '%s', { trimempty = true })
            kind.kind = ' ' .. (strings[1] or '') .. ' '
            kind.menu = '    (' .. (strings[2] or '') .. ')'

            return kind
          end,
        },
      }
    end
Wansmer commented 1 year ago

I think I figured out what the problem is: try calling require('langmapper').hack_get_keymap() after the plugin setup - should help.

https://github.com/Wansmer/langmapper.nvim/issues/8#issuecomment-1529142210

andvarfolomeev commented 1 year ago

Yes, It's work! Thanks