Skip to content
SpartanJPublic

About

Lightweight multi-platform code editor designed for modern hardware with a focus on responsiveness and performance.

Topics

Resources

Code of conduct

Contributing

Stars

1.7k stars

Watchers

11 watching

Forks

Latest commit

Β 

History

213 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation


ecode

ecode is a lightweight multi-platform code editor designed for modern hardware with a focus on responsiveness and performance. It has been developed with the hardware-accelerated eepp GUI, which provides the core technology for the editor. The project comes as the first serious project using the eepp GUI, and it's currently being developed to improve the eepp GUI library as part of one of its main objectives.

Screenshots

ecode - Code Editor

For more screenshots checkout running on macOS, running on Windows, running on Haiku, low dpi, code completion, terminal, file locator, file formats, global find, global replace, linter.

Notable Features

  • Lightweight
  • Portable
  • Uncluttered GUI
  • Syntax Highlighting (including nested syntax highlighting, supporting over 100 languages and LSP semantic highlighting)
  • Multi-cursor support
  • LSP support
  • Debugger support via Debug Adapter Protocol
  • Git integration
  • Terminal support
  • Command Palette
  • Auto-Completion
  • Customizable Linter support
  • Customizable Formatter support
  • Customizable Color-Schemes
  • Customizable keyboard bindings
  • Configurable build pipelines
  • Fast global search (and replace)
  • AI Assistant plugin with ACP support
  • Minimap
  • Unlimited editor splitting
  • Easily extendable language support
  • Customizable and scalable (non-integer) GUI (thanks to eepp GUI)
  • Dark & Light Mode
  • File system Tree View (with real-time file system changes)
  • Smart hot-reload of files
  • Folders as Projects with .gitignore support *
  • Per Project Settings
  • Smart and fast project file locator
  • Multiline search and replace
  • Project/Folder state persist between sessions
  • Soft-wrap
  • Code-folding
  • Session Snapshot & Periodic Backup
  • Perl Regular Expressions and Lua pattern searches support
  • Snippets support
  • Plugins support (linter, spell checker, LSP, DAP, Git, and more).

Folder / Project Settings (*)

In ecode, folders are treated as projects, similar to other code editors. However, ecode distinguishes itself by using the repository's .gitignore file as a project configuration to streamline file management.

Automatic File Filtering

ecode automatically excludes files listed in the .gitignore file when indexing project files. This ensures that only relevant files are considered for project-wide searches and navigation, resulting in faster and more accurate search outcomes.

Customizing File Inclusion

To override .gitignore filtering, ecode supports two configuration files in the .ecode/ subfolder:

  • .prjallowed: Add glob patterns to include files ignored by .gitignore, making them available for indexing and searching.
  • .prjdisallowed: Add glob patterns to exclude files that are not ignored by .gitignore, providing precise control over file visibility.

Supported File Types

By default, ecode indexes only file types it officially supports. Unsupported files are excluded unless their patterns are explicitly added to the .ecode/.prjallowed file.

This approach ensures an efficient and tailored project management experience with flexible customization options.

Philosophy

Some points to illustrate the project philosophy:

  • Extendable functionality but in a controlled environment. New features and new plugins are accepted, but the author will supervise any new content that might affect the application quality and performance.
  • Load as few files and resources as possible and load asynchronously as many resources as possible. Startup time of the application is considered critical.
  • Use the machine resources but not abuse them.
  • The editor implementation will try to prioritize performance and memory usage over simplicity.
  • Developed with modern hardware in mind: expected hardware should have low file system latency (SSD), high cores count and decent GPU acceleration.
  • Plugins and non-main functionality should never lock the main thread (GUI thread) or at least should block it as little as possible.
  • Terminals are part of the developer workflow.

Live Demo

ecode can be compiled to WASM and run in any modern browser. There are no plans to focus the development on the web version (at least for the moment) since there are plenty of good solutions out there. But you can give it a try:

Demo here

