Haga que su Vim sea más inteligente usando Ctrlp y Ctags

Me encanta Vim, y utilizo Vim para toda mi codificación y escritura año tras año. Aunque hay más gente, especialmente para aquellos que trabajan con JavaScript, prefieren editores de código modernos como Sublime Text o VSCode, prefiero dedicar un poco de tiempo a intentar hacer que mi juguete sea más inteligente.

CtrlP

Si eres un tipo de Sublime Text, Atom o VSCode, debes usar ctrl + pmiles de veces para mejorar la productividad. Bueno, no te pongas celoso si eres un chico de Vim porque este elegante complemento de Vim, CtrlP, te dará todo lo que necesitas.

Consulte este documento oficial para la instalación y configuración.

Ctags

Ctags es una herramienta que examinará su código, métodos de indexación, clases, variables y otros identificadores, almacenando el índice en un archivo de etiquetas. El archivo de etiquetas contiene una sola etiqueta por línea. Dependiendo de los argumentos de la línea de comandos y del idioma en el que se ejecute ctags, se puede obtener mucha información de este índice.

Actualmente, Ctags admite 41 lenguajes de programación y es relativamente fácil agregar definiciones para más.

Ctags hace que sea mucho más fácil navegar por un proyecto más grande, especialmente si el código con el que está trabajando no es familiar. Si no está seguro de qué hace un método o cómo se supone que debe llamarse, puede pasar directamente a su definición. Si se encuentra en la espiral descendente de una secuencia de comandos Perl de más de 500 líneas y desea saber dónde se definió una variable hace tres horas, puede volver a ella. Y luego, puede volver a donde estaba trabajando.

Puede instalar Ctags usando Homebrew en OSX:

brew install ctags

Tenga en cuenta que OS X viene con un ejecutable Ctags, pero no es un Ctags exuberante y le faltan la mayoría de las funciones útiles. Si ve un error como Invalid Parametercuando ejecuta ctags, significa que el sistema no está usando el que instaló con Homebrew. Para solucionar esto:

$ alias ctags="`brew --prefix`/bin/ctags"

Cuando esté sentado en el directorio que desea indexar, simplemente ejecute:

ctags -R.

Ctags recorrerá el directorio de forma recursiva, etiquetando todos los archivos fuente que encuentre. Para proyectos muy grandes, esto puede llevar un tiempo, pero normalmente es bastante rápido.

También puede necesitar alguna configuración adicional para Ctags, a continuación se muestra la ~/.ctagsque estoy usando:

--langmap=javascript:.js.es6.es.jsx--javascript-kinds=-c-f-m-p-v
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Za-z0-9_$]+)[ \t]*=[ \t]*\[/\2/A,Array,Arrays/
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Z][A-Za-z0-9_$]+)[ \t]*=[ \t]*function/\2/C,Class,Classes/--regex-javascript=/^[ \t]*class[ \t]+([A-Za-z0-9_$]+)/\1/C,Class,Classes/
--regex-javascript=/^[ \t]*export[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\3/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\5/E,export,Exports/--regex-javascript=/^[ \t]*export[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\7/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?(var|let|const)[ \t]+([A_Za-z0-9_$]+)/\2/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?(var|let|const)[ \t]+([A_Za-z0-9_$]+)[ \t]*[^,]+,[ \t]*([A_Za-z0-9_$]+)/\3/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?(var|let|const)[ \t]+([A_Za-z0-9_$]+)[ \t]*[^,]+,[ \t]*([A_Za-z0-9_$]+)[ \t]*[^,]+,[ \t]*([A_Za-z0-9_$]+)/\4/E,Export,Exports/
--regex-javascript=/^[ \t]*function[ \t]*([A-Za-z0-9_$]+)[ \t\(]/\1/F,Function,Functions/--regex-javascript=/^[ \t]*[\(]function[ \t]*([A-Za-z0-9_$]+)[ \t\(]/\1/F,Function,Functions/--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([a-z][A-Za-z0-9_$]+)[ \t]*=[ \t]*function[^\*][^\*]/\2/F,Function,Functions/--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([a-z][A-Za-z0-9_$]+)[ \t]*=[ \t]*\([^\*]/\2/F,Function,Functions/
--regex-javascript=/^[ \t]*function[ \t]*\*[ \t]*([A-Za-z0-9_$]+)/\1/G,Generator,Generators/--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([a-z][A-Za-z0-9_$]+)[ \t]*=[ \t]*function([ \t]*\*)/\2/G,Generator,Genrators/--regex-javascript=/^[ \t]*(\*[ \t])([A-Za-z0-9_$]+)[ \t]*\(.*\)[ \t]*{/\2/G,Generator,Generators/
--regex-javascript=/^[ \t]*import[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\3/I,Import,Imports/--regex-javascript=/^[ \t]*import[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\5/I,Import,Imports/--regex-javascript=/^[ \t]*import[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\7/I,Import,Imports/
--regex-javascript=/^[ \t]*this\.([A-Za-z0-9_$]+)[ \t]*=.*{$/\1/M,Method,Methods/--regex-javascript=/^[ \t]*([A-Za-z0-9_$]+)[ \t]*[:=][ \t]*[\(]*function[ \t]*\(/\1/M,Method,Methods/--regex-javascript=/^[ \t]*static[ \t]+([A-Za-z0-9_$]+)[ \t]*\(/\1/M,Method,Methods/--regex-javascript=/^[ \t]*([A-Za-z0-9_$]+)\(.*\)[ \t]*{/\1/M,Method,Methods/
--regex-javascript=/^[ \t]*(this\.)*([A-Za-z0-9_$]+)[ \t]*[:=].*[,;]*[^{]$/\2/P,Property,Properties/
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Za-z0-9_$]+)[ \t]*=[ \t]*{/\2/O,Object,Objects/
--regex-javascript=/\/\/[ \t]*(FIXME|TODO|BUG|NOBUG|\?\?\?|\!\!\!|HACK|XXX)[ \t]*\:*(.*)/\1/T,Tag,Tags/
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Za-z0-9_$]+)[ \t]*=[ \t]*[^\[{]*;$/\2/V,Variable,Variables/
--exclude=min--exclude=vendor--exclude=\*.min.\*--exclude=\*.map--exclude=\*.swp--exclude=\*.bak--exclude=tags--exclude=node_modules--exclude=bower_components--exclude=test--exclude=__test__--exclude=build--exclude=dist--exclude=*.bundle.*

Así es como se ve al ir a la definición de función:

También puede usar Ctrlp para buscar etiquetas en lugar de archivos. Para hacer esto, primero necesita mapear un atajo en su .vimrc:

nnoremap . :CtrlPTag

Así es como funciona:

Espero eso ayude :)

Escribo código para audio y web, y toco la guitarra en YouTube. Si quieres ver más cosas mías o saber más sobre mí, siempre puedes encontrarme en:

Sitio web:

//haochuan.io/

GitHub:

//github.com/haochuan

Medio:

//medium.com/@haochuan

YouTube: //www.youtube.com/channel/UCNESazgvF_NtDAOJrJMNw0g