Solución al error "command-t.vim could not load the C extension."

Author
Por Darío Rivera
Publicado el en Vim

Hace unos días vimos cómo instalar command-t para realizar búsquedas de archivos en Vim. Para esto vimos que fue necesario compilar parte del plugin en lenguaje C. Sin embargo, decidí separar el post y crear uno exclusivamente para tratar este error que suele ser muy común cuando instalas este plugin. El error completo con el que te puedes encontrar es simiar al siguiente:

command-t.vim could not load the C extension.
Please see INSTALLATION and TROUBLE-SHOOTING in the help.
Vim Ruby version: 2.5.5-p157
Expected version: [unknown]-p[unknown]
For more information type:    :help command-t

Como puedes ver Vim no ha detectado de forma correcta la versión de Ruby [unknown]-p[unknown]. Puede que aún así tu error sea algo diferente y no muestre la parte del Expected version.

Origen

Este error es derivado de la no coincidencia entre la versión de Ruby soportada por Vim y la versión con la cual se compiló el plugin de Vim. Para verificar la versión de vim que deberías tener instalada debes correr el siguiente comando en vim.

:ruby puts RUBY_VERSION

Una vez hecho esto, debes asegurarte de instalar la herramientas necesarias para compilar el plugin en tu sistema operativo e instalar la versión de ruby adecuada según la que soporta Vim (esto lo puedes hacer con RVM). Puedes revisar nuestro artículo cómo instalar command-t para realizar búsquedas de archivos en Vim si tienes Linux o MacOS para instalar estas herramientas y la versión específica de Ruby,

Preparación del entorno

Antes de iniciar el proceso de recompilar el plugin debes ingresar a la carpeta en donde se aloja el plugin de CommandT. Para esto, debes ingresar a la carpeta de Vim y buscar el archivo ruby de command-t.

cd ~/.vim
find . -name "extconf.rb"

Obtendrás el path en donde se encuentra, algo similar a lo siguiente

./plugged/command-t/ruby/command-t/ext/command-t/extconf.rb

Debes ingresar a la carpeta en donde está este archivo.

cd ./plugged/command-t/ruby/command-t/ext/command-t

Y finalmente debes limpiar el entorno de toda otra compilación que hallamos realizado.

rm *.o && rm ext.bundle && rm metadata.rb && rm Makefile

Recompilación en MacOS

Para compilar en MacOS debes hacerlo de la siguiente manera:

ruby extconf.rb && make

En algunos casos ejecutar el comando ruby directamente desde la terminal puede funcionar. Sin embargo, hay probabilidaes de que tengas versiones diferentes en tu sistema provenientes de brew y rvm. El siguiente comando te mostrará el path de configuración actual de ruby al cual le puedes agregar /bin/ruby para obtener el ejecutable.

user@host% ruby -e "require 'rbconfig'; puts RbConfig::CONFIG['prefix']"
/Users/my-user/.rvm/rubies/ruby-2.7.2

En este caso, el comando ruby parece estar tomando el ejecutable desde rvm así que se puede utilizar de manera directa. En cualquier otro caso, deberás utilizar el path del binario completo así

/Users/my-user/.rvm/rubies/ruby-2.7.2/bin/ruby --version

Recompilación en Linux

Para compilar en Linux debes hacerlo de la siguiente manera:

ruby extconf.rb && make

Si todo ha salido bien obtendrás una salida como la siguiente:

checking for float.h... yes
checking for ruby.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for fcntl.h... yes
checking for stdint.h... yes
checking for sys/errno.h... yes
checking for sys/socket.h... yes
checking for ruby/st.h... yes
checking for st.h... yes
checking for pthread_create() in -lpthread... yes
creating Makefile
compiling ext.c
compiling heap.c
compiling match.c
compiling matcher.c
compiling watchman.c
linking shared-object ext.so

Después de esto puedes ingresar a vim y utilizar el plugin.


Acerca de Darío Rivera

Author

Application Architect at Elentra Corp . Quality developer and passionate learner with 10+ years of experience in web technologies. Creator of EasyHttp , an standard way to consume HTTP Clients.

LinkedIn Twitter Instagram

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.