Demo Clarifications

  • You'll need a modern browser with SharedArrayBuffer support
  • Linter, Formatter, LSP Client and Debugger plugins won't work since they work by running other processes (except for the native formatters that are available)
  • WebGL renderer isn't optimized, so it's not as fast as it could/should be (still, performance is good in chromium based browsers)
  • Demo is designed for desktop resolutions (mobile is unusable, IME keyboard won't show up due to an emscripten limitation)

Source Code

Currently, the source code is located at the eepp project repository. ecode editor source is located at src/tools/ecode. ecode is being used to actively improve and iterate the eepp GUI library. At some point, it will be migrated to this repository. The ecode repository should be used for issues and documentation. PRs for ecode will be accepted at the eepp repository.

Build from Source

There are scripts for each supported platform ready to build the application. For Linux and macOS it is trivial to build the project, you'll just need to have GCC/Clang installed and also the development library from libSDL2. Windows build script is currently a cross-compiling script and it uses mingw64. But it also can be easily built with Visual Studio and libSDL2 development libraries installed. For more information on how to build manually a project please follow the eepp build instructions. The project name is always ecode (so if you are building with make, you'll need to run make ecode).

  • Linux build script can be found here. Running build.app.sh will try to build the AppImage package and tar.gz with the compressed application. ecode folder will contain the uncompressed application.
  • macOS build script can be found here. Running build.app.sh will create ecode.app. Run create.dmg.sh to create the dmg file. ecode.app folder will contain the uncompressed application.
  • Windows cross-compiling build script can be found here. Running build.app.sh will create a zip file with the zipped application package. ecode folder will contain the uncompressed application. To build from Windows follow the instructions here.
  • FreeBSD build script can be found here. Running build.app.sh will try to build a tar.gz with the compressed application. ecode.app folder will contain the uncompressed application.
  • Haiku build script can be found here. Running build.app.sh will try to build a tar.gz with the compressed application. ecode.app folder will contain the uncompressed application.

Nightly Builds

Nightly builds are being distributed here for the more impatient users. ecode is being developed actively, nightly builds may not be stable for daily usage unless there's a pending unreleased fix required for the user.

Plugins

Plugins extend the base code editor functionality. Currently all plugins are enabled by default, but they are optional and they can be disabled at any time. ecode implements an internal protocol that allow plugins to communicate with each other. The LSP protocol is going to be used as a base to implement the plugin communication. And, for example, the Linter plugin will consume the LSP to improve its diagnostics. Also the Auto Complete module will request assistance from the LSP, if available, to improve the completions and to provide signature help.

Linter

Linter support is provided by executing already stablished linters from each language. ecode provides support for several languages by default and can be extended easily by expanding the linters.json configuration.

For more information read the linter documentation.

LSP Client

LSP support is provided by executing already stablished LSP from each language. ecode provides support for several languages by default and can be extended easily by expanding the lspclient.json configuration.

For more information read the lsp client documentation.

Debugger

Debugger support is provided by the implementation the Debug Adapter Protocol. ecode is able to debug any language implementing this protocol, although the protocol is generic sometimes requires to support some of the languages some specific adaptation is needed, so initially the support is limited to the languages mentoined in the support list.

For more information on how to use the debugger read the debugger documentation.

Git integration

ecode provides some basic Git integration (more features will come in the future). Its main purpose is to help the user to do the most basics operations with Git. Some of the current features supported: git status and stats visualization (files states), commit, push, checkout, pull, fetch, fast-forward merge, creating+renaming+deleting branches, managing stashes. All stats will be automatically updated/refreshed in real time. There's also some basic configuration available.

For more information read the git integration documentation.

Auto Formatter

The formatter plugin works exactly like the linter plugin, but it will execute tools that auto-format code. ecode provides support for several languages by default with can be extended easily by expanding the formatters.json configuration.

For more information read the formatter documentation.

Auto Complete

The auto-complete plugin is in charge of providing suggestions for code-completion and signature help.

For more information read the auto-complete documentation.

AI Assistant

The AI Assistant is a simple but effective LLM Chat UI. You'll be able to chat with different models from within the editor.

For more information read the AI assistant documentation.

Spell Checker

The spell checker plugin uses the typos specialized tool for code spell checking.

For more information read the Spell Checker documentation.

XML Tools

The XML Tools plugin (disabled by default) provides some nice to have improvements when editing XML content.

For more information read the xml tools documentation.

Plugins configuration files location

ecode respects the standard configuration paths on each OS:

  • Linux: uses XDG_CONFIG_HOME, usually translates to ~/.config/ecode/plugins
  • macOS: uses Application Support folder in HOME, usually translates to ~/Library/Application Support/ecode/plugins
  • Windows: uses APPDATA, usually translates to C:\Users\{username}\AppData\Roaming\ecode\plugins

