Solución al error "command-t.vim could not load the C extension."
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:
/usr/local/opt/ruby/bin/ruby extconf.rb && make
Debes evitar a toda consta hacerlo con el comando ruby directamente ya que seguramente tendrás versiones diferentes en tu sistema provedientes de brew y rvm. Puedes comprobar esto verificando dichas versiones.
/usr/local/opt/ruby/bin/ruby --version
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.