Table of Contents generated with DocToc
- Elixir plugin
- IDEs
- Features
- Project
- Project Structure
- Project Settings
- Module Settings
- New Elixir File
- Syntax Highlighting and Semantic Annotation
- External Annotators
- Grammar parsing
- Inspections
- Quick Fixes
- Code Folding
- Commenter
- Debugger
- Delimiters
- Building/Compiling
- Live Templates
- Run Configurations
- Completion
- Decompilation
- Go To Declaration
- Formatting
- Go To Symbol
- Go To Test
- Go To Test Subject
- Find Usage
- Refactor
- SDK
- Elixir External Tools
- Structure
- Viewing Embedded Elixir Templates
- Installation
- Screenshots
- Error reporting
- Donations
This is a plugin that adds support for Elixir to JetBrains IDEs.
The plugin works both in the rich IDEs that allow alternative language SDK selection and small IDEs that are language specific. The rich IDEs work best for IntelliJ Elixir because only in the rich IDEs can have an Elixir SDK set as the Project SDK. In all small IDEs, the native language SDK is always there, which makes anything that uses the SDK, such as running elixir
, erl
, or mix
more complicated both internally and externally in the configuration you have to setup.
The plugin is free to use in all JetBrains IDEs. The Cost column in the below table is what JetBrains charges for the IDE itself. IntelliJ Elixir is maintained by @KronicDeth who does not get any of the subscription money. If you want to support the plugin itself, make a donation.
IDE | Rich/Small | Languages | Cost | Trial | License | Source |
---|---|---|---|---|---|---|
IntelliJ IDEA Community Edition | Rich | Java | Free | N/A | Apache 2.0 | JetBrains/intellij-community |
IntelliJ IDEA Ultimate Edition | Rich | Java | Subscription | 30-days | Commercial | N/A |
AppCode | Small | Objective-C | Subscription | 30-days | Commercial | N/A |
CLion | Small | C/C++ | Subscription | 30-days | Commercial | N/A |
DataGrip | Small | SQL | Subscription | 30-days | Commercial | N/A |
Gogland | Small | Go | Free | N/A | Early Access Preview | N/A |
PHPStorm | Small | PHP | Subscription | 30-days | Commercial | N/A |
PyCharm Community Edition | Small | Python | Free | N/A | Apache 2.0 | JetBrains/intellij-community subdirectory |
PyCharm Professional Edition | Small | Python | Subscription | N/A | Commercial | N/A |
Rider | Small | .NET | Subcription | N/A | Commercial | N/A |
RubyMine | Small | Ruby | Subscription | 30-days (90-day for whole team) | Commercial | N/A |
WebStorm | Small | JavaScript | Subscription | 30-days | Commercial | N/A |
Once you have your IDE of choice installed, you can install this plugin
Feature | Rich | Small | Alternative |
---|---|---|---|
Project | Yes | No | 1. Open directory 2. Elixir SDK Path in External Elixir Tools |
Project Structure | Automatic | Manual | |
Project Settings | Yes | No | |
Module Settings | Yes | No | |
New Elixir File | Yes | Yes | |
Syntax Highlighting and Semantic Annotation | Yes | Yes | |
Grammar Parsing | Yes | Yes | |
Inspections | Yes | Yes | |
Quick Fixes | Yes | Yes | |
Code Folding | Yes | Yes | |
Commenter | Yes | Yes | |
Debugger | Yes | Yes | |
Delimiters | Yes | Yes | |
Building/Compiling | Yes | No | Build/compile as part mix run configurations only |
Live Templates | Yes | Yes | |
Run Configurations | Yes | Yes | |
Completion | Yes | Yes | |
Decompilation | Yes | Yes | |
Go To Declaration | Yes | Yes | |
Formatting | Yes | Yes | |
Go To Symbol | Yes | Yes | |
Go To Test | Yes | Yes | |
Go To Test Subject | Yes | Yes | |
Find Usage | Yes | Yes | |
Refactor | Yes | Yes | |
SDK | Yes | No | Elixir SDK Path in External Elixir Tools |
Structure | Yes | Yes |
- Open Directory of the project
- Setup the Elixir SDK Path in External Elixir Tools
If you've already created a mix
project, you can load it as an Elixir project into the plugin.
- File > New > Project From Existing Sources...
- Select the root directory of your project.
- Select "Import project from external model"
- Select Mix
- Click Next
- The "Mix project root" will be filled in with the selected directory.
- (Optional) Uncheck "Fetch dependencies with mix" if you don't want to run
mix deps.get
when importing the project- If "Fetch dependencies with mix" is checked both
mix hex.local --force
andmix deps.get
will be run.
- If "Fetch dependencies with mix" is checked both
- Ensure the correct "Mix Path" is detected. On Windows, the
mix.bat
, such asC:\Program Files (x86)\Elixir\bin\mix.bat
should be used instead of themix
file without the extension. - Ensure the "Mix Version" is as expected. The number in parentheses should match the Elixir version.
- Click Next
- All directories with
mix.exs
files will be selected as "Mix projects to import". To import just the main project and not its dependencies, click Unselect All. - Check the box next to the project root to use only its
mix.exs
. (It will likely be the first checkbox at the top.) - Click Next
- Select a Project SDK directory by clicking Configure.
- The plugin will automatically find the newest version of Elixir installed. (NOTE: SDK detection only works for Linux, homebrew installs on OSX, and Windows. Open an issue with information about Elixir install locations on your operating system and package manager to have SDK detection added for it.)
- If the automatic detection doesn't find your Elixir SDK or you want to use an older version, manually select select
the directory above the
bin
directory containingelixir
,elixirc
,iex
, andmix
. (On Windows it is the directory containingelixir.bat
,elixirc.bat
,iex.bat
, andmix.bat
.) - Click Finish after you select SDK name from the Project SDK list.
If you've already created a (non-mix
) project, you can load it as an Elixir project into the plugin.
- File > New > Project From Existing Sources...
- Select the root directory of your project.
- Leave the default selection, "Create project from existing sources"
- Click Next
- Project name will be filled with the basename of the root directory. Customize it if you like.
- Project location will be the root directory.
- Click Next.
- If you previously opened the directory in IntelliJ or another JetBrains IDE, you'll be prompted to overwrite the .idea directory. Click Yes.
- You'll be prompted with a list of detected Elixir project roots to add to the project. Each root contains a
mix.exs
. Uncheck any project roots that you don't want added. - Click Next.
- Select a Project SDK directory by clicking Configure.
- The plugin will automatically find the newest version of Elixir installed. (NOTE: SDK detection only works for Linux, homebrew installs on OSX, and Windows. Open an issue with information about Elixir install locations on your operating system and package manager to have SDK detection added for it.)
- If the automatic detection doesn't find your Elixir SDK or you want to use an older version, manually select select
the directory above the
bin
directory containingelixir
,elixirc
,iex
, andmix
. - Click Next after you select SDK name from the Project SDK list.
- Click Finish on the framework page. (No framework detection is implemented yet for Elixir.)
- Choose whether to open in a New Window or in This Window.
If you want to create a basic (non-mix
) Elixir project with a lib
directory, perform the following steps.
- File > New > Project
- Select Elixir from the project type menu on the left
- Click Next
- Select a Project SDK directory by clicking Configure.
- Select a Project SDK directory by clicking Configure.
- The plugin will automatically find the newest version of Elixir installed.
- macOS / OSX
- Homebrew (
/usr/local/Cellar/elixir
) - Nix (
/nix/store
)
- Homebrew (
- Linux
/usr/local/lib/elixir
- Nix and NixOS (
/nix/store
)
- Windows
- 32-bit (
C:\Program Files\Elixir
) - 64-bit (
C:\Program Files (x86)\Elixir
) - (NOTE: SDK detection only works for Open an issue with information about Elixir install locations on your operating system and package manager to have SDK detection added for it.)
- 32-bit (
- macOS / OSX
- If the automatic detection doesn't find your Elixir SDK or you want to use an older version, manually select select the directory above the
bin
directory containingelixir
,elixirc
,iex
, andmix
. If thebin
,lib,
orsrc
directory is incorrectly selected, it will be corrected to the parent directory. - Click Next after you select SDK name from the Project SDK list.
- Change the
Project name
to the name your want for the project - (Optionally) change the
Project location
if the directory does not match what you want - (Optionally) expand
More Settings
to change theModule name
,Content root
,Module file location
, and/orProject format
. The defaults derived from theProject name
andProject location
should work for most projects. - Click Finish
- Choose whether to open in a New Window or in This Window.
- Excluded
_build
(Output frommix
)rel
(Output fromexrm
)
- Sources
lib
- Test Sources
test
The Project Settings include
- Project Name
- Project SDK
The Module Settings include Marking directories as
- Excluded
- Sources
- Tests
Module paths list the output directories when compiling code in the module. There is a an "Output path" for dev
MIX_ENV
and "Test output path" for the test
MIX_ENV
.
Module dependencies are currently just the SDK and the sources for the module. Dependencies in deps
are not
automatically detected at this time.
- Right-click a directory (such as
lib
ortest
in the standardmix new
layout) - Select New > Elixir File.
- Enter an Alias for the Module name, such as
MyModule
orMyNamespace.MyModule
. - Select a Kind of Elixir File to use a different template.
An underscored file will be created in an underscored directory lib/my_namespace/my_module.ex
) with the given module
name with be created:
defmodule MyNamespace.MyModule do
@moduledoc false
end
An underscored file will be created in an underscored directory lib/my_namespace/my_module.ex
) with the given module
name with be created. It will have a start/2
function that calls MyNamespace.MyModule.Supervisor.start_link/0
.
defmodule MyNamespace.MyModule do
@moduledoc false
use Application
def start(_type, _args) do
MyNamespace.MyModule.Supervisor.start_link()
end
end
An underscored file will be created in an underscored directory lib/my_namespace/my_module.ex
) with the given module
name with be created. It will have a start_link/1
function that calls Supervisor.start_link/0
and init/1
that sets
up the child specs. It assumes a MyWorker
child that should be supervised :one_for_one
.
defmodule MyNamespace.MyModule.Supervisor do
@moduledoc false
use Supervisor
def start_link(arg) do
Supervisor.start_link(__MODULE__, arg)
end
def init(arg) do
children = [
worker(MyWorker, [arg], restart: :temporary)
]
supervise(children, strategy: :one_for_one)
end
end
An underscored file will be created in an underscored directory lib/my_namespace/my_module.ex
) with the given module
name with be created. It will have a start_link/2
function that calls GenServer.start_link/3
and the minimal
callback implementations for init/1
, handle_call/3
, and handle_cast/2
.
The Elixir use GenServer
supplies these callbacks, so this template is for when you want to change the callbacks, but
would like the stubs to get started without having to look them up in the documentation.
defmodule MyNamespace.MyModule do
@moduledoc false
use GenServer
def start_link(state, opts) do
GenServer.start_link(__MODULE__, state, opts)
end
def init(_opts) do
{:ok, %{}}
end
def handle_call(_msg, _from, state) do
{:reply, :ok, state}
end
def handle_cast(_msg, state) do
{:noreply, state}
end
end
An underscored file will be created in an underscored directory lib/my_namespace/my_module.ex
) with the given module
name with be created. The minimal callback implementations for init/1
, handle_event/2
, and handle_call/2
,
handle_info/2
.
The Elixir use GenEvent
supplies these callbacks, so this template is for when you want to change the callbacks, but
would like the stubs to get started without having to look them up in the documentation.
defmodule MyNamespace.MyModule do
@moduledoc false
use GenEvent
# Callbacks
def init(_opts) do
{:ok, %{}}
end
def handle_event(_msg, state) do
{:ok, state}
end
def handle_call(_msg, state) do
{:ok, :ok, state}
end
def handle_info(_msg, state) do
{:ok, state}
end
end
Syntax highlighting of lexer tokens and semantic annotating of parser elements can be customized in in the Color Settings page for Elixir (Preferences > Editor > Color & Fonts > Elixir).
In addition to the built-in syntax highlighting and annotations above, various mix
tasks will be run to gather annotations from Elixir status analysis tools.
If credo
is not installed as a project dependency, nothing will happen, but if it is installed, mix credo PATH
will be called on any files after updates have quieted. Any credo
check failures will show up as warning annotations
Individual check failures will show the explanation (from mix credo PATH:LINE(:COLUMN)
) if you hover over the annotation
You can hover over the explanation and click the embedded links to jump to the line (and column) where the failure occurred.
Built on top of highlighted tokens above, the parser understands the following parts of Elixir grammar as valid or allows the grammar because they contain correctable errors:
- Empty Parentheses (
()
) - Keyword Lists
- Keyword Keys - Aliases, identifiers, quotes, or operators when followed immediately by a colon and horizontal or vertical space.
- Keyword Values - Empty parentheses (
()
) and matched expressions.
- Matched Expressions,
in other words, unary and binary operations on variable, function, and macro names and values (numbers, strings,
char lists, sigils, heredocs,
true
,false
, andnil
). - No Parentheses expressions, which
are function calls with neither parentheses nor
do
blocks that have either (1) a positional argument and keyword arguments OR (2) two or more positional arguments with optional keyword arguments. - Anonymous function calls
.()
with either no arguments; a no parentheses arguments expression as an argument; keywords as an argument; positional argument(s); or positional arguments followed by keywords as arguments. - Remote function calls (
Alias.function
,:atom.function
, etc) and local function calls (function
) with...- No Parentheses with...
- No Arguments (
Alias.function
) - Keywords (
Alias.function key: value
) - Nested No Parentheses Call (
Alias.function Inner.function positional, key: value
) - Positional and Keyword arguments (
Alias.function positional, key: value
) - Matched Expression (
Alias.function 1 + 2
)
- No Arguments (
- Parentheses with...
- No arguments (
Alias.function()
) - No Parentheses Call (
Alias.function(Inner.function positional, key: value
) - Keywords (
Alias.function(key: value)
) - Positional and Keyword arguments (
Alias.function(positional, key: value)
) - Trailing parentheses for quoting (
def unquote(variable)(positional)
)
- No arguments (
- No Parentheses with...
- Bracket expression (
variable[key]
) - Block expressions (
function do end
) - Unmatched expressions, in other words combinations of block expressions and matched expressions.
Inspections mark sections of code with warnings and errors. They can be customized from the Preferences > Inspections > Elixir.
Detects when compiler will throw unexpected comma. Parentheses are required to solve ambiguity in nested calls
.
Function calls with multiple arguments without parentheses cannot take as arguments functions with multiple arguments
without parentheses because which functional gets which arguments is unclear as in the following example:
outer_function first_outer_argument,
# second argument is another function call without parentheses, but with multiple arguments
inner_function first_inner_argument,
ambiguous_keyword_key: ambiguous_keyword_value
To fix the ambiguity if first_inner_keyword_key: first_inner_keyword_value
should be associated, add parentheses
around the inner function's arguments:
# keywords are for inner function
outer_function first_outer_argument
inner_function(
first_inner_argument
ambiguous_keyword_key: ambiguous_keyword_value
)
# keywords are for outer function
outer_function first_outer_argument
inner_function(
first_inner_argument
),
ambiguous_keyword_key: ambiguous_keyword_value
Preferences > Inspections > Elixir > Ambiguous nested calls
Ambiguous nested call inspection marks the error on the comma that causes the ambiguity.
Mousing over the comma marked as an error in red (or over the red square in the right gutter) will show the inspection describing the error.
Detects when compiler will throw unexpected parenthesis. If you are making a function call, do not insert spaces in between the function name and the opening parentheses
.
Function calls with space between the function name and the parentheses cannot distinguish between function calls with
parentheses, but with an accidental space before the (
and function calls without parentheses where the first
positional argument is in parentheses.
function ()
To fix the ambiguity remove the space or add outer parentheses without the space if the first argument should be ()
:
# extra space, no arguments to function
function()
# first argument is `()`
function(())
function (key: value)
Keywords inside parentheses is not valid, so the only way to fix this is to remove the space
function(key: value)
function (first_positional, second_positional)
A list of positional arguments in parenthenses is not valid, so the only way to fix this is to remove the space
function(first_positional, second_positional)
Preferences > Inspections > Elixir > Ambiguous parentheses
Ambiguous parentheses inspection marks the error on the parenthetical group surrounded by the parentheses that are ambiguous due to the preceding space.
Mousing over the parenthetical group marked as an error in red (or over the red square in the right gutter) will show the inspection describing the error.
Type specifications separate the name from the definition using ::
.
@type name: definition
Replace the :
with ::
@type name :: definition
one.(
one,
two positional, key: value,
three
)
Keywords can only appear at the end of an argument list, so either surround the no parentheses expression argument with parentheses, or move the the keywords to the end of the list if it wasn't meant to be a no parentheses expression.
one.(
one
two(positional, key: value),
three
)
OR
one.(
one,
two,
three,
key: value
)
Preferences > Inspections > Elixir > Keywords Not At End
Keywords Not At End inspection marks the error over the keywords that need to be surrounded by parentheses or moved to the end of the list.
Mousing over the keywords marked as an error in red (or over the red square in the right gutter) will show the inspection describing the error.
Type specifications separate the name from the definition using ::
.
@type name = definition
Replace the =
with ::
@type name :: definition
Quick Fixes are actions IntelliJ can take to change your code to correct errors (accessed with Alt+Enter by default).
If a type specification uses a single :
instead of ::
, then hit Alt+Enter on the :
to change it to ::
and fix the type spec.
If a type specification uses =
instead of ::
, then hit Alt+Enter on the =
to change it to ::
and fix the type spec.
If a set of parentheses is marked as ambiguous then the space before it can be removed to disambiguate the parentheses with Alt+Enter. (Will vary based on keymap.)
Hitting Alt+Enter on ambiguous parentheses error will bring up the Local Quick Fix, "Remove spaces between function name and parentheses". Hit Enter to accept and remove the space.
You can collapse (fold) pre-defined regions of your Elixir code to make it easier to quickly scroll through files or hide details you don't care about right now.
- Position cursor between lines with with downward facing - arrow and upward facing - arrow.
- Cmd+-
- Position cursor on the collapsed line with the square +
- Cmd++
Expanded | Collapsed | Folded By Default? |
---|---|---|
do end |
do: ... |
No |
-> and right operand |
-> ... |
No |
@doc VALUE |
@doc "..." |
No |
@moduledoc VALUE |
@moduledoc "..." |
No |
@typedoc VALUE |
@typedoc "..." |
No |
alias ALIAS1 alias ALIAS1 |
alias ... |
Yes |
import ALIAS1 import ALIAS2 |
import ... |
Yes |
require ALIAS1 require ALIAS2 |
require ... |
Yes |
use ALIAS1 use ALIAS2 |
use ALIAS1 |
Yes |
@for |
FOR in defimpl PROTOCOL, for: FOR |
Yes |
@protocol |
PROTOCOL in defimpl PROTOCOL, for: FOR |
Yes |
@MODULE_ATTRIBUTE | VALUE in @MODULE_ATTRIBUTE VALUE |
No |
You can comment or uncomment the current line or selected block of source. By selecting a block of source first you can quickly comment out and entire function if you're trying to track down a compiling or testing error that's not giving a helpful line number.
Using the menus
- Highlight one or more lines
- Comment (or Uncomment) with one of the following:
a. Code > Comment with Line Comment
b. On OSX the key binding is normally
Cmd+/
.
IntelliJ Elixir allows for graphical debugging of *.ex
files using line breakpoints.
Line breakpoints can added by clicking in the left-hand gutter of an editor tab. A red dot will appear marking the breakpoint. When a Run Configuration is Run with the Debug (bug) instead of Run (arrow) button, execution will stop at the breakpoint and you can view the local variables (with Erlang names) and the stackframes.
- Define a run/debug configuration
- Create breakpoints in the
*.ex
files - Launch a debugging session
- During the debugger session, step through the breakpoints, examine suspended program, and explore frames.
After you have configured a run configuration for your project, you can launch it in debug mode by pressing Ctrl+D
.
Action | Keyword Shortcut |
---|---|
Toggle Breakpoint | Cmd+F8 |
Resume Program | Alt+Cmd+R |
Step Over | F8 |
Step Into | F7 |
View breakpoint details/all breakpoints | Shift+Cmd+F8 |
Variable | Example | Description |
---|---|---|
INTELLIJ_ELIXIR_DEBUG_BLACKLIST | iconv,some | Excluding modules from debugger |
Notice: If you want non Elixir.
module in blacklist, write it with: :
.
This rule applies only to module atoms.
When a breakpoint is set, the editor displays a breakpoint icon in the gutter area to the left of the affected source code. A breakpoint icon denotes status of a breakpoint, and provides useful information about its type, location, and action.
The icons serve as convenient shortcuts for managing breakpoints. Clicking an icon removes the breakpoint. Successive use of Alt - click on an icon toggles its state between enabled and disabled. The settings of a breakpoint are shown in a tooltip when a mouse pointer hovers over a breakpoint icon in the gutter area of the editor.
When the button is pressed in the toolbar of the Debug tool window, all the breakpoints in a project are muted, and their icons become grey: .
To view the list of all breakpoints and their properties, do one of the following:
To view properties of a single breakpoint
To configure actions, suspend policy and dependencies of a breakpoint
- Open the Breakpoint Properties
- Right-click a breakpoint in the left gutter, then click the More link or press
Shift+Cmd+F8
- Open the Breakpoints dialog box and select the breakpoint from the list
- In the Favorites tool window, select the desired breakpoint, and click the pencil icon.
- Right-click a breakpoint in the left gutter, then click the More link or press
- Define the actions to be performed by IntelliJ IDEA on hitting breakpoint:
- To notify about the reaching of a breakpoint with a text message in the debugging console, check the "Log message to console" check box. A message of the format
*DBG* 'Elixir.IntellijElixir.DebugServer' got cast {breakpoint_reached, PID}
will appear in the console. - To set a breakpoint the current one depends on, select it from the "Disabled until selected breakpoint hit" drop-down list. Once dependency has been set, the current breakpoint is disabled until selected one is hit.
- Choose the "Disable again" radio button to disable the current breakpoint after selected breakpoint was hit.
- Choose the "Leave enabled" radio button to keep the current breakpoint enabled after selected breakpoint was hit.
- Enable suspending an application upon reaching a breakpoint by checking the "Suspend" check box.
- To notify about the reaching of a breakpoint with a text message in the debugging console, check the "Log message to console" check box. A message of the format
A line breakpoint is a breakpoint assigned to a specific line in the source code.
Line breakpoints can be set on executable lines. Comments, declarations and empty lines are not valid locations for the line breakpoints.
- Place the caret on the desired line of the source code.
- Do one of the following:
- Click the left gutter area at a line where you want to toggle a breakpoint
- Run > Toggle Line Breakpoint
Cmd+F8
- Open the Breakpoints dialog
- Right-click the breakpoint you want to describe
- Select "Edit description" from the context menu
- In the "Edit Description" dialog box, type the desired description.
- Open the Breakpoints dialog
- Start typing the description of the desired breakpoint
- To view the selected breakpoint without closing the dialog box, use the preview pane.
- To open the file with the selected breakpoint for editing, double-click the desired breakpoint.
- To close Breakpoints dialog, press
Cmd+Down
. The caret will be placed at the line marked with the breakpoint in question.
When you temporarily disable or enable a breakpoint, its icon changes from to and vice versa.
- Place the caret at the desired line with a breakpoint.
- Do one of the following:
- Run > Toggle Breakpoint Enable
- Right-click the desired breakpoint icon, select or deselect the enabled check box, and then click Done.
- Alt-click the breakpoint icon
Do one of he following:
- In the Breakpoints dialog box, select the desired line breakpoint, and click the red minus sign.
- In the editor, locate the line with the line breakpoint to be deleted, and click its icon in the left gutter.
- Place caret on the desired line and press
Cmd+F8
.
- Select the run/debug configuration to execute
- Do one of the following
OR
Debug quick menu
Ctrl+Alt+D
- Select the configuration from the pop-up menu
- Hit
Enter
The "Thread" drop-down lists the current processes in the local node. Only the current process is suspended. The rest of the processes are still running.
The Frames for the current process can be navigated up and down using the arrow keys or clicking on the frame.
- Press
Up
orDown
to change frames - Click the frame from the list
When changing frames or jumping to definitions, you can lose track of where the debugger is paused. To get back to the current execution point, do one of the following:
While Elixir allows rebinding variable names, Erlang does not, so when viewed in the Variables pane, variables will have an @VERSION
after their name indicating which rebinding of a the variable is. Even if there is no variable reuse, the first variable will still have @1
in its name.
The right-delimiter will be automatically inserted when the left delimiter is typed. In some cases, to prevent false positives, the the delimiter is only completed if when used for sigils.
Preceded By | Left | Right |
---|---|---|
do |
end |
|
fn |
end |
|
[ |
] |
|
{ |
} |
|
( |
) |
|
' |
' |
|
''' |
''' |
|
" |
" |
|
""" |
""" |
|
<< |
>> |
|
~<sigil-name> |
< |
> |
~<sigil-name> |
/ |
/ |
~<sigil-name> |
` | ` |
All delimiters that are auto-inserted are also matched for highlighting
Left | Right |
---|---|
do |
end |
fn |
end |
[ |
] |
{ |
} |
( |
) |
' |
' |
''' |
''' |
" |
" |
""" |
""" |
<< |
>> |
< |
> |
/ |
/ |
` | ` |
- Compile project with mix (use
mix compile
instead ofelixirc
directly) - Attach docs (don't use
--no-docs
elixirc
flag) - Attach debug info (don't use
--no-debug-info
elixirc
flag) - Ignore module conflict (use
--ignore-module-conflict
elixirc
flag)
- Have a file selected in Project view with the Project view in focus OR have an Editor tab in focus
- Build > Compile 'FILE_NAME'
- Build results will be shown
- Build > Make Project
- Build results will be shown
Live Templates are snippets of code that can be inserted quickly and have placeholder locations that the cursor will automatically jump to when using the template. Whenever you start typing, Live Templates will start matching against the shortcuts. A template can be selected with Tab.
Live Templates can be customized in Preferences > Editor > Live Templates > Elixir.
END
is the final location of the
cursor.
Shortcut | Code |
---|---|
@doc
|
|
case
|
|
cond
|
|
def
|
|
def,
|
|
defi
|
|
defm
|
|
defmac
|
|
defmacp
|
|
defover
|
|
defp
|
|
defpro
|
|
defs
|
|
do
|
|
doc
|
|
fn
|
|
for
|
|
if
|
|
ife
|
|
ii
|
|
mdoc
|
|
rec
|
|
test
|
|
try
|
|
Much like rake
tasks in Rubymine, this plugin can run mix
tasks.
- Run > Edit Configurations...
- Click +
- Select "Elixir Mix"
- Fill in the "Program arguments" starting with the name of the
mix
task followed by any arguments to that task - Fill in the "Working directory"
- Type the absolute path to the directory.
- Select the path using directory picker by clicking the
...
button
- (Optionally) click the
...
button on the "Environment variables" line to add environment variables. - Click "OK" to save the Run Configuration and close the dialog
- Click the Run arrow in the Toolbar to run the
mix
task - The Run pane will open, showing the results of the
mix
task.
The mix test
task gets a special type of Run Configuration, Elixir Mix ExUnit
. Using this Run Configuration type instead, of the basic Elixir Mix
Run Configuration will cause the IDE to attach a special formatter to mix test
, so that you get the standard graphical tree of Test Results
The Run pane will show Test Results. If there is a compilation error before or during mix test
, it will be shown as a test failure. If the compilation failure is in a _test.exs
file can it can be inferred from the stacktrace, the compilation error will show up as a test failure in that specific module.
doctest
names are rearranged to emphasize the function being tested: "test doc at MODULE.FUNCTION/ARITY (COUNT)"
becomes "MODULE.FUNCTION/ARITY doc (COUNT)"
. If MODULE
is the same as the test case without the Test
suffix, then MODULE
is stripped too and the test name becomes only FUNCTION/ARITY doc (COUNT)
.
- Run > Edit Configurations...
- Click +
- Select "Elixir Mix ExUnit"
- Fill in the "Program arguments" with the argument(s) to pass to
mix test
. Normally, this will be a directory liketest
, relative to the "Working directory" - Fill in the "Working directory"
- Type the absolute path to the directory.
- Select the path using directory picker by clicking the
...
button
- (Optionally) click the
...
button on the "Environment variables" line to add environment variables. - Click "OK" to save the Run Configuration and close the dialog
- Click the RUn arrow in the Toolbar to run the
mix test
task - The Run pane will open showing the Test Results
While you can create Elixir Mix ExUnit
run configurations manually using the Run > Edit Configurations...
menu, it is probably more convenient to use the context menu.
The context menu must know that the the directory, file, or line you are right-clicking is a test. It does this by checking if the current directory or an ancestor is marked as a Test Sources Root.
- In the Project pane, ensure your OTP application's
test
directory is marked as a Test Sources Root - Check if the
test
directory is green. If it is, it is likely a Test Sources Root. This color may differ in different themes, so to be sure you can check the context menu - Right-click the
test
directory. - Hover over "Mark Directory As >" * If "Unmark as Test Sources Root" is shown, then the directory is already configured correctly, and create from context will work. * If "Test Sources Root" is shown, then the directory need to be configured by clicking that entry
- Right-click the directory in the Project pane
- Click "Run Mix ExUnit", which will both create the Run Configuration and Run it.
- If you want to only create the Run Configuration, select "Create Mix ExUnit" instead
Alternatively, you can use keyboard shortcuts
- Select the directory in the Project pane.
Ctrl+Shift+R
will create the Run Configuration and Run it.
- Right-click the file in the Project pane
- Click "Run Mix ExUnit", which will both create the Run Configuration and Run it.
- If you want to only create the Run Configuration, select "Create Mix ExUnit" instead
Alternatively, you can use keyboard shortcuts
- Select the directory in the Project pane.
Ctrl+Shift+R
will create the Run Configuration and Run it.
Finally, you can use the editor tabs
- Right-click the editor tab for the test file you want to run
- Click "Run Mix ExUnit", which will both create the Run Configuration and Run it.
- If you want to only create the Run Configuration, select "Create Mix ExUnit" instead
If you want to be able to run a single test, you can create a Run Configuration for a line in that test
- Right-click a line in the test file
- Click "Run Mix ExUnit", which will both create the Run Configuration and Run it.
- If you want to only create the Run Configuration, select "Create Mix ExUnit" instead
Alternatively, you can use keyboard shortcuts
- Place the cursor on the line you want to test
Ctrl+Shift+R
will create the Run Configuration and Run it.
When you start typing an Alias, completion will look in three locations:
alias
aliased names in the current fileSuffix
foralias Prefix.Suffix
MultipleAliasA
orMultipleAliasB
foralias Prefix.{MultipleAliasA, MultipleAliasB}
As
foralias Prefix.Suffix, as: As
- Indexed module names (as available from Go To Symbol)
Prefix.Suffix
fromdefmodule Prefix.Suffix
MyProtocol
fromdefprotocol MyProtocol
MyProtocol.MyStruct
defimpl MyProtocol, for: MyStruct
defimpl MyProtocol
nested underdefmodule MyStruct
- Nested modules under aliased names
Suffix.Nested
foralias Prefix.Suffix
wherePrefix.Suffix.Nested
is an indexed module, implementation or protocol name.MultipleAliasA.Nested
foralias Prefix.{MultipleAliasA, MultipleAliasB}
wherePrefix.MultipleAliasA.Nested
alias Prefix.{MultipleAliasA, MultipleAliasB}
is an indexed module, implementation or protocol name.As.Nested
foralias Prefix.Suffix, as: As
wherePrefix.Suffix.Nested
is an indexed module, implementation, or protocol name.
When you start typing inside { }
for alias Prefix.{}
or import Prefix.{}
, completion will look for nested modules under Prefix
and then remove the Prefix.
, so completion will look like Suffix
.
Completion uses the same presentation as Structure, so you can tell whether the name is function/macro (Time), whether it is public/private (Visibility) and the Module where it is defined. Between the icons and the Modules is the name itself, which is highlighted in bold, the parameters for the call definition follow, so that you can preview the patterns required for the different clauses.
Qualified functions and macro calls will complete using those functions and macros defined in the qualifying Module (defmodule
), Implementation (defimpl
) or Protocol (defprotocol
). Completion starts as shown as .
is typed after a qualifying Alias.
Function and macro calls that are unqualified are completed from the index of all function and macro definitions, both public and private. (The index contains only those Elixir functions and macro defined in parsable source, such as those in the project or its dependencies. Erlang functions and Elixir functions only in compiled .beam
files, such as the standard library will not complete.) Private function and macros are shown, so you can choose them and then make the chosen function or macro public if it is a remote call.
Module attributes declared earlier in the file can be completed whenever you type @
and some letter. If you want to see all module attributes, you can type @a
, wait for the completions to appear, then delete the @
to remove the filtering to a
.
Parameter and variable usages can be completed whenever typing an identifier. The completions will include all variables know up from that part of the file. It can include variables from outside macros, like quote blocks.
.beam
files, such as those in the Elixir SDK, the Elixir SDK's Internal Erlang SDK, and in your project's build
directory will be decompiled to equivalent def
and defmacro
calls. The bodies will not be decompiled, only the call definition head and placeholder parameters. These decompiled call definition heads are enough to allow Go To Declaration, the Structure pane, and Completion to work with the decompiled .beam
files.
.beam
files are not detected purely by their file extension: the BEAM file format starts with a magic number, FOR1
, that is checked for before decompiling.
If the .beam
module was compiled with the compressed
compiler directive, which in Erlang looks like
-compile([compressed])
and in Elixir looks like
@compile [:compressed]
then the outer file format is GZip (which is detected by checking for the gzip magic number, 1f 8b
, at the start of the file) and the .beam
will be (stream) decompressed before the .beam
header is checked and the chunks decoded.
Functions and macros can have names that aren't valid identifier names, so the decompiler has special handlers to detect these invalid identifiers and escape them to make decompiled code that is parsable as valid Elixir.
Handler | Name/Arity | Decompiled | Reason |
Infix Operator | !=/2 |
left != right |
Infix operators are defined in infix position |
!==/2 |
left !== right |
||
&&/2 |
left && right |
||
&&&/2 |
left &&& right |
||
*/2 |
left * right |
||
=+/2 |
left + right |
||
=++/2 |
left ++ right |
||
-/2 |
left - right |
||
--/2 |
left -- right |
||
->/2 |
left -> right |
||
../2 |
left .. right |
||
//2 |
left / right |
||
::/2 |
left :: right |
||
</2 |
left < right |
||
<-/2 |
left <- right |
||
<<</2 |
left <<< right |
||
<<~/2 |
left <<~ right |
||
<=/2 |
left <= right |
||
<>/2 |
left <> right |
||
<|>/2 |
left <|> right |
||
<~/2 |
left <~ right |
||
<~>/2 |
left <~> right |
||
=/2 |
left = right |
||
==/2 |
left == right |
||
===/2 |
left === right |
||
=>/2 |
left => right |
||
=~/2 |
left =~ right |
||
>/2 |
left > right |
||
>=/2 |
left >= right |
||
>>>/2 |
left >>> right |
||
\\/2 |
left \\\\ right |
||
^/2 |
left ^ right |
||
^^^/2 |
left ^^^ right |
||
and/2 |
left and right |
||
in/2 |
left in right |
||
or/2 |
left or right |
||
|>/2 |
left |> right |
||
||/2 |
left || right |
||
|||/2 |
left ||| right |
||
~=/2 |
left ~= right |
||
~>/2 |
left ~> right |
||
~>>/2 |
left ~>> right |
||
Prefix Operator | +/1 |
(+value) |
To prevent precedence errors, unary prefix operators, which also have binary infix operators of the same name need to be defined inside parentheses |
-/1 |
(-value) |
||
Unquoted | %/2 |
unquote(:%)(p0, p1) |
Special forms need to defined as atom passed to unquote, as special forms are handled before macros defining the calls are applied |
%{}/1 |
unquote(:%{})(p0) |
||
&/1 |
unquote(:&)(p0) |
||
./2 |
unquote(:.)(p0, p1) |
||
<<>>/1 |
unquote(:<<>>)(p0) |
||
do/n |
unquote(:do)(p0, ...) |
Keywords need to be escaped | |
fn/1 |
unquote(:fn)(p0) |
Special forms need to defined as atom passed to unquote, as special forms are handled before macros defining the calls are applied | |
unquote/1 |
unquote(:unquote)(p0) |
||
unquote_splicing/1 |
unquote(:unquote_splicing)(p0) |
||
{}/n |
unquote(:{})(p0, ...) |
||
Capitalized/n |
unquote(:Capitalized)(p0, ...) |
Part of the Corba libraries in OTP have functions starting with a capital letter, which would be parsed as an Alias in Elixir if not unquoted. | |
#text#/1 |
unquote(:"#text#")(p0) |
Part of the XML libraries in OTP have functions
that start with or contain `#`, which would parse as a comment in Elixir if not unquoted in a double quoted
atom.
|
|
Default | name/n |
name(p0, ...) |
If no specialized handler is required, functions and macros are defined normally with pN for each parameter in the Nth position |
Go To Declaration is a feature of JetBrains IDEs that allows you to jump from the usage of a symbol, such as a Module
Alias, to its declaration, such as the defmodule
call.
- Place the cursor over an Alias with an aliased name setup by
alias
Suffix
ifalias Prefix.Suffix
calledMultipleAliasA
ifalias Prefix.{MultipleAliasA, MultipleAliasB}
calledAs
ifalias Prefix.Suffix, as: As
- Activate the Go To Declaration action with one of the following:
Cmd+B
- Select Navigate > Declaration from the menu.
Cmd+Click
- A Go To Declaration lookup menu will appear, allowing you to jump either the
alias
that setup the aliased name or jumping directly todefmodule
of the unaliased name. Select which declaration you want- Use arrow keys to select and hit
Enter
Click
- Use arrow keys to select and hit
You'll know if function or macro usage is resolved and Go To Declaration will work if the call is annotated, which in the default themes will show up as italics.
- Place the cursor over name of the function or macro call.
- Activate the Go to Declaration action with one of the following:
Cmd+B
- Select Navigate > Declaration from the menu.
Cmd+Click
- A Go To Declaration lookup menu will appear, allowing you to jump to either the
import
that imported the function or macro or jumping directly to the function or macro definition clause. Select which declaration you want.- Use arrow keys to select and hit
Enter
Click
- Use arrow keys to select and hit
- Place the cursor over name of the function or macro call.
- Activate the Go to Declaration action with one of the following:
Cmd+B
- Select Navigate > Declaration from the menu.
Cmd+Click
- Whether a lookup a Go To Declaration lookup menu appears depends on the number of clauses in the function or macro definition:
- If there is only one clause in the function or macro definition, you'll jump immediately to that clause
- If there is more than one clause in the function or macro definition, a Go To Declaration lookup menu will appear, allowing you to jump to either the
import
that imported the function or macro or jumping directly to the function or macro definition clause. Select which declaration you want.- Use arrow keys to select and hit
Enter
Click
- Use arrow keys to select and hit
- Place the cursor over name of the function or macro call that is qualified by an Alias.
- Activate the Go to Declaration action with one of the following:
Cmd+B
- Select Navigate > Declaration from the menu.
Cmd+Click
-
- If there is only one clause in the function or macro definition, you'll jump immediately to that clause
- If there is more than one clause in the function or macro definition, a Go To Declaration lookup menu will appear, allowing you to jump to either the
import
that imported the function or macro or jumping directly to the function or macro definition clause. Select which declaration you want.- Use arrow keys to select and hit
Enter
Click
- Use arrow keys to select and hit
- Place the cursor over a fully-qualified Alias
A.B
inA.B.func()
A.B
inalias A.B
B
inalias A.{B, C}
- Activate the Go To Declaration action with one of the following:
Cmd+B
- Select Navigate > Declaration from the menu.
Cmd+Click
If you hold Cmd
and hover over the Alias before clicking, the target declaration will be shown.
- Place the cursor over a
@module_attribute
- Activate the Go To Declaration action with one of the following:
Cmd+B
- Select Navigate > Declaration from the menu.
Cmd+Click
If you hold Cmd
and hover over the @module_attribute
before clicking, the target declaration will be shown.
- Place the cursor over a parameter or variable usage
- Active the Go To Declaration action with one of the following:
Cmd+B
- Select Navigate > Declaration from the menu.
Cmd+Click
If you hold Cmd
and hover over the variable before clicking, it will say parameter
or variable
, which matches the annotation color.
IntelliJ Elixir can reformat code to follow a consistent style.
do
block lines are indenteddo
blocksend
as the last argument of a no parentheses call unindents to the start of the call- If one clause of a multi-clause anonymous function wraps, all clauses wrap.
- Indent after
else
- Indent map and struct keys
- All keys wrap if any key wraps
- No spaces around...
.
- Spaces around...
and
in
or
when
- Configure spaces around...
=
<-
and\\
!=
,==
,=~
,!==
, and===
<
,<=
,>=
, and>
+
and-
*
and/
- Unary
+
,-
,!
,^
, and~~~
->
::
|
||
and|||
&&
and&&&
<~
,|>
,~>
,<<<
,<<~
,<|>
,<~>
,>>>
, and~>>
..
^^^
++
,--
,..
,<>
=>
- Configure spaces before...
,
- No space after...
@
- Spaces after...
not
fn
after
catch
rescue
key:
- Configure space after...
&
,
- Configure spaces within...
{ }
<< >>
[ ]
( )
- No space around
/
in&NAME/ARITY
and&QUALIFIER.NAME/ARITY
when
wraps when its right operand wraps, so that guards start withwhen
on a newline when they are too long.- Align
|>
at start of indented line for pipelines - Align
end
with start of call instead of start of line fordo
blocks in pipelines - Indent list elements when wrapped
- Indent tuple elements when wrapped
- Align type definition to right of
::
- Align guard to right of
when
when guards span multiple lines - Align two operator (
++
,--
,..
,<>
) operands, so that<>
binaries are multiple lines align their starts instead of using continuation indent and being indented relative to first operand. - Align pipe
|
operands, so that alternates in types and specs are aligned instead of continuation indented relative to the first operand. - Comments in
spec
(that is above operands to|
align with the operands - Remove newlines from pipelines, so that all pipelines start with an initial value or call and each
|>
is the start of a successive line. - Key exclusivity: if an association operation or keyword key is already on a line, the container value automatically has it's elements wrapped if there is nested associations or keyword pairs, so that two levels of keys are not on the same line.
- Indent bit string (
<< >>
) elements when wrapped
All files in a directory can be reformatted.
Using context menu:
- Open the Project pane
- Right-click the directory
- Select Reformat Code
- Set the desired options in the Reformat Code dialog
- Click Run
Using keyboard shortcuts:
- Open the Project pane
- Select the directory
Alt+Cmd+L
- Set the desired options in the Reformat Code dialog
- Click Run
All lines in a file can be reformatted.
Using context menu:
- Open the Project pane
- Right-click the file
- Select Reformat Code
- Set the desired options in the Reformat Code dialog
- Click OK
Using keyboard shortcuts:
- Open the Project pane
- Select the file
Alt+Cmd+L
- Set the desired options in the Reformat Code dialog
- Click OK
All the lines in the current editor tab file can be reformatted with the current settings.
- Code > Reformat
Alt+Cmd+L
Alt+Shift+Cmd+L
to get the Reformat Code dialog.
A subset of a file can be reformatted.
- Highlight the selection
- Use the Reformat Code action
- Code > Reformat Code
Alt+Shift+Cmd+L
Go To Symbol is a way to search for any of the following by name:
- Call definition clauses (
def
,defp
,defmacro
, anddefmacrop
) - Callbacks (
@callback
and@macrocallback
) - Call definition specifications (
@spec
) - Call definition heads (
foo(bar)
) for delegation (defdelegate foo(bar), to: BAZ
) - Implementations (
defimpl
) - Protocols (
defprotocol
)
You can bring up Go To Symbol with the keyboard shortcut (⌥⌘O on OSX) or using the menus (Navigate > Symbol...).
Go to Test allows you to jump from the a Source Module to its corresponding Test Module
- Have the cursor in the body of a Module
- Active the Go To Test action with one of the following:
Shift+Cmd+T
- Select Navigate > Test from the menu.
Go to Test Subject allows you to jump from the a Test Module to its corresponding Source Module
- Have the cursor in the body of a Test Module
- Active the Go To Test Subject action with one of the following:
Shift+Cmd+T
- Select Navigate > Test Subject from the menu.
Find Usage is a feature of JetBrains IDEs that allows you to find all the places a declared symbol, such a Module Alias
in a defmodule
, is used, including in strings and comments.
- Place cursor over an
defmodule
Alias. - Activate the Find Usage action with one of the following:
a.
i. Right-click the Alias
ii. Select "Find Usages" from the context menu
b. Select Edit > Find > Find Usages from the menu
c.
Alt+F7
- Place cursor over the
@module_attribute
part of the declaration@module_attribute value
. - Activate the Find Usage action with one of the following:
1.
1. Right-click the module attribute
2. Select "Find Usages" from the context menu
2. Select Edit > Find > Find Usages from the menu
3.
Alt+F7
- Place cursor over the parameter or variable declaration.
- Active the Find Usage action with one of the following:
1.
1. Right-click the Alias
2. Select "Find Usages" from the context menu
2. Select Edit > Find > Find Usages from the menu
3.
Alt+F7
- Place the cursor over the
@module_attribute
usage or declaration. - Active the Rename Refactoring action with one of the following:
1.
1. Right-click the module attribute
2. Select Refactoring from the context menu
3. Select "Rename..." from the Refactoring submenu
2.
Shift+F6
- Edit the name inline and have the declaration and usages update.
- Place the cursor over the parameter or variable usage or declaration
- Active the Rename Refactoring action with one of the following:
1.
1. Right-click the module attribute
2. Select Refactoring from the context menu
3. Select "Rename..." from the Refactoring submenu
2.
Shift+F6
- Edit the name inline and have the declaration and usages update.
NOTE: These instructions only apply to Rich IDEs, for a Small IDE use Elixir SDK Path
Because Elixir is built on top of Erlang, Elixir command line commands don't have OS native binaries, instead the OS native binaries from Erlang are used. In order to reliably find the Erlang OS native binaries, like erl
and erl.exe
, the path to BOTH the Erlang SDK and the Elixir SDK must be configured. This allows you to install Erlang and Elixir with completely different package managers too: you can install Erlang with kerl
and Elixir with kiex
and you don't have to worry about IntelliJ not seeing the environment variables set by kerl
when launching IntelliJ from an application launchers instead of a terminal.
Since JetBrains' OpenAPI only supports one SDK per Project or Module, to support Elixir and Erlang SDK at the same time, the Elixir SDK keeps track of an Internal Erlang SDK. When setting up your first Elixir SDK, you will be prompted to create an Erlang SDK (if you have the intellij-erlang
plugin installed) or and Erlang for Elixir SDK (if you don't have intellij-erlang
installed and you need to use the minimal Erlang for Elixir SDK supplied by this plugin).
With the Elixir SDK setup with an Internal Erlang SDK, you can see the Elixir SDK name and the home path, but unlike other SDKs, there's a dropdown for changing the Internal Erlang SDK.
You'll notice there is a mix of two different parent paths in Class Paths:
-
Those from the Elixir SDK Home Directory, which are the
lib/APP/ebin
for theAPP
s that ships with Elixir:eex
,elixir
,ex_unit
,iex
,logger
, andmix
. -
Those from the Internal Erlang SDK Home Directory, which are the
lib/APP-VERSION/ebin
for theAPP
s that ship with OTP.
The Class Paths are combined from the two SDKs because OpenAPI doesn't allow to dynamically delegate to the Internal Erlang SDK when checking for Class Paths to scan for completion and running. If you change the Internal Erlang SDK in the dropdown, the Class Paths will be updated to remove the old Internal Erlang SDK Class Paths and add the new Internal Erlang SDK Class Paths.
These Class Paths are not just for code completion and search anymore, all paths listed as passed with -pa
flag to erl
or erl.exe
when running mix
, so that you can mix different versions of OTP applications shipped with different version of OTP, so you can take advantage of the independently updatable OTP apps in the release notes for OTP.
-
The default SDK for new projects can we set from the Configure menu on Welcome Screen
-
Hover over "Project Defaults" to see its submenu
-
Select "Project Structure" from the submenu
-
IntelliJ will start out with no default SDK. To make the default SDK, an Elixir SDK, Click New
-
Select "Elixir SDK"
-
You'll get "Cannot Create SDK" message because there are no Erlang SDKs for the Elixir SDK to use as an Internal Erlang SDK. Click OK to create the Erlang SDK first.
-
You'll be actually prompted to Select Home Directory for the Erlang SDK
-
If you have the
intellij-erlang
plugin installed, you'll create an Erlang SDK from it.NOTE: Erlang SDK's default Home Directory favors the oldest version of Erlang installed. You probably want the newest version. To manually select the Home Directory, it is the directory that contains the
bin
,erts-VERSION
, andlib
subdirectories. For Homebrew, the path looks like/usr/local/Cellar/erlang/VERSION/lib/erlang
. It is important to select thelib/erlang
directory and not theVERSION
directory forintellij-erlang
to accept it as a Home Directory. -
If you don't have
intellij-erlang
installed, then you'll create and Erlang for Elixir SDK, which is supplied by this plugin.
-
-
With an Erlang SDK available to use as the Internal Erlang SDK, you'll be prompted for the Home Directory for the Elixir SDK.
In a Rich IDE, like IntelliJ IDEA, only the path to mix
is configured as an external tool. This mix
path is only used when creating new projects, so when opening a pre-existing project with Import project from external model, this doesn't even need to be set.
NOTE: To setup the SDK in a Rich IDE use Import project from external model or SDK
In a Small IDE, like Rubymine, the Project SDK is always a Ruby SDK, so to support a pseudo-Elixir-SDK in a Small IDE, the Elixir SDK Path can be set.
- Open Preferences > Other Settings > Elixir External Tools
- Set the Elixir SDK Path
- Paste the path to an Elixir SDK
- Click the
...
to select the directory
The pattern for the Elixir SDK Path varies based on the OS and package manager you used to install Elixir
OS | Package Manager | Elixir SDK Path |
---|---|---|
OSX/macOS | Homebrew | /usr/local/Cellar/elixir/VERSION |
OSX/macOS/Linux | Nix | /nix/store/HASH-elixir-VERSION |
Windows 32-bit | Erlang Solutions | C:\Program Files\Elixir |
Windows 64-bit | Erlang Solutions | C:\Program Files (x86)\Elixir |
Linux | Default | /usr/local/lib/elixir |
You can view the structure of the currently open editor tab using the Structure tool window.
- View > Tool Windows > Structure
- Click the Structure Button (normally in the left tool buttons)
- If you can't see the Tool Buttons, they can be enabled with View > Tool Buttons
Cmd+7
The buttons in the Structure tool are broken into 4 categories:
NOTE: When any combination of sorters is turned on, they are sorted from left to right (as shown in the button bar), so with all 3 sorters on, the elements are first grouped by Time, then inside each Time group, they are sorted by Visibility, then in each Visibility group, they are sorted by name.
The providers add nodes not in the text of the file, but that will appear in the compiled Module.
Icon | Tooltip | Description |
---|---|---|
Show Used | In Modules that `use ` or `use , arg`, the elements from the last `quote` block in the `__using__/1` for `` are injected. |
The expanders expand or collapse all the elements in the Structure tool window.
Icon | Tooltip | Description |
---|---|---|
Expand All | Expand All Elements in the Structure tool window | |
Collapse All | Collapse All Elements in the Structure tool window |
The autoscrollers link together the editor tab's location and the Structure tool windows selected element.
The Time icons indicate whether the element is usable at compile time or runtime.
The Visibility icons indicated whether the element is usable outside its defining Module.
There is currently no direct support for Embedded Elixir (*.eex
) templates.
However, because the Elixir syntax is so similar to Ruby, you can use
the Ruby language support for RHTML/ERB to get some syntax highlighting support
in *.eex
views.
Note that this involves disabling some of the support for Ruby, but if you don't write Ruby, or if you write it in a different IDE (e.g. RubyMine), it won't matter.
Here's the steps in Preferences (for OSX, other platforms may differ):
- Install the standard Jetbrains Ruby plugin
- Editor -> File Types -> RHTML: Add "
*.eex
" as type - Editor -> Inspections -> Ruby -> Unresolved Ruby Reference: Uncheck
- Editor -> Inspections -> Ruby -> Double Quoted String: Uncheck
Some non-Ruby syntax (e.g. ->
or do
) will still show as an
error, and of course none of the native Elixir support works, but most
things will highlight reasonably well. Unfortunately it's not
possible to disable all error highlighting, but you can
vote for this issue
to try and get that fixed (click the "thumbs up" next to "Voters").
You can disable the errors on a per-file basis, though, with the following steps:
- Open the
*.eex
file which is showing a Ruby syntax error inspection - From the menu pick
Analyze -> Configure Current File Analysis
- Move the "ruby" Highlighting Level slider to "None"
- Preferences
- Plugins
- Browse Repositories
- Select Elixir
- Install plugin
- Apply
- Restart the IDE
- Go to releases.
- Download the lastest zip.
- Preferences
- Plugins
- Install plugin from disk...
- Select the downloaded zip.
- Apply
- Restart the IDE.
If the plugin encounters an error, there is a custom error handler registered, so you can open a pre-populated issue in your browser.
- Click the red error notification in bottom right corner of the IDE window.
- Fill in a description of what you were doing when the error occurred.
- Click "Open Issue against https://github.com/KronicDeth/intellij-elixir"
- The IDE will open your browser to https://github.com/KronicDeth/intellij-elixir/issues/new
- The title will be filled as
[auto-generated]
, but if you can summarize the issue, change the title. - If the "Fatal IDE Errors" dialog has Attachments, copy their contents to the
Attachments
section of the issue body. - Review for IP disclosures. This will be public, so use your best judgement of how much of your code to post in the issue.
- Click the "Preview" tab to ensure the Markdown formatting looks correct.
- Click "Submit new issue".
If you would like to make a donation you can use Paypal:
If you'd like to use a different donation mechanism (such as Patreon), please open an issue.
I'd like to thank those who have donated to help support this project.
- Adrian Philipp (@adri)
- Artem Hordynskyi
- Bjorgvin Reynisson
- Garrett Hart (@https://github.com/thirdshift)
- Gerard de Brieder (@smeevil) of govannon.nl
- Jeremy Jackson (@jejacks0n)
- Josh Taylor (@joshuataylor)
- Maximilian Buschner
- Nguyen Le
- Percy Grunwald (@pgrunwald)
- Purelogic Apps
- Raúl Vázquez González (@rvazquezglez)
- Robin Hillard (@robinhillard) of rocketboots.com
- Ryan Scheel (@Havvy)
- Tynes Consulting
- William De Melo Gueiros (@williamgueiros)
- Yicheng Dong
- TreasureData
- Denis Andrejew (@seeekr)
- Vanja Radovanović (@elvanja)
- Bartłomiej Kuczyński (@Koziolek)
- Szymon Jeż (@szymon-jez)
- Klemen Sever (@achedeuzot)
- Christian Nelson (@christiannelson)
- César Salazar Hernández (@cesarslzr)
- Milan Köpke