Plugins important behaviors

All plugin configurations are designed to be overwritable by the user. This means that the default configuration can be replaced with custom configurations from the user. For example, if the user wants to use a different linter, it just needs to declare a new linter definition in its own linter configuration file. The same applies to formatters and LSPs servers. Plugins will always implement a "config" for plugins customization, and will always implement a "keybindings" key to configure custom keybindings.

UI Customizations

ecode is highly customizable and extendable thanks to its several configuration files. If you're interested in creating new color schemes for the editor or terminal, or in creating new UI themes please check our documentation:

For more information read the UI Customization documentation.

Language support

ecode is constantly adding more languages support and also supports extending it's language support via configuration files (for every feature: syntax highlighting, LSP, linter and formatter).

Language support table

Language Highlight LSP Linter Formatter Debugger
.htaccess βœ“ None None None None
.ignore file βœ“ None None None None
[x]it! βœ“ None None None None
ada βœ“ ada_language_server None None None
adept βœ“ AdeptLSP None None None
angelscript βœ“ None None None None
arm assembly βœ“ None None None None
awk script βœ“ None None None None
bat βœ“ None None None None
bazel βœ“ None None None None
bend βœ“ None None None None
blade βœ“ None None None None
blueprint βœ“ None None None None
bolt βœ“ None None None None
brainfuck βœ“ None None None None
buzz βœ“ None None None None
c βœ“ clangd cppcheck clang-format gdb / lldb-dap
c2 βœ“ None None None None
c3 βœ“ c3-lsp None None None
carbon βœ“ None None None None
clojure βœ“ clojure-lsp None None None
cmake βœ“ neocmakelsp None None None
cmakecache βœ“ None None None None
covscript βœ“ None None None None
cpp βœ“ clangd cppcheck clang-format gdb / lldb-dap
crystal βœ“ crystalline None None None
csharp βœ“ OmniSharp None None None
css βœ“ emmet-language-server None native None
csv βœ“ None None None None
curry βœ“ None None None None
d βœ“ serve-d None None gdb
dart βœ“ dart language-server None None dart
diff βœ“ None None None None
dockerfile βœ“ docker-langserver None None None
ec βœ“ None None None None
elena βœ“ None None None None
elixir βœ“ elixir-ls None None None
elm βœ“ elm-language-server None None None
environment file βœ“ None None None None
fantom βœ“ None None None None
fennel βœ“ None None None None
fixscript βœ“ None None None None
flow9 βœ“ None None None None
fortran βœ“ fortls None None gdb
freebasic βœ“ None None None None
fstab βœ“ None None None None
gdscript βœ“ None None None None
gemini βœ“ None None None None
gleam βœ“ None None None None
glsl βœ“ glsl_analyzer None None None
gn βœ“ None None None None
gnuplot βœ“ None None None None
go βœ“ gopls None gopls gdb / delve
graphql βœ“ None None None None
groovy βœ“ None None None None
hare βœ“ None None None None
haskell βœ“ haskell-language-server hlint ormolu None
haxe βœ“ None None None None
hlsl βœ“ None None None None
html βœ“ emmet-language-server native prettier None
idl βœ“ None None None None
ini βœ“ None None None None
ispc βœ“ None None None None
jai βœ“ None None None None
janet βœ“ None None None None
java βœ“ jdtls None clang-format None
javascript βœ“ typescript-language-server oxlint prettier node
javascriptreact βœ“ typescript-language-server None None None
json βœ“ None native native None
jule βœ“ None None None None
julia βœ“ LanguageServer.jl None None None
koka βœ“ None None None None
kotlin βœ“ kotlin-language-server ktlint ktlint None
l.b. stanza βœ“ None None None None
latex βœ“ texlab None None None
lisp βœ“ None None ros None
lobster βœ“ None None None None
lua βœ“ lua-language-server luacheck None None
m4 βœ“ None None None None
makefile βœ“ None None None None
markdown βœ“ marksman None None None
meson βœ“ None None None None
modula2 βœ“ None None None None
modula3 βœ“ None None None None
moonscript βœ“ None None None None
msbuild solution βœ“ None None None None
nelua βœ“ None nelua None None
nim βœ“ nimlsp nim None None
nix βœ“ None None None None
objc βœ“ None None None None
objeck βœ“ None None None None
objective-cpp βœ“ clangd None clang-format None
ocaml βœ“ OCaml-LSP None None None
odin βœ“ ols None None lldb-dap
openscad βœ“ None None None None
pascal βœ“ None None None gdb
perl βœ“ PerlNavigator None None perl-ls
php βœ“ phpactor php None None
pico-8 βœ“ None None None None
pkg-config βœ“ None None None None
plaintext βœ“ None None None None
po βœ“ None None None None
pony βœ“ None None None None
postgresql βœ“ None None None None
powershell βœ“ None None None None
python βœ“ pylsp ruff ruff debugpy
qb64 βœ“ None None None None
qbs βœ“ None None None None
qmake βœ“ None None None None
r βœ“ r languageserver None None None
racket βœ“ racket-langserver None None None
rave βœ“ None None None None
rc script βœ“ None None None None
rescript βœ“ None None None None
ring βœ“ None None None None
rpm spec βœ“ None None None None
ruby βœ“ solargraph None None None
rust βœ“ rust-analyzer None rustfmt gdb / lldb-dap
sass βœ“ emmet-language-server None None None
scala βœ“ metals None None None
scheme βœ“ None None None None
shellscript βœ“ bash-language-server None None None
smallbasic βœ“ None None None None
solidity βœ“ solc solhint None None
sql βœ“ None None None None
squirrel βœ“ None None None None
svelte βœ“ None None None None
swift βœ“ sourcekit-lsp None None None
tcl βœ“ None None None None
teal βœ“ None tl None None
toml βœ“ None None None None
tsv βœ“ None None None None
typescript βœ“ typescript-language-server oxlint prettier node
typescriptreact βœ“ typescript-language-server None None None
typst βœ“ Tinymist None None None
v βœ“ v-analyzer None v None
v1 βœ“ None None None None
vala βœ“ vala-language-server None None None
verilog βœ“ None None None None
viml βœ“ None None None None
visual basic βœ“ None None None None
vue βœ“ vls None None None
webassembly interface types βœ“ None None None None
webassembly text format βœ“ None None None None
wren βœ“ None None None None
x86 assembly βœ“ None None None None
xml βœ“ emmet-language-server native native None
xtend βœ“ None None None None
yaml βœ“ yaml-language-server native None None
yuescript βœ“ None None None None
zephir βœ“ None None None None
zig βœ“ zls zig zig lldb-dap
ΓΌ βœ“ Ü language server None None gdb / lldb-dap

