
Lightweight, fast code editor offering syntax highlighting for 19+ languages, smart autocomplete, real-time error detection, auto-formatting, multi-tab file management, 19 themes, and keyboard shortcuts.
Just keep coding
A lightweight, fast, and beautiful code editor built with Kotlin Multiplatform and Compose Multiplatform. Dedicated language support for Kotlin, Python and MicroPython, and it opens and edits everything else.
# Clone the repository
git clone https://github.com/Ma7moud3ly/nemo-editor.git
cd nemo-editor
# Run on Desktop
./gradlew :composeApp:run
# Run on Android
./gradlew :androidApp:installGmsDebug
# Run on Web
./gradlew :composeApp:wasmJsBrowserDevelopmentRuncommonMain.dependencies {
implementation("io.github.ma7moud3ly:nemo-editor:1.0.3")
}@Composable
fun MyEditor() {
val codeState = rememberCodeState(
code = "fun main() {\n println(\"Hello\")\n}",
language = Language.KOTLIN
)
NemoCodeEditor(state = codeState)
}@Composable
fun PythonEditor() {
val codeState = rememberCodeState(
code = """
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
for i in range(10):
print(fibonacci(i))
""".trimIndent(),
language = Language.PYTHON
)
val editorSettings = remember {
EditorSettings(
theme = EditorThemes.NEMO_DARK,
tabSize = 4,
)
}
NemoCodeEditor(
state = codeState,
settings = editorSettings,
modifier = Modifier.fillMaxSize()
)
}See complete documentation for more examples.
Three languages have dedicated support their own tokenizer, formatter, error detector and completion provider:
| Language | Extensions | Highlighting | Formatting | Autocomplete | Errors |
|---|---|---|---|---|---|
| Kotlin | .kt, .kts | ✅ | ✅ | ✅ | ✅ |
| Python | .py | ✅ | ✅ | ✅ | ✅ |
| MicroPython | .mpy | ✅ | ✅ | ✅ | ✅ |
Everything else opens and edits normally; Java, JavaScript, C/C++, HTML, CSS, JSON, XML, Markdown, Shell, SQL and more can be created and edited, and the file browser recognizes them, but they fall back to a generic tokenizer and have no formatter, error detection or completion of their own.
Adding a language means implementing Tokenizer, and optionally
CodeFormatter, ErrorDetector and CompletionProvider, then registering it
in the matching factory. Contributions welcome.
Dark Themes:
Light Themes:
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + N | ⌘ + N | New File |
| Ctrl + O | ⌘ + O | Open File |
| Ctrl + Shift + O | ⌘ + Shift + O | Open Folder |
| Ctrl + S | ⌘ + S | Save |
| Ctrl + Shift + S | ⌘ + Shift + S | Save As |
| Ctrl + W | ⌘ + W | Close Tab |
| Ctrl + Shift + W | ⌘ + Shift + W | Close All Tabs |
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + Z | ⌘ + Z | Undo |
| Ctrl + Y | ⌘ + Y | Redo |
| Ctrl + D | ⌘ + D | Duplicate Line |
| Ctrl + L | ⌘ + L | Delete Line |
| Ctrl + / | ⌘ + / | Toggle Comment |
| Ctrl + ] | ⌘ + ] | Indent |
| Ctrl + [ | ⌘ + [ | Unindent |
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + F | ⌘ + F | Find |
| Ctrl + H | ⌘ + H | Find & Replace |
| Ctrl + Shift + F | ⌘ + Shift + F | Format Code |
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + = | ⌘ + = | Zoom In |
| Ctrl + - | ⌘ + - | Zoom Out |
| Ctrl + B | ⌘ + B | Toggle Sidebar |
| Ctrl + Tab | ⌘ + Tab | Next Tab |
| Ctrl + Shift + Tab | ⌘ + Shift + Tab | Previous Tab |
The app lives in :androidApp; :composeApp is a shared library and produces
no APK. There are two flavours: gms includes Firebase analytics and
crashlytics, default is free of them.
# Debug APK
./gradlew :androidApp:assembleGmsDebug
# Release APK
./gradlew :androidApp:assembleGmsRelease
# Analytics-free build
./gradlew :androidApp:assembleDefaultRelease
# Output: androidApp/build/outputs/apk/# Windows
./gradlew :composeApp:packageReleaseMsi
./gradlew :composeApp:packageReleaseExe
# macOS
./gradlew :composeApp:packageReleaseDmg
# Linux
./gradlew :composeApp:packageReleaseDeb
./gradlew :composeApp:packageReleaseRpm
# Output: composeApp/build/compose/binaries/main-release/Each installer is built by jpackage on its own platform. The RPM target
additionally needs rpmbuild on the build machine (apt install rpm on
Debian-based systems).
# Development
./gradlew :composeApp:wasmJsBrowserDevelopmentRun
# Production
./gradlew :composeApp:wasmJsBrowserDistribution
# Output: composeApp/build/dist/wasmJs/productionExecutable/# Publish to Maven Local for use in another project
./gradlew :nemo-editor:publishToMavenLocalContributions are welcome! Here's how:
git checkout -b feature/amazing-feature
git commit -m 'Add amazing feature'
git push origin feature/amazing-feature
MIT License - see LICENSE file.
If you find Nemo Editor useful:
Made with ❤️ using Kotlin Multiplatform
Nemo Editor - Just keep coding 🐠
⭐ Star on GitHub • 📖 Documentation • 🐛 Report Bug • 💬 Discussions
Just keep coding
A lightweight, fast, and beautiful code editor built with Kotlin Multiplatform and Compose Multiplatform. Dedicated language support for Kotlin, Python and MicroPython, and it opens and edits everything else.
# Clone the repository
git clone https://github.com/Ma7moud3ly/nemo-editor.git
cd nemo-editor
# Run on Desktop
./gradlew :composeApp:run
# Run on Android
./gradlew :androidApp:installGmsDebug
# Run on Web
./gradlew :composeApp:wasmJsBrowserDevelopmentRuncommonMain.dependencies {
implementation("io.github.ma7moud3ly:nemo-editor:1.0.3")
}@Composable
fun MyEditor() {
val codeState = rememberCodeState(
code = "fun main() {\n println(\"Hello\")\n}",
language = Language.KOTLIN
)
NemoCodeEditor(state = codeState)
}@Composable
fun PythonEditor() {
val codeState = rememberCodeState(
code = """
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
for i in range(10):
print(fibonacci(i))
""".trimIndent(),
language = Language.PYTHON
)
val editorSettings = remember {
EditorSettings(
theme = EditorThemes.NEMO_DARK,
tabSize = 4,
)
}
NemoCodeEditor(
state = codeState,
settings = editorSettings,
modifier = Modifier.fillMaxSize()
)
}See complete documentation for more examples.
Three languages have dedicated support their own tokenizer, formatter, error detector and completion provider:
| Language | Extensions | Highlighting | Formatting | Autocomplete | Errors |
|---|---|---|---|---|---|
| Kotlin | .kt, .kts | ✅ | ✅ | ✅ | ✅ |
| Python | .py | ✅ | ✅ | ✅ | ✅ |
| MicroPython | .mpy | ✅ | ✅ | ✅ | ✅ |
Everything else opens and edits normally; Java, JavaScript, C/C++, HTML, CSS, JSON, XML, Markdown, Shell, SQL and more can be created and edited, and the file browser recognizes them, but they fall back to a generic tokenizer and have no formatter, error detection or completion of their own.
Adding a language means implementing Tokenizer, and optionally
CodeFormatter, ErrorDetector and CompletionProvider, then registering it
in the matching factory. Contributions welcome.
Dark Themes:
Light Themes:
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + N | ⌘ + N | New File |
| Ctrl + O | ⌘ + O | Open File |
| Ctrl + Shift + O | ⌘ + Shift + O | Open Folder |
| Ctrl + S | ⌘ + S | Save |
| Ctrl + Shift + S | ⌘ + Shift + S | Save As |
| Ctrl + W | ⌘ + W | Close Tab |
| Ctrl + Shift + W | ⌘ + Shift + W | Close All Tabs |
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + Z | ⌘ + Z | Undo |
| Ctrl + Y | ⌘ + Y | Redo |
| Ctrl + D | ⌘ + D | Duplicate Line |
| Ctrl + L | ⌘ + L | Delete Line |
| Ctrl + / | ⌘ + / | Toggle Comment |
| Ctrl + ] | ⌘ + ] | Indent |
| Ctrl + [ | ⌘ + [ | Unindent |
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + F | ⌘ + F | Find |
| Ctrl + H | ⌘ + H | Find & Replace |
| Ctrl + Shift + F | ⌘ + Shift + F | Format Code |
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + = | ⌘ + = | Zoom In |
| Ctrl + - | ⌘ + - | Zoom Out |
| Ctrl + B | ⌘ + B | Toggle Sidebar |
| Ctrl + Tab | ⌘ + Tab | Next Tab |
| Ctrl + Shift + Tab | ⌘ + Shift + Tab | Previous Tab |
The app lives in :androidApp; :composeApp is a shared library and produces
no APK. There are two flavours: gms includes Firebase analytics and
crashlytics, default is free of them.
# Debug APK
./gradlew :androidApp:assembleGmsDebug
# Release APK
./gradlew :androidApp:assembleGmsRelease
# Analytics-free build
./gradlew :androidApp:assembleDefaultRelease
# Output: androidApp/build/outputs/apk/# Windows
./gradlew :composeApp:packageReleaseMsi
./gradlew :composeApp:packageReleaseExe
# macOS
./gradlew :composeApp:packageReleaseDmg
# Linux
./gradlew :composeApp:packageReleaseDeb
./gradlew :composeApp:packageReleaseRpm
# Output: composeApp/build/compose/binaries/main-release/Each installer is built by jpackage on its own platform. The RPM target
additionally needs rpmbuild on the build machine (apt install rpm on
Debian-based systems).
# Development
./gradlew :composeApp:wasmJsBrowserDevelopmentRun
# Production
./gradlew :composeApp:wasmJsBrowserDistribution
# Output: composeApp/build/dist/wasmJs/productionExecutable/# Publish to Maven Local for use in another project
./gradlew :nemo-editor:publishToMavenLocalContributions are welcome! Here's how:
git checkout -b feature/amazing-feature
git commit -m 'Add amazing feature'
git push origin feature/amazing-feature
MIT License - see LICENSE file.
If you find Nemo Editor useful:
Made with ❤️ using Kotlin Multiplatform
Nemo Editor - Just keep coding 🐠
⭐ Star on GitHub • 📖 Documentation • 🐛 Report Bug • 💬 Discussions