MCPcopy Index your code
hub / github.com/Canop/codesort

github.com/Canop/codesort @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
125 symbols 380 edges 32 files 11 documented · 9%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

CodeSort

AGPL Latest Version Chat on Miaou

Your code is full of lists: enum variants, struct fields, match arms, function declarations, etc.

When a list grows, it's sometimes useful to sort it alphabetically, to help you keep track of the parts.

Of course you can't just sort lines: the code wouldn't work anymore; comments and annotations would be lost, spacing would be off, etc.

And sorting code manually is a tedious task.

codesort can do it for you, with a shortcut on the desired part of the code, directly in your IDE.

Here's the before and after of sorting around the cursor's line:

errors

Examples

Sort the variants of a rust enum

Sort the fields of a rust struct

Sort javascript function assignements

Here, the range to sort has been visually selected.

Sort the arms of a huge rust match

Install codesort

Having Rust dev environment installed, run

cargo install codesort

Usage

Sort a range in a file

codesort --range 6:26 src/my/file.rs

Sort around a line

Unless you specifically want to exclude a part of the list from sorting (eg a field you want to keep at the end of a struct), you should prefer to use --around which selects the range for you.

The first example of this readme has been sorted with the following command:

codesort --around 14 src/my/file.rs

Any other line number from 6 to 26 would have been fine, except the deeper lines 21 and 22 (if you sort around line 22, you sort start and end, which is probably not desired).

Sort from stdin, return to stdout

When no path is provided to codesort, specify the language using --lang/-l:

cat some/file.js | codesort -l js

Code Editor Integration

By default, codesort takes the code to sort from stdin and writes the sorted code to stdout.

It can sort either the whole input, a given range (with --range), or select the best range around a given line (using --around).

You can also change the input and output to be files, with --src and --dst.

If necessary, you can provide a filename to codesort for langage detection (the file doesn't have to exist, only the extension of the name will be used, eg .js).

Those options make it easy to integrate codesort in any editor. See below for vim and IntelliJ (contributions welcome for other editors).

Use codesort in vim / neovim

Sort the selection

When you don't want to sort the whole range (for example because there's a specific entry that you want to keep at the beginning), you can specify the range.

Visually select the selection, then type :, then !codesort. This changes the input to

:'<,'>!codesort

Press the enter key: the selection is sorted with codesort.

Add a binding to sort around the current line

You don't usually have to select the zone to sort. You can ask codesort to automatically select the zone to sort around your current line.

Define this binding in your vim configuration:

" sort the optimal range around the current line
" See https://github.com/Canop/codesort
nnoremap <Leader>cs ma<ESC>:execute ":%!codesort --around ".line('.')." --detect ".shellescape(expand('%:t'))<CR>`a

Typing the leader key then 'cs' will automatically select the set of blocs around the current line and sort it.

Explanation of the command:

  • the current position is saved in the a register with ma
  • the command including the line number is built then executed with :execute
  • the codesort command takes the current line number through --around
  • the codesort command takes the filename, for langage detection, through --detect
  • the previous position is then restored

Use codesort in IntelliJ

sort on a range

Configure the shortcut (File -> Settings -> Tools -> External tools) like this:

Arguments: --range $SelectionStartLine$:$SelectionEndLine$ $FileDir$/$FileName$

Settings Screenshot

To use it: right-click selection -> external tools -> codesort

sort around the current line

Arguments: --around $LineNumber$ $FileDir$/$FileName$

Settings Screenshot

Supported Code kinds

3 code analyzers are available now:

  • Rust / C / Zig
  • Java
  • JavaScript

Contribute

Codesort is much tested on Rust, but would need tests and probably improvements for other languages.

Whatever the language and use case, please come discuss on Miaou.

More info

Here's an article explaining how CodeSort works: https://dystroy.org/blog/sort-code/

Licence

codesort is licenced under AGPL-3.0.

You're free to use the codesort program to sort the code of your choice, even commercial.

Core symbols most depended-on inside this repo

push
called by 45
src/brace_stack.rs
print_debug
called by 42
src/focused.rs
len
called by 31
src/loc_list.rs
to_index
called by 26
src/line_number.rs
sort
called by 19
src/focused.rs
into_blocks
called by 14
src/loc_list.rs
focus_around_line_index
called by 11
src/loc_list.rs
depth
called by 10
src/brace_stack.rs

Shape

Method 68
Function 35
Class 14
Enum 8

Languages

Rust100%

Modules by API surface

src/loc_list.rs37 symbols
src/line_number.rs12 symbols
src/loc.rs10 symbols
src/analyzers/rust.rs7 symbols
src/gifts.rs5 symbols
src/brace_stack.rs5 symbols
src/analyzers/mod.rs5 symbols
src/spacing.rs4 symbols
src/cli/args.rs4 symbols
src/focused.rs3 symbols
src/analyzers/javascript.rs3 symbols
examples/sort-all-enums/main.rs3 symbols

For agents

$ claude mcp add codesort \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact