Commit Graph

250 Commits

Author SHA1 Message Date
ZyX
244dbe3a77 viminfo: First version of ShaDa file dumping
What works:

1. ShaDa file dumping: header, registers, jump list, history, search patterns,
   substitute strings, variables.
2. ShaDa file reading: registers, global marks, variables.

Most was not tested.

TODO:

1. Merging.
2. Reading history, local marks, jump and buffer lists.
3. Documentation update.
4. Converting some data from &encoding.
5. Safer variant of dumping viminfo (dump to temporary file then rename).
6. Removing old viminfo code (currently masked with `#if 0` in a ShaDa file for
   reference).
2015-10-08 21:59:51 +03:00
Björn Linse
6769438cd1 encoding: don't allow changing encoding after startup scripts 2015-09-08 10:53:27 +02:00
Thiago de Arruda
2a0ff9f5cf log: Make logging thread-safe 2015-09-06 09:18:52 -03:00
Steven Oliver
f7c5dc4db2 Remove instances of TRUE/FALSE macro
memory.c
os_unix.c
path.c
2015-09-04 11:07:33 +02:00
Thiago de Arruda
cb87670ff8 main: Initialize event loop before command_line_scan
The call to `event_init()` was too late. `command_line_scan()` in `main()` could
already need the loop initialized. Ref https://github.com/neovim/neovim/issues/3045#issuecomment-123405833.

A consequence of this change is that it was necessary to move the
`channel_from_stdio()` call to `command_line_scan()` when embedded_mode is set.
2015-08-21 13:28:53 -03:00
Thiago de Arruda
502aee690c event: Refactor async event processing
- Improve the implementation of deferred/immediate events.
- Use the new queue module to change how/when events are queued/processed by
  giving a private queue to each emitter.
- Immediate events(which only exist to break uv_run recursion) are now
  represented in the `loop->fast_events` queue.
- Events pushed to child queues are propagated to the event loop main queue and
  processed as K_EVENT keys.
2015-08-13 08:49:38 -03:00
Marco Hinz
05bb841487 Source provider at start if &cb is set #3025
The main problem is that <c-c> is a default mapping but also sets got_int.

Because of the former, normal_cmd() is kicked off which eventually leads to
sourcing the clipboard provider. But due to the latter, do_source() throws an
error, because got_int is set.

This is a temporary workaround and sources the clipboard provider before
main_loop(), if &clipboard is set.

References #3023.
2015-07-20 18:18:59 +02:00
Thiago de Arruda
aa9cb48bf0 job: Replace by a better process abstraction layer
- New libuv/pty process abstraction with simplified API and no globals.
- Remove nvim/os/job*. Jobs are now a concept that apply only to programs
  spawned by vimscript job* functions.
- Refactor shell.c/channel.c to use the new module, which brings a number of
  advantages:
  - Simplified API, less code
  - No slots in the user job table are used
  - Not possible to acidentally receive data from vimscript
- Implement job table in eval.c, which is now a hash table with unilimited job
  slots and unique job ids.
2015-07-17 00:32:07 -03:00
Thiago de Arruda
991d3ec1e6 event loop: New abstraction layer with refactored time/signal API
- Add event loop abstraction module under src/nvim/event. The
  src/nvim/event/loop module replaces src/nvim/os/event
- Remove direct dependency on libuv signal/timer API and use the new abstraction
  instead.
- Replace all references to uv_default_loop() by &loop.uv, a new global variable
  that wraps libuv main event loop but allows the event loop functions to be
  reused in other contexts.
2015-07-17 00:19:19 -03:00
Thiago de Arruda
d6ed2b3a39 os/fs: Use module-local uv_loop_t instance
This event loop is just a stub instance used in synchronous libuv function
calls, it needs to be decoupled from the main event loop in order to run it from
another thread.
2015-07-01 05:40:53 -03:00
Michael Reed
b113754de8 Passing by: Remove X_LOCALE refs
We don't link to any X11 libs, so this is most likely unneeded.
2015-05-30 17:09:27 -04:00
Michael Reed
7c2afbd9a6 main.c:mainerr(): Namespace messages
Error messages in general should be namespaced, especially in the
context of a shell. Given the possibility of a backgrounded job printing
messages to standard output/error, namespacing these messages should
avoid any confusion as to where the message came from.

Helped-by: Scott Prager <splinterofchaos@gmail.com>
Helped-by: oni-link <knil.ino@gmail.com>
2015-05-30 17:09:22 -04:00
Michael Reed
53774af5e9 main.c: Simplify error string management
This removes the need for preprocessor defines as array indices, and
brings error handling more in line with other files, which for the most
most part to use constant strings (also, see `globals.h`).

Helped-By: Nicolas Hillegeer <nicolas@hillegeer.com>
2015-05-30 12:44:25 -04:00
Scott Prager
412d246be7 getenv: return NULL if empty #2574
Making an environment variable empty can be a way of unsetting it for
platforms that don't support unsetenv(). In most cases, we treat empty
variables as having been unset. For all others, use os_env_exists().
2015-05-29 13:12:12 -04:00
Justin M. Keyes
b2c400b3f2 input: rename input_{start,stop}_stdin()
- "stdin" is misleading because it may read from stdout or stderr
- also remove some unused includes
2015-05-27 09:34:05 -04:00
Justin M. Keyes
4219b69145 input: stream_set_blocking(): libuv impl
- Create a private libuv loop instead of re-using uv_default_loop(), to
  avoid conflict[1] with existing watcher(s) on the fd.
- Expose the global "input" fd as a getter instead of a mutable global.

[1] .deps/build/src/libuv/src/unix/core.c:833:
      uv__io_stop: Assertion `loop->watchers[w->fd] == w' failed.
2015-05-27 09:34:04 -04:00
Justin M. Keyes
8a782f1699 input: set input stream to blocking on exit
If stdin is non-blocking, many tools (e.g. cat(1), read(1)) which assume
that stdin is blocking, will break in odd ways:

  read: read error: 0: Resource temporarily unavailable
  cat: -: Resource temporarily unavailable
  rm: error closing file

libuv puts stdin in nonblocking mode, and leaves it that way at exit
(this is apparently by design). So, before this commit, this always
works (because the shell clobbers O_NONBLOCK):

  $ nvim --cmd q
  $ read

...but these forms do _not_ work:

  $ nvim --cmd q && read
  $ echo foo | nvim --cmd q && read
  $ nvim && read

After this commit, all of the above forms work.

Background:

437b4397b9 (diff-41f4d294430cd8c36538999d62681ae2)
https://github.com/fish-shell/fish-shell/issues/176#issuecomment-15800155

- bash (and other shells: zsh, tcsh, fish), upon returning to the
  foreground, always sets fd 0 back to blocking mode. This practice only
  applies to stdin, _not_ stdout or stderr (in practice these fds may be
  affected anyways).
- bash/zsh/tcsh/fish do _not_ restore the non-blocking status of stdin
  when _resuming a job_.
- We do _not_ save/restore the original flags visible to
  fcntl(F_[SG]ETFL), because (counterintuitively) that isn't expected.

Helped-by: oni-link <knil.ino@gmail.com>

Closes #2086
Closes #2377

---

Note: The following implementation of stream_set_blocking() was
discarded, because it resulted in a failed libuv assertion[1]:

  int stream_set_blocking(int fd, bool blocking)
  {
    uv_pipe_t stream;
    uv_pipe_init(uv_default_loop(), &stream, 0);
    uv_pipe_open(&stream, fd);
    int retval = uv_stream_set_blocking((uv_stream_t *)&stream, blocking);
    uv_close((uv_handle_t *)&stream, NULL);
    return retval;
  }

[1] .deps/build/src/libuv/src/unix/core.c:833: uv__io_stop: Assertion `loop->watchers[w->fd] == w' failed.
2015-05-27 09:32:31 -04:00
Michael Reed
a16eab9e57 Remove -T command-line option
It didn't actually do anything after
3baba1e7bc

Helped-by: Justin M. Keyes <justinkz@gmail.com>
2015-05-18 11:06:54 -04:00
Michael Reed
3a3a6bee0d nvim --help text: Unify with manpages 2015-05-13 18:16:51 -04:00
Michael Reed
b0b3076995 main.c: Make '-v' synonymous with '--version'
This is done for consistency with '-h' and '--help'.
While here, also move the mch_exit() call out of usage
to make it clear what is being done.

Helped-by: Justin M. Keyes <justinkz@gmail.com>
2015-05-13 18:16:51 -04:00
Michael Reed
af3381b319 Remove char_u: Review
Helped-by: Scott Prager <splinterofchaos@gmail.com>
2015-05-13 15:29:50 -04:00
Michael Reed
743a0aa7f1 Remove char_u: main:use_vimrc 2015-05-13 15:29:49 -04:00
Michael Reed
b4534ba578 Remove char_u: main:process_env()
In addition, make static and modernize function comment
2015-05-13 15:29:49 -04:00
Michael Reed
5e60180a1e Remove char_u: ex_docmd:do_cmdline_cmd() 2015-05-13 15:29:49 -04:00
Yamakaky
0b03399b8b refactor: remove USR_VIMRC_FILE4 #2580
It was 1) not used and 2) badly treated, compared to USR_VIMRC_FILE3.
2015-05-07 17:05:41 -04:00
Mark Bainter
c55e488079 Remove char_u: concat_fnames() 2015-05-06 21:34:19 -05:00
Felipe Oliveira Carvalho
caabcae0b7 Replace VIM_ISDIGIT() and vim_isdigit() with ascii_isdigit() defined in ascii.h 2015-04-24 20:37:13 -03:00
Mark Bainter
a7e17de048 Refactor get_env() to respect const qualifier
Without the casts*, the compiler rightly warns about the os_getenv
losing the qualifier.  This refactor adds a variable to manage this
properly, and renames the original variables to increase clarity.
2015-04-18 21:37:10 +00:00
Mark Bainter
4848158cc1 Remove char_u: vim_getenv() 2015-04-17 14:46:58 +00:00
Thiago de Arruda
34c48aaf12 memory: Add free wrapper and refactor project to use it
We already use wrappers for allocation, the new `xfree` function is the
equivalent for deallocation and provides a way to fully replace the malloc
implementation used by Neovim.
2015-04-13 08:22:44 -03:00
Scott Prager
0f4976687d os_scandir: fname_case -> path_fix_case
Use os_scandir().

fname_case() only gets used when `defined(USE_FNAME_CASE)` (on operating
systems with case-insensitive file systems), but may be useful in other
contexts, so move it to path.c. (See the TODO.)

Remove the unused parameter, len.
2015-03-31 11:20:23 -03:00
Thiago de Arruda
6e7757ad51 eval: Refactor vimscript job control API
- Remove JobActivity autocmd and v:job_data variable
- Simplify `jobstart` to receive:
  - An argument vector
  - An optional dictionary which may contain any of the current `jobstart`
    options plus `on_stdout`, `on_stderr` and `on_exit` callbacks.
- Refactor and add more job tests
- Update documentation
2015-03-29 20:35:44 -03:00
Thiago de Arruda
cdedd89d22 terminal: New module that implements a terminal emulator
This commit integrates libvterm with Neovim and implements a terminal emulator
with nvim buffers as the display mechanism. Terminal buffers can be created
using any of the following methods:

- Opening a file with name following the "term://[${cwd}//[${pid}:]]${cmd}"
  URI pattern where:
  - cwd is the working directory of the process
  - pid is the process id. This is just for use in session files where a pid
    would have been assigned to the saved buffer title.
  - cmd is the command to run
- Invoking the `:terminal` ex command
- Invoking the `termopen` function which returns a job id for automating the
  terminal window.

Some extra changes were also implemented to adapt with terminal buffers. Here's
an overview:

- The `main` function now sets a BufReadCmd autocmd to intercept the term:// URI
  and spawn the terminal buffer instead of reading the file.
- terminal buffers behave as if the following local buffer options were set:
  - `nomodifiable`
  - `swapfile`
  - `undolevels=-1`
  - `bufhidden=hide`
- All commands that delete buffers(`:bun`, `:bd` and `:bw`) behave the same for
  terminal buffers, but only work when bang is passed(eg: `:bwipeout!`)
- A new "terminal" mode was added. A consequence is that a new set of mapping
  commands were implemented with the "t" prefix(tmap, tunmap, tnoremap...)
- The `edit` function(which enters insert mode) will actually enter terminal
  mode if the current buffer is a terminal
- The `put` operator was adapted to send data to the terminal instead of
  modifying the buffer directly.
- A window being resized will also trigger a terminal resize if the window
  displays the terminal.
2015-03-25 18:57:35 -03:00
Justin M. Keyes
adfc8cf50a doc: Misc. cleanup
Add missing parentheses and whatnot, move dangling comment, etc. Some
specific items worth mentioning:

Fixed some references to non-existent tags, found via `make html`

msgpack_rpc/channel.c:
  ELOG already prefixes each line with "error @ ..."
2015-03-24 19:29:29 -04:00
Michael Reed
bb7aa04e61 Remove --nofork / -f remnants 2015-03-24 19:29:29 -04:00
bobtwinkles
03d47965c0 refactor: split some more functions from misc1.c
This commit pulls the some environment-variable handling functions out of
misc1.c and in to os/env.c. Previously submited as #1231, this is the start of
a patch series that does that work based on a more up-to-date master branch.

Major tasks accomplished:
  - move functions and fix includes
  - fix clint/clang analysis warnings
  - correct documentation comments
2015-03-24 16:13:00 -04:00
Thiago de Arruda
4d63d99174 main: Simplify code that deals with early user input
A read stream will be started before the first ex command is processed. This
stream will be used to read early user input before handling control over to the
UI module.

Which stdio stream will be used depends on which types of file descriptors are
connected, and whether the "-" argument was passed.
2015-03-18 21:28:20 -03:00
Thiago de Arruda
5709181243 main: Start stdin before sourcing startup scripts
This is required to be compatible with plugins that ask user questions at
startup(eg: vim-addon-local-vimrc)
2015-03-17 14:49:09 -03:00
Thiago de Arruda
c546875daf ui: Replace cursor_{on,off} by busy_{stop,start}
Switching cursor off is only necessary in two occasions:

- When redrawing to avoid terminal flickering
- When the editor is busy

The first can now be handled by the TUI, so most calls to ui_cursor_off can be
removed from the core.

So, before this commit it was only necessary to switch the cursor off to notify
the user that nvim was running some long operation. Now the cursor_{on,off}
functions have been replaced by busy_{stop,start} which can be handled in a
UI-specific way(turning the cursor off or showing a busy indicator, for
example).

To make things even more simpler, nvim is always busy except when waiting for
user input or other asynchronous events: It automatically switches to a non-busy
state when the event loop is about to be entered for more than 100 milliseconds.

`ui_busy_start` can be called when its not desired to change the busy state in
the event loop (As its now done by functions that perform blocking shell
invocations).
2015-03-15 10:30:59 -03:00
Michael Reed
481ebc0bb1 Interface cleanup: Symlink handling & docs
This removes the ability to start nvim via the following aliases in
favor of just using their command line arguments:

ex        vim -e
exim      vim -E
view      vim -R
gvim      vim -g
gex       vim -eg
gview     vim -Rg
rvim      vim -Z
rview     vim -RZ
rgvim     vim -gZ
rgview    vim -RgZ

This also removes Vi mode (-v) for consistency. From ':help -v':

    -v  Start Ex in Vi mode.  Only makes a difference when the
    executable is called "ex" or "gvim".  For gvim the GUI is not
    started if possible.
