【问题标题】:UltiSnips and YouCompleteMeUltiSnips 和 YouCompleteMe
【发布时间】:2013-01-31 12:34:36
【问题描述】:

我的 macvim 上安装了 ultisnips 和 youcompleteme 包。 问题是 ultisnips 不起作用,因为 tab 受 ycm 约束。 我尝试输入let g:UltiSnipsExpandTrigger = "<s-tab>",以便可以使用 shift-tab 触发 sn-p 完成,但由于某些未知原因它不起作用。我可以使用大写作为触发器,但到目前为止我还没有找到这样做的方法。

你们中有人一起使用这两个插件吗? 我该怎么做才能使 shift-tab 工作? 你能推荐另一个触发 sn-ps 的键吗?

【问题讨论】:

  • YCM 也映射<S-Tab>,UltiSnips、IIRC 也是如此。我猜你应该问问 YCM 的作者。
  • 我更改了之前在 ycm 上完成的键,并删除了 s-tab。还是行不通。我想我会尝试在 github 上给他发消息
  • 看看你的地图是否与:verbose map <S-Tab>一起工作,但它可能无法在命令行vim上工作。一个很好的替代 imo 是<CR>
  • 感谢您,我渴望找到解决方案,而 YouCompleteMe 没有论坛这一事实很烦人。谢谢
  • 你最近有没有试过这个?必须更新一个或两个插件,因为 UltiSnips 文档说:“YouCompleteMe - 为 UltiSnips 提供开箱即用的完成支持。它为 sn-ps 提供了非常好的完成对话。”

标签: vim autocomplete macvim ultisnips


【解决方案1】:

我同时使用它们。 YouCompleteMe 默认绑定<Tab><Down> 来选择下一个完成项,还绑定<S-Tab><Up> 来选择上一个完成项。您可以使用 g:ycm_key_list_select_completiong:ycm_key_list_previous_completion 选项更改 YouCompleteMe 绑定。 Note that the names of these options were recently changed when the option was changed from a single string to a list of strings.

【讨论】:

    【解决方案2】:

    我的 vimrc 里有这个

    "" YouCompleteMe
    let g:ycm_key_list_previous_completion=['<Up>']
    
    "" Ultisnips
    let g:UltiSnipsExpandTrigger="<c-tab>"
    let g:UltiSnipsListSnippets="<c-s-tab>"
    

    这就是我第一次尝试时所做的,但我将 UltiSnips 与 Ultisnips 拼错了。哦,好吧,最后成功了!

    【讨论】:

      【解决方案3】:

      在来自 YouCompleteMe 问题跟踪器的 page 上尝试此建议。在你的 .vimrc 中:

      let g:UltiSnipsExpandTrigger="<c-j>"
      

      虽然此设置将使扩展 sn-p 共享在 sn-p 内向前跳转的默认映射,但它会模拟 UltiSnips 帮助标签中提到的 TextMates 的行为。

      由于我已将 Caps Lock 键映射到 Ctrl,因此此映射工作得非常顺利。

      【讨论】:

      • 这应该是最好的答案,简单直接,虽然在我的macOS 10.12上的macvim中,不起作用,我把它改成,然后一切正常。 向前, 向后, 展开 sn-p。谢谢
      • 我是 Ultisnips 的新手,我尝试了这个建议。我不推荐它,因为将“向前跳跃”和“扩展”都映射到同一个键会使嵌套的 sn-ps 无法使用,这是您最有可能最终需要的东西。
      【解决方案4】:

      将以下代码复制到您的 vimrc 中,然后尽情享受吧。此函数将处理 YCM 和 UltiSnips 之间的所有问题。

      function! g:UltiSnips_Complete()
          call UltiSnips#ExpandSnippet()
          if g:ulti_expand_res == 0
              if pumvisible()
                  return "\<C-n>"
              else
                  call UltiSnips#JumpForwards()
                  if g:ulti_jump_forwards_res == 0
                     return "\<TAB>"
                  endif
              endif
          endif
          return ""
      endfunction
      
      au BufEnter * exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=g:UltiSnips_Complete()<cr>"
      let g:UltiSnipsJumpForwardTrigger="<tab>"
      let g:UltiSnipsListSnippets="<c-e>"
      " this mapping Enter key to <C-y> to chose the current highlight item 
      " and close the selection list, same as other IDEs.
      " CONFLICT with some plugins like tpope/Endwise
      inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
      

      【讨论】:

      • 这似乎对我不起作用,对于 Mac OS X;截至 2014 年 7 月 10 日。然而,齐格弗里德的回答奏效了。
      • 到目前为止看起来很棒!但是我怎样才能“通过”sn-p 断点呢?
      • 我发现绑定g:UltiSnipsJumpForwardTrigger="&lt;cr&gt;" 很方便,这样我仍然可以在所有可能的完成/sn-ps 中使用标签
      • 这让我可以浏览 YCM 列出的完成(包括 Ultisnips 建议),但最后一个 inoremap 行实际上似乎并没有影响我按下回车键。我可以用 手动触发完成,但是 enter 没有做任何事情。有什么建议吗?
      【解决方案5】:

      虽然我知道这篇文章有点老了,但我有自己的功能,比上面给出的更优化:

      function! g:UltiSnips_Complete()
        call UltiSnips#ExpandSnippetOrJump()
        if g:ulti_expand_or_jump_res == 0
          if pumvisible()
            return "\<C-N>"
          else
            return "\<TAB>"
          endif
        endif
      
        return ""
      endfunction
      

      当然,如果您只是保留 Joey Liu 提供的设置,然后使用此功能,一切都会完美无缺!

      编辑:另外,我使用另一个函数来增加 YouCompleteMe 和 UltiSnips 之间的后退功能。我会告诉你我的意思:

      function! g:UltiSnips_Reverse()                                                                                               
        call UltiSnips#JumpBackwards()                                                                                              
        if g:ulti_jump_backwards_res == 0        
          return "\<C-P>"                                                                                                           
        endif                                                                                                                       
      
        return ""                                                                                                                   
      endfunction
      

      然后把它放在你的 .vimrc 中:

      au BufEnter * exec "inoremap <silent> " . g:UltiSnipsJumpBackwardTrigger . " <C-R>=g:UltiSnips_Reverse()<cr>"
      

      还有let g:UltiSnipsJumpBackwardTrigger="&lt;s-tab&gt;" 和你的套装!

      【讨论】:

        【解决方案6】:

        另一种选择是使用 SuperTab 插件:

        " if you use Vundle, load plugins:
        Bundle 'ervandew/supertab'
        Bundle 'Valloric/YouCompleteMe'
        Bundle 'SirVer/ultisnips'
        
        " make YCM compatible with UltiSnips (using supertab)
        let g:ycm_key_list_select_completion = ['<C-n>', '<Down>']
        let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
        let g:SuperTabDefaultCompletionType = '<C-n>'
        
        " better key bindings for UltiSnipsExpandTrigger
        let g:UltiSnipsExpandTrigger = "<tab>"
        let g:UltiSnipsJumpForwardTrigger = "<tab>"
        let g:UltiSnipsJumpBackwardTrigger = "<s-tab>"
        

        Here YouCompleteMe 绑定到不同的组合 Ctrln,但随后该组合通过 SuperTab 绑定到制表符。 UltiSnips 和 SuperTab 配合得很好,所以你可以直接将 UltiSnips 绑定到 tab,一切都会好起来的。

        【讨论】:

        • Joey Liu 的建议对我不起作用(选项卡不会展开任何内容,它只会滚动到下一个自动完成选项)。这个答案效果很好,但我必须先更新并重新编译 YouCompleteMe。
        • 正如其他人所提到的,Joey Liu 的解决方案不再有效。这个可以!
        • 有没有办法在自动补全列表中突出显示 sn-ps?
        • 该死!人 !像魅力一样工作!有史以来最好的解决方案!
        • 这很好,但是在 sn-p 中点击tab 将转到下一个制表位,而不是完成 YCM 建议。我必须添加 let g:UltiSnipsJumpForwardTrigger = "&lt;Right&gt;"let g:UltiSnipsJumpBackwardTrigger = "&lt;Left&gt;" 才能完成这项工作。
        【解决方案7】:

        我个人选择不将 &lt;tab&gt; 与 YouCompleteMe 一起使用,而是手动导航。

        所以我将此添加到我的.vimrc

        let g:ycm_key_list_select_completion=[]
        let g:ycm_key_list_previous_completion=[]
        

        这只是禁用 YCM 的 tab 键。相反,您使用移动键(箭头或CTRL-N/CTRL-P)并选择带有CR 的条目。 UltiSnips 默认使用 tab

        【讨论】:

          【解决方案8】:

          虽然许多答案在这篇文章中运行良好,但我只想说问题是由 YCM 和 UltiSnip 之间的键绑定冲突引起的,而 YCM 默认支持 UltiSnip sn-ps,它需要默认的 UltiSnip 扩展触发器 @987654321 @ 作为其完成选择键,因此 UltiSnip sn-ps 不会被 &lt;tab&gt; 扩展。给他们不同的键绑定将解决问题,我个人使用 &lt;c-n&lt;c-p&gt; 用于 YCM 并使用默认的 &lt;tab&gt; 用于 UltiSnip。您可以在 vim 中使用help youcompleteme doc 获取更多详细信息。

          【讨论】:

            【解决方案9】:

            根据 Siegfried 的回答,我正在使用以下看起来更自然的方法:

            let g:ycm_key_list_select_completion = ['<C-j>']
            let g:ycm_key_list_previous_completion = ['<C-k>']
            
            let g:UltiSnipsExpandTrigger = "<C-l>"
            let g:UltiSnipsJumpForwardTrigger = "<C-j>"
            let g:UltiSnipsJumpBackwardTrigger = "<C-k>"
            

            我还在其他地方使用c-hjkl 绑定(从窗格切换到另一个),但这只会在正常模式下,所以没有问题。

            【讨论】:

            • 这很有效,而且感觉很自然。谢谢分享!
            【解决方案10】:

            只需将 Michaelslec、Joey Liu 的答案以及我在 this issue threadthis guy's vimrc 中找到的解决方案放在一起,我现在就有了几乎解决所有问题的解决方案。

            function! g:UltiSnips_Complete()
              call UltiSnips#ExpandSnippet()
              if g:ulti_expand_res == 0
                if pumvisible()
                  return "\<C-n>"
                else
                  call UltiSnips#JumpForwards()
                  if g:ulti_jump_forwards_res == 0
                    return "\<TAB>"
                  endif
                endif
              endif
              return ""
            endfunction
            
            function! g:UltiSnips_Reverse()
              call UltiSnips#JumpBackwards()
              if g:ulti_jump_backwards_res == 0
                return "\<C-P>"
              endif
            
              return ""
            endfunction
            
            
            if !exists("g:UltiSnipsJumpForwardTrigger")
              let g:UltiSnipsJumpForwardTrigger = "<tab>"
            endif
            
            if !exists("g:UltiSnipsJumpBackwardTrigger")
              let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
            endif
            
            au InsertEnter * exec "inoremap <silent> " . g:UltiSnipsExpandTrigger     . " <C-R>=g:UltiSnips_Complete()<cr>"
            au InsertEnter * exec "inoremap <silent> " .     g:UltiSnipsJumpBackwardTrigger . " <C-R>=g:UltiSnips_Reverse()<cr>"
            

            【讨论】:

            • 这在尝试解决 COC 和 Ultisnips 的相同问题时非常有用。想要使用 来上下移动 PUM 以及在 Ultisnips 占位符内来回移动。谢谢。
            【解决方案11】:

            我在 YouCompleteMe 插件之后安装了 UltiSnips 插件,所以我认为它们有冲突,但实际上我有更多干扰:

            set paste
            

            如果存在,请确保将其从 .vimrc 中删除。

            【讨论】:

              【解决方案12】:

              我使用kj。这就是我的.vimrc

              let g:UltisnipsExpandTrigger="kj".

              我很少遇到包含kj 的单词。如果是这种情况,我会在输入 k 和输入 j 后等待几秒钟。

              【讨论】:

                【解决方案13】:

                正如其他人所说,将 C-j 映射到 ultisnips 效果很好。
                let g:UltiSnipsExpandTrigger="&lt;c-j&gt;"

                现在,如果您进一步安装 xcape 并使用
                xcape -e "Shift_L=Control_R|J"

                你释放了只使用 utlitsnips 的 shift 键的力量。

                【讨论】:

                  【解决方案14】:

                  我使用; 来扩展 UltiSnips,这对我来说太棒了

                  let g:UltiSnipsExpandTrigger = ";"
                  

                  【讨论】:

                  • 编辑:我现在使用 \,因为我发现我无法在 Vim 的插入模式下输入 ;
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-04-28
                  • 2020-09-07
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-06-13
                  • 2020-11-13
                  • 1970-01-01
                  相关资源
                  最近更新 更多