Skriver IntelliJ IDEA-plugins

1. Introduksjon

I løpet av de siste årene har IntelliJ fra JetBrains raskt blitt topp IDE for Java-utviklere. I vår siste State of Java-rapport var IntelliJ den valgte IDE for 55% av respondentene, opp fra 48% året før.

En funksjon som gjør IntelliJ så attraktivt for Java-utviklere, er muligheten til å utvide og opprette ny funksjonalitet ved hjelp av plugins. I denne opplæringen vil vi se på å skrive et IntelliJ-plugin for å demonstrere noen av måtene å utvide IDE på.

Og merk at mens denne artikkelen er fokusert på IntelliJ-plugins, deler alle JetBrains IDEs felles kode. Derfor, mange av teknikkene som brukes her kan brukes på andre JetBrains IDEer som PyCharm, RubyMine og mer.

2. Plugin-funksjonalitet

Plugin-funksjonalitet for IntelliJ faller vanligvis inn i en av fire kategorier:

  • Egendefinerte språk: evnen til å skrive, tolke og kompilere kode skrevet på forskjellige språk
  • Rammeverk: støtte for tredjeparts rammer som våren
  • Verktøy: integrering med eksterne verktøy som Gradle
  • Tillegg for brukergrensesnitt: nye menyelementer, verktøyvinduer og knapper og mer

Plugins vil ofte falle i flere kategorier. For eksempel samhandler Git-pluginet som leveres med IntelliJ med git-kjørbar installert på systemet. Plugin har verktøyvindu og popup-menyelementer, samtidig som det integreres i arbeidsflyten for prosjektoppretting, preferansevindu og mer.

3. Opprette et plugin

Den enkleste måten å komme i gang med IntelliJ-plugins er å bruke deres Plugin DevKit. Dette er tilgjengelig fra Ny >Prosjekt Meny:

Merk at vi må bruke en JetBrains JDK for å sikre at nødvendige plugin-klasser er tilgjengelige på klassestien. IntelliJ skal komme med en passende JDK som standard, men hvis ikke, kan vi laste ned en herfra.

Når dette skrives, vi kan bare bruke Java 8 for å skrive IntelliJ-plugins. Dette er fordi JetBrains for øyeblikket ikke gir en offisiell JDK for Java 9 eller høyere.

4. Eksempel på plugin

For å demonstrere å skrive et IntelliJ-plugin, oppretter vi et plugin som gir rask tilgang til det populære Stack Overflow-nettstedet fra flere områder i IDE. Vi vil legge til:

  • Et menyelement for Verktøy for å gå til siden Still et spørsmål
  • Et popup-menyelement i både teksteditor og konsollutgang for å søke i Stack Overflow etter uthevet tekst.

4.1. Opprette handlinger

Handlinger er kjernekomponenten som brukes til å skrive IntelliJ-plugins. Handlinger blir utløst av hendelser i IDE, for eksempel å klikke på et menyelement eller verktøylinjeknapp.

Det første trinnet i å lage en handling er å lage en Java-klasse som utvides Et tiltak. For vårt Stack Overflow-plugin oppretter vi to handlinger.

Den første handlingen åpner siden Still et spørsmål i et nytt nettleservindu:

offentlig klasse AskQuestionAction utvider AnAction {@Override public void actionPerformed (AnActionEvent e) {BrowserUtil.browse ("// stackoverflow.com/questions/ask"); }}

Vi bruker den innebygde BrowserUtil klasse fordi den håndterer alle nyansene ved å åpne en webside på forskjellige operativsystemer og nettlesere.

Den andre handlingen åpner søkesiden for Stack Overflow og sender søketeksten som en spørringsstreng. Denne gangen implementerer vi to metoder.

Den første metoden vi implementerer er akkurat som vår første handling og håndterer åpning av en nettleser.

Først må vi imidlertid samle to verdier for StackOverflow. Den ene er språkmerket, og den andre er teksten du skal søke etter.

For å få språketaggen, bruker vi grensesnittet for programstruktur. Denne API-en analyserer alle filene i et prosjekt og gir en programmatisk måte å inspisere dem på.

I dette tilfellet bruker vi PSI til å bestemme programmeringsspråket til en fil:

PsiFile-fil = e.getData (CommonDataKeys.PSI_FILE); Språk lang = e.getData (CommonDataKeys.PSI_FILE) .getLanguage (); String languageTag = "+ [" + lang.getDisplayName (). ToLowerCase () + "]";

Merk at PSI også gir språkspesifikke detaljer om en fil. For eksempel, vi kunne bruke PSI til å finne alle offentlige metoder i en Java-klasse.

