Commit Graph

4429 Commits

Author SHA1 Message Date
ZyX
10080366b8 documentation: Fix &undodir default 2015-10-30 17:42:54 +03:00
Justin M. Keyes
4abf108f46 Merge pull request #3556 from Pyrohh/local-mk-update
contrib/local.mk.example: Mention ENABLE_JEMALLOC
2015-10-29 21:10:07 -04:00
Michael Reed
8ef2bb5366 contrib/local.mk.example: Mention ENABLE_JEMALLOC
This doesn't prevent compilation of jemalloc, but the important thing is
that it prevents it being used in nvim.

refs 6cd20177df
refs 95707bf336
2015-10-29 16:19:34 -04:00
Thiago de Arruda
6cd20177df build: Set the default value of ENABLE_JEMALLOC to ON
Restoring the default which was changed by #3515.
2015-10-29 14:51:56 -03:00
ZyX
ffdf9399ba undo: Automatically create undo directory if needed 2015-10-29 19:34:26 +03:00
ZyX
d99941777d undo: Do some refactoring
Specifically refactor u_get_undo_file_name which will be modified to
automatically create undo directory and replace `char_u` with `char` in some of
the related functions.
2015-10-29 19:34:25 +03:00
ZyX
1af15494c2 stdpaths: Document that stdpaths_*_subpath is not returning NULL 2015-10-29 19:34:25 +03:00
ZyX
baf032834a stdpaths: Use NULL in place of empty strings 2015-10-29 19:34:25 +03:00
ZyX
0bcc2bf126 option: Add current directory to &backupdir option
Fixes #3496
2015-10-29 19:34:24 +03:00
Thiago de Arruda
58962d89c8 Merge PR #3546 'Fix some regressions' 2015-10-29 10:06:05 -03:00
Thiago de Arruda
c2185833e8 tui: Don't use stderr as an output fallback for the TUI
Ref: https://github.com/neovim/neovim/issues/3547#issuecomment-152156639
2015-10-29 09:09:05 -03:00
Thiago de Arruda
7e8b431d3f tui: Fix abort when stdout and stderr are not tty.
The abort came from using libuv tty handle on non-tty fd. Use uv_pipe_t in these
cases. Also add simple test for this case.
2015-10-29 08:13:45 -03:00
Thiago de Arruda
7dae3ad24d os/input.c: Fix assertion in create_cursorhold_event
The assertion now considers the case where events are disabled.
2015-10-29 07:47:48 -03:00
Justin M. Keyes
98b5ec565b Merge pull request #3554 from ovidiu/fix-exrc-option
Fix the 'exrc' option
2015-10-28 23:24:55 -04:00
Ovidiu Curcan
dbef4111ed Fix 'exrc' option
`do_user_initialization()` ignored changes to the value of the `exrc` option
caused by the processing of environment variables or sourcing of files.
2015-10-29 02:28:07 +01:00
Justin M. Keyes
dc8b0c47b1 Merge pull request #3540 from fmoralesc/fix-spellfile
spellfile: follow the XDG spec
2015-10-28 09:52:49 -04:00
Felipe Morales
6b6f018f84 spellfile: follow the XDG spec
Closes #3535
2015-10-28 14:46:00 +01:00
Justin M. Keyes
454b087dda Merge pull request #3539 from jszakmeister/js/use-updated-busted
Remove our cliargs workaround use 2.0.rc11 of Busted.
2015-10-28 08:26:14 -04:00
John Szakmeister
e34ae35d10 Remove our cliargs workaround use 2.0.rc11 of Busted.
Busted now correctly excludes the 3.0 line of cliargs.
2015-10-28 03:12:48 -04:00
Justin M. Keyes
2394a1aeee Merge pull request #3528 from Grimy/directory-last-char
option: fix off-by-one error when handling &directory
2015-10-27 22:08:34 -04:00
Justin M. Keyes
e6525f3ceb Merge pull request #3525 from jszakmeister/fix-busted-dependency
Update busted to pick up the CLI fix.
2015-10-27 14:20:06 -04:00
Victor Adam
8848b5cef2 option: fix off-by-one error when handling &directory
a8e18d9 introduced an off-by-one error that caused the last character of
&directory to be ignored. This commit is a straightforward fix for that error.

