A command line text editor with notepad like key bindings.
[![Crates.io](https://img.shields.io/crates/v/lino)](https://crates.io/crates/lino)
[![Crates.io](https://img.shields.io/crates/l/lino)](https://github.com/ahmednooor/lino/blob/main/LICENSE)
[![Crates.io](https://img.shields.io/crates/d/lino)](https://crates.io/crates/lino)
## Features
- Notepad like keybindings.
- Multi-line indentation.
- Auto-indented new lines.
- Line numbers.
- Syntax highlighting.
- Copy, Paste.
- Undo, Redo.
- Find, Replace.
## Usage (Key Bindings)
| Key | Function |
| --- | --- |
| ↑ , ↓ , ← , → | `Move cursor` |
| Ctrl + ← , → | `Move by word` |
| Page Up , Page Down | `Move by page (scrolling)` |
| Home | `Move to line start` |
| End | `Move to line end` |
| Shift + ↑ , ↓ , ← , → | `Select` |
| Ctrl + Shift + ← , → | `Select by word` |
| Shift + Page Up , Page down | `Select by page` |
| Shift + Home | `Select upto line start` |
| Shift + End | `Select upto line end` |
| Ctrl + A | `Select all` |
| Backspace | `Delete backward` |
| Delete | `Delete forward` |
| Ctrl / Alt + Backspace | `Delete backward by word` |
| Ctrl / Alt + Delete | `Delete forward by word` |
| Shift + Delete | `Delete current line` |
| Ctrl / Alt + ↑ | `Move current line up` |
| Ctrl / Alt + ↓ | `Move current line down` |
| Ctrl / Alt + Shift + ↑ | `Duplicate current line upward` |
| Ctrl / Alt + Shift + ↓ , Ctrl + D | `Duplicate current line downward` |
| Alt + ] / → , Tab | `Increase indentation` |
| Alt + [ / ← , Shift + Tab | `Decrease indentation` |
| Enter | `Enter auto-indented new line` |
| Ctrl / Shift + Enter | `Enter non-indented new line` |
| Ctrl + F | `Find, Replace` |
| Ctrl + X | `Cut` |
| Ctrl + C | `Copy` |
| Ctrl + V | `Paste` |
| Ctrl + Z | `Undo` |
| Ctrl + Y | `Redo` |
| Ctrl + S | `Save` |
| Alt + S | `Save as` |
| Ctrl + Q , Ctrl + W | `Close` |
> Some key-bindings might not work on different terminals. But the most common ones should work on all.
## Install
> You will need to have Rust (2018 or higher) installed on your system before proceeding.\
**Install it from [https://www.rust-lang.org/tools/install](https://www.rust-lang.org/tools/install)**
**1. Install with Cargo**
```sh
cargo install lino
```
**2. Run**
```sh
lino
```
**3. Move binary to `/usr/bin/` on Linux (Optional)**
```sh
sudo mv `which lino` /usr/bin/
```
> Tested on `Windows 10` and `WSL (Ubuntu 18.04)`
## Build
> You will need to have Rust (2018 or higher) installed on your system before proceeding.\
**Install it from [https://www.rust-lang.org/tools/install](https://www.rust-lang.org/tools/install)**
**1. Clone this repo**
```sh
git clone https://github.com/ahmednooor/lino.git
```
**2. Go into the cloned repo directory**
```sh
cd ./lino/
```
**3. Build & run with Cargo**
```sh
cargo run
```
On `Linux (Debian based)`, if you head into problems, try installing the following libraries and re-run with cargo.
```sh
sudo apt install xorg-dev libxcb-present-dev libxcb-composite0-dev libxcb-shape0-dev libxcb-xfixes0-dev
```
If you get an error about something like couldn't link with `cc`, try installing the following.
```sh
sudo apt install gcc gcc-multilib binutils
```
> NOTE: If you are unsure about above mentioned Linux libraries, do it on a dev system or a vm instead of your daily driver.
## Rust Dependencies
- [**crossterm**](https://crates.io/crates/crossterm) (to interact with the terminal)
- [**ctrlc**](https://crates.io/crates/ctrlc) (to prevent close on Ctrl+c)
- [**copypasta**](https://crates.io/crates/copypasta) (for clipboard access)
- [**syntect**](https://github.com/trishume/syntect) (for syntax highlighting)
- [**unicode-width**](https://github.com/unicode-rs/unicode-width) (for multi-width unicode character rendering)
> A big Thanks to the authors/maintainers/contributors of these libraries.
## Motivation
Imagine you're a mortal who is accustomed to VS Code or some other GUI Text Editor/IDE, and suddenly you have to login to some SSH or fire up a Linux Server Distro with no GUI. You find yourself treading in the territory of immortals where beasts like Vim, Emacs and others reside. You find a friend called Nano, but it doesn't speak your tongue (i.e. key bindings), so you waste your time trying to learn a new way to communicate instead of getting the job done and get the hell out of there. This editor can be your friend that speaks the same-ish tongue and you can take it there with you. It isn't the only one though, there is another one (a better one) called [Micro](https://github.com/zyedidia/micro).