Skip to content

Instantly share code, notes, and snippets.

@yogthos
Forked from jasongilman/atom_clojure_setup.md
Last active October 20, 2017 12:31
Show Gist options
  • Save yogthos/da9a5ce386e7a6c73d5f1978bf4ba76d to your computer and use it in GitHub Desktop.
Save yogthos/da9a5ce386e7a6c73d5f1978bf4ba76d to your computer and use it in GitHub Desktop.
This describes how I setup Atom for Clojure Development.

Atom Clojure Setup

This describes how I setup Atom for an ideal Clojure development workflow. This fixes indentation on newlines, handles parentheses, etc. The keybinding settings for enter (in keymap.cson) are important to get proper newlines with indentation at the right level. There are other helpers in init.coffee and keymap.cson that are useful for cutting, copying, pasting, deleting, and indenting Lisp expressions.

Install Atom

Download Atom

The Atom documentation is excellent. It's highly worth reading the flight manual.

Install Java and Leiningen

Install These Packages

These are the ones I install related to Clojure development.

  • proto-repl - Clojure REPL, autocompletion, etc.
  • proto-repl-charts - Graphs and Charts
  • ink - Proto REPL dependency used for inline display and the REPL output.
  • tool-bar - Proto REPL uses this to display a tool bar with options.
  • lisp-paredit - Allows structurally manipulating s-expressions, maintains balanced parens.
  • highlight-selected - highlights selected keywords throughout an editor.
  • set-syntax - Easily change syntax with the command palette.

optionally, you might prefer Parinfer to lisp-paredit

  • Parinfer - Handles parentheses and general Lisp editing.

Package Settings

language-clojure

This is the built in package that comes with Atom for the Clojure Grammar. I find the default settings bad for the way that I work. I recommend changing them to the following.

  • Auto Indent: unchecked
  • Auto Indent On Paste: unchecked
  • Non Word Characters: ()"':,;~@#$%^&{}[]`
  • Scroll Past End: checked
  • Tab Length: 1

Everything else is left at the default.

bracket-matcher

Change autocomplete characters to (), [], {}, "", “”, ‘’, «», ‹› This disables closing of single quotes and back ticks.

Proto REPL

Enabled Checkboxes: auto pretty print, auto scroll, display executed code, enable completions, prefer lein, all the refresh check boxes, show inline results, use clojure syntax.

lisp-paredit

  • Enabled: checked
  • Strict: checked
  • Indentation Forms: try, catch, finally, /^let/, are, /^def/, fn, cond, condp, /^if.*/, /.*\/for/, for, for-all, /^when.*/, testing, doseq, dotimes, ns, routes, GET, POST, PUT, DELETE, extend-protocol, loop, do, case, with-bindings, checking, with-open

Atom Settings

These are main Atom Settings related to Clojure that are different than the default.

  • Auto Indent On Paste: unchecked
  • Scroll Past End: checked
    • Due to this autocomplete issue there is a lot of flashing from the autocomplete window that pops up. Scrolling down farther usually resolves the issue.

styles.less

Atom has a place for custom styles. Place the following in your styles.less. This disables unbalanced lisp-paredit parentheses indicators in the REPL.

.proto-repl-repl::shadow .lisp-syntax-error .region {
  background-color: rgba(0, 0, 0, 0) !important;
}

init.coffee and keymap.cson

The files included in this gist init.coffee and keymap.cson contain additional settings for Atom. You can paste their contents in the files after opening them in Atom.

# These add some convenience commands for cutting, copying, pasting, deleting, and indenting Lisp expressions.
# Applies the function f and then reverts the cursor positions back to their original location
maintainingCursorPosition = (f)->
editor = atom.workspace.getActiveTextEditor()
currSelected = editor.getSelectedBufferRanges()
f()
editor.setSelectedScreenRanges(currSelected)
# Cuts the current block of lisp code.
atom.commands.add 'atom-text-editor', 'jason:cut-sexp', ->
editor = atom.workspace.getActiveTextEditor()
atom.commands.dispatch(atom.views.getView(editor), 'lisp-paredit:up-sexp')
atom.commands.dispatch(atom.views.getView(editor), 'lisp-paredit:expand-selection')
atom.commands.dispatch(atom.views.getView(editor), 'core:cut')
# Copies the current block of lisp code.
atom.commands.add 'atom-text-editor', 'jason:copy-sexp', ->
maintainingCursorPosition ->
editor = atom.workspace.getActiveTextEditor()
atom.commands.dispatch(atom.views.getView(editor), 'lisp-paredit:up-sexp')
atom.commands.dispatch(atom.views.getView(editor), 'lisp-paredit:expand-selection')
atom.commands.dispatch(atom.views.getView(editor), 'core:copy')
# Pastes over current block of lisp code.
atom.commands.add 'atom-text-editor', 'jason:paste-sexp', ->
editor = atom.workspace.getActiveTextEditor()
atom.commands.dispatch(atom.views.getView(editor), 'lisp-paredit:up-sexp')
atom.commands.dispatch(atom.views.getView(editor), 'lisp-paredit:expand-selection')
atom.commands.dispatch(atom.views.getView(editor), 'core:paste')
# Deletes the current block of lisp code.
atom.commands.add 'atom-text-editor', 'jason:delete-sexp', ->
editor = atom.workspace.getActiveTextEditor()
atom.commands.dispatch(atom.views.getView(editor), 'lisp-paredit:up-sexp')
atom.commands.dispatch(atom.views.getView(editor), 'lisp-paredit:expand-selection')
atom.commands.dispatch(atom.views.getView(editor), 'core:delete')
# Indents the top level sexp.
atom.commands.add 'atom-text-editor', 'jason:indent-top-sexp', ->
maintainingCursorPosition ->
editor = atom.workspace.getActiveTextEditor()
range = protoRepl.EditorUtils.getCursorInClojureTopBlockRange(editor)
# Work around a lisp paredit bug where it can't indent a range if selected from the very beginning of the file
start = range.start
if start.column == 0 && start.row == 0
start.column = 1
editor.setSelectedScreenRange(range)
atom.commands.dispatch(atom.views.getView(editor), 'lisp-paredit:indent')
# Allows using enter to select an autocomplete suggestion.
'.platform-darwin atom-text-editor[data-grammar~="clojure"].autocomplete-active':
'enter': 'autocomplete-plus:confirm'
'.platform-darwin atom-text-editor[data-grammar~="clojure"]':
'enter': 'lisp-paredit:newline'
# Indent the current selection
'cmd-i': 'lisp-paredit:indent'
# Expand/shrink the selection up a block
'cmd-shift-up': 'lisp-paredit:expand-selection'
'cmd-shift-down': 'lisp-paredit:contract-selection'
# Helpers for cutting, copying, pasting, deleting, and indenting a Clojure code
'cmd-shift-x': 'jason:cut-sexp'
'cmd-shift-c': 'jason:copy-sexp'
'cmd-shift-v': 'jason:paste-sexp'
'cmd-shift-delete': 'jason:delete-sexp'
'cmd-shift-d': 'jason:delete-sexp'
'cmd-shift-i': 'jason:indent-top-sexp'
# Miscellaneous helpers. Less applicable to clojure code. (optional)
'.platform-darwin atom-workspace atom-text-editor':
'ctrl-d': 'proto-repl:exit-repl'
'cmd-l': 'go-to-line:toggle'
'ctrl-l': 'proto-repl:clear-repl'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment