# Preferred IDE?

**URL:** <https://forum.crystal-lang.org/t/preferred-ide/6034>\
**Category:** Help & Support\
**Created:** [September 28, 2023, 6:17pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034 "2023-09-28T18:17:38Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![vvilliamperez](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/vvilliamperez/32/2175_2.png) [@vvilliamperez](https://forum.crystal-lang.org/u/vvilliamperez)\
**Post date:** [September 28, 2023, 6:17pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/1 "2023-09-28T18:17:38Z")

</div>

What does a typical Crystal ide setup look like?

I got crystal installed on macos from brew, and have vscode plugin installed, but I can’t do something as standard as “go to definition”

Is this just the state of things right now?

---

<div class="post-metadata">

**Author:** ![meatball133](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/meatball133/32/1869_2.png) [@meatball133](https://forum.crystal-lang.org/u/meatball133)\
**Post date:** [September 28, 2023, 6:40pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/2 "2023-09-28T18:40:30Z")

</div>

I use vsc with the Crystal extension, and it can be paired up with crystal-ameba which will lint your code. The vsc code extension for Crystal has received a lot of work and improvements, they are working on a new release as you can see here: [New release? · Issue #174 · crystal-lang-tools/vscode-crystal-lang (github.com)](https://github.com/crystal-lang-tools/vscode-crystal-lang/issues/174)

---

<div class="post-metadata">

**Author:** ![Blacksmoke16](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/blacksmoke16/32/1241_2.png) [@Blacksmoke16](https://forum.crystal-lang.org/u/Blacksmoke16)\
**Post date:** [September 28, 2023, 6:55pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/3 "2023-09-28T18:55:49Z")

</div>

I just use Sublime text with the Crystal plugin. No LSP or anything but provides highlighting and formats on save. I think it’s also somewhat smart and provides autocompletion based on matches of previously used words. Can also sometimes hover over methods and stuff and can click to go to its definition, but not 100% on what determines if that works or not.

---

<div class="post-metadata">

**Author:** ![vvilliamperez](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/vvilliamperez/32/2175_2.png) [@vvilliamperez](https://forum.crystal-lang.org/u/vvilliamperez)\
**Post date:** [September 28, 2023, 7:01pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/4 "2023-09-28T19:01:28Z")

</div>

Thanks I’ll try seeing if that new release works. I see it does mention goto definition in the notes.

When learning a new language its super useful to go to definition on the standard libs.

---

<div class="post-metadata">

**Author:** ![Blacksmoke16](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/blacksmoke16/32/1241_2.png) [@Blacksmoke16](https://forum.crystal-lang.org/u/Blacksmoke16)\
**Post date:** [September 28, 2023, 7:14pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/5 "2023-09-28T19:14:21Z")

</div>

Could also consider keeping a tap open to [Crystal 1.9.2](https://crystal-lang.org/api/), then can use that when you need info on a particular type/method.

---

<div class="post-metadata">

**Author:** ![MistressRemilia](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/mistressremilia/32/2585_2.png) [@MistressRemilia](https://forum.crystal-lang.org/u/MistressRemilia)\
**Post date:** [September 28, 2023, 7:35pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/6 "2023-09-28T19:35:39Z")

</div>

I use Emacs, no LSP or anything, just syntax highlighting and some basic completion based on “I typed this before in one of the open buffers”. I absolutely love it this way, for both Crystal and other languages. Then I tab over to a terminal and run crystal/shards/make/rake myself.

---

<div class="post-metadata">

**Author:** ![mavu](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/mavu/32/213_2.png) [@mavu](https://forum.crystal-lang.org/u/mavu)\
**Post date:** [September 28, 2023, 8:18pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/7 "2023-09-28T20:18:56Z")

</div>

I use vim, syntax highlighting, at one point I had LSP kind of working, but it’s currently broken, and I have not suffered enough to try to fix it.

---

<div class="post-metadata">

**Author:** ![nobodywasishere](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/nobodywasishere/32/1983_2.png) [@nobodywasishere](https://forum.crystal-lang.org/u/nobodywasishere)\
**Post date:** [September 28, 2023, 10:48pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/8 "2023-09-28T22:48:33Z")

</div>

For those additional features you’ll probably have to set a “mainFile” in your VS Code workspace settings, just an FYI. There are also features you can enable in the settings for the extensions but some people ran into memory issues using them.

---

<div class="post-metadata">

**Author:** ![mdwagner](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/mdwagner/32/1077_2.png) [@mdwagner](https://forum.crystal-lang.org/u/mdwagner)\
**Post date:** [September 29, 2023, 11:51am UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/9 "2023-09-29T11:51:12Z")

</div>

I use Neovim with the LSP running, but I just use it as an addition when it makes sense, otherwise I treat it as no LSP. And I use the Crystal vim plugin for formatting on demand.

---

<div class="post-metadata">

**Author:** ![zw963](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/zw963/32/1623_2.png) [@zw963](https://forum.crystal-lang.org/u/zw963)\
**Post date:** [September 29, 2023, 12:48pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/10 "2023-09-29T12:48:11Z")

</div>

Me too.

 ![image](https://canada1.discourse-cdn.com/flex036/uploads/crystal_lang/original/2X/c/cbc64d29d2d089c5f5ce437078ae3da0e975308a.png)

---

<div class="post-metadata">

**Author:** ![zw963](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/zw963/32/1623_2.png) [@zw963](https://forum.crystal-lang.org/u/zw963)\
**Post date:** [September 29, 2023, 1:05pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/11 "2023-09-29T13:05:23Z")

</div>

I want to say, this probably the easiest way to get the document for now.

@vvilliamperez

You don’t want to use LSP plugins for this purpose, AFAIK, no core member interested in working on this, but it almost impossible to get a go/rust LSP experience if not touch the language itself.

Check [this](https://github.com/elbywan/crystalline/issues/53) inactive issue, a year ago, it was almost the only hope of the LSP, but soon, it lose activity again.

You should accept Crystal no LSP support for a long time anyway.

---

<div class="post-metadata">

**Author:** ![Xen](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/xen/32/2288_2.png) [@Xen](https://forum.crystal-lang.org/u/Xen)\
**Post date:** [October 1, 2023, 7:58pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/12 "2023-10-01T19:58:45Z")

</div>

> [@vvilliamperez](#):
>
> but I can’t do something as standard as “go to definition”
> 
> Is this just the state of things right now?

Well, it’s 2023, and my PHP language server can’t either. I use `ripgrep` a lot.

I’ve installed a extension to [https://devdocs.io/](https://devdocs.io/) in Emacs, so that takes care of the core stuff.

---

<div class="post-metadata">

**Author:** ![kees](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/kees/32/914_2.png) [@kees](https://forum.crystal-lang.org/u/kees)\
**Post date:** [October 2, 2023, 6:09pm UTC](https://forum.crystal-lang.org/t/preferred-ide/6034/13 "2023-10-02T18:09:44Z")

</div>

I use [vscodium](https://vscodium.com/#intro), a vscode clone without the telemetry
