Giter Club home page Giter Club logo

ecode's Introduction


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
  • Minimalist GUI
  • Syntax Highlighting (including nested syntax highlighting, supporting over 90 languages and LSP semantic highlighting)
  • Multi-cursor support
  • Terminal support
  • Command Palette
  • LSP support
  • Git integration
  • Auto-Completion
  • Customizable Linter support
  • Customizable Formatter support
  • Customizable Color-Schemes
  • Customizable keyboard bindings
  • Configurable build pipelines
  • Unlimited editor splitting
  • Minimap
  • Fast global search (and replace)
  • 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
  • Lua pattern searches support
  • Plugins support.

Folder / Project Settings (*)

ecode treats folders as projects, like many other editors. The main difference is that it also tries to automatically sanitize the project files by filtering out any file that it's filtered in the repository .gitignore files. The idea is to use the .gitignore file as a project setting. The project files will be the ones used to find files in the project and do global searches. Usually, this translates into much better results for any project-related search. There's also a very simple mechanism to allow visibility of filtered files by the .gitignore, by adding a file with the allowed filtered patterns in a subfolder over the folder loaded, creating a file in .ecode/.prjallowed with the necessary glob patterns allowing the filtered patterns to be "unfiltered". ecode will only add files that are supported by the editor, the editor won't try to do anything with files that are not officially supported.

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 and LSP plugins won't work since both work 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.
  • macOS build script can be found here. Running build.app.sh will create ecode.app.
  • Windows cross-compiling build script can be found here. Running build.app.sh will create a zip file with the zipped application package.

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
.htaccess None None None
.ignore file None None None
[x]it! None None None
adept AdeptLSP None None
angelscript None None None
bat None None None
blueprint None None None
brainfuck None None None
buzz None None None
c clangd cppcheck clang-format
carbon None None None
clojure clojure-lsp None None
cmake cmake-language-server None None
cpp clangd cppcheck clang-format
crystal crystalline None None
csharp OmniSharp None None
css emmet-language-server None native
d serve-d None None
dart dart language-server None None
diff None None None
dockerfile docker-langserver None None
elixir elixir-ls None None
elm elm-language-server None None
environment file None None None
fantom None None None
fortran None None None
fstab None None None
gdscript None None None
glsl glsl_analyzer None None
go gopls None gopls
graphql None None None
groovy None None None
hare None None None
haskell haskell-language-server hlint ormolu
haxe None None None
haxe compiler arguments None None None
hlsl None None None
html emmet-language-server None prettier
ini None None None
jai None None None
java jdtls None None
javascript typescript-language-server eslint prettier
javascriptreact typescript-language-server None None
json None jq native
julia None None None
kotlin kotlin-language-server ktlint ktlint
latex texlab None None
lobster None None None
lua lua-language-server luacheck None
makefile None None None
markdown None None None
meson None None None
moonscript None None None
nelua None nelua None
nim nimlsp nim None
objeck None None None
objective-c clangd None clang-format
odin ols None None
pascal None None None
perl None None None
php phpactor php None
pico-8 None None None
plaintext None None None
po None None None
pony None None None
postgresql None None None
powershell None None None
python pylsp ruff black
r r languageserver None None
ruby solargraph None None
rust rust-analyzer None rustfmt
sass emmet-language-server None None
scala metals None None
shellscript bash-language-server None None
smallbasic None None None
solidity solc solhint None
sql None None None
swift sourcekit-lsp None None
teal None tl None
toml None None None
typescript typescript-language-server eslint prettier
typescriptreact typescript-language-server None None
v v-analyzer None v
vala vala-language-server None None
verilog None None None
visual basic None None None
vue vls None None
wren None None None
x86 assembly None None None
xml emmet-language-server native native
xtend None None None
yaml yaml-language-server None None
zig zls zig zig

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>.

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. linters.json default configuration can be obtained from here. To configure new linters you can create a new linters.json file in the default configuration path of ecode.

linters.json format

The format is a very simple JSON object with a config object and array of objects containing the file formats supported, the Lua pattern to find any error printed by the linter to the stdout, the position of each group of the pattern, and the command to execute. It also supports some optional extra object keys.

JavaScript linter example (using eslint)

