VI Worsened, a lightweight and fun VI clone. Inspired by the 6-domino-cascade from the React world.
- gcc
- ncurses
# Fedora
sudo dnf install ncurses-devel
# Debian/Ubuntu
sudo apt-get install libncurses5-dev
$ git clone https://github.com/lpan/viw
$ cd viw/
$ make build
$ ./viw [filename]
j
Cursor downk
Cursor uph
Cursor leftl
Cursor right0
Cursor to the beginning of the line$
Cursor to the end of the linei
Insert beforeI
Insert at the beginning of the linea
Insert afterA
Insert at the end of the lineo
Append line then insertO
Prepend line then insertdd
Delete line under the cursorgg
Go to the first line of the fileG
Go the last line of the file
:q
quit:w
save:wq
save then quit
Feel free to contribute! :)
- initiate the state
- Read file to buffer.
- Set up interface with ncurses
- Listen to keyboard events.
- Each supported keybinding is mapped to a method that mutates the
buffer
- Run
update_state(st)
andrender_update(st)
- Similar to
selectors
in redux,update_state(state_t *st)
will update all the computed properties (such as cursor position, rows to be displayed on the screen, etc) according to the new mutatedbuffer
state. render_update(state_t *st)
will actually render everything on the screen according to the result fromupdate_state()
.
- Goto step 2
Our main state
object has two children states, namely buffer
and screen
. This seperation
makes it easier to perform unit tests against the buffer
. It also facilitates the migration
to a different rendering library in the future.
- The parent state stores computed states that depend on the
buffer
and/orscreen
. Those states include cursor positions, aount of space reserved for line numbers, etc.
- The buffer is represented as a two dimensional doubly linked list. This allows conatant time line/char deletion and insertion. Go to buffer.h for more information.
- Buffer is only allowed to be modified by the methods declared in
buffer.h
- The screen is the state of the interface between viw and GNU ncurses. It stores information such as pointers to the ncurses windows, etc. You can learn more about it at screen.h.