Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
* Noteditor
[[./share/images/screenshot.png]]
*Noteditor* is an open-source, all-in-one window manager and text editor designed to streamline your development experience.
Powered by *Emacs* and on the foundation of *FG42*, and *EXWM*.
All dependencies — both Emacs packages and the external command-line tools
noteditor uses — are provided by *Nix* at build time. There is nothing to
download at runtime and no global state to manage.
** Requirements
- Nix with flakes enabled (=experimental-features = nix-command flakes=)
** Try it without installing
#+BEGIN_SRC bash
# Editor mode
$ nix run github:yottanami/noteditor
# Window-manager mode
$ nix run github:yottanami/noteditor#wm
#+END_SRC
** Install on NixOS (as a window-manager session)
Add noteditor to your flake inputs and enable the module. It then shows up in
your display manager's session list like any other window manager.
#+BEGIN_SRC nix
{
inputs.noteditor.url = "github:yottanami/noteditor";
# In your NixOS configuration:
imports = [ inputs.noteditor.nixosModules.default ];
nixpkgs.overlays = [ inputs.noteditor.overlays.default ];
programs.noteditor.enable = true;
}
#+END_SRC
** Install into a profile
#+BEGIN_SRC bash
$ nix profile install github:yottanami/noteditor
$ noteditor # editor mode
$ noteditor-wm # window-manager mode
#+END_SRC
** Build locally
#+BEGIN_SRC bash
$ git clone https://github.com/yottanami/noteditor
$ cd noteditor
$ nix build # result/bin/noteditor and result/bin/noteditor-wm
# or, without flakes:
$ nix-build
#+END_SRC
** Configuration
*** User overrides
Drop a =noteditor-user.el= in any of these locations (first match wins) to
extend or override the configuration without touching the package:
- =$XDG_CONFIG_HOME/noteditor/noteditor-user.el=
- =~/.noteditor/noteditor-user.el=
*** Adding extra runtime tools
Browsers, media players and terminals that are unfree or not in nixpkgs
(e.g. brave, plexamp, alacritty) are not bundled. Add them with
=extraRuntimeInputs=:
#+BEGIN_SRC nix
noteditor.override {
extraRuntimeInputs = with pkgs; [ brave alacritty ];
}
#+END_SRC
*** Environment variables
| =NOTEDITOR_HOME= | Pathname of Noteditor (set by the launcher) |
| =NOTEDITOR_WM= | =true= for window-manager mode, =false= for editor |
| =NOTEDITOR_DEBUG= | =true= to abort loudly on load errors |
| =NOTEDITOR_JDTLS_HOME= | Java LSP (jdtls) install dir (set by the launcher) |
** Keybindings
*** Fast dial keybindings
| =s-d= | Launch applications |
| =s-x= | Terminal |
| =s-l= | Screen lock |
| =s-s= | Screenshot app |
| =s-m= | Media player |
| =s-b= | Browser |
*** Workspace and window keybindings
| =s-a= | Pick any open buffer/app and jump to its workspace |
| =s-w= | Switch workspace interactively |
| =s-0=..=s-9= | Switch to workspace by number |
| =s-o= | Switch to other window |
| =s-r= | Reset (exit char-mode and fullscreen) |
| =s-g= | Keyboard quit |
| =s-<f5>= | Force a display re-detection cycle (see below) |
*** Other keybindings
| =s-t= | tab-bar-mode |
** Plugins
*** wm
Window manager based on EXWM. Automatically reconfigures displays on
monitor connect/disconnect. Some docks never send a hot-plug event when
only the monitor cable (not the dock-laptop link) is unplugged/replugged,
which leaves an external output "connected" but with no signal; press
=s-<f5>= to force a re-detection cycle without touching the cable.
*** editor
General-purpose text editing: UI, navigation, search and window management.
*** devel
The IDE plugin: project management, language support, LSP, debugging,
version control, completion and AI assistants. See [[*IDE features]] below.
*** theme
Fonts, colors and more
*** org
org-mode, org-roam and other related modes
** IDE features
The =devel= plugin turns noteditor into a multi-language IDE. Highlighting and
language features are enabled automatically based on the file type — just open
a file and its language server and tree-sitter mode start on their own.
*** Languages
Out of the box: *C/C++*, *Python*, *Ruby*, *Java*, *TypeScript* and
*JavaScript*. Each gets LSP (via =lsp-mode=), tree-sitter highlighting (the
built-in =*-ts-mode=) and, where available, debugging (=dap-mode=). Every
language server is bundled by Nix — nothing is installed at runtime.
*** Selecting languages
All six languages are on by default. To enable only a subset, set
=noteditor-devel-languages= in your =noteditor-user.el= *before* the plugin
loads:
#+BEGIN_SRC emacs-lisp
;; Valid symbols: c-cpp python ruby java typescript javascript
(setq noteditor-devel-languages '(python ruby typescript))
#+END_SRC
This is read at startup — no rebuild is needed to change the set. (Adding a
*new* language's server binary is still a Nix change in =nix/package.nix=.)
*** Key IDE bindings
| =M-.= | Jump to definition |
| =M-?= | Find references |
| =M-,= | Jump back |
| =C-c l= | LSP command prefix |
| =C-x g= | Magit status |
| =C-c a= | AI assistant (aidermacs) menu |
Diagnostics from LSP are shown on the fly via =flycheck=.