For å få teksten å søke etter, bruker vi Redaktør API for å hente uthevet tekst på skjermen:

endelig redaktørredaktør = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); Streng valgtTekst = caretModel.getCurrentCaret (). GetSelectedText ();

Selv om denne handlingen er den samme for både redigerings- og konsollvinduer, fungerer tilgang på den valgte teksten på samme måte.

Nå kan vi sette alt sammen i en handling utført erklæring:

@ Overstyr offentlig ugyldig handling Utført (AnActionEvent e) {PsiFile-fil = e.getData (CommonDataKeys.PSI_FILE); Språk lang = e.getData (CommonDataKeys.PSI_FILE) .getLanguage (); String languageTag = "+ [" + lang.getDisplayName (). ToLowerCase () + "]"; Editor editor = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); String selectedText = caretModel.getCurrentCaret (). GetSelectedText () String-spørring = selectedText.replace ('', '+') + språkTag; BrowserUtil.browse ("// stackoverflow.com/search?q=" + spørring); } 

Denne handlingen overstyrer også den andre metoden som heter Oppdater. Dette tillater oss å aktivere eller deaktivere handlingen under forskjellige forhold.

I dette tilfellet deaktiverer vi søkehandlingen når det ikke er valgt tekst:

@Override offentlig ugyldig oppdatering (AnActionEvent e) {Editor editor = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); e.getPresentation (). setEnabledAndVisible (caretModel.getCurrentCaret (). hasSelection ()); } 

4.2. Registrere handlinger

Når vi har skrevet handlingene våre, vi må registrere dem med IDE. Det er to måter å gjøre dette på.

Den første måten er å bruke plugin.xml fil, som blir opprettet for oss når vi starter et nytt prosjekt.

Som standard vil filen ha en tom element, det er der vi vil legge til handlingene våre:

Å bruke XML-filen til å registrere handlinger vil sikre at de registreres under IDE-oppstart, noe som vanligvis er å foretrekke.

Den andre måten å registrere handlinger på er programmatisk å bruke ActionManager klasse:

ActionManager.getInstance (). RegisterAction ("StackOverflow.SearchAction", ny SearchAction ());

Dette har fordelen av å la oss registrere handlinger dynamisk. For eksempel, hvis vi skriver et plugin for å integrere med et eksternt API, vil vi kanskje registrere et annet sett med handlinger basert på versjonen av API-en som vi kaller.

Ulempen med denne tilnærmingen er at handlinger ikke registreres ved oppstart. Vi må lage en forekomst av ApplicationComponent for å administrere handlinger, noe som krever mer koding og XML-konfigurasjon.

5. Testing av programtillegget

Som med alle programmer, krever det å teste et IntelliJ-plugin. For et lite plugin som det vi har skrevet, er det tilstrekkelig for å sikre at plugin kompileres og at handlingene vi opprettet fungerer som forventet når vi klikker på dem.

Vi kan teste (og feilsøke) pluginet vårt manuelt ved å bruke en Plugin-run-konfigurasjon:

Dette vil starte en ny forekomst av IntelliJ med pluginet vårt aktivert. Dette lar oss klikke på de forskjellige menyelementene vi opprettet, og sikre at de riktige Stack Overflow-sidene åpnes.

Hvis du ønsker å gjøre mer tradisjonelle enhetstester, gir IntelliJ et hodeløst miljø for å kjøre enhetstester. Vi kan skrive tester ved hjelp av hvilket som helst testrammeverk vi ønsker, og testene kjøres ved hjelp av ekte, ulåste komponenter fra IDE.

6. Distribuere programtillegget

Plugin DevKit gir en enkel måte å pakke plugins slik at vi kan installere og distribuere dem. Høyreklikk bare på plugin-prosjektet og velg "Forbered plugin-modul for distribusjon". Dette vil generere en JAR-fil i prosjektkatalogen.

Den genererte JAR-filen inneholder koden og konfigurasjonsfilene som trengs for å lastes inn i IntelliJ. Du kan installere det lokalt, eller publisere det til et plugin-depot for bruk av andre.

Skjermbildet nedenfor viser et av de nye Stack Overflow-menyelementene i aksjon:

7. Konklusjon

I denne artikkelen utviklet vi et enkelt plugin som fremhever bare noen få av hvordan vi kan forbedre IntelliJ IDE.

Mens vi primært jobbet med handlinger, tilbyr IntelliJ plugin SDK flere måter å legge til ny funksjonalitet i IDE. For videre lesing, sjekk ut den offisielle startveiledningen.

Som alltid kan den fullstendige koden for eksempler på plugin finnes i GitHub-depotet vårt.


$config[zx-auto] not found$config[zx-overlay] not found