1import{_ as s,c as a,e,o as t}from"./app-CjUkjRdW.js";const l="/assets/new-plugin-project-AaRp2cVl.png",i="/assets/sandbox-ide-plugin-DSLCqWSQ.png",p={};function o(c,n){return t(),a("div",null,n[0]||(n[0]=[e(`<h1 id="project-setup" tabindex="-1"><a class="header-anchor" href="#project-setup"><span>Project Setup</span></a></h1><p>Let's go ahead and install the requirements:</p><ul><li><a href="https://www.jetbrains.com/idea/download" target="_blank" rel="noopener noreferrer">IntelliJ IDEA Community Edition</a></li><li>Plugins: <ul><li><a href="https://plugins.jetbrains.com/plugin/13112-gradle" target="_blank" rel="noopener noreferrer">Gradle</a> (comes bundled with IntelliJ)</li><li><a href="https://plugins.jetbrains.com/plugin/22851-plugin-devkit" target="_blank" rel="noopener noreferrer">Plugin DevKit</a></li><li><a href="https://plugins.jetbrains.com/plugin/6606-grammar-kit" target="_blank" rel="noopener noreferrer">Grammar-Kit</a></li></ul></li></ul><p>Since we're going to target IntelliJ Platform 2024.2+, we'll need Java 21. On my macOS machine, I installed it using homebrew:</p><div class="language-sh-session line-numbers-mode" data-highlighter="prismjs" data-ext="sh-session" data-title="sh-session"><pre><code><span class="line"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">brew <span class="token function">install</span> openjdk@21</span></span></span> 2<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><h2 id="new-plugin-project" tabindex="-1"><a class="header-anchor" href="#new-plugin-project"><span>New Plugin Project</span></a></h2><p>Because we installed Plugin DevKit, we can now create a new project of type <strong>IDE Plugin</strong>.</p><p><img src="`+l+`" alt="New IDE Plugin Project"></p><p>Unfortunately, the new project by default targets IntelliJ IDEA 2023.2 (using Java 17), and uses the IntelliJ Grade plugin version 1.x. We need to update the project to target IntelliJ IDEA 2024.2 (using Java 21) and use the IntelliJ Gradle plugin version 2.x. For this, we'll need to replace the <code>build.gradle.kts</code> file with the following:</p><div class="language-kts line-numbers-mode" data-highlighter="prismjs" data-ext="kts" data-title="kts"><pre><code><span class="line"><span class="token comment">// build.gradle.kts</span></span> 3<span class="line"></span> 4<span class="line">plugins <span class="token punctuation">{</span></span> 5<span class="line"> <span class="token function">id</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"org.jetbrains.intellij.platform"</span></span><span class="token punctuation">)</span> version <span class="token string-literal singleline"><span class="token string">"2.0.1"</span></span></span> 6<span class="line"> <span class="token function">id</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"org.jetbrains.kotlin.jvm"</span></span><span class="token punctuation">)</span> version <span class="token string-literal singleline"><span class="token string">"2.0.20"</span></span></span> 7<span class="line"><span class="token punctuation">}</span></span> 8<span class="line"></span> 9<span class="line">repositories <span class="token punctuation">{</span></span> 10<span class="line"> <span class="token function">mavenCentral</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span> 11<span class="line"></span> 12<span class="line"> intellijPlatform <span class="token punctuation">{</span></span> 13<span class="line"> <span class="token function">defaultRepositories</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span> 14<span class="line"> <span class="token punctuation">}</span></span> 15<span class="line"><span class="token punctuation">}</span></span> 16<span class="line"></span> 17<span class="line">dependencies <span class="token punctuation">{</span></span> 18<span class="line">
18 intellijPlatform <span class="token punctuation">{</span></span> 19<span class="line"> <span class="token function">intellijIdeaCommunity</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"2024.2.1"</span></span><span class="token punctuation">)</span></span> 20<span class="line"> <span class="token function">instrumentationTools</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span> 21<span class="line"> <span class="token punctuation">}</span></span> 22<span class="line"><span class="token punctuation">}</span></span> 23<span class="line"></span> 24<span class="line">intellijPlatform <span class="token punctuation">{</span></span> 25<span class="line"> buildSearchableOptions <span class="token operator">=</span> <span class="token boolean">false</span></span> 26<span class="line"><span class="token punctuation">}</span></span> 27<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Here's a breakdown of the changes:</p><ul><li>We updated the IntelliJ Platform Gradle plugin to version 2.0.1.</li><li>We updated the Kotlin plugin to version 2.0.20.</li><li>We added the <code>intellijPlatform</code> block under <code>repositories</code> to add the <code>defaultRepositories()</code> to the project.</li><li>We updated the <code>intellijPlatform</code> block under <code>dependencies</code> to target IntelliJ IDEA 2024.2.1. We also added the <code>instrumentationTools()</code> dependency to instrument the compiled code (like nullability assertions).</li><li>We added the <code>intellijPlatform</code> block at the end of the file to configure the plugin build. For now, we only disabled building searchable options (which we don't need for now).</li></ul><p>We can now tell Gradle to reload the project from the Gradle tool window. Gradle will then download the configured Gradle plugins, and all the declared dependencies, including an IDEA Community Edition 2024.2 sandbox. It takes a while to download everything and index the dependencies, so be patient.</p><h2 id="plugin-configuration" tabindex="-1"><a class="header-anchor" href="#plugin-configuration"><span>Plugin Configuration</span></a></h2><p>Plugins have an XML-driven configuration file called <code>plugin.xml</code>, stored under the <code>src/main/resources/META-INF</code> directory. It contains metadata about the plugin, such as the plugin ID, name, version, and description, as well as registrations for extension points that the plugin implements.</p><p>Let's update the <code>plugin.xml</code> file to reflect the details of our plugin:</p><div class="language-xml line-numbers-mode" data-highlighter="prismjs" data-ext="xml" data-title="xml"><pre><code><span class="line"><span class="token comment"><!-- src/main/resources/META-INF/plugin.xml --></span></span> 28<span class="line"></span> 29<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>idea-plugin</span><span class="token punctuation">></span></span></span> 30<span class="line"></span> 31<span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>id</span><span class="token punctuation">></span></span>khaledh.nimjet<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>id</span><span class="token punctuation">></span></span></span> 32<span class="line"></span> 33<span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>NimJet<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span></span> 34<span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>vendor</span> <span class="token attr-name">email</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>...<span class="token punctuation">"</span></span> <span class="token attr-name">url</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>...<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Khaled Hammouda<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>vendor</span><span class="token punctuation">></span></span></span> 35<span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>description</span><span class="token punctuation">></span></span><span class="token cdata"><![CDATA[A plugin for the Nim programming language.]]></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>description</span><span class="token punctuation">></span></span></span> 36<span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>0.1.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span></span> 37<span class="line"></span> 38<span class="line"> <span class="token comment"><!-- plugin dependencies on core modules --></span></span> 39<span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>depends</span><span class="token punctuation">></span></span>
39com.intellij.modules.platform<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>depends</span><span class="token punctuation">></span></span></span> 40<span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>depends</span><span class="token punctuation">></span></span>com.intellij.modules.lang<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>depends</span><span class="token punctuation">></span></span></span> 41<span class="line"></span> 42<span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>extensions</span> <span class="token attr-name">defaultExtensionNs</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>com.intellij<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span> 43<span class="line"> <span class="token comment"><!-- extension point registrations go here --></span></span> 44<span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>extensions</span><span class="token punctuation">></span></span></span> 45<span class="line"></span> 46<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>idea-plugin</span><span class="token punctuation">></span></span></span> 47<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The <code><depends></code> elements declare the compatibility of the plugin with the IntelliJ Platform products.</p><ul><li>The <code>com.intellij.modules.platform</code> dependency is required all plugins to indicate dependency on shared functionality.</li><li>The <code>com.intellij.modules.lang</code> dependency indicates dependency on the platform module that provides language support (e.g. syntax highlighting, code completion, etc.).</li></ul><h2 id="running-the-plugin" tabindex="-1"><a class="header-anchor" href="#running-the-plugin"><span>Running the Plugin</span></a></h2><p>Although we haven't written any code yet, we can still run the plugin to see if everything is set up correctly. To run the plugin, we trigger the <code>runIde</code> task from the Gradle tool window under <code>Tasks</code> > <code>intellij platform</code> > <code>runIde</code>.</p><p>We should be presented with a new instance of IntelliJ IDEA 2024.2 with our plugin loaded. Let's create an empty test project and verify that our plugin is loaded by checking the <strong>Settings | Plugins</strong> dialog:</p><p><img src="`+i+'" alt="Sandbox IDE Plugin"></p><p>Great! We can see that our plugin is loaded and enabled, although not doing anything at the moment.</p><div class="hint-container tip"><p class="hint-container-title">Tips</p><p>When you close the sandbox project, the IDE doesn't completely close. Instead, it goes back to the welcome screen, which needs to be closed as well. Moreover, when you run the sandbox IDE again, it will show the welcome screen instead of the last project you had open. To avoid this, when you are in the project, quit the IDE using <code>Cmd+Q</code> (macOS), not by closing the project window.</p></div><p>In the next section, we'll start by registering a new file type for the Nim language so that the IDE can recognize Nim files and associate them with our plugin.</p>',26)]))}const r=s(p,[["render",o],["__file","02-setup.html.vue"]]),d=JSON.parse(`{"path":"/nimjet/02-setup.html","title":"Project Setup","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"New Plugin Project","slug":"new-plugin-project","link":"#new-plugin-project","children":[]},{"level":2,"title":"Plugin Configuration","slug":"plugin-configuration","link":"#plugin-configuration","children":[]},{"level":2,"title":"Running the Plugin","slug":"running-the-plugin","link":"#running-the-plugin","children":[]}
47],"git":{"updatedTime":1725233521000},"filePathRelative":"nimjet/02-setup.md","excerpt":"\\n<p>Let's go ahead and install the requirements:</p>\\n<ul>\\n<li><a href=\\"https://www.jetbrains.com/idea/download\\" target=\\"_blank\\" rel=\\"noopener noreferrer\\">IntelliJ IDEA Community Edition</a></li>\\n<li>Plugins:\\n<ul>\\n<li><a href=\\"https://plugins.jetbrains.com/plugin/13112-gradle\\" target=\\"_blank\\" rel=\\"noopener noreferrer\\">Gradle</a> (comes bundled with\\nIntelliJ)</li>\\n<li><a href=\\"https://plugins.jetbrains.com/plugin/22851-plugin-devkit\\" target=\\"_blank\\" rel=\\"noopener noreferrer\\">Plugin DevKit</a></li>\\n<li><a href=\\"https://plugins.jetbrains.com/plugin/6606-grammar-kit\\" target=\\"_blank\\" rel=\\"noopener noreferrer\\">Grammar-Kit</a></li>\\n</ul>\\n</li>\\n</ul>"}`);export{r as comp,d as data};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.