fixes #3519
2015-10-27 13:33:48 +01:00
John Szakmeister
804edb0489 Update busted to pick up the CLI fix.
Unfortunately, it's not enough to avoid the rc file.  For now, let's
install a good version of lua_cliargs until the dependency is fixed
upstream.
2015-10-27 05:52:33 -04:00
Justin M. Keyes
68e5968568 doc: Remove CLA requirement.
Closes #3036
2015-10-27 01:07:24 -04:00
Justin M. Keyes
597015d765 Merge pull request #3516 from Pyrohh/manual
nvim.1: XDG update
2015-10-27 00:59:38 -04:00
Michael Reed
6b4063fafe nvim.1: XDG update
Helped-by: Justin M. Keyes <justinkz@gmail.com>
Helped-by: ZyX <kp-pav@yandex.ru>
2015-10-27 00:49:22 -04:00
Justin M. Keyes
95707bf336 Merge pull request #3515 from Tranquility/make_jemalloc_optional
Make jemalloc optional
2015-10-26 18:40:07 -04:00
Ole Reifschneider
2bcfd7fde1 Make jemalloc optional 2015-10-26 19:33:50 +01:00
Felipe Morales
f17c6482f2 Merge pull request #3514 from fmoralesc/fix-tutorial-2
tutor: fix typo
2015-10-26 19:25:05 +01:00
Felipe Morales
04810c2b39 tutor: fix typo 2015-10-26 19:23:59 +01:00
Justin M. Keyes
77e93a65fe Merge pull request #3502 from ZyX-I/fix-xdg
option: Fix typos that may lead to SEGV in some cases
2015-10-26 12:48:42 -04:00
Thiago de Arruda
29d64a901d Merge PR #3413 'Refactor Neovim to remove the side effects of K_EVENT' 2015-10-26 11:24:51 -03:00
Thiago de Arruda
1726c7d999 edit.c: Fix one clint warning 2015-10-26 11:06:07 -03:00
Thiago de Arruda
b4c82dba5c Start documenting code 2015-10-26 10:52:02 -03:00
Thiago de Arruda
ed985d06ef ex_getln: Extract command_line_handle_key from command_line_execute 2015-10-26 10:52:02 -03:00
Thiago de Arruda
c0c562f97f ex_getln: Convert cmdline_{not_,}changed labels into functions 2015-10-26 10:52:02 -03:00
Thiago de Arruda
0701e1bfa4 ex_getln: refactor command line mode to use the state_enter loop
Split `getcmdline()` into command_line_{enter,check,execute}`
2015-10-26 10:52:02 -03:00
Thiago de Arruda
52d4978b03 ex_getln: Extract local variables from getcmdline() and fix code style
Begin refactoring getcmdline() into a state that can be managed by the
`state_enter()`:

- Move local variables into a local CommandLineState structure
- Fix code style in the entire function.
2015-10-26 10:52:02 -03:00
Thiago de Arruda
344bd64f96 terminal: Refactor to use state_enter
- Create `TerminalState` structure containing data used in terminal mode
- Extract `terminal_execute` from `terminal_enter` and use it with
  `state_enter`.
2015-10-26 10:52:02 -03:00
Thiago de Arruda
8890852cb7 edit: Extract some functions from insert_execute
- `insert_handle_key`: Contains the big insert mode switch statement.
- `insert_do_complete`: Code that used to be in the `docomplete` label.
- `insert_do_cindent`: Code that used to be in the `force_cindent` label.

Also move some code after the switch statement into the beginning of
`insert_check`.
2015-10-26 10:52:02 -03:00
Thiago de Arruda
091e7d033c edit: Move most code from edit() to insert_{enter,check,execute}
Refactor insert mode to use `state_enter` as an event loop:

- Move o_lnum(static variable) outside function
- Move code before the insert mode loop into `insert_enter`
- Move code before `safe_vgetc()` call into `insert_check`
- Move code after `safe_vgetc()` call into `insert_execute`
- Remove doESCkey label and handle insert mode repeating in the `insert_enter`
  function
- Remove do_intr label(this is not the place for platform-specific interrupt
  charts)
2015-10-26 10:52:02 -03:00
Thiago de Arruda
f5b333f532 edit: Extract local variables from edit() and fix code style
Begin refactoring edit() into a state that can be managed by the `state_enter()`:

- Move local variables into a local InsertState structure
- Fix code style in the entire function.
2015-10-26 10:52:01 -03:00
Thiago de Arruda
f1bc3e4c0c normal: Extract some functions from normal_finish_command
- `normal_need_redraw_mode_message`
- `normal_redraw_mode_message`
2015-10-26 10:52:01 -03:00
Thiago de Arruda
4c6e417d2a normal: Extract normal_finish_command from normal_execute 2015-10-26 10:52:01 -03:00
Thiago de Arruda
5abd25f6fb normal: Extract normal_get_command_count from normal_execute 2015-10-26 10:52:01 -03:00
Thiago de Arruda
0f0fae58b9 normal: Extract some functions from normal_execute
- `normal_handle_special_visual_command`
- `normal_need_aditional_char`
- `normal_get_additional_char`
- `normal_invert_horizontal`
2015-10-26 10:52:01 -03:00
Thiago de Arruda
fa83b03fea normal: Split normal_check into multiple functions
Split most code in `normal_check` in:

- `normal_check_stuff_buffer`
- `normal_check_interrupt`
- `normal_check_cursor_moved`
- `normal_check_text_changed`
- `normal_check_folds`
- `normal_redraw`
2015-10-26 10:52:01 -03:00
Thiago de Arruda
8d93621c63 main: Start modeling Nvim as pushdown automaton
From a very high level point of view, Vim/Nvim can be described as state
machines following these instructions in a loop:

- Read user input
- Peform some action. The action is determined by the current state and can
  switch states.
- Possibly display some feedback to the user.

This is not immediately visible because these instructions spread across dozens
of nested loops and function calls, making it very hard to modify the state
machine(to support more event types, for example).

So far, the approach Nvim has taken to allow more events is this:

- At the very core function that blocks for input, poll for arbitrary events.
- If the event received from the OS is user input, just return it normally to
  the callers.
- If the event is not direct result of user input(possibly a vimscript function
  call coming from a msgpack-rpc socket or a job control callback), return a
  special key code(`K_EVENT`) that is handled by callers where it is safer to
  perform arbitrary actions.

One problem with this approach is that the `K_EVENT` signal is being sent across
multiple states that may be unaware of it. This was partially fixed with the
`input_enable_events`/`input_disable_events` functions, which were added as a
mechanism that the upper layers can use to tell the core input functions that it
is ready to accept `K_EVENT`.

Another problem is that the mapping engine is implemented in getchar.c
which is called from every state, but the mapping engine is not aware of
`K_EVENT` so events can break mappings.

While it is theoretically possible to modify getchar.c to make it aware of
`K_EVENT`, this commit fixes the problem with a different approach: Model Nvim
as a pushdown automaton(https://en.wikipedia.org/wiki/Pushdown_automaton). This
design has many advantages which include:

- Decoupling the event loop from the states reponsible for handling events.
- Better control of state transition with less dependency on global variable
  hacks(eg: 'restart_edit' global variable).
- Easier removal of global variables and function splitting. That is because
  many variables are for state-specific information, and probably ended up being
  global to simplify communication between functions, which we fix by storing
  state-specific information in specialized structures.

The final goal is to let Nvim have a single top-level event loop represented by
the following pseudo-code:

```
while not quitting
  let event = read_event
  current_state(event)
  update_screen()
