UltiSnips y YouCompleteMe

130

Tengo paquetes ultisnips y youcompleteme instalado en mi macvim. El problema es que los ultisnips no funcionan porque la pestaña está unida por ycm. Traté de poner let g:UltiSnipsExpandTrigger = "<s-tab>"para poder activar la finalización del fragmento con shift-tab, pero no funciona por alguna razón desconocida. Podría usar mayúsculas como disparador, pero hasta ahora no he encontrado la manera de hacerlo.

¿Alguno de ustedes usa esos dos complementos juntos? ¿Qué puedo hacer para que la pestaña shift funcione? ¿Me puede recomendar otra clave para activar fragmentos?

pvinis
fuente
YCM también mapea <S-Tab>y también lo hace UltiSnips, IIRC. Deberías preguntarle al autor de YCM, supongo.
romainl
Cambié las claves para la finalización anterior en ycm, y eliminé s-tab. sigue sin funcionar. Trataré de enviarle mensajes en Github, supongo
pvinis
1
Vea si su mapa funciona :verbose map <S-Tab>, aunque probablemente no funcionará en la línea de comando vim. Un buen reemplazo de la OMI es <CR>.
Daan Bakker
Gracias por eso estaba ansioso por encontrar una solución y el hecho de que YouCompleteMe no tenga un foro es molesto. Gracias
atmosx
2
¿Has intentado esto nuevamente recientemente? Uno o ambos complementos deben haberse actualizado, porque la documentación de UltiSnips dice: "YouCompleteMe - viene con soporte de finalización listo para usar para UltiSnips. Ofrece un diálogo de finalización realmente agradable para fragmentos".
Kyle Strand

Respuestas:

188

Otra opción es usar el complemento 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>"

Aquí YouCompleteMe está vinculado a una combinación diferente Ctrln, pero luego esa combinación está vinculada a la pestaña a través de SuperTab. UltiSnips y SuperTab juegan bien juntos, por lo que puede vincular UltiSnips a la pestaña directamente y todo saldrá bien.

Siegfried Gevatter
fuente
77
La sugerencia de Joey Liu no estaba funcionando para mí (la pestaña no expandiría nada, solo se desplazaría a la siguiente opción de autocompletar). Esta respuesta funcionó muy bien, pero primero tuve que actualizar y recompilar YouCompleteMe.
BenjaminGolder
1
Como otros han mencionado, la solución de Joey Liu ya no funciona. ¡Este sí!
Anclaje
3
¿Hay alguna forma de resaltar fragmentos en la lista de autocompletado?
sintagma el
3
MALDICIÓN ! Hombre! Trabajando como un encanto! ¡La mejor solución!
Yves Lange
44
Esto es bueno, pero golpear tabdentro de un fragmento irá a la siguiente pestaña, en lugar de completar la sugerencia de YCM. Tuve que agregar let g:UltiSnipsJumpForwardTrigger = "<Right>"y let g:UltiSnipsJumpBackwardTrigger = "<Left>"hacer que esto funcione.
Gabriel Florit
48

Pruebe esta sugerencia en una página del rastreador de problemas de YouCompleteMe. En tu .vimrc:

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

Si bien esta configuración hará que la expansión de un fragmento comparta la asignación predeterminada para saltar hacia adelante dentro de un fragmento , simula el comportamiento de TextMates como se menciona en las etiquetas de ayuda de UltiSnips.

Como he asignado mi tecla Bloq Mayús a Ctrl, esta asignación funciona bastante bien.

inestable
fuente
1
Esta debería ser la mejor respuesta, simple y directa, aunque en mi macvim en macOS 10.12, <cj> no funciona, lo cambio a <ck>, luego todo funciona bien. <tab> hacia adelante, <s-tab> hacia atrás, <ck> expande el fragmento. Gracias
gpanda
40

copia el siguiente código a tu vimrc y disfruta. Esta función manejará todos los problemas entre YCM y 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>"
Joey Liu
fuente
27
Un poco de crédito donde es debido, creo: github.com/Valloric/YouCompleteMe/issues/… Y el BufEnter escribió algunos comentarios hacia abajo.
ches
3
Esto no pareció funcionar para mí, para Mac OS X; a partir del 10 de julio de 2014. Sin embargo, la respuesta de Siegfried funcionó.
miguel.martin
¡Parece genial hasta ahora! Pero, ¿cómo puedo "tabular" los puntos de interrupción del fragmento?
chmanie
1
Me pareció útil vincular g:UltiSnipsJumpForwardTrigger="<cr>"para poder seguir
revisando
1
Esto me permite pasar por las listas completas de YCM (incluidas las sugerencias de Ultisnips), pero la última línea inoremap <expr> en realidad no parece estar afectando mi presión de la tecla Intro. Puedo activar manualmente la finalización con <Cy>, pero enter no hace nada. ¿Alguna sugerencia?
HaaR
18