{
    "config": {
        "delay_time": "0.5s"
    },
    "linters": [
      {
        "file_patterns": ["%.js$", "%.ts$"],
        "warning_pattern": "[^:]:(%d+):(%d+): ([^%[]+)%[([^\n]+)",
        "warning_pattern_order": { "line": 1, "col": 2, "message": 3, "type": 4 },
        "command": "eslint --no-ignore --format unix $FILENAME"
      }
    ]
}

That's all we need to have a working linter in ecode. Linters executables must be installed manually by the user, linters will not come with the editor, and they also need to be visible to the executable. This means that it must be on PATH environment variable or the path to the binary must be absolute.

Currently supported linters

Please check the language support table

Linter config object keys

  • delay_time: Delay to run the linter after editing a document
  • enable_error_lens: Enables error lens (prints the message inline)
  • enable_lsp_diagnostics: Boolean that enable/disable LSP diagnostics as part of the linting. Enabled by default.
  • disable_lsp_languages: Array of LSP languages disabled for LSP diagnostics. For example: "disable_lsp_languages": ["lua", "python"], disables lua and python.

Linter JSON object keys

  • file_patterns: Array of Lua Patterns representing the file extensions that must use the linter
  • warning_pattern: Lua Pattern to be parsed from the executable stdout
  • warning_pattern_order: The order where the line, column, error/warning/notice message, and the type of the message (warning, error, notice, info) are read. The pattern must have at least 3 groups (line, message, and type). The error type is auto-detected from its name.
  • command: The command to execute to run the linter. $FILENAME represents the file path.
  • url (optional): The web page URL of the linter
  • expected_exitcodes: Array of integer numbers accepted as parseable exit codes (optional)
  • no_errors_exit_code: Integer number representing the exit code that means that no errors were found (optional).
  • deduplicate: In case the linter outputs duplicated errors, this boolean will ignore duplicated errors (optional, boolean true/false)
  • use_tmp_folder: Temporal files (files representing the current status of the modified file) will be written in the default temporal folder of the operating system, otherwise it will be written in the same folder path of the modified file (optional, boolean true/false).

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. formatters.json default configuration can be obtained from here. It also supports some formatters natively, this means that the formatter comes with ecode without requiring any external dependency. And also supports LSP text document formatting, meaning that if you're running an LSP that supports formatting documents, formatting will be available too. To configure new formatters you can create a new formatters.json file in the default configuration path of ecode.

formatters.json format

{
    "config": {
        "auto_format_on_save": false
    },
    "keybindings": {
        "format-doc": "alt+f"
    },
    "formatters": [
        {
            "file_patterns": ["%.js$", "%.ts$"],
            "command": "prettier $FILENAME"
        }
    ]
}

Currently supported formatters

Please check the language support table

Formatter config object keys

  • auto_format_on_save: Indicates if after saving the file it should be auto-formatted

Formatter keybindings object keys

  • format-doc: Keybinding to format the doc with the configured language formatter

Formatter JSON object keys

  • file_patterns: Array of Lua Patterns representing the file extensions that must use the formatter
  • command: The command to execute to run the formatter. $FILENAME represents the file path
  • type: Indicates the mode that which the formatter outputs the results. Supported two possible options: "inplace" (file is replaced with the formatted version), "output" (newly formatted file is the stdout of the program, default option) or "native" (uses the formatter provided by ecode)
  • url (optional): The web page URL of the formatter

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. lspclient.json default configuration can be obtained from here. To configure new LSPs you can create a new lspclient.json file in the default configuration path of ecode.

Important note: LSP servers can be very resource intensive and might not be always the best option for simple projects.

Implementation details: LSP servers are only loaded when needed, no process will be opened until a supported file is opened in the project.

lspclient.json format

The format follows the same pattern that all previous configuration files. Configuration is represented in a JSON file with three main keys: config, keybindings, servers.

C and C++ LSP server example (using clangd)

{
    "config": {
        "hover_delay": "0.5s"
    },
    "servers": [
        {
          "language": "c",
          "name": "clangd",
          "url": "https://clangd.llvm.org/",
          "command": "clangd -log=error --background-index --limit-results=500 --completion-style=bundled",
          "file_patterns": ["%.c$", "%.h$", "%.C$", "%.H$", "%.objc$"]
        },
        {
          "language": "cpp",
          "use": "clangd",
          "file_patterns": ["%.inl$", "%.cpp$", "%.hpp$", "%.cc$", "%.cxx$", "%.c++$", "%.hh$", "%.hxx$", "%.h++$", "%.objcpp$"]
        }
    ]
}

That's all we need to have a working LSP in ecode. LSPs executables must be installed manually by the user, LSPs will not come with the editor, and they also need to be visible to the executable. This means that it must be on PATH environment variable or the path to the binary must be absolute.

Currently supported LSPs

Please check the language support table

LSP Client config object keys

  • hover_delay: The time the editor must wait to show symbol information when hovering any piece of code.
  • server_close_after_idle_time: The time the LSP Server will keep alive after all documents that consumes that LSP Server were closed. LSP Servers are spawned and killed on demand.
  • semantic_highlighting: Enable/Disable semantic highlighting (disabled by default, boolean)
  • silent: Enable/Disable non-critical LSP logs
  • trim_logs: If logs are enabled and trim_logs is enabled it will trim the line log size at maximum 1 KiB per line (useful for debugging)

LSP Client keybindings object keys

  • lsp-symbol-info: Keybinding to request symbol information
  • lsp-go-to-definition: Keybinding to "Go to Definition"
  • lsp-go-to-declaration: Keybinding to "Go to Declaration"
  • lsp-go-to-implementation: Keybinding to "Go to Implementation"
  • lsp-go-to-type-definition: Keybinding to "Go to Type Definition"
  • lsp-symbol-references: Keybinding to "Find References to Symbol Under Cursor"
  • lsp-symbol-code-action: Keybinding to "Code Action"
  • lsp-switch-header-source: Keybinding to "Switch Header/Source" (only available for C and C++)

LSP Client JSON object keys

  • language: The LSP language identifier. Some identifiers can be found here
  • name: The name of the language server
  • url (optional): The web page URL of the language server
  • use (optional): A server can be inherit the configuration from other server. This must be the name of the server configuration that inherits (useful for LSPs that support several languages like clang and typescript-language-server).
  • file_patterns: Array of Lua Patterns representing the file extensions that must use the LSP client
  • command: The command to execute to run the LSP. It's possible to override the default LSP command by declaring the server in the lspclient.json config. It's also possible to specify a different command for each platform, given that it might change in some ocassions per-platform. In that case an object should be used, with each key being a platform, and there's also a wildcard platform "other" to specify any other platform that does not match the platform definition. For example, sourcekit-lsp uses: "command": {"macos": "xcrun sourcekit-lsp","other": "sourcekit-lsp"}
  • command_parameters (optional): The command parameters. Parameters can be set from the command also, unless the command needs to run a binary with name with spaces. Also command_parameters can be used to add more parameters to the original command. The lsp configuration can be overriden from the lspclient.json in the user configuration. For example: a user trying to append some command line arguments to clang would need to do something like: {"name": "clangd","command_parameters": "--background-index-priority=background --malloc-trim"}
  • rootIndicationFileNames (optional): Some languages need to indicate the project root path to the LSP work correctly. This is an array of files that might indicate where the root path is. Usually this is resolver by the LSP itself, but it might help in some situations.
  • initializationOptions (optional): These are custom initialization options that can be passed to the LSP. Usually not required, but it will allow the user to configure the LSP. More information can be found here.
  • host (optional): It's possible to connect to LSP servers via TCP. This is the host location of the LSP. When using TCP connections command can be empty or can be used to initialize the LSP server. And then use the LSP through a TCP connection.
  • port (optional): It's possible to connect to LSP servers via TCP. This is the post location of the LSP.
  • env (optional): Array of strings with environment variables added to the process environment.

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. The plugin requires the user to have a git binary installed and available in PATH environment variable.

git.json format

The format follows the same pattern that all previous configuration files. Configuration is represented in a JSON file with three main keys: config, keybindings, servers.

C and C++ LSP server example (using clangd)

{
  "config": {
    "silent": false,
    "status_recurse_submodules": true,
    "statusbar_display_branch": true,
    "statusbar_display_modifications": true,
    "ui_refresh_frequency": "5s"
  },
  "keybindings": {
    "git-blame": "alt+shift+b"
  }
}

Git config object keys

  • silent: Enable/Disable non-critical Git logs.
  • status_recurse_submodules: Enables/disables recursing sub-modules for the file status report.
  • statusbar_display_branch: Enables/disables an always visible status on the bottom statusbar.
  • statusbar_display_modifications: Enables/disables if the number of lines affected is displayed in the statusbar.
  • ui_refresh_frequency: Indicates the frequency in which the status is updated (it will only trigger updates if changes are detected inside the .git directory).
  • filetree_highlight_changes: Enables/disables the highlighting of changes on the file-tree.
  • filetree_highlight_style_color: Allows to change the highlight color in the file-tree.

Git keybindings object keys

  • git-blame: Keybinding to display the a git blame summary over the current positioned line.

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 overwriteable 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.

Customizations

Custom editor color schemes

Custom editor color schemes can be added in the user color schemes directory found at:

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

Any file written in the directory will be treated as an editor color scheme file. Each file can contain any number of color schemes.

The format of a color scheme can be read from here.

Custom terminal color schemes

Custom terminal color schemes can be added in the user terminal color schemes directory found at:

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

Any file written in the directory will be treated as a terminal color scheme file. Each file can contain any number of color schemes.

The format of a color scheme can be read from here.

Custom UI themes

Custom UI schemes can be added in the user UI themes directory found at:

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

A custom UI theme file must have the extension .css, ecode will look for all the files with .css extension in the directory, the UI theme name is the file name without the extension. The new theme will appear in Settings -> Window -> UI Theme.

Custom UI themes allow customizing the editor at the user's will. Since ecode uses CSS to style all the elements of the UI, creating new themes is quite easy. It's possible to customize only the color palette but it's also possible to customize all the UI elements if desired. Customizing the whole UI theme can be extensive, but customizing the colors is as simple as changing the values of the CSS variables used to color the UI. For reference, the complete base UI theme used by ecode can be seen here. The most important selector would be the :root selector, where all the variables are defined. Color variables can be easily extracted from that file.

A simple example of a custom UI theme that changes only the tint colors, let's call it Breeze Light Red.css:

:root {
	--inherit-base-theme: true;
	--primary: #e93d66;
	--scrollbar-button: #a94074;
	--item-hover: #502834;
	--tab-hover: #5e3347;
}

That effectively would create/add a new UI theme with light red colors. A very important detail is that if the UI theme must inherit the complete definition of the default theme, we must add --inherit-base-theme: true to the :root element, otherwise the UI theme must be defined completely, which means, every widget must be styled from scratch (not recommended given its complexity). It's also possible to override the style of the different widgets redefining their properties with the usual rules that apply to the well-known CSS specification (A.K.A. using adequate specificity and probably abusing the !important flag).

Custom languages support

Custom languages support can be added in the languages directory found at:

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

ecode will read each file located at that directory with json extension. Each file can contain one or several languages. In order to set several languages the root element of the json file should be an array, containing one object for each language, otherwise if the root element is an object, it should contain the language definition.

Language definition format

{
	"name": "language_name",
	"files": [ "Array of file extensions supported" ],
	"comment": "Sets the comment string used for auto-comment functionality.",
	"patterns": [
		{ "pattern": "lua_pattern", "type": "type_name" },
		{ "pattern": "no_capture(pattern_capture_1)(pattern_capture_2)", "type": { "no_capture_type_name", "capture_1_type_name", "capture_2_type_name" } },
		{ "pattern": ["lua_pattern_start", "lua_pattern_end", "escape_character"], "type": "type_name" }
	],
	"symbols": [
		{ "symbol_name": "type_name" }
	],
	"visible": true, /* sets if the language is visible as a main language in the editor, optional parameter, true by default */
	"auto_close_xml_tag": false, /* sets if the language defined supports auto close XML tags, optional parameter, false by default */
	"lsp_name": "sets the LSP name assigned for the language, optional parameter, it will use the _name_ in lowercase if not set"
}

Porting language definitions

ecode uses the same format for language definition as lite and lite-xl editors. This makes much easier to add new languages to ecode. There's also a helper tool that can be download from ecode repository located here that allows to directly export a lite language definition to the JSON file format used in ecode. A minor clarification: ecode does not currently support regex for pattern matching that it's supported by lite-xl (it might be added in the near future).

Language definition example