native

Native tag means that the feature is supported natively by ecode and it doesn't need any external tool to function.

Language support health

ecode brings a tool to display the current language support health. From ecode you can check its health status from Settings -> Tools -> Check Language Health, and from CLI you can use the --health flag: ecode --health. Use the health check flag to troubleshoot missing language servers, linters and formatters.

Check the health of all languages with ecode --health or ask for details about a specific language with ecode --health-lang=<lang>.

Custom languages support

Users can add support for new languages with a very simple JSON file format.

For more information read the custom languages documentation.

Planned Features

Listed in no particular order:

  • General polishing
  • Macros support
  • Better integration with OSes
  • Modal editing
  • Maybe Remote development support
  • Maybe Tree-sitter support

Collaborate

The author is more than open to collaborations. Any person interested in the project is invited to participate. Many features are still pending, and the project will grow much more over time. Please, collaborate. =)

Before participating, please read the contribution and community support guidelines and the Code of Conduct.

Current Limitations

  • No VIM-mode / modal editing *1

*1 I'm not a VIM user, and I'm not qualified to implement the VIM mode or any modal editing. PRs are welcome to support this.

Author comments

This editor has a deeply rooted inspiration from the lite, lite-xl, QtCreator and Sublime Text editors. Several features were developed based on the lite/lite-xl implementations. Some features can be ported directly from lite: color-schemes and syntax-highlighting patterns (eepp implementation expands original lite implementation to add many more features).

ecode is being used mostly in Linux and macOS, it's not well tested in Windows. If you find any issues with the editor please report it here.

This is a work in progress, stability is not guaranteed. Please don't use it for critical tasks. I'm using the editor daily and is stable enough for me, but use it at your own risk.

Acknowledgements

Special thanks to

Code License

MIT License

About

Lightweight multi-platform code editor designed for modern hardware with a focus on responsiveness and performance.

Topics

Resources

Code of conduct

Contributing

Stars

1.7k stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages