Skip to content

Question: is there a way to configure Tonsky's indentation rule? #21

Open

Description

@markx

Activity

  1. changed the title [-]Question: is there a way to configure Tonsky's indent rule?[/-] [+]Question: is there a way to configure Tonsky's indentation rule?[/+] on Dec 21, 2021
  2. axvr commented on Dec 21, 2021

    @axvr
    Member

    From a quick scan of that page, it looks like clojurefmt doesn’t exist (yet?). But if it does exist, you can tell Vim to use it by setting formatprg like this:

    autocmd! FileType clojure setlocal formatprg=clojurefmt

    This will set the program used by the gq operator. So to format the entire file using clojurefmt you would type gggqG in normal mode.

    The downside to this is that formatting won’t happen automatically, but you could write a little Vim script to auto-format on file save.

  3. markx commented on Dec 23, 2021

    @markx
    Author

    Thanks for the tip about formatprg. With it I can use external tools like cljstyles to format the file.

    However this is not what I was looking for originally. I was looking for a way to adjust the vim indent config so that it auto-indents following Tonsky's indentation rule. This way the indentation would be correct while I type, so I don't need to save the file constantly.

    After some exploring, I found the indentation for lispwords basically works in my setting (I think mostly just set shiftwidth=2), so I just add everything to listpwordsby using:

    let g:clojure_fuzzy_indent_patterns = ['^\S\+']
    

    This works in most cases but sometimes doesn't. I haven't figured out why yet.

    Is there a better to achieve this?

  4. axvr commented on Dec 23, 2021

    @axvr
    Member

    Oh, OK I think I understand now.

    Do you have an example of where your g:clojure_fuzzy_indent_patterns value isn't working properly?

    Maybe you could try this one (it should be slightly more accurate):

    let g:clojure_fuzzy_indent_patterns = ['^[\k\d]\+']
  5. reopened this on Dec 23, 2021
  6. markx commented on Dec 24, 2021

    @markx
    Author

    E.g. for this sometimes it doesn't work. (Sometimes it does work. Not sure why. )

    (+
     1
     1)
    

    Desired result would be:

    (+
      1
      1)
    

    Also let g:clojure_fuzzy_indent_patterns = ['^[\k\d]\+'] doesn't seem to work for me :(
    What does \k match?

  7. axvr commented on Dec 27, 2021

    @axvr
    Member

    Thanks for the example. I'll look into this when I get a chance (hopefully soon).

    (The \k matches characters in the iskeyword option. This value lists (most of) the characters allowed in Clojure symbols.)

  8. self-assigned this
    on Dec 27, 2021
  9. Deraen commented on Feb 4, 2022

    @Deraen
    Member

    g:clojure_align_subforms option controls whether to indent function calls with one (tonsky's post) or two spaces ("emacs"/clojure-style-guide). The first, two spaces, is the default.

    If you haven't changed the option, check your indentexpr, formatexpr, formatprg, you might another plugin which is indenting function call forms with one space.

  10. added a commit that references this issue on Apr 27, 2023
  11. linked a pull request that will close this issueRewrite indentation code #31on Jun 23, 2023
  12. added this to the Indentation overhaul milestone on Jun 23, 2023
  13. garrett-hopper commented on May 8, 2025

    @garrett-hopper

    Looks like the (+<CR>...) issue is due to s:current_word calling searchpos('\v>'...) when it's on the symbol in question. This search fails when the symbol is a single character. Potentially making it move back a character before searching would be sufficient?

    RE: clojure_fuzzy_indent_patterns, I've been using this pattern which I adapted from the tree-sitter grammar

    local suffixonly = ":#'0-9\\/" -- not allowed as first character
    local forbidden = {
      [[\[\]\n\r\t \\]], -- brackets, whitespace, slashes
      '(){}"@~^;`,', -- parens, braces, special characters
      suffixonly,
    }
    local prefix = string.format("[^%s]", table.concat(forbidden))
    local suffix = string.format([[\(%s\|[%s]\)*]], prefix, suffixonly)
    local symbol = prefix .. suffix
    vim.g["clojure_fuzzy_indent_patterns"] = { symbol }

    It's slightly more accurate than relying on \k in the pattern. Still, I don't think there's an easy userland fix for the single character symbols.

    Edit: Ha, just saw #31; wish I'd looked closer before spending time looking into this. 😆

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions