2010-01-18 10 views
48

He buscado alrededor de una hora, tanto en Stack Overflow como en otros lugares. ¡Ay! Por favor ayuda. La omnicompletion de Vim solo no funciona.Omnicompletion de Vim con Python simplemente no funciona

  1. Tengo Vim 7.2 compilado con soporte de Python.

  2. filetype plugin on está en mi .vimrc.

  3. Cuando se abre un archivo .py, :echo &omnifunc imprime pythoncomplete#Complete.

  4. Estoy trabajando con un proyecto grande y tengo un archivo tags generado con exhuberant-ctags. Está en la ruta de Vim ctags. Puedo probarlo escribiendo ^] en un símbolo y me llevan a la definición de símbolos.

  5. Actualización 1: Todo el código de mi proyecto está en la ruta de python-in-Vim. Puedo :python import myproject con éxito.

Ahora, cualquier trato C-x C-o, todo lo que consigo es:

-- Omni completion (^O^N^P) Pattern not found 

¿Qué estoy haciendo mal?

Actualización 2: Cuando escribo C-x C-O-C n a nivel de módulo, Vim muestra una ventana emergente finalización con algunas constantes de nivel de módulo de otros módulos en mi proyecto. Pero solo son constantes (símbolos mayúsculas) y la finalización aún no funciona en ningún otro lado.

Actualización 3: he descubierto que C-x C-o en la parte superior del archivo comienza a algún tipo de omnicompletion, y la finalización de pprint. hace aparecer el menú y de referencia rápida de todo en el módulo pprint. Sin embargo, ninguna de las importaciones de mi propio módulo se está completando.

Actualización 4, un año después: Me rendí y aprendí Emacs. He estado en el lado oscuro, la tierra mística de la intriga y la especia, y te digo que he encontrado el Camino.

Actualización 5, dos años después: Volví a Vim. Emacs es hermoso, pero incluso después de 1,5 años de Emacs, soy aún más rápido para terminar el trabajo en Vim. Sin embargo, he dejado de escribir Python por el momento y no puedo probar qué tan bien funcionan estas sugerencias.

+0

Es posible que desee probar esto, si no lo ha hecho ya: http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/ –

+0

@jellybean - Buen enlace, gracias ! Ya usé 'minibufexpl.vim' y' Taglist.vim', pero el anuncio de 'TODO' sería una gran adición. –

+3

Nunca encontré una respuesta a esto :( –

Respuesta

12

¿Qué módulo contiene el símbolo que está intentando completar? ¿Está en el python stdlib? ¿O es un módulo de terceros?

Asegúrese de que el módulo/paquete esté en PYTHONPATH.

En Vim, hacer:

:python import sys 
:python print sys.path 

el añadido del directorio del módulo:

:python sys.path.append("/path/to/directory/") 
+0

Buenas sugerencias, gracias. Estos son símbolos del código de mi proyecto Sí, el camino está en el camino de Python de Vim. He actualizado la descripción de la pregunta. –

+0

Entonces, ¿no es posible tener autocompletado en sus propias bibliotecas? – rednaw

+0

Sí, es posible, solo asegúrese de que los módulos y paquetes estén en algún lugar en la ruta de búsqueda del módulo de Python. – codeape

9

Puesto que has sido prudente y se aseguró de que su código es accesible por el PYTHONPATH, por sugerencia de codeape, está ahí una posibilidad de que se está ejecutando en el import bug for Vim Python omni-complete? Este error todavía existe a partir de Vim 7.2.245.

En esencia, si cualquier declaración de importación produce un error en el archivo que se está trabajando, independientemente de si está envuelto en una cláusula Try-Except, se romperá por completo omni-finalización. Debería ser bastante fácil verificar esto, ya que la mayoría de las importaciones ocurren al comienzo del archivo.

Si decide que este error es la causa de sus problemas, sus opciones incluyen:

  • asegurándose de que los módulos se importan están en la ruta del sistema, no sólo los archivos de proyecto
  • comentando a cabo ningún import declaraciones que no
  • corregir el error
  • usando ropevim como su método de finalización
  • usando un editor diferente; NetBeans IDE tiene soporte para Python, y el jVi plugin es bastante buena si eres un adicto a Vim como yo (no deje que la década de 1990 aspecto de la página de inicio te engañe)
+1

Yo también me he encontrado con este problema de cualquier problema de importación simplemente tras Hing mi omni-completo por completo. Creo que incluso las "advertencias" sobre un módulo que ya ha sido importado desde una ubicación diferente en el proyecto se bloqueará su sesión vim cuando intente omni-completarlo. – Bodhi

+0

Bodhi, eche un vistazo a ropevim. (Vea el enlace en mi respuesta editado anteriormente.) – gotgenes

0

¿Ha intentado utilizar <C_x><C-]>?