tengo esto en mi vimrc

"" YouCompleteMe
let g:ycm_key_list_previous_completion=['<Up>']

"" Ultisnips
let g:UltiSnipsExpandTrigger="<c-tab>"
let g:UltiSnipsListSnippets="<c-s-tab>"

eso es lo que hice en mi primer intento, pero escribí mal UltiSnips con Ultisnips ... ¡bueno, al final funcionó!

pvinis
fuente
17

Personalmente elegí no usar <tab>con YouCompleteMe sino navegarlo manualmente.

Entonces agregué esto a mi .vimrc:

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

que simplemente deshabilita la tabclave para YCM. En su lugar, use las teclas de movimiento (flechas o CTRL-N/ CTRL-P) y seleccione la entrada con CR. UltiSnips funciona por defecto con tab.

Thomas Fankhauser
fuente
5

Simplemente reuniendo las respuestas de Michaelslec, Joey Liu y junto con las soluciones que encontré en este hilo del problema y el vimrc de este tipo , ahora tengo esto que resolvió casi todos los problemas.

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>"
sudo bangbang
fuente
Esto fue muy útil cuando esencialmente intentaba solucionar el mismo problema con COC y Ultisnips. Queriendo usar <TAB> y <S-TAB> para subir y bajar el PUM, así como moverse hacia adelante y hacia atrás dentro de los marcadores de posición de Ultisnips. Gracias.
110100100
4

Aunque sé que esta publicación es un poco antigua, tengo mi propia función que está un poco más optimizada que la anterior:

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

Por supuesto, si mantiene la configuración que proporcionó Joey Liu y luego usa esta función, ¡todo funcionará perfectamente!

EDITAR: Además, uso otra función para aumentar la funcionalidad de retroceso entre YouCompleteMe y UltiSnips. Te mostraré lo que quiero decir:

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

  return ""                                                                                                                   
endfunction

Luego solo pon esto en tu .vimrc:

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

Así como let g:UltiSnipsJumpBackwardTrigger="<s-tab>"y tu conjunto!

Michaelslec
fuente
3

Los uso a los dos juntos. De forma predeterminada, YouCompleteMe se une <Tab>y <Down>selecciona el siguiente elemento de finalización y también <S-Tab>y <Up>selecciona el elemento de finalización anterior. Puede cambiar los enlaces de YouCompleteMe con las opciones g: ycm_key_list_select_completion y g: ycm_key_list_previous_completion . Tenga en cuenta que los nombres de estas opciones se cambiaron recientemente cuando la opción se cambió de una sola cadena a una lista de cadenas.

David Brown
fuente
3

Instalé el complemento UltiSnips después del complemento YouCompleteMe, así que pensé que eran conflictivos, pero en realidad tenía algo más interferente:

set paste

Asegúrese de eliminar eso de .vimrcsi está presente.

Antoine Snyers
fuente
2

Si bien Muchas respuestas funcionan bien en esta publicación, solo quiero decir que el problema es causado por la colisión de enlace de teclas entre YCM y UltiSnip, mientras que YCM admite fragmentos de UltiSnip de forma predeterminada, toma el desencadenador de expansión de UltiSnip predeterminado <tab>como su tecla de selección de finalización, por lo que Los fragmentos de UltiSnip no serán expandidos por <tab>. Darles una combinación de teclas diferente resolverá el problema, yo personalmente uso <c-ny <c-p>para YCM y uso el valor predeterminado <tab>para UltiSnip. Puede obtener más detalles con help youcompletemedoc en vim.

Minghao Ni
fuente
2

Basado en la respuesta de Siegfried, estoy usando lo siguiente que parece más natural:

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>"

También uso los c-hjklenlaces en otro lugar (cambiar de un panel a otro), pero eso solo estaría en modo normal, por lo que no hay problema.

Nicolas Mattia
fuente
1

Yo uso ;para expandir UltiSnips, es tan ingenioso para mí

let g:UltiSnipsExpandTrigger = ";"
Ruto Collins
fuente
Editar: ahora lo uso \porque descubrí que no podía escribir ;en el modo de inserción de Vim
Ruto Collins
0

Yo uso kj. Esto es lo que hay en mi .vimrc:

let g:UltisnipsExpandTrigger="kj".

Raramente sucede que me encuentro con la palabra que contiene kj. Si este es el caso, solo esperaría un par de segundos después de escribir ky ese tipo j.

dowewas
fuente
0

Como lo mencionaron otros, asignar Cj a ultisnips funciona muy bien.
let g:UltiSnipsExpandTrigger="<c-j>"

Ahora, si va un poco más allá e instala xcape y usa
xcape -e "Shift_L=Control_R|J"

Libera el poder de usar solo la tecla shift para utlitsnips.

Hritik
fuente