{
  "name": "Elixir",
  "files": [ "%.ex$", "%.exs$" ],
  "comment": "#",
  "patterns": [
    { "pattern": "#.*\n",                "type": "comment"  },
    { "pattern": [ ":\"", "\"", "\\" ],    "type": "number"   },
    { "pattern": [ "\"\"\"", "\"\"\"", "\\" ], "type": "string"   },
    { "pattern": [ "\"", "\"", "\\" ],     "type": "string"   },
    { "pattern": [ "'", "'", "\\" ],     "type": "string"   },
    { "pattern": [ "~%a[/\"|'%(%[%{<]", "[/\"|'%)%]%}>]", "\\" ], "type": "string"},
    { "pattern": "-?0x%x+",              "type": "number"   },
    { "pattern": "-?%d+[%d%.eE]*f?",     "type": "number"   },
    { "pattern": "-?%.?%d+f?",           "type": "number"   },
    { "pattern": ":\"?[%a_][%w_]*\"?",     "type": "number"   },
    { "pattern": "[%a][%w_!?]*%f[(]",    "type": "function" },
    { "pattern": "%u%w+",                "type": "normal"   },
    { "pattern": "@[%a_][%w_]*",         "type": "keyword2" },
    { "pattern": "_%a[%w_]*",            "type": "keyword2" },
    { "pattern": "[%+%-=/%*<>!|&]",      "type": "operator" },
    { "pattern": "[%a_][%w_]*",          "type": "symbol"   }
  ],
  "symbols": [
    {"def": "keyword"},
    {"defp": "keyword"},
    {"defguard": "keyword"},
    {"defguardp": "keyword"},
    {"defmodule": "keyword"},
    {"defprotocol": "keyword"},
    {"defimpl": "keyword"},
    {"defrecord": "keyword"},
    {"defrecordp": "keyword"},
    {"defmacro": "keyword"},
    {"defmacrop": "keyword"},
    {"defdelegate": "keyword"},
    {"defoverridable": "keyword"},
    {"defexception": "keyword"},
    {"defcallback": "keyword"},
    {"defstruct": "keyword"},
    {"for": "keyword"},
    {"case": "keyword"},
    {"when": "keyword"},
    {"with": "keyword"},
    {"cond": "keyword"},
    {"if": "keyword"},
    {"unless": "keyword"},
    {"try": "keyword"},
    {"receive": "keyword"},
    {"after": "keyword"},
    {"raise": "keyword"},
    {"rescue": "keyword"},
    {"catch": "keyword"},
    {"else": "keyword"},
    {"quote": "keyword"},
    {"unquote": "keyword"},
    {"super": "keyword"},
    {"unquote_splicing": "keyword"},
    {"do": "keyword"},
    {"end": "keyword"},
    {"fn": "keyword"},
    {"import": "keyword2"},
    {"alias": "keyword2"},
    {"use": "keyword2"},
    {"require": "keyword2"},
    {"and": "operator"},
    {"or": "operator"},
    {"true": "literal"},
    {"false": "literal"},
    {"nil": "literal"}
  ]
}

For more complex syntax definitions please see the definition of all the native languages supported by ecode here and here.

Planned Features

Listed in no particular order:

  • DAP support
  • Improved plugin system (visual configuration, more flexibility/features)
  • Code-folding
  • Soft-wrap

Long Term Planned Features

  • Remote development support
  • Modal editing
  • 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. =)

FAQ

Why some characters are not being rendered correctly inside the editor?

Some Unicode characters won't be rendered in the editor out of the box. You'll need to change the default monospace font in favor of a font that supports the characters you want to see that are not being rendered. You could also change the default fallback font in the case you want to use a traditional monospaced font. The default fallback font should cover a wide range of languages but you could need some special font (currently covers CJK languages).

Current Limitations

  • No font sub-pixel hinting *2 *3
  • No BiDi support *2
  • No ligatures support *4
  • No VIM-mode / modal editing *5
  • English only (internationalization pending). It should be implemented soon.
  • No text-shaping. *2 *6

*1 I don't see the point of supporting more encodings for the moment. UTF8 is kind of the defacto industry standard.

*2 Current eepp feature limitations.

*3 I'm not a fan of sub-pixel hinting. But I'm more than willing to implement it, I'm not very versed in the matter, so any help will be appreciated.

*4 I don't really like ligatures. I'm open to PRs implementing them.

*5 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.

*6 Better Unicode support will come with time, but with no rush for the moment. eepp architecture is ready to add HarfBuzz support.

Author comments

This editor has a deeply rooted inspiration from the lite, lite-xl, and Sublime Text editors. It also takes some inspiration from QtCreator (the current IDE used to develop eepp and ecode). 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