```

This closely mirrors the state machine description above and makes it easier to
understand, extend and debug the program.

Note that while the pseudo code suggests an explicit stack of states that
doesn't rely on return addresses(as suggested by the principles of
automata-based programming:
https://en.wikipedia.org/wiki/Automata-based_programming), for now we'll use the
call stack as a structure to manage state transitioning as it would be very
difficult to refactor Nvim to use an explicit stack of states, and the benefits
would be small.

While this change may seem like an endless amount of work, it is possible to
do it incrementally as was shown in the previous commits. The general procedure
is:

1- Find a blocking `vgetc()`(or derivatives) call. This call represents an
   implicit state of the program.

2- Split the code before and after the `vgetc()` call into functions that match
   the signature of `state_check_callback` and `state_execute_callback.
   Only `state_execute_callback` is required.

3- Create a `VimState` "subclass" and a initializer function that sets the
   function pointers and performs any other required initialization steps. If
   the state has no local variables, just use `VimState` without subclassing.

4- Instead of calling the original function containing the `vgetc()`,
   initialize a stack-allocated `VimState` subclass, then call `state_enter` to
   begin processing events in the state.

5- The check/execute callbacks can return 1 to continue normally, 0 to break the
   loop or -1 to skip to the next iteration. These callbacks contain code that
   execute before and after the old `vgetc()` call.

The functions created in step 2 may contain other `vgetc()` calls. These
represent implicit sub-states of the current state, but it is fine to remove
them later in smaller steps since we didn't break compatibility with existing
code.
2015-10-26 10:52:01 -03:00
Thiago de Arruda
350ffc63db main: Refactor normal_enter to call os_inchar directly
This makes it impossible for K_EVENT to interfere with mappings, but it also
disables processing of events while in the middle of a mapping (Though this will
be fixed later as this refactoring progresses).

`may_sync_undo` is now called when K_EVENT is received. This is necessary to
correctly update undo entry lists before executing some action.
2015-10-26 10:52:01 -03:00
Thiago de Arruda
32594a33a3 main: Call normal_execute from normal_enter
`normal_prepare` is now called by `normal_check` before returning 1(to
continue).

Also remove `input_{enable,disable}_events` calls from `normal_cmd`, which only
exists now as a compatibility function to run normal commands with keys inserted
into the typeahead buffer(We don't want to process events in these cases
anyway).
2015-10-26 10:52:01 -03:00