0

c-x c-n funciona para obtener la lista de miembros de un objeto.

0

que utilizan SUPERTAB (http://www.vim.org/scripts/script.php?script_id=1643)

Desde Cx Co es un poco frustrante para utilizar

en .vimrc:

let g:SuperTabDefaultCompletionType = "<c-x><c-o>" 

continuación, sólo tiene que utilizar para Tabb omnicompletion

+0

me ha solucionado un problema agregando: ' sea g: = SuperTabDefaultCompletionType a mi .vimrc (configuración del plugin SuperTab) ""' – nexayq

9

Suena como el que pregunta hace tiempo que se ha ido al lado oscuro *, sino por lo que merece la pena Acabo de tener este síntoma, y ​​en mi caso la porque fue que un módulo que estaba usando dependía de Python 2.7, pero mi versión de Vim se compiló con Python 2.5.

Para diagnosticar intenté :python import mymodule, que falló con un error al importar un módulo dependiente. Luego :python import dependentmodule que falló con el siguiente paso de la cadena. Y así sucesivamente, en &, hasta que falló al intentar importar un módulo del sistema que era nuevo desde Python 2.7. Problema encontrado.

Para resolver, acabo de hacer sudo port install vim +python27. Pero eso es para OSX. YMMV.

(* Estoy bromeando. Los usuarios de Emacs son nuestros amigos. Es la gente que programa en el Bloc de notas todos tenemos que guardar ...)

+0

Este es uno de los más prometedores soluciones. ¡Gracias! –

+0

Interesante ... ¡Tengo una fuerte sensación de que me estoy metiendo en esto también! Estoy usando MacVim (compilación de Macports) con soporte de Python, y está vinculado a (también Macports) Python 2.5. Estoy trabajando en un proyecto que es Python 2.7 y estoy seguro de que importamos algunos módulos de solo 2.7. Cuando el mío falla al completar la pestaña (complemento Supertab), ¡realmente falla mi sesión de vim SEGV! Espero que reinstalar MacVim con python2.7 lo resuelva. ¡Aclamaciones! – Bodhi

+1

Sentí que un informe valía la pena: mi plugin de Supertab y mi trabajo de omnicompleto * mucho * mejor ahora, pero * aún * doblo mi sesión de macvim a veces :(Parece que siempre hay algo malo en la secuencia de importación que la finalización está buscando (como una posible importación circular, por ejemplo). Las cosas están mejorando, de todos modos, ¡gracias! – Bodhi

2

Al haber actualizado a Fedora 16 (pero aún compilando vim desde la fuente), omni completado dejó de funcionar con el mismo mensaje que el anterior. Lo "arreglé" volviendo a mapear las teclas.

inoremap <C-space> <C-x><C-o> 

en ~/.vimrc y ahora funciona de nuevo.

2

Tuve un problema similar con omni finalización no funcionaba. En mi caso, resultó que el complemento minibufexpl.vim estaba interfiriendo con la omni terminación. Así es como me enteré:

La finalización de la palabra clave normal funciona. Omni completo no funciona para ningún idioma, no solo para Python. omnifunc está configurado correctamente. Después de I C-X C-O, no pasa nada. I do ": py print globals()" y está claro que el pythoncomplete no estaba cargado. Puedo ": llamar a pythoncomplete # Complete (1, '')" y ver que se cargue. Para mí, esto excluye que sea un problema de Vim. Parece que algo está interfiriendo con el mapeo de teclas o interceptando la solicitud de omni compleción. Así que empiezo a desactivar mis complementos uno por uno. Resulta que el culpable en mi caso es "minibufexpl". Tengo la versión Holgado de github.

Parece que hay muchos problemas abiertos con MBE de acuerdo con el rastreador de problemas en github y no ha habido ningún progreso desde principios de 2012. Voy a desactivarlo por ahora, así que puedo usar autocompletar. Mientras tanto, solo agregaré lo siguiente a mi vimrc para mantener abiertos varios búferes modificados al mismo tiempo y usar una secuencia de teclas simple para recorrerlos (MBE selecciona de manera más inteligente los búferes para recorrerlos pero parece demasiado torpe para un problema simple):

set hidden 
noremap <C-TAB> :bnext<CR> 
noremap <C-S-TAB> :bprev<CR> 
0

Si está utilizando python2, asegúrese de que

sudo apt-get install vim.nox-py2 

y utilizar vim.nox-AP2 vez de vim.

Cuestiones relacionadas