ecode's People

Contributors

lupuionut avatar spartanj avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ecode's Issues

[0.4.4] Freezing on Windows after switching projects multiple times

Today I have managed to get ecode to freeze (lock-up) several times.

This has never happened before.

The only thing I've been doing differently today is switching between folders (projects) several times.

image

I'm not sure what other information I can provide to help find the bug.

Thanks,

Crash when right clicking the tree view if empty

  • Start ecode appimage
  • Right click inside the tree view
  • Segmentation fault (core dumped)

Not sure if there are any log files associated but I was able to replicate it with both the released 0.4.3 appimage as well as an appimage built from source (85e73262).

I'm wondering if it is an issue with the appimage not seeing local files on start? If I use the "naked" binary with an empty directory (folder literally called "empty") e.g. ./ecode empty then it looks the same but the right click brings up the new file etc. menu. Just running ./ecode brings up the files and folders from where it was run.

Also don't see the issue if you open a folder from the main menu with the appimage (or give it a directory as an argument).

Hope that makes sense, can elaborate or make a video if it doesn't.

OS - Linux Mint 21

Auto Formatter on save issue

When enabling the "auto_format_on_save": true for the Auto Formatter plugin, the file will format correctly, however it will not be saved. Seems like the file is being saved, and then the formatter formats the code after, leaving the editor in a dirty state (little asterisk in the file tab at the top). You have to save again to actually commit those formattings to the disk, which still won't clear the dirty editor asterisk, as it will format again after saving (but, nothing changes, so it's weird that saving doesn't remove the asterisk).

I'm using python black as the formatter in this case.

Color picker text field changes don't persist without pressing Enter

Tested this on Windows. Moving the sliders causes the color to update immediately, and pressing Enter after changing the value in the text field causes the picker to update.

Reproduction

  1. Double-click an RGB color to open the color picker.

    image

  2. Change only the color in the text field:

    image

  3. Click OK. The value from the text field doesn't replace the original text, but I'd expect it to.

Text Rendered with Shadow

I'm using the editor's light mode and solarobj as the style. On the 0.4.2 version, the text in the editor area is rendered with shadow. So, it becomes difficult to read. I've attached the screenshot figuring the comparison between the 0.4.2 and 0.4.1 versions here: https://pasteboard.co/e3RZGeq0Jdqq.jpg

Implement Pyright

Hello again!

I see in https://github.com/SpartanJ/eepp/blob/develop/bin/assets/plugins/lspclient.json that Python uses pylsp as the LSP client. I wanted to instead use Pyright, so I went ahead and modified my user lspclient.json like so:

{
  "config": {
    ...
  },
  "keybindings": {
    ...
  },
  "servers": [
    {
      "command": "pyright-langserver --stdio",
      "file_patterns": [
        "%.py$"
      ],
      "language": "python",
      "name": "pyright",
      "url": "https://github.com/microsoft/pyright"
    }
  ]
}

One or 2 versions ago, I'm pretty sure this worked correctly, but now I don't see any lines being highlighted, nor are autocompletes working. I see that node /usr/bin/pyright-langserver --stdio is started in htop when I open the editor as well.

Anything that I am missing? Command is wrong? Maybe some incompatibility between the LSP plugin and the linter plugin that displays errors? By the way, error lens looks very nice!

Actually I just noticed my linter settings, it looks like it already accounts for LSP diagnostics:

{
  "config": {
    "delay_time": "500ms",
    "disable_languages": [],
    "disable_lsp_languages": [],
    "enable_error_lens": true,
    "enable_lsp_diagnostics": true
  },
  "linters": []
}

Renaming folder name to one with a special character garbles character

For example if I have a folder called "ake" and try to rename it to "äke" , the result is:
image
This also happens when creating a folder, which has a special character in it's name.
The garbled characters are also visible in the system explorer.
Doesn't happen when creating files though.

"Error renaming file" when renaming folder

That's it.
Also you can't delete folders that have files inside - "Cannot remove non-empty directory", maybe a warning could be implemented if the directory has files in it?

[0.4.3] A file added/removed from a subfolder is not detected

If I add/remove a file from an external tool (eg Windows Explorer) to the active project folder, then ecode will detect that file...but if this is done in a sub-folder it is not detected.

This is quite annoying as sometimes I add/remove files from Unity and the aren't detected. It would be great to have this feature.

