Gør din Vim smartere ved hjælp af Ctrlp og Ctags

Jeg elsker absolut Vim, og jeg bruger Vim til al min kodning og skrivning fra år til år. Selvom flere er flere mennesker, især for dem der arbejder med JavaScript, foretrækker moderne kodeditorer som Sublime Text eller VSCode, jeg vil hellere bruge lidt tid på at gøre mit legetøj mere intelligent.

CtrlP

Hvis du er en sublim tekst-, Atom- eller VSCode-fyr, skal du bruge ctrl + ptusinder af gange for at forbedre produktiviteten. Nå, vær ikke jaloux, hvis du er en Vim-fyr, fordi dette smarte Vim-plugin CtrlP giver dig alt hvad du behøver.

Se dette officielle dokument for installation og opsætning.

Ctags

Ctags er et værktøj, der søger gennem din kode, indekseringsmetoder, klasser, variabler og andre identifikatorer, der lagrer indekset i en tagsfil. Mærkefilen indeholder et enkelt mærke pr. Linje. Afhængigt af kommandolinjeargumenter og sproget ctags køres mod, kan der fås meget information fra dette indeks.

Ctags understøtter i øjeblikket 41 programmeringssprog, og det er relativt let at tilføje definitioner for mere.

Ctags gør det meget nemmere at navigere i et større projekt, især hvis koden du arbejder med, er ukendt. Hvis du er usikker på, hvad en metode gør, eller hvordan den skal kaldes, kan du springe direkte til dens definition. Hvis du er i den nedadgående spiral af et Perl-script på 500+ linjer og vil vide, hvor en variabel blev defineret for tre timer siden, kan du hoppe lige tilbage til den. Og bagefter kan du hoppe lige tilbage til det sted, hvor du arbejdede.

Du kan installere Ctags ved hjælp af Homebrew i OSX:

brew install ctags

Bemærk, at OS X leveres med en Ctags-eksekverbar, men den er ikke sprudlende-Ctags og mangler de fleste af de nyttige funktioner. Hvis du ser en fejl som Invalid Parameternår du kører ctags, betyder det, at systemet ikke bruger den, du installerede med Homebrew. For at løse dette:

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

Når du sidder i det bibliotek, du vil indeksere, skal du bare køre:

ctags -R.

Ctags vil gå gennem kataloget rekursivt og tagge alle kildefiler, det støder på. For meget store projekter kan det tage et stykke tid, men normalt er det ret hurtigt.

Du har muligvis også brug for nogle ekstra konfigurationer til Ctags. Nedenfor er den ~/.ctagsjeg bruger:

--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.*

Sådan ser det ud til at gå til funktionsdefinition:

Du kan også bruge Ctrlp til at søge efter tags i stedet for filer. For at gøre dette skal du først kortlægge en genvej i din .vimrc:

nnoremap . :CtrlPTag

Sådan fungerer det:

Håber det hjælper :)

Jeg skriver kode til lyd og internet og spiller guitar på YouTube. Hvis du vil se flere ting fra mig eller vide mere om mig, kan du altid finde mig i:

Internet side:

//haochuan.io/

GitHub:

//github.com/haochuan

Medium:

//medium.com/@haochuan

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