2015-03-12 20:04:26 -04:00
Thiago de Arruda
3baba1e7bc refactor: Remove term modules and termcap options
- Removed term.c, term.h and term_defs.h
- Tests for T_* values were removed. screen.c was simplified as a
  consequence(the best strategy for drawing is implemented in the UI layer)
- Redraw functions now call ui.c functions directly. Updates are flushed with
  `ui_flush()`
- Removed all termcap options(they now return empty strings for compatibility)
- &term/&ttybuiltin options return a constant value(nvim)
- &t_Co is still available, but it mirrors t_colors directly
- Remove cursor tracking from screen.c and the `screen_start` function. Now the
  UI is expected to maintain cursor state across any call, and reset it when
  resized.
- Remove unused code
2015-02-21 05:08:21 -03:00
Thiago de Arruda
9a2dd7c498 ui: Rewrite the builtin terminal UI
Now all terminal-handling code was moved to src/nvim/tui, which implements a
new terminal UI based on libtermkey and unibilium
2015-02-16 23:17:39 -03:00
Thiago de Arruda
e0e41b30c6 ui: Remove/adapt some old code for a big UI refactor
- Remove abstract_ui global, now it is always active
- Remove some terminal handling code
- Remove unused functions
- Remove HAVE_TGETENT/TERMINFO/TERMIOS/IOCTL #ifdefs
- Remove tgetent/terminfo from version.c
- Remove curses/terminfo dependencies
- Only start/stop termcap when starting/exiting the program
- msg_use_printf will return true if there are no attached UIs(
  messages will be written to stdout)
- Remove `ex_winpos`(implement `:winpos` with `ex_ni`)
2015-02-16 23:17:39 -03:00
Michael Reed
7b98b4c442 Remove vimdiff
While we're here:
- Remove references to the '+diff' feature, which has since been made
  non-optional.
- Update a few Vim instances with Nvim.
2015-02-03 15:15:54 -05:00
Michael Reed
054aabbe06 main.c: usage() improvement
- Factor out main_msg() in favor of mch_msg() and manual indentation, as to
  provide a much closer representation to the actual output of '--help'.
  'gcc -E' reveals that main_msg() only consists of 3 printf calls
  anyways.
- Factor out for loop used for printing top part of usage text; just
  print the text normally.

usage() text:
- Don't print the version; that's what '--version' is for.
- Be consistent about nomenclature, e.g. '<arg>' denotes required
  argument, '-h | --help' denotes '-h' and '--help' are equivalent, etc.
- Change some instances of vim{,rc,info} to nvim
2015-02-03 13:58:38 -05:00
Michael Reed
9381004066 main.c: Misc. improvements
- Constify parameters and reduce char_u usage
- Modernize function signatures
- Modernize function comment blocks, rewriting if needed
- Factor out mainerr_arg_missing(); all the other ME_* macros lack
  such a wrapper function.

main_errors[]
  - Remove unneeded parentheses
  - Remove an unused error string and its respective macro

mainerr()
  - Don't print version when called. mainerr() only handles errors
    related to command line arguments, so the version isn't much help at
    all.
  - Changed 'vim' instance to 'nvim'

Misc.
  - Remove duplicate include
  - Replace unneeded 'inttypes.h' include with 'stdint.h'
  - Remove stray comments
  - Remove excessive newlines
2015-01-23 19:59:57 -05:00
Michael Reed
1a40013bec main.c: Enable -Wconversion 2015-01-23 19:42:21 -05:00
Felipe Morales
44b01ca863 Remove easy mode 2015-01-15 18:55:44 -03:00
Justin M. Keyes
5c6348e999 Merge pull request #1816 from Pyrohh/macro_cleanup
Macro cleanup
2015-01-15 09:59:45 -05:00
Michael Reed
cd8e91b87e Macro cleanup: HAS_SWAP_EXISTS_ACTION
Neovim always ships with all features[0], so this serves no purpose.
Besides, this always evaluated to true.

[0]: https://github.com/neovim/neovim/wiki/Differences-from-vim
2015-01-14 15:08:19 -05:00