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?


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.


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.


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

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ó!


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.


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

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!


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.


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.


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.


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.


1

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

let g:UltiSnipsExpandTrigger = ";"

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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.