tmsvg / pear-tree

A Vim auto-pair plugin that supports multi-character pairs, intelligent matching, and more
MIT License
391 stars 12 forks source link

Breaks other plugins that map <CR> in insert mode #33

Open sodapopcan opened 5 years ago

sodapopcan commented 5 years ago

...specifically, endwise.vim, a vital plugin for languages like ruby and viml that use end (and its variants) to close code blocks.

A quickfix is to change:

imap <buffer> <CR> <Plug>(PearTreeExpand)

to

exec "imap <buffer> <CR> ".maparg("<CR>", "i")."<Plug>(PearTreeExpand)"

...though this adds an extra blank line, for example, typing def foo<CR>hi! produces:

def foo

  hi!
end

...so this isn't a full solution.

This plugin, along with its great config, is the only one of its type that actually does what I want so I'm pretty invested in resolving this! I'd be happy to take it on myself I wanted to file an issue first to get your thoughts and see if you'd even be amenable to a PR.

jonsmithers commented 5 years ago

It looks like the extra newline is coming from endwise's <cr> mapping.

maparg("<CR>", "i") == '<CR><Plug>DiscretionaryEnd'

You could just omit this by changing maparg("<CR>", "i") to substitute(maparg('<CR>', 'i'), '<CR>', '', '')

[update] .......except that won't work because vim-endwise wants to be invoked after <CR>. One alternative bad idea is to explicitly invoke EndwiseDiscretionary() inside of <Plug>(PearTreeExpand), after <CR>.

So instead of

  return "\<CR>"

we could do

  if exists('*EndwiseDiscretionary')
    return "\<CR>\<C-R>=EndwiseDiscretionary()\<CR>"
  else
    return "\<CR>"
  endif
tmsvg commented 4 years ago

Hello! It appears that putting imap <CR> <Plug>(PearTreeExpand)<Plug>DiscretionaryEnd in my vimrc fixes this. I don't normally use Endwise, so let me know if this misses something.

I don't really like the idea of having plugin-specific compatibility code in Pear Tree, so if putting the above in your vimrc does work, I would consider that the official solution.

wookayin commented 4 years ago

This plugin (or precisely the imap ) also breaks vim-clap. Is there any general solution that is agnostic of other plugins but preserves the mapping chian?

JoosepAlviste commented 4 years ago

Since Pear Tree isn't really useful in vim-clap's popup I disabled Pear Tree in that filetype:

let g:pear_tree_ft_disabled = ['clap_input']

But that kind of an approach only works for some use cases though.

jounathaen commented 4 years ago

Well, just to add something to the list of stuff that breaks with the <CR> mapping: I use it to select the completion in the ncm2 window or jump between neosnippets fields.

jounathaen commented 4 years ago

I think I have solve my mapping issue for neosnippet and ncm2 with the following mappings:

let g:pear_tree_map_special_keys = 0
imap <BS> <Plug>(PearTreeBackspace)
imap <Esc> <Plug>(PearTreeFinishExpansion)
imap <expr><CR> neosnippet#expandable_or_jumpable() ?
      \ "\<Plug>(neosnippet_expand_or_jump)" : "\<Plug>(PearTreeExpand)"
adworacz commented 3 years ago

For anyone using this is coc.nvim, here's how I got the autocomplete window to work properly with PearTreeExpand (much thanks to jounathaen above):

    " Disable automapping so we can fix Coc mapping.
    let g:pear_tree_map_special_keys = 0

    " Default mappings:
    imap <BS> <Plug>(PearTreeBackspace)
    imap <Esc> <Plug>(PearTreeFinishExpansion)

    " Get PearTreeExpand working with coc.nvim
    imap <expr> <CR> pumvisible() ? coc#_select_confirm() : "\<Plug>(PearTreeExpand)"

Note: you have to use imap - inoremap didn't work for me likely because of how the \ command works.

jakewvincent commented 3 years ago

Hello! It appears that putting imap <CR> <Plug>(PearTreeExpand)<Plug>DiscretionaryEnd in my vimrc fixes this. I don't normally use Endwise, so let me know if this misses something.

I don't really like the idea of having plugin-specific compatibility code in Pear Tree, so if putting the above in your vimrc does work, I would consider that the official solution.

This worked for me. In markdown documents using vimwiki, hitting in a list is expected to continue the list, but pear-tree was interfering with that functionality before using this fix.

mellery451 commented 3 years ago

the <cr> map also conflicts with telescope. I'm sure there is a way to disable pear-tree when telescope activates, but I haven't found it yet.

Leo310 commented 2 years ago

@mellery451 did you fix it? I am facing the same problem now

mellery451 commented 2 years ago

@Leo310 my fix was to remove this plugin - I need Telescope more than I need this so it was not a big loss of productivity.

Leo310 commented 2 years ago

Ah ok I see. I switched to auto-pair plugin

skarrok commented 1 year ago

You can disable pear-tree in telescope prompt with

let g:pear_tree_ft_disabled = ['TelescopePrompt']
bsaxon20 commented 1 year ago

for lua nvim I used the following: vim.g.pear_tree_ft_disabled = 'TelescopePrompt'

EmreDogann commented 1 year ago

For anyone using this is coc.nvim, here's how I got the autocomplete window to work properly with PearTreeExpand (much thanks to jounathaen above):

    " Disable automapping so we can fix Coc mapping.
    let g:pear_tree_map_special_keys = 0

    " Default mappings:
    imap <BS> <Plug>(PearTreeBackspace)
    imap <Esc> <Plug>(PearTreeFinishExpansion)

    " Get PearTreeExpand working with coc.nvim
    imap <expr> <CR> pumvisible() ? coc#_select_confirm() : "\<Plug>(PearTreeExpand)"

Note: you have to use imap - inoremap didn't work for me likely because of how the command works.

This code wasn't working for me (would just paste <Plug>(PearTreeExpand) as text) but I managed to hack together a function that kinda does what I want:

function! CustomCR() abort
    " Make <CR> to accept selected completion item or notify coc.nvim to format.
    if coc#pum#visible()
        return coc#_select_confirm()
    else
        " Undo each individual enter action as opposed to undo in blocks.
        " call feedkeys("\<C-g>u")
        call coc#on_enter()
        return "\<Plug>(PearTreeExpand)"
endfunction

" Get PearTreeExpand working with coc.nvim
imap <silent><expr> <CR> CustomCR()

I haven't fully tested it but from the 5 minutes of playing around with it, it seems to work.