Perhaps some way to refresh the folder view at least? Currently I have to toggle "Show Hidden Files" for it to update. Perhaps a Refresh button in the context-menu or F5 shortcut? Ideally I guess it would monitor for file changes in all folders.

Thanks,

Improve active vs inactive file tab contrast

image

I find it difficult to easily tell which file tab is currently selected at a glance.

Perhaps some way to increase the contract between the selected vs the deselected tabs? Maybe darken the deselected tabs slightly or something?

Thanks,

Cannot close file deleted outside of ecode

When I have a file open inside ecode and delete it in the system explorer, I can no longer close the file.
File is automatically closed afterwards though.
Refreshing the view doesn't mitigate this.

Add aarch64 support

Hi,

i want to use your software on manjaro aarch64 you can make a build for arm64 ?
Also if you can build for apple silicon too ?

Best Regards

Support for mouse wheel click-scrolling

A lot of editors support clicking the mouse wheel and then dragging up/down to automatically smooth scroll. I've found some moments where I've missed this feature...

Cannot open any files after closing an untitled tab

Reproducing:

  • Open a file
  • Close the file
  • An untitled tab opens up
  • Close the untitled tab from the cross or using ctrl+w
  • Can't open any files anymore, the Open Folder and Open File prompts in the settings menu don't do anything

If you write some text into the new untitled tab that appears after closing the old one and then close that, ignoring the warning, you can open files again

Dont works on my Haiku-Os

Hello there i have try to test your software on haiku but i get this output:

ecode-haiku-0.4.0-x86_64> sh **ecode/ecode**
runtime_loader: Cannot open file libeepp.so (needed by /boot/home/Downloads/ecode-haiku-0.4.0-x86_64/ecode/ecode.bin): **No such file or directory**

But there is the libeepp.so, as it comes packed, did try to copy it to ecode root folder and nothing, dont know what happen here.

Haiku HREV: 56724

Always opens in full screen mode

Thanks for the fantastic editor. I am on windows 10 and using the windows version. The editor for some reason only works in full screen mode even if full screen mode is disabled in settings.

Editor and terminal folders not in .config Arch

The editor and terminal folders don't exist in ~/.config/ecode/ and after manually creating them, the editor doesn't read anything from the folders
It seems to be loading the keybindings tho
On windows it works fine

[0.4.3] Open Folder should open the last folder opened instead of ecode.exe path

I believe it would be useful for Open Folder command to default to the last folder opened (which should be the current folder being used) instead of what it does currently, which is to show the folder of the ecode.exe file.

Each time I go to browse to a folder I have to navigate from the ecode.exe folder instead of the folder where all of my code projects are located.

I think it would be widely appreciated.

Thanks for the awesome editor, can't wait to see it grow!

Open the most recent folder on startup

Could we have an option to toggle so the editor would open in the last opened folder automatically?
I know you can go to recent folders and open it from there, but this would make life a bit easier
I'm sorry if this is already a thing and I can't find the option

Ruff (Python) linter ignores pyproject.toml

I think this is caused by the default linters.json specifying the ruff python linter with --ignore=E402

I simply added this to my linters.json, removing the -n --ignore=E402 from the default one, and it now seems to work just fine:

    {
      "file_patterns": ["%.py$"],
      "warning_pattern": "[^:]:(%d+):(%d+):%s([^\n]+)",
      "command": "ruff $FILENAME"
    }

I wasn't sure if doing this replaces the entire linters list from the default linters.json, or only the python linter specifically?

Also, your documentation says that python uses pycodestyle, which it looks like it uses ruff now (good call!)

Custom tab visualisation

I find the current tab representation a little bit hard to understand:
image

In VSCode it looks like this:
image

It would be great if this could be customised, both the character and the spacing...

I know this is a strange request....

[0.4.3] Invisible character giving inconcistent editing experience

Sometimes it seems like an invisible character appears which means that when I use arrows to navigate the cursor doesn't move on the first press, only the second. It also results in when pressing delete it will delete the wrong character.

image

Here there is an invisible character after the "{" if you position the cursor after the "{" then press right-arrow it will not move until the second press.

Also, if you position the cursor just before the "V" on line 3, then press backspace, it will delete the V instead of the space.

I think that this may be related to #26

I am using Windows.

The example file is attached:
TestBug2.cs.txt

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.