diff options
Diffstat (limited to 'src')
75 files changed, 1977 insertions, 1463 deletions
diff --git a/src/clint.py b/src/clint.py index 4a5e435bbd..e7d76366b0 100755 --- a/src/clint.py +++ b/src/clint.py @@ -264,7 +264,7 @@ _error_suppressions_2 = set() # The allowed line length of files. # This is set by --linelength flag. -_line_length = 80 +_line_length = 100 # The allowed extensions for file names # This is set by --extensions flag. diff --git a/src/nvim/README.md b/src/nvim/README.md index affc5c79cc..4efb42b896 100644 --- a/src/nvim/README.md +++ b/src/nvim/README.md @@ -75,8 +75,108 @@ Logs will be written to `${HOME}/logs/*san.PID` then. For more information: https://github.com/google/sanitizers/wiki/SanitizerCommonFlags -TUI debugging -------------- +Debug: Performance +------------------ + +### Profiling (easy) + +For debugging performance bottlenecks in any code, there is a simple (and very +effective) approach: + +1. Run the slow code in a loop. +2. Break execution ~5 times and save the stacktrace. +3. The cause of the bottleneck will (almost always) appear in most of the stacktraces. + +### Profiling (fancy) + +For more advanced profiling, consider `perf` + `flamegraph`. + +### USDT profiling (powerful) + +Or you can use USDT probes via `NVIM_PROBE` ([#12036](https://github.com/neovim/neovim/pull/12036)). + +> USDT is basically a way to define stable probe points in userland binaries. +> The benefit of bcc is the ability to define logic to go along with the probe +> points. + +Tools: +- bpftrace provides an awk-like language to the kernel bytecode, BPF. +- BCC provides a subset of C. Provides more complex logic than bpftrace, but takes a bit more effort. + +Example using bpftrace to track slow vim functions, and print out any files +that were opened during the trace. At the end, it prints a histogram of +function timing: + + #!/usr/bin/env bpftrace + + BEGIN { + @depth = -1; + } + + tracepoint:sched:sched_process_fork /@pidmap[args->parent_pid]/ { + @pidmap[args->child_pid] = 1; + } + + tracepoint:sched:sched_process_exit /@pidmap[args->pid]/ { + delete(@pidmap[args->pid]); + } + + usdt:build/bin/nvim:neovim:eval__call_func__entry { + @pidmap[pid] = 1; + @depth++; + @funcentry[@depth] = nsecs; + } + + usdt:build/bin/nvim:neovim:eval__call_func__return { + $func = str(arg0); + $msecs = (nsecs - @funcentry[@depth]) / 1000000; + + @time_histo = hist($msecs); + + if ($msecs >= 1000) { + printf("%u ms for %s\n", $msecs, $func); + print(@files); + } + + clear(@files); + delete(@funcentry[@depth]); + @depth--; + } + + tracepoint:syscalls:sys_enter_open, + tracepoint:syscalls:sys_enter_openat { + if (@pidmap[pid] == 1 && @depth >= 0) { + @files[str(args->filename)] = count(); + } + } + + END { + clear(@depth); + } + + $ sudo bpftrace funcslower.bt + 1527 ms for Slower + @files[/usr/lib/libstdc++.so.6]: 2 + @files[/etc/fish/config.fish]: 2 + <snip> + + ^C + @time_histo: + [0] 71430 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| + [1] 346 | | + [2, 4) 208 | | + [4, 8) 91 | | + [8, 16) 22 | | + [16, 32) 85 | | + [32, 64) 7 | | + [64, 128) 0 | | + [128, 256) 0 | | + [256, 512) 6 | | + [512, 1K) 1 | | + [1K, 2K) 5 | | + +Debug: TUI +---------- ### TUI troubleshoot diff --git a/src/nvim/api/private/dispatch.c b/src/nvim/api/private/dispatch.c index eae4581f42..9f16da4078 100644 --- a/src/nvim/api/private/dispatch.c +++ b/src/nvim/api/private/dispatch.c @@ -21,12 +21,12 @@ #include "nvim/api/window.h" #include "nvim/api/deprecated.h" -static Map(String, MsgpackRpcRequestHandler) *methods = NULL; +static Map(String, MsgpackRpcRequestHandler) methods = MAP_INIT; static void msgpack_rpc_add_method_handler(String method, MsgpackRpcRequestHandler handler) { - map_put(String, MsgpackRpcRequestHandler)(methods, method, handler); + map_put(String, MsgpackRpcRequestHandler)(&methods, method, handler); } /// @param name API method name @@ -37,7 +37,7 @@ MsgpackRpcRequestHandler msgpack_rpc_get_handler_for(const char *name, { String m = { .data = (char *)name, .size = name_len }; MsgpackRpcRequestHandler rv = - map_get(String, MsgpackRpcRequestHandler)(methods, m); + map_get(String, MsgpackRpcRequestHandler)(&methods, m); if (!rv.fn) { api_set_error(error, kErrorTypeException, "Invalid method: %.*s", diff --git a/src/nvim/api/private/handle.c b/src/nvim/api/private/handle.c deleted file mode 100644 index eb96192af2..0000000000 --- a/src/nvim/api/private/handle.c +++ /dev/null @@ -1,40 +0,0 @@ -// This is an open source non-commercial project. Dear PVS-Studio, please check -// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com - -#include <assert.h> -#include <stdint.h> - -#include "nvim/vim.h" -#include "nvim/map.h" -#include "nvim/api/private/handle.h" - -#define HANDLE_INIT(name) name##_handles = pmap_new(handle_T)() - -#define HANDLE_IMPL(type, name) \ - static PMap(handle_T) *name##_handles = NULL; /* NOLINT */ \ - \ - type *handle_get_##name(handle_T handle) \ - { \ - return pmap_get(handle_T)(name##_handles, handle); \ - } \ - \ - void handle_register_##name(type *name) \ - { \ - pmap_put(handle_T)(name##_handles, name->handle, name); \ - } \ - \ - void handle_unregister_##name(type *name) \ - { \ - pmap_del(handle_T)(name##_handles, name->handle); \ - } - -HANDLE_IMPL(buf_T, buffer) -HANDLE_IMPL(win_T, window) -HANDLE_IMPL(tabpage_T, tabpage) - -void handle_init(void) -{ - HANDLE_INIT(buffer); - HANDLE_INIT(window); - HANDLE_INIT(tabpage); -} diff --git a/src/nvim/api/private/handle.h b/src/nvim/api/private/handle.h deleted file mode 100644 index 26e9dc3314..0000000000 --- a/src/nvim/api/private/handle.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef NVIM_API_PRIVATE_HANDLE_H -#define NVIM_API_PRIVATE_HANDLE_H - -#include "nvim/vim.h" -#include "nvim/buffer_defs.h" -#include "nvim/api/private/defs.h" - -#define HANDLE_DECLS(type, name) \ - type *handle_get_##name(handle_T handle); \ - void handle_register_##name(type *name); \ - void handle_unregister_##name(type *name); - -// handle_get_buffer handle_register_buffer, handle_unregister_buffer -HANDLE_DECLS(buf_T, buffer) -// handle_get_window handle_register_window, handle_unregister_window -HANDLE_DECLS(win_T, window) -// handle_get_tabpage handle_register_tabpage, handle_unregister_tabpage -HANDLE_DECLS(tabpage_T, tabpage) - -void handle_init(void); - - -#endif // NVIM_API_PRIVATE_HANDLE_H - diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c index 3ec6151090..eedcfd69b8 100644 --- a/src/nvim/api/private/helpers.c +++ b/src/nvim/api/private/helpers.c @@ -9,7 +9,6 @@ #include "nvim/api/private/helpers.h" #include "nvim/api/private/defs.h" -#include "nvim/api/private/handle.h" #include "nvim/api/vim.h" #include "nvim/msgpack_rpc/helpers.h" #include "nvim/lua/executor.h" @@ -1725,7 +1724,7 @@ const char *describe_ns(NS ns_id) { String name; handle_T id; - map_foreach(namespace_ids, name, id, { + map_foreach(&namespace_ids, name, id, { if ((NS)id == ns_id && name.size) { return name.data; } diff --git a/src/nvim/api/private/helpers.h b/src/nvim/api/private/helpers.h index 055abb797f..ecce6afa26 100644 --- a/src/nvim/api/private/helpers.h +++ b/src/nvim/api/private/helpers.h @@ -101,6 +101,14 @@ #define api_free_window(value) #define api_free_tabpage(value) +EXTERN PMap(handle_T) buffer_handles INIT(= MAP_INIT); +EXTERN PMap(handle_T) window_handles INIT(= MAP_INIT); +EXTERN PMap(handle_T) tabpage_handles INIT(= MAP_INIT); + +#define handle_get_buffer(h) pmap_get(handle_T)(&buffer_handles, (h)) +#define handle_get_window(h) pmap_get(handle_T)(&window_handles, (h)) +#define handle_get_tabpage(h) pmap_get(handle_T)(&tabpage_handles, (h)) + /// Structure used for saving state for :try /// /// Used when caller is supposed to be operating when other VimL code is being diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c index 63e6ad883a..713980ca68 100644 --- a/src/nvim/api/ui.c +++ b/src/nvim/api/ui.c @@ -37,24 +37,18 @@ typedef struct { bool wildmenu_active; } UIData; -static PMap(uint64_t) *connected_uis = NULL; - -void remote_ui_init(void) - FUNC_API_NOEXPORT -{ - connected_uis = pmap_new(uint64_t)(); -} +static PMap(uint64_t) connected_uis = MAP_INIT; void remote_ui_disconnect(uint64_t channel_id) FUNC_API_NOEXPORT { - UI *ui = pmap_get(uint64_t)(connected_uis, channel_id); + UI *ui = pmap_get(uint64_t)(&connected_uis, channel_id); if (!ui) { return; } UIData *data = ui->data; api_free_array(data->buffer); // Destroy pending screen updates. - pmap_del(uint64_t)(connected_uis, channel_id); + pmap_del(uint64_t)(&connected_uis, channel_id); xfree(ui->data); ui->data = NULL; // Flag UI as "stopped". ui_detach_impl(ui, channel_id); @@ -73,7 +67,7 @@ void remote_ui_wait_for_attach(void) } LOOP_PROCESS_EVENTS_UNTIL(&main_loop, channel->events, -1, - pmap_has(uint64_t)(connected_uis, CHAN_STDIO)); + pmap_has(uint64_t)(&connected_uis, CHAN_STDIO)); } /// Activates UI events on the channel. @@ -95,7 +89,7 @@ void nvim_ui_attach(uint64_t channel_id, Integer width, Integer height, Dictionary options, Error *err) FUNC_API_SINCE(1) FUNC_API_REMOTE_ONLY { - if (pmap_has(uint64_t)(connected_uis, channel_id)) { + if (pmap_has(uint64_t)(&connected_uis, channel_id)) { api_set_error(err, kErrorTypeException, "UI already attached to channel: %" PRId64, channel_id); return; @@ -172,7 +166,7 @@ void nvim_ui_attach(uint64_t channel_id, Integer width, Integer height, data->wildmenu_active = false; ui->data = data; - pmap_put(uint64_t)(connected_uis, channel_id, ui); + pmap_put(uint64_t)(&connected_uis, channel_id, ui); ui_attach_impl(ui, channel_id); } @@ -195,7 +189,7 @@ void ui_attach(uint64_t channel_id, Integer width, Integer height, void nvim_ui_detach(uint64_t channel_id, Error *err) FUNC_API_SINCE(1) FUNC_API_REMOTE_ONLY { - if (!pmap_has(uint64_t)(connected_uis, channel_id)) { + if (!pmap_has(uint64_t)(&connected_uis, channel_id)) { api_set_error(err, kErrorTypeException, "UI not attached to channel: %" PRId64, channel_id); return; @@ -208,7 +202,7 @@ void nvim_ui_try_resize(uint64_t channel_id, Integer width, Integer height, Error *err) FUNC_API_SINCE(1) FUNC_API_REMOTE_ONLY { - if (!pmap_has(uint64_t)(connected_uis, channel_id)) { + if (!pmap_has(uint64_t)(&connected_uis, channel_id)) { api_set_error(err, kErrorTypeException, "UI not attached to channel: %" PRId64, channel_id); return; @@ -220,7 +214,7 @@ void nvim_ui_try_resize(uint64_t channel_id, Integer width, return; } - UI *ui = pmap_get(uint64_t)(connected_uis, channel_id); + UI *ui = pmap_get(uint64_t)(&connected_uis, channel_id); ui->width = (int)width; ui->height = (int)height; ui_refresh(); @@ -230,12 +224,12 @@ void nvim_ui_set_option(uint64_t channel_id, String name, Object value, Error *error) FUNC_API_SINCE(1) FUNC_API_REMOTE_ONLY { - if (!pmap_has(uint64_t)(connected_uis, channel_id)) { + if (!pmap_has(uint64_t)(&connected_uis, channel_id)) { api_set_error(error, kErrorTypeException, "UI not attached to channel: %" PRId64, channel_id); return; } - UI *ui = pmap_get(uint64_t)(connected_uis, channel_id); + UI *ui = pmap_get(uint64_t)(&connected_uis, channel_id); ui_set_option(ui, false, name, value, error); } @@ -310,7 +304,7 @@ void nvim_ui_try_resize_grid(uint64_t channel_id, Integer grid, Integer width, Integer height, Error *err) FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY { - if (!pmap_has(uint64_t)(connected_uis, channel_id)) { + if (!pmap_has(uint64_t)(&connected_uis, channel_id)) { api_set_error(err, kErrorTypeException, "UI not attached to channel: %" PRId64, channel_id); return; @@ -328,7 +322,7 @@ void nvim_ui_try_resize_grid(uint64_t channel_id, Integer grid, Integer width, void nvim_ui_pum_set_height(uint64_t channel_id, Integer height, Error *err) FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY { - if (!pmap_has(uint64_t)(connected_uis, channel_id)) { + if (!pmap_has(uint64_t)(&connected_uis, channel_id)) { api_set_error(err, kErrorTypeException, "UI not attached to channel: %" PRId64, channel_id); return; @@ -339,7 +333,7 @@ void nvim_ui_pum_set_height(uint64_t channel_id, Integer height, Error *err) return; } - UI *ui = pmap_get(uint64_t)(connected_uis, channel_id); + UI *ui = pmap_get(uint64_t)(&connected_uis, channel_id); if (!ui->ui_ext[kUIPopupmenu]) { api_set_error(err, kErrorTypeValidation, "It must support the ext_popupmenu option"); @@ -369,13 +363,13 @@ void nvim_ui_pum_set_bounds(uint64_t channel_id, Float width, Float height, Float row, Float col, Error *err) FUNC_API_SINCE(7) FUNC_API_REMOTE_ONLY { - if (!pmap_has(uint64_t)(connected_uis, channel_id)) { + if (!pmap_has(uint64_t)(&connected_uis, channel_id)) { api_set_error(err, kErrorTypeException, "UI not attached to channel: %" PRId64, channel_id); return; } - UI *ui = pmap_get(uint64_t)(connected_uis, channel_id); + UI *ui = pmap_get(uint64_t)(&connected_uis, channel_id); if (!ui->ui_ext[kUIPopupmenu]) { api_set_error(err, kErrorTypeValidation, "UI must support the ext_popupmenu option"); diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index ec13bdd0e2..2536249de5 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -58,22 +58,16 @@ # include "api/vim.c.generated.h" #endif -void api_vim_init(void) - FUNC_API_NOEXPORT -{ - namespace_ids = map_new(String, handle_T)(); -} - void api_vim_free_all_mem(void) FUNC_API_NOEXPORT { String name; handle_T id; - map_foreach(namespace_ids, name, id, { + map_foreach(&namespace_ids, name, id, { (void)id; xfree(name.data); }) - map_free(String, handle_T)(namespace_ids); + map_destroy(String, handle_T)(&namespace_ids); } /// Executes Vimscript (multiline block of Ex-commands), like anonymous @@ -1571,14 +1565,14 @@ void nvim_set_current_tabpage(Tabpage tabpage, Error *err) Integer nvim_create_namespace(String name) FUNC_API_SINCE(5) { - handle_T id = map_get(String, handle_T)(namespace_ids, name); + handle_T id = map_get(String, handle_T)(&namespace_ids, name); if (id > 0) { return id; } id = next_namespace_id++; if (name.size > 0) { String name_alloc = copy_string(name); - map_put(String, handle_T)(namespace_ids, name_alloc, id); + map_put(String, handle_T)(&namespace_ids, name_alloc, id); } return (Integer)id; } @@ -1593,7 +1587,7 @@ Dictionary nvim_get_namespaces(void) String name; handle_T id; - map_foreach(namespace_ids, name, id, { + map_foreach(&namespace_ids, name, id, { PUT(retval, name.data, INTEGER_OBJ(id)); }) diff --git a/src/nvim/api/vim.h b/src/nvim/api/vim.h index d6873da6d2..4fd353ce5c 100644 --- a/src/nvim/api/vim.h +++ b/src/nvim/api/vim.h @@ -6,7 +6,7 @@ #include "nvim/api/private/defs.h" #include "nvim/map.h" -EXTERN Map(String, handle_T) *namespace_ids INIT(= NULL); +EXTERN Map(String, handle_T) namespace_ids INIT(= MAP_INIT); EXTERN handle_T next_namespace_id INIT(= 1); #ifdef INCLUDE_GENERATED_DECLARATIONS diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index 145f6f5601..417953eb14 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -5,7 +5,7 @@ #include "nvim/autocmd.h" -#include "nvim/api/private/handle.h" +#include "nvim/api/private/helpers.h" #include "nvim/ascii.h" #include "nvim/buffer.h" #include "nvim/charset.h" @@ -1150,7 +1150,7 @@ void aucmd_prepbuf(aco_save_T *aco, buf_T *buf) block_autocmds(); // We don't want BufEnter/WinEnter autocommands. if (need_append) { win_append(lastwin, aucmd_win); - handle_register_window(aucmd_win); + pmap_put(handle_T)(&window_handles, aucmd_win->handle, aucmd_win); win_config_float(aucmd_win, aucmd_win->w_float_config); } // Prevent chdir() call in win_enter_ext(), through do_autochdir() @@ -1191,7 +1191,7 @@ void aucmd_restbuf(aco_save_T *aco) win_found: win_remove(curwin, NULL); - handle_unregister_window(curwin); + pmap_del(handle_T)(&window_handles, curwin->handle); if (curwin->w_grid_alloc.chars != NULL) { ui_comp_remove_grid(&curwin->w_grid_alloc); ui_call_win_hide(curwin->w_grid_alloc.handle); @@ -1724,7 +1724,7 @@ BYPASS_AU: void block_autocmds(void) { // Remember the value of v:termresponse. - if (is_autocmd_blocked()) { + if (!is_autocmd_blocked()) { old_termresponse = get_vim_var_str(VV_TERMRESPONSE); } autocmd_blocked++; @@ -1737,7 +1737,7 @@ void unblock_autocmds(void) // When v:termresponse was set while autocommands were blocked, trigger // the autocommands now. Esp. useful when executing a shell command // during startup (nvim -d). - if (is_autocmd_blocked() + if (!is_autocmd_blocked() && get_vim_var_str(VV_TERMRESPONSE) != old_termresponse) { apply_autocmds(EVENT_TERMRESPONSE, NULL, NULL, false, curbuf); } diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 587ef74b35..fdb3ffdc7e 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -24,7 +24,6 @@ #include <inttypes.h> #include <assert.h> -#include "nvim/api/private/handle.h" #include "nvim/api/private/helpers.h" #include "nvim/api/vim.h" #include "nvim/ascii.h" @@ -532,7 +531,7 @@ bool close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last) } if (buf->terminal) { - terminal_close(buf->terminal, NULL); + terminal_close(buf->terminal, -1); } // Always remove the buffer when there is no file name. @@ -757,7 +756,7 @@ void buf_freeall(buf_T *buf, int flags) */ static void free_buffer(buf_T *buf) { - handle_unregister_buffer(buf); + pmap_del(handle_T)(&buffer_handles, buf->b_fnum); buf_free_count++; // b:changedtick uses an item in buf_T. free_buffer_stuff(buf, kBffClearWinInfo); @@ -1841,7 +1840,7 @@ buf_T *buflist_new(char_u *ffname_arg, char_u *sfname_arg, linenr_T lnum, lastbuf = buf; buf->b_fnum = top_file_num++; - handle_register_buffer(buf); + pmap_put(handle_T)(&buffer_handles, buf->b_fnum, buf); if (top_file_num < 0) { // wrap around (may cause duplicates) EMSG(_("W14: Warning: List of file names overflow")); if (emsg_silent == 0) { @@ -4253,7 +4252,7 @@ int build_stl_str_hl( if (*fmt_p == '#') { stl_items[curitem].type = Highlight; stl_items[curitem].start = out_p; - stl_items[curitem].minwid = -syn_namen2id(t, (int)(fmt_p - t)); + stl_items[curitem].minwid = -syn_name2id_len(t, (size_t)(fmt_p - t)); curitem++; fmt_p++; } diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index b03d69a04c..0ae8dd3664 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -863,8 +863,8 @@ struct file_buffer { int b_mapped_ctrl_c; // modes where CTRL-C is mapped MarkTree b_marktree[1]; - Map(uint64_t, ExtmarkItem) *b_extmark_index; - Map(uint64_t, ExtmarkNs) *b_extmark_ns; // extmark namespaces + Map(uint64_t, ExtmarkItem) b_extmark_index[1]; + Map(uint64_t, ExtmarkNs) b_extmark_ns[1]; // extmark namespaces // array of channel_id:s which have asked to receive updates for this // buffer. diff --git a/src/nvim/change.c b/src/nvim/change.c index 41e1e3911b..13b86e9244 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -1837,7 +1837,7 @@ void truncate_line(int fixpos) /// Delete "nlines" lines at the cursor. /// Saves the lines for undo first if "undo" is true. -void del_lines(long nlines, int undo) +void del_lines(long nlines, bool undo) { long n; linenr_T first = curwin->w_cursor.lnum; diff --git a/src/nvim/channel.c b/src/nvim/channel.c index a0db1bcdfd..6f12d2eab8 100644 --- a/src/nvim/channel.c +++ b/src/nvim/channel.c @@ -32,13 +32,9 @@ static uint64_t next_chan_id = CHAN_STDERR+1; /// Teardown the module void channel_teardown(void) { - if (!channels) { - return; - } - Channel *channel; - map_foreach_value(channels, channel, { + map_foreach_value(&channels, channel, { channel_close(channel->id, kChannelPartAll, NULL); }); } @@ -152,7 +148,6 @@ bool channel_close(uint64_t id, ChannelPart part, const char **error) /// Initializes the module void channel_init(void) { - channels = pmap_new(uint64_t)(); channel_alloc(kChannelStreamStderr); rpc_init(); } @@ -177,7 +172,7 @@ Channel *channel_alloc(ChannelStreamType type) chan->exit_status = -1; chan->streamtype = type; assert(chan->id <= VARNUMBER_MAX); - pmap_put(uint64_t)(channels, chan->id, chan); + pmap_put(uint64_t)(&channels, chan->id, chan); return chan; } @@ -249,7 +244,7 @@ static void free_channel_event(void **argv) callback_reader_free(&chan->on_stderr); callback_free(&chan->on_exit); - pmap_del(uint64_t)(channels, chan->id); + pmap_del(uint64_t)(&channels, chan->id); multiqueue_free(chan->events); xfree(chan); } @@ -259,7 +254,7 @@ static void channel_destroy_early(Channel *chan) if ((chan->id != --next_chan_id)) { abort(); } - pmap_del(uint64_t)(channels, chan->id); + pmap_del(uint64_t)(&channels, chan->id); chan->id = 0; if ((--chan->refcount != 0)) { @@ -698,9 +693,7 @@ static void channel_process_exit_cb(Process *proc, int status, void *data) { Channel *chan = data; if (chan->term) { - char msg[sizeof("\r\n[Process exited ]") + NUMBUFLEN]; - snprintf(msg, sizeof msg, "\r\n[Process exited %d]", proc->status); - terminal_close(chan->term, msg); + terminal_close(chan->term, status); } // If process did not exit, we only closed the handle of a detached process. @@ -901,7 +894,7 @@ Array channel_all_info(void) { Channel *channel; Array ret = ARRAY_DICT_INIT; - map_foreach_value(channels, channel, { + map_foreach_value(&channels, channel, { ADD(ret, DICTIONARY_OBJ(channel_info(channel->id))); }); return ret; diff --git a/src/nvim/channel.h b/src/nvim/channel.h index df858e1602..9bc0df3615 100644 --- a/src/nvim/channel.h +++ b/src/nvim/channel.h @@ -89,7 +89,7 @@ struct Channel { bool callback_scheduled; }; -EXTERN PMap(uint64_t) *channels INIT(= NULL); +EXTERN PMap(uint64_t) channels INIT(= MAP_INIT); #ifdef INCLUDE_GENERATED_DECLARATIONS # include "channel.h.generated.h" @@ -98,7 +98,7 @@ EXTERN PMap(uint64_t) *channels INIT(= NULL); /// @returns Channel with the id or NULL if not found static inline Channel *find_channel(uint64_t id) { - return pmap_get(uint64_t)(channels, id); + return pmap_get(uint64_t)(&channels, id); } static inline Stream *channel_instream(Channel *chan) diff --git a/src/nvim/decoration.c b/src/nvim/decoration.c index 74cb9a26b7..5168ed6d0f 100644 --- a/src/nvim/decoration.c +++ b/src/nvim/decoration.c @@ -13,12 +13,7 @@ # include "decoration.c.generated.h" #endif -static PMap(uint64_t) *hl_decors; - -void decor_init(void) -{ - hl_decors = pmap_new(uint64_t)(); -} +static PMap(uint64_t) hl_decors; /// Add highlighting to a buffer, bounded by two cursor positions, /// with an offset. @@ -77,7 +72,7 @@ void bufhl_add_hl_pos_offset(buf_T *buf, Decoration *decor_hl(int hl_id) { assert(hl_id > 0); - Decoration **dp = (Decoration **)pmap_ref(uint64_t)(hl_decors, + Decoration **dp = (Decoration **)pmap_ref(uint64_t)(&hl_decors, (uint64_t)hl_id, true); if (*dp) { return *dp; @@ -150,7 +145,7 @@ bool decor_redraw_reset(buf_T *buf, DecorState *state) } } kv_size(state->active) = 0; - return buf->b_extmark_index; + return map_size(buf->b_extmark_index); } diff --git a/src/nvim/edit.c b/src/nvim/edit.c index fec8da2c3c..ffe60ab043 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -1652,8 +1652,8 @@ static void init_prompt(int cmdchar_todo) check_cursor(); } -// Return TRUE if the cursor is in the editable position of the prompt line. -int prompt_curpos_editable(void) +/// @return true if the cursor is in the editable position of the prompt line. +bool prompt_curpos_editable(void) { return curwin->w_cursor.lnum == curbuf->b_ml.ml_line_count && curwin->w_cursor.col >= (int)STRLEN(prompt_text()); @@ -8124,8 +8124,7 @@ static bool ins_bs(int c, int mode, int *inserted_space_p) // again when auto-formatting. if (has_format_option(FO_AUTO) && has_format_option(FO_WHITE_PAR)) { - char_u *ptr = ml_get_buf(curbuf, curwin->w_cursor.lnum, - TRUE); + char_u *ptr = ml_get_buf(curbuf, curwin->w_cursor.lnum, true); int len; len = (int)STRLEN(ptr); diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 472b43a387..5603fbb082 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -267,7 +267,7 @@ static partial_T *vvlua_partial; #endif static uint64_t last_timer_id = 1; -static PMap(uint64_t) *timers = NULL; +static PMap(uint64_t) timers = MAP_INIT; static const char *const msgpack_type_names[] = { [kMPNil] = "nil", @@ -328,7 +328,6 @@ void eval_init(void) { vimvars[VV_VERSION].vv_nr = VIM_VERSION_100; - timers = pmap_new(uint64_t)(); struct vimvar *p; init_var_dict(&globvardict, &globvars_var, VAR_DEF_SCOPE); @@ -5096,7 +5095,7 @@ bool garbage_collect(bool testing) // Channels { Channel *data; - map_foreach_value(channels, data, { + map_foreach_value(&channels, data, { set_ref_in_callback_reader(&data->on_data, copyID, NULL, NULL); set_ref_in_callback_reader(&data->on_stderr, copyID, NULL, NULL); set_ref_in_callback(&data->on_exit, copyID, NULL, NULL); @@ -5106,7 +5105,7 @@ bool garbage_collect(bool testing) // Timers { timer_T *timer; - map_foreach_value(timers, timer, { + map_foreach_value(&timers, timer, { set_ref_in_callback(&timer->callback, copyID, NULL, NULL); }) } @@ -7519,7 +7518,7 @@ static bool set_ref_in_callback_reader(CallbackReader *reader, int copyID, timer_T *find_timer_by_nr(varnumber_T xx) { - return pmap_get(uint64_t)(timers, xx); + return pmap_get(uint64_t)(&timers, xx); } void add_timer_info(typval_T *rettv, timer_T *timer) @@ -7546,9 +7545,9 @@ void add_timer_info(typval_T *rettv, timer_T *timer) void add_timer_info_all(typval_T *rettv) { - tv_list_alloc_ret(rettv, timers->table->n_occupied); + tv_list_alloc_ret(rettv, map_size(&timers)); timer_T *timer; - map_foreach_value(timers, timer, { + map_foreach_value(&timers, timer, { if (!timer->stopped) { add_timer_info(rettv, timer); } @@ -7628,7 +7627,7 @@ uint64_t timer_start(const long timeout, timer->tw.blockable = true; time_watcher_start(&timer->tw, timer_due_cb, timeout, timeout); - pmap_put(uint64_t)(timers, timer->timer_id, timer); + pmap_put(uint64_t)(&timers, timer->timer_id, timer); return timer->timer_id; } @@ -7650,7 +7649,7 @@ static void timer_close_cb(TimeWatcher *tw, void *data) timer_T *timer = (timer_T *)data; multiqueue_free(timer->tw.events); callback_free(&timer->callback); - pmap_del(uint64_t)(timers, timer->timer_id); + pmap_del(uint64_t)(&timers, timer->timer_id); timer_decref(timer); } @@ -7664,7 +7663,7 @@ static void timer_decref(timer_T *timer) void timer_stop_all(void) { timer_T *timer; - map_foreach_value(timers, timer, { + map_foreach_value(&timers, timer, { timer_stop(timer); }) } diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 041140211e..f7a1327c87 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -715,7 +715,7 @@ sortend: void ex_retab(exarg_T *eap) { linenr_T lnum; - int got_tab = FALSE; + bool got_tab = false; long num_spaces = 0; long num_tabs; long len; @@ -766,10 +766,11 @@ void ex_retab(exarg_T *eap) start_vcol = vcol; start_col = col; } - if (ptr[col] == ' ') + if (ptr[col] == ' ') { num_spaces++; - else - got_tab = TRUE; + } else { + got_tab = true; + } } else { if (got_tab || (eap->forceit && num_spaces > 1)) { /* Retabulate this string of white-space */ @@ -824,7 +825,7 @@ void ex_retab(exarg_T *eap) col = start_col + len; } } - got_tab = FALSE; + got_tab = false; num_spaces = 0; } if (ptr[col] == NUL) @@ -1386,11 +1387,11 @@ static void do_filter( * Adjust '[ and '] (set by buf_write()). */ curwin->w_cursor.lnum = line1; - del_lines(linecount, TRUE); - curbuf->b_op_start.lnum -= linecount; /* adjust '[ */ - curbuf->b_op_end.lnum -= linecount; /* adjust '] */ - write_lnum_adjust(-linecount); /* adjust last line - for next write */ + del_lines(linecount, true); + curbuf->b_op_start.lnum -= linecount; // adjust '[ + curbuf->b_op_end.lnum -= linecount; // adjust '] + write_lnum_adjust(-linecount); // adjust last line + // for next write foldUpdate(curwin, curbuf->b_op_start.lnum, curbuf->b_op_end.lnum); } else { /* @@ -2763,8 +2764,8 @@ int do_ecmd( } } - /* Check if cursors in other windows on the same buffer are still valid */ - check_lnums(FALSE); + // Check if cursors in other windows on the same buffer are still valid + check_lnums(false); /* * Did not read the file, need to show some info about the file. @@ -3835,7 +3836,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, _("replace with %s (y/n/a/q/l/^E/^Y)?"), sub); msg_no_more = FALSE; msg_scroll = i; - showruler(TRUE); + showruler(true); ui_cursor_goto(msg_row, msg_col); RedrawingDisabled = temp; @@ -5171,21 +5172,21 @@ void fix_help_buffer(void) if (in_example && len > 0 && !ascii_iswhite(line[0])) { /* End of example: non-white or '<' in first column. */ if (line[0] == '<') { - /* blank-out a '<' in the first column */ - line = ml_get_buf(curbuf, lnum, TRUE); + // blank-out a '<' in the first column + line = ml_get_buf(curbuf, lnum, true); line[0] = ' '; } in_example = false; } if (!in_example && len > 0) { if (line[len - 1] == '>' && (len == 1 || line[len - 2] == ' ')) { - /* blank-out a '>' in the last column (start of example) */ - line = ml_get_buf(curbuf, lnum, TRUE); + // blank-out a '>' in the last column (start of example) + line = ml_get_buf(curbuf, lnum, true); line[len - 1] = ' '; in_example = true; } else if (line[len - 1] == '~') { - /* blank-out a '~' at the end of line (header marker) */ - line = ml_get_buf(curbuf, lnum, TRUE); + // blank-out a '~' at the end of line (header marker) + line = ml_get_buf(curbuf, lnum, true); line[len - 1] = ' '; } } @@ -5204,10 +5205,11 @@ void fix_help_buffer(void) && TOLOWER_ASC(fname[7]) == 'x' && fname[8] == NUL) ) { - for (lnum = 1; lnum < curbuf->b_ml.ml_line_count; ++lnum) { - line = ml_get_buf(curbuf, lnum, FALSE); - if (strstr((char *)line, "*local-additions*") == NULL) + for (lnum = 1; lnum < curbuf->b_ml.ml_line_count; lnum++) { + line = ml_get_buf(curbuf, lnum, false); + if (strstr((char *)line, "*local-additions*") == NULL) { continue; + } /* Go through all directories in 'runtimepath', skipping * $VIMRUNTIME. */ diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index a49b0c15e1..e06a62e0f6 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -1460,7 +1460,7 @@ bool dialog_close_terminal(buf_T *buf) int ret = vim_dialog_yesnocancel(VIM_QUESTION, NULL, buff, 1); - return (ret == VIM_YES) ? true : false; + return ret == VIM_YES; } /// Return true if the buffer "buf" can be abandoned, either by making it diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index af8a23f5cc..0f98c9cd34 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -5734,18 +5734,13 @@ HistoryType get_histtype(const char *const name, const size_t len, static int last_maptick = -1; /* last seen maptick */ -/* - * Add the given string to the given history. If the string is already in the - * history then it is moved to the front. "histype" may be one of he HIST_ - * values. - */ -void -add_to_history ( - int histype, - char_u *new_entry, - int in_map, /* consider maptick when inside a mapping */ - int sep /* separator character used (search hist) */ -) +/// Add the given string to the given history. If the string is already in the +/// history then it is moved to the front. "histype" may be one of he HIST_ +/// values. +/// +/// @parma in_map consider maptick when inside a mapping +/// @param sep separator character used (search hist) +void add_to_history(int histype, char_u *new_entry, int in_map, int sep) { histentry_T *hisptr; @@ -6259,8 +6254,8 @@ static int open_cmdwin(void) const int histtype = hist_char2type(cmdwin_type); if (histtype == HIST_CMD || histtype == HIST_DEBUG) { if (p_wc == TAB) { - add_map((char_u *)"<buffer> <Tab> <C-X><C-V>", INSERT); - add_map((char_u *)"<buffer> <Tab> a<C-X><C-V>", NORMAL); + add_map((char_u *)"<buffer> <Tab> <C-X><C-V>", INSERT, false); + add_map((char_u *)"<buffer> <Tab> a<C-X><C-V>", NORMAL, false); } set_option_value("ft", 0L, "vim", OPT_LOCAL); } diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c index 4b2dccd8a4..b4f22dbf33 100644 --- a/src/nvim/extmark.c +++ b/src/nvim/extmark.c @@ -48,20 +48,7 @@ #endif static ExtmarkNs *buf_ns_ref(buf_T *buf, uint64_t ns_id, bool put) { - if (!buf->b_extmark_ns) { - if (!put) { - return NULL; - } - buf->b_extmark_ns = map_new(uint64_t, ExtmarkNs)(); - buf->b_extmark_index = map_new(uint64_t, ExtmarkItem)(); - } - - ExtmarkNs *ns = map_ref(uint64_t, ExtmarkNs)(buf->b_extmark_ns, ns_id, put); - if (put && ns->map == NULL) { - ns->map = map_new(uint64_t, uint64_t)(); - ns->free_id = 1; - } - return ns; + return map_ref(uint64_t, ExtmarkNs)(buf->b_extmark_ns, ns_id, put); } @@ -195,7 +182,7 @@ bool extmark_clear(buf_T *buf, uint64_t ns_id, int l_row, colnr_T l_col, int u_row, colnr_T u_col) { - if (!buf->b_extmark_ns) { + if (!map_size(buf->b_extmark_ns)) { return false; } @@ -215,12 +202,9 @@ bool extmark_clear(buf_T *buf, uint64_t ns_id, } // the value is either zero or the lnum (row+1) if highlight was present. - static Map(uint64_t, ssize_t) *delete_set = NULL; + static Map(uint64_t, ssize_t) delete_set = MAP_INIT; typedef struct { Decoration *decor; int row1; } DecorItem; static kvec_t(DecorItem) decors; - if (delete_set == NULL) { - delete_set = map_new(uint64_t, ssize_t)(); - } MarkTreeIter itr[1] = { 0 }; marktree_itr_get(buf->b_marktree, l_row, l_col, itr); @@ -231,7 +215,7 @@ bool extmark_clear(buf_T *buf, uint64_t ns_id, || (mark.row == u_row && mark.col > u_col)) { break; } - ssize_t *del_status = map_ref(uint64_t, ssize_t)(delete_set, mark.id, + ssize_t *del_status = map_ref(uint64_t, ssize_t)(&delete_set, mark.id, false); if (del_status) { marktree_del_itr(buf->b_marktree, itr, false); @@ -240,7 +224,7 @@ bool extmark_clear(buf_T *buf, uint64_t ns_id, decor_redraw(buf, it.row1, mark.row, it.decor); decor_free(it.decor); } - map_del(uint64_t, ssize_t)(delete_set, mark.id); + map_del(uint64_t, ssize_t)(&delete_set, mark.id); continue; } @@ -261,7 +245,7 @@ bool extmark_clear(buf_T *buf, uint64_t ns_id, kv_push(decors, ((DecorItem) { .decor = item.decor, .row1 = mark.row })); } - map_put(uint64_t, ssize_t)(delete_set, other, decor_id); + map_put(uint64_t, ssize_t)(&delete_set, other, decor_id); } else if (item.decor) { decor_redraw(buf, mark.row, mark.row, item.decor); decor_free(item.decor); @@ -276,7 +260,7 @@ bool extmark_clear(buf_T *buf, uint64_t ns_id, } uint64_t id; ssize_t decor_id; - map_foreach(delete_set, id, decor_id, { + map_foreach(&delete_set, id, decor_id, { mtpos_t pos = marktree_lookup(buf->b_marktree, id, itr); assert(itr->node); marktree_del_itr(buf->b_marktree, itr, false); @@ -286,7 +270,7 @@ bool extmark_clear(buf_T *buf, uint64_t ns_id, decor_free(it.decor); } }); - map_clear(uint64_t, ssize_t)(delete_set); + map_clear(uint64_t, ssize_t)(&delete_set); kv_size(decors) = 0; return marks_cleared; } @@ -383,7 +367,7 @@ ExtmarkInfo extmark_from_id(buf_T *buf, uint64_t ns_id, uint64_t id) // free extmarks from the buffer void extmark_free_all(buf_T *buf) { - if (!buf->b_extmark_ns) { + if (!map_size(buf->b_extmark_ns)) { return; } @@ -395,17 +379,17 @@ void extmark_free_all(buf_T *buf) map_foreach(buf->b_extmark_ns, id, ns, { (void)id; - map_free(uint64_t, uint64_t)(ns.map); + map_destroy(uint64_t, uint64_t)(ns.map); }); - map_free(uint64_t, ExtmarkNs)(buf->b_extmark_ns); - buf->b_extmark_ns = NULL; + map_destroy(uint64_t, ExtmarkNs)(buf->b_extmark_ns); + map_init(uint64_t, ExtmarkNs, buf->b_extmark_ns); map_foreach(buf->b_extmark_index, id, item, { (void)id; decor_free(item.decor); }); - map_free(uint64_t, ExtmarkItem)(buf->b_extmark_index); - buf->b_extmark_index = NULL; + map_destroy(uint64_t, ExtmarkItem)(buf->b_extmark_index); + map_init(uint64_t, ExtmarkItem, buf->b_extmark_index); } diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index ee8be8429f..3d058e1d09 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -11,7 +11,7 @@ #include <fcntl.h> #include "nvim/vim.h" -#include "nvim/api/private/handle.h" +#include "nvim/api/private/helpers.h" #include "nvim/ascii.h" #include "nvim/fileio.h" #include "nvim/buffer.h" diff --git a/src/nvim/fold.c b/src/nvim/fold.c index 6989c29d57..51a8a85aa0 100644 --- a/src/nvim/fold.c +++ b/src/nvim/fold.c @@ -2961,7 +2961,7 @@ static void foldlevelIndent(fline_T *flp) linenr_T lnum = flp->lnum + flp->off; buf = flp->wp->w_buffer; - s = skipwhite(ml_get_buf(buf, lnum, FALSE)); + s = skipwhite(ml_get_buf(buf, lnum, false)); /* empty line or lines starting with a character in 'foldignore': level * depends on surrounding lines */ @@ -3123,7 +3123,7 @@ static void foldlevelMarker(fline_T *flp) flp->start = 0; flp->lvl_next = flp->lvl; - s = ml_get_buf(flp->wp->w_buffer, flp->lnum + flp->off, FALSE); + s = ml_get_buf(flp->wp->w_buffer, flp->lnum + flp->off, false); while (*s) { if (*s == cstart && STRNCMP(s + 1, startmarker, foldstartmarkerlen - 1) == 0) { diff --git a/src/nvim/generators/gen_api_dispatch.lua b/src/nvim/generators/gen_api_dispatch.lua index 1d41cabfa4..c14b465f92 100644 --- a/src/nvim/generators/gen_api_dispatch.lua +++ b/src/nvim/generators/gen_api_dispatch.lua @@ -321,8 +321,6 @@ end output:write([[ void msgpack_rpc_init_method_table(void) { - methods = map_new(String, MsgpackRpcRequestHandler)(); - ]]) for i = 1, #functions do diff --git a/src/nvim/generators/gen_options.lua b/src/nvim/generators/gen_options.lua index 9f91160034..0454c54faf 100644 --- a/src/nvim/generators/gen_options.lua +++ b/src/nvim/generators/gen_options.lua @@ -119,10 +119,10 @@ local get_value = function(v) end local get_defaults = function(d,n) - if (d.vi == nil and d.vim == nil) or (d.vi ~= nil and d.vim ~= nil) then - error("option '"..n.."' should have one and only one default value") + if d == nil then + error("option '"..n.."' should have a default value") end - return get_value(d.vim or d.vi) + return get_value(d) end local defines = {} diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index f955fe8859..28f58e2c34 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -52,7 +52,6 @@ #include "nvim/os/input.h" #include "nvim/os/os.h" #include "nvim/os/fileio.h" -#include "nvim/api/private/handle.h" /// Index in scriptin @@ -841,6 +840,14 @@ static void init_typebuf(void) } } +void init_default_mappings(void) +{ + add_map((char_u *)"Y y$", NORMAL, true); + add_map((char_u *)"<C-L> <Cmd>nohlsearch<Bar>diffupdate<CR><C-L>", NORMAL, true); + add_map((char_u *)"<C-U> <C-G>u<C-U>", INSERT, true); + add_map((char_u *)"<C-W> <C-G>u<C-W>", INSERT, true); +} + // Insert a string in position 'offset' in the typeahead buffer (for "@r" // and ":normal" command, vgetorpeek() and check_termcode()) // @@ -1162,7 +1169,7 @@ void may_sync_undo(void) { if ((!(State & (INSERT + CMDLINE)) || arrow_used) && scriptin[curscript] == NULL) - u_sync(FALSE); + u_sync(false); } /* @@ -4357,18 +4364,23 @@ check_map ( } -/* - * Add a mapping "map" for mode "mode". - * Need to put string in allocated memory, because do_map() will modify it. - */ -void add_map(char_u *map, int mode) +/// Add a mapping. Unlike @ref do_map this copies the {map} argument, so +/// static or read-only strings can be used. +/// +/// @param map C-string containing the arguments of the map/abbrev command, +/// i.e. everything except the initial `:[X][nore]map`. +/// @param mode Bitflags representing the mode in which to set the mapping. +/// See @ref get_map_mode. +/// @param nore If true, make a non-recursive mapping. +void add_map(char_u *map, int mode, bool nore) { char_u *s; char_u *cpo_save = p_cpo; p_cpo = (char_u *)""; // Allow <> notation + // Need to put string in allocated memory, because do_map() will modify it. s = vim_strsave(map); - (void)do_map(0, s, mode, FALSE); + (void)do_map(nore ? 2 : 0, s, mode, false); xfree(s); p_cpo = cpo_save; } diff --git a/src/nvim/highlight.c b/src/nvim/highlight.c index 29ee7aae56..7341ac9393 100644 --- a/src/nvim/highlight.c +++ b/src/nvim/highlight.c @@ -25,22 +25,16 @@ static bool hlstate_active = false; static kvec_t(HlEntry) attr_entries = KV_INITIAL_VALUE; -static Map(HlEntry, int) *attr_entry_ids; -static Map(int, int) *combine_attr_entries; -static Map(int, int) *blend_attr_entries; -static Map(int, int) *blendthrough_attr_entries; +static Map(HlEntry, int) attr_entry_ids = MAP_INIT; +static Map(int, int) combine_attr_entries = MAP_INIT; +static Map(int, int) blend_attr_entries = MAP_INIT; +static Map(int, int) blendthrough_attr_entries = MAP_INIT; /// highlight entries private to a namespace -static Map(ColorKey, ColorItem) *ns_hl; +static Map(ColorKey, ColorItem) ns_hl; void highlight_init(void) { - attr_entry_ids = map_new(HlEntry, int)(); - combine_attr_entries = map_new(int, int)(); - blend_attr_entries = map_new(int, int)(); - blendthrough_attr_entries = map_new(int, int)(); - ns_hl = map_new(ColorKey, ColorItem)(); - // index 0 is no attribute, add dummy entry: kv_push(attr_entries, ((HlEntry){ .attr = HLATTRS_INIT, .kind = kHlUnknown, .id1 = 0, .id2 = 0 })); @@ -71,7 +65,7 @@ static int get_attr_entry(HlEntry entry) entry.id2 = 0; } - int id = map_get(HlEntry, int)(attr_entry_ids, entry); + int id = map_get(HlEntry, int)(&attr_entry_ids, entry); if (id > 0) { return id; } @@ -104,7 +98,7 @@ static int get_attr_entry(HlEntry entry) id = (int)next_id; kv_push(attr_entries, entry); - map_put(HlEntry, int)(attr_entry_ids, entry, id); + map_put(HlEntry, int)(&attr_entry_ids, entry, id); Array inspect = hl_inspect(id); @@ -154,7 +148,7 @@ void ns_hl_def(NS ns_id, int hl_id, HlAttrs attrs, int link_id) { DecorProvider *p = get_decor_provider(ns_id, true); if ((attrs.rgb_ae_attr & HL_DEFAULT) - && map_has(ColorKey, ColorItem)(ns_hl, ColorKey(ns_id, hl_id))) { + && map_has(ColorKey, ColorItem)(&ns_hl, ColorKey(ns_id, hl_id))) { return; } int attr_id = link_id > 0 ? -1 : hl_get_syn_attr(ns_id, hl_id, attrs); @@ -162,7 +156,7 @@ void ns_hl_def(NS ns_id, int hl_id, HlAttrs attrs, int link_id) .link_id = link_id, .version = p->hl_valid, .is_default = (attrs.rgb_ae_attr & HL_DEFAULT) }; - map_put(ColorKey, ColorItem)(ns_hl, ColorKey(ns_id, hl_id), it); + map_put(ColorKey, ColorItem)(&ns_hl, ColorKey(ns_id, hl_id), it); } int ns_get_hl(NS ns_id, int hl_id, bool link, bool nodefault) @@ -177,7 +171,7 @@ int ns_get_hl(NS ns_id, int hl_id, bool link, bool nodefault) } DecorProvider *p = get_decor_provider(ns_id, true); - ColorItem it = map_get(ColorKey, ColorItem)(ns_hl, ColorKey(ns_id, hl_id)); + ColorItem it = map_get(ColorKey, ColorItem)(&ns_hl, ColorKey(ns_id, hl_id)); // TODO(bfredl): map_ref true even this? bool valid_cache = it.version >= p->hl_valid; @@ -220,7 +214,7 @@ int ns_get_hl(NS ns_id, int hl_id, bool link, bool nodefault) it.attr_id = fallback ? -1 : hl_get_syn_attr((int)ns_id, hl_id, attrs); it.version = p->hl_valid-tmp; it.is_default = attrs.rgb_ae_attr & HL_DEFAULT; - map_put(ColorKey, ColorItem)(ns_hl, ColorKey(ns_id, hl_id), it); + map_put(ColorKey, ColorItem)(&ns_hl, ColorKey(ns_id, hl_id), it); } if (it.is_default && nodefault) { @@ -395,28 +389,28 @@ void clear_hl_tables(bool reinit) { if (reinit) { kv_size(attr_entries) = 1; - map_clear(HlEntry, int)(attr_entry_ids); - map_clear(int, int)(combine_attr_entries); - map_clear(int, int)(blend_attr_entries); - map_clear(int, int)(blendthrough_attr_entries); + map_clear(HlEntry, int)(&attr_entry_ids); + map_clear(int, int)(&combine_attr_entries); + map_clear(int, int)(&blend_attr_entries); + map_clear(int, int)(&blendthrough_attr_entries); memset(highlight_attr_last, -1, sizeof(highlight_attr_last)); highlight_attr_set_all(); highlight_changed(); screen_invalidate_highlights(); } else { kv_destroy(attr_entries); - map_free(HlEntry, int)(attr_entry_ids); - map_free(int, int)(combine_attr_entries); - map_free(int, int)(blend_attr_entries); - map_free(int, int)(blendthrough_attr_entries); - map_free(ColorKey, ColorItem)(ns_hl); + map_destroy(HlEntry, int)(&attr_entry_ids); + map_destroy(int, int)(&combine_attr_entries); + map_destroy(int, int)(&blend_attr_entries); + map_destroy(int, int)(&blendthrough_attr_entries); + map_destroy(ColorKey, ColorItem)(&ns_hl); } } void hl_invalidate_blends(void) { - map_clear(int, int)(blend_attr_entries); - map_clear(int, int)(blendthrough_attr_entries); + map_clear(int, int)(&blend_attr_entries); + map_clear(int, int)(&blendthrough_attr_entries); highlight_changed(); update_window_hl(curwin, true); } @@ -437,7 +431,7 @@ int hl_combine_attr(int char_attr, int prim_attr) // TODO(bfredl): could use a struct for clearer intent. int combine_tag = (char_attr << 16) + prim_attr; - int id = map_get(int, int)(combine_attr_entries, combine_tag); + int id = map_get(int, int)(&combine_attr_entries, combine_tag); if (id > 0) { return id; } @@ -494,7 +488,7 @@ int hl_combine_attr(int char_attr, int prim_attr) id = get_attr_entry((HlEntry){ .attr = new_en, .kind = kHlCombine, .id1 = char_attr, .id2 = prim_attr }); if (id > 0) { - map_put(int, int)(combine_attr_entries, combine_tag, id); + map_put(int, int)(&combine_attr_entries, combine_tag, id); } return id; @@ -550,8 +544,8 @@ int hl_blend_attrs(int back_attr, int front_attr, bool *through) int combine_tag = (back_attr << 16) + front_attr; Map(int, int) *map = (*through - ? blendthrough_attr_entries - : blend_attr_entries); + ? &blendthrough_attr_entries + : &blend_attr_entries); int id = map_get(int, int)(map, combine_tag); if (id > 0) { return id; diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c index cb3cb6e73e..b00c4282be 100644 --- a/src/nvim/lua/executor.c +++ b/src/nvim/lua/executor.c @@ -13,7 +13,6 @@ #include "nvim/func_attr.h" #include "nvim/api/private/defs.h" #include "nvim/api/private/helpers.h" -#include "nvim/api/private/handle.h" #include "nvim/api/vim.h" #include "nvim/msgpack_rpc/channel.h" #include "nvim/vim.h" @@ -40,6 +39,7 @@ #include "nvim/lua/converter.h" #include "nvim/lua/executor.h" #include "nvim/lua/treesitter.h" +#include "nvim/lua/xdiff.h" #include "luv/luv.h" @@ -68,7 +68,8 @@ typedef struct { } #if __has_feature(address_sanitizer) - PMap(handle_T) *nlua_ref_markers = NULL; + static PMap(handle_T) nlua_ref_markers = MAP_INIT; + static bool nlua_track_refs = false; # define NLUA_TRACK_REFS #endif @@ -517,6 +518,10 @@ static int nlua_state_init(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL // internal vim._treesitter... API nlua_add_treesitter(lstate); + // vim.diff + lua_pushcfunction(lstate, &nlua_xdl_diff); + lua_setfield(lstate, -2, "diff"); + lua_setglobal(lstate, "vim"); { @@ -564,7 +569,7 @@ void nlua_init(void) #ifdef NLUA_TRACK_REFS const char *env = os_getenv("NVIM_LUA_NOTRACK"); if (!env || !*env) { - nlua_ref_markers = pmap_new(handle_T)(); + nlua_track_refs = true; } #endif @@ -595,10 +600,10 @@ void nlua_free_all_mem(void) fprintf(stderr, "%d lua references were leaked!", nlua_refcount); } - if (nlua_ref_markers) { + if (nlua_track_refs) { // in case there are leaked luarefs, leak the associated memory // to get LeakSanitizer stacktraces on exit - pmap_free(handle_T)(nlua_ref_markers); + pmap_destroy(handle_T)(&nlua_ref_markers); } #endif @@ -997,9 +1002,9 @@ LuaRef nlua_ref(lua_State *lstate, int index) if (ref > 0) { nlua_refcount++; #ifdef NLUA_TRACK_REFS - if (nlua_ref_markers) { + if (nlua_track_refs) { // dummy allocation to make LeakSanitizer track our luarefs - pmap_put(handle_T)(nlua_ref_markers, ref, xmalloc(3)); + pmap_put(handle_T)(&nlua_ref_markers, ref, xmalloc(3)); } #endif } @@ -1013,8 +1018,8 @@ void nlua_unref(lua_State *lstate, LuaRef ref) nlua_refcount--; #ifdef NLUA_TRACK_REFS // NB: don't remove entry from map to track double-unref - if (nlua_ref_markers) { - xfree(pmap_get(handle_T)(nlua_ref_markers, ref)); + if (nlua_track_refs) { + xfree(pmap_get(handle_T)(&nlua_ref_markers, ref)); } #endif luaL_unref(lstate, LUA_REGISTRYINDEX, ref); diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c index 1425baacf0..ed475c324f 100644 --- a/src/nvim/lua/treesitter.c +++ b/src/nvim/lua/treesitter.c @@ -18,7 +18,7 @@ #include "tree_sitter/api.h" #include "nvim/lua/treesitter.h" -#include "nvim/api/private/handle.h" +#include "nvim/api/private/helpers.h" #include "nvim/memline.h" #include "nvim/buffer.h" @@ -80,6 +80,10 @@ static struct luaL_Reg node_meta[] = { { "parent", node_parent }, { "iter_children", node_iter_children }, { "_rawquery", node_rawquery }, + { "next_sibling", node_next_sibling }, + { "prev_sibling", node_prev_sibling }, + { "next_named_sibling", node_next_named_sibling }, + { "prev_named_sibling", node_prev_named_sibling }, { NULL, NULL } }; @@ -101,7 +105,7 @@ static struct luaL_Reg treecursor_meta[] = { { NULL, NULL } }; -static PMap(cstr_t) *langs; +static PMap(cstr_t) langs = MAP_INIT; static void build_meta(lua_State *L, const char *tname, const luaL_Reg *meta) { @@ -119,8 +123,6 @@ static void build_meta(lua_State *L, const char *tname, const luaL_Reg *meta) /// all global state is stored in the regirstry of the lua_State void tslua_init(lua_State *L) { - langs = pmap_new(cstr_t)(); - // type metatables build_meta(L, TS_META_PARSER, parser_meta); build_meta(L, TS_META_TREE, tree_meta); @@ -133,7 +135,7 @@ void tslua_init(lua_State *L) int tslua_has_language(lua_State *L) { const char *lang_name = luaL_checkstring(L, 1); - lua_pushboolean(L, pmap_has(cstr_t)(langs, lang_name)); + lua_pushboolean(L, pmap_has(cstr_t)(&langs, lang_name)); return 1; } @@ -142,7 +144,7 @@ int tslua_add_language(lua_State *L) const char *path = luaL_checkstring(L, 1); const char *lang_name = luaL_checkstring(L, 2); - if (pmap_has(cstr_t)(langs, lang_name)) { + if (pmap_has(cstr_t)(&langs, lang_name)) { return 0; } @@ -185,7 +187,7 @@ int tslua_add_language(lua_State *L) TREE_SITTER_LANGUAGE_VERSION, lang_version); } - pmap_put(cstr_t)(langs, xstrdup(lang_name), lang); + pmap_put(cstr_t)(&langs, xstrdup(lang_name), lang); lua_pushboolean(L, true); return 1; @@ -195,7 +197,7 @@ int tslua_inspect_lang(lua_State *L) { const char *lang_name = luaL_checkstring(L, 1); - TSLanguage *lang = pmap_get(cstr_t)(langs, lang_name); + TSLanguage *lang = pmap_get(cstr_t)(&langs, lang_name); if (!lang) { return luaL_error(L, "no such language: %s", lang_name); } @@ -243,7 +245,7 @@ int tslua_push_parser(lua_State *L) // Gather language name const char *lang_name = luaL_checkstring(L, 1); - TSLanguage *lang = pmap_get(cstr_t)(langs, lang_name); + TSLanguage *lang = pmap_get(cstr_t)(&langs, lang_name); if (!lang) { return luaL_error(L, "no such language: %s", lang_name); } @@ -992,6 +994,50 @@ static int node_parent(lua_State *L) return 1; } +static int node_next_sibling(lua_State *L) +{ + TSNode node; + if (!node_check(L, 1, &node)) { + return 0; + } + TSNode sibling = ts_node_next_sibling(node); + push_node(L, sibling, 1); + return 1; +} + +static int node_prev_sibling(lua_State *L) +{ + TSNode node; + if (!node_check(L, 1, &node)) { + return 0; + } + TSNode sibling = ts_node_prev_sibling(node); + push_node(L, sibling, 1); + return 1; +} + +static int node_next_named_sibling(lua_State *L) +{ + TSNode node; + if (!node_check(L, 1, &node)) { + return 0; + } + TSNode sibling = ts_node_next_named_sibling(node); + push_node(L, sibling, 1); + return 1; +} + +static int node_prev_named_sibling(lua_State *L) +{ + TSNode node; + if (!node_check(L, 1, &node)) { + return 0; + } + TSNode sibling = ts_node_prev_named_sibling(node); + push_node(L, sibling, 1); + return 1; +} + /// assumes the match table being on top of the stack static void set_match(lua_State *L, TSQueryMatch *match, int nodeidx) { @@ -1127,7 +1173,7 @@ int tslua_parse_query(lua_State *L) } const char *lang_name = lua_tostring(L, 1); - TSLanguage *lang = pmap_get(cstr_t)(langs, lang_name); + TSLanguage *lang = pmap_get(cstr_t)(&langs, lang_name); if (!lang) { return luaL_error(L, "no such language: %s", lang_name); } diff --git a/src/nvim/lua/vim.lua b/src/nvim/lua/vim.lua index 8cecaa51dd..ed435439a4 100644 --- a/src/nvim/lua/vim.lua +++ b/src/nvim/lua/vim.lua @@ -178,8 +178,8 @@ end --- Return a human-readable representation of the given object. --- ---@see https://github.com/kikito/inspect.lua ---@see https://github.com/mpeterv/vinspect +---@see https://github.com/kikito/inspect.lua +---@see https://github.com/mpeterv/vinspect local function inspect(object, options) -- luacheck: no unused error(object, options) -- Stub for gen_vimdoc.py end @@ -203,15 +203,15 @@ do --- end)(vim.paste) --- </pre> --- - --@see |paste| + ---@see |paste| --- - --@param lines |readfile()|-style list of lines to paste. |channel-lines| - --@param phase -1: "non-streaming" paste: the call contains all lines. + ---@param lines |readfile()|-style list of lines to paste. |channel-lines| + ---@param phase -1: "non-streaming" paste: the call contains all lines. --- If paste is "streamed", `phase` indicates the stream state: --- - 1: starts the paste (exactly once) --- - 2: continues the paste (zero or more times) --- - 3: ends the paste (exactly once) - --@returns false if client should cancel the paste. + ---@returns false if client should cancel the paste. function vim.paste(lines, phase) local call = vim.api.nvim_call_function local now = vim.loop.now() @@ -279,7 +279,7 @@ function vim.schedule_wrap(cb) end --- <Docs described in |vim.empty_dict()| > ---@private +---@private function vim.empty_dict() return setmetatable({}, vim._empty_dict_mt) end @@ -338,12 +338,12 @@ end --- Get a table of lines with start, end columns for a region marked by two points --- ---@param bufnr number of buffer ---@param pos1 (line, column) tuple marking beginning of region ---@param pos2 (line, column) tuple marking end of region ---@param regtype type of selection (:help setreg) ---@param inclusive boolean indicating whether the selection is end-inclusive ---@return region lua table of the form {linenr = {startcol,endcol}} +---@param bufnr number of buffer +---@param pos1 (line, column) tuple marking beginning of region +---@param pos2 (line, column) tuple marking end of region +---@param regtype type of selection (:help setreg) +---@param inclusive boolean indicating whether the selection is end-inclusive +---@return region lua table of the form {linenr = {startcol,endcol}} function vim.region(bufnr, pos1, pos2, regtype, inclusive) if not vim.api.nvim_buf_is_loaded(bufnr) then vim.fn.bufload(bufnr) @@ -390,9 +390,9 @@ end --- Use to do a one-shot timer that calls `fn` --- Note: The {fn} is |schedule_wrap|ped automatically, so API functions are --- safe to call. ---@param fn Callback to call once `timeout` expires ---@param timeout Number of milliseconds to wait before calling `fn` ---@return timer luv timer object +---@param fn Callback to call once `timeout` expires +---@param timeout Number of milliseconds to wait before calling `fn` +---@return timer luv timer object function vim.defer_fn(fn, timeout) vim.validate { fn = { fn, 'c', true}; } local timer = vim.loop.new_timer() @@ -408,11 +408,12 @@ end --- Notification provider ---- without a runtime, writes to :Messages --- see :help nvim_notify ---@param msg Content of the notification to show to the user ---@param log_level Optional log level ---@param opts Dictionary with optional options (timeout, etc) +--- +--- Without a runtime, writes to :Messages +---@see :help nvim_notify +---@param msg Content of the notification to show to the user +---@param log_level Optional log level +---@param opts Dictionary with optional options (timeout, etc) function vim.notify(msg, log_level, _opts) if log_level == vim.log.levels.ERROR then @@ -429,21 +430,21 @@ local on_keystroke_callbacks = {} --- Register a lua {fn} with an {id} to be run after every keystroke. --- ---@param fn function: Function to call. It should take one argument, which is a string. +---@param fn function: Function to call. It should take one argument, which is a string. --- The string will contain the literal keys typed. --- See |i_CTRL-V| --- --- If {fn} is nil, it removes the callback for the associated {ns_id} ---@param ns_id number? Namespace ID. If not passed or 0, will generate and return a new +---@param ns_id number? Namespace ID. If not passed or 0, will generate and return a new --- namespace ID from |nvim_create_namesapce()| --- ---@return number Namespace ID associated with {fn} +---@return number Namespace ID associated with {fn} --- ---@note {fn} will be automatically removed if an error occurs while calling. +---@note {fn} will be automatically removed if an error occurs while calling. --- This is to prevent the annoying situation of every keystroke erroring --- while trying to remove a broken callback. ---@note {fn} will not be cleared from |nvim_buf_clear_namespace()| ---@note {fn} will receive the keystrokes after mappings have been evaluated +---@note {fn} will not be cleared from |nvim_buf_clear_namespace()| +---@note {fn} will receive the keystrokes after mappings have been evaluated function vim.register_keystroke_callback(fn, ns_id) vim.validate { fn = { fn, 'c', true}, @@ -459,7 +460,7 @@ function vim.register_keystroke_callback(fn, ns_id) end --- Function that executes the keystroke callbacks. ---@private +---@private function vim._log_keystroke(char) local failed_ns_ids = {} local failed_messages = {} diff --git a/src/nvim/lua/xdiff.c b/src/nvim/lua/xdiff.c new file mode 100644 index 0000000000..d50f874a82 --- /dev/null +++ b/src/nvim/lua/xdiff.c @@ -0,0 +1,334 @@ +#include <lua.h> +#include <lualib.h> +#include <lauxlib.h> + +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> +#include <string.h> + +#include "nvim/vim.h" +#include "nvim/xdiff/xdiff.h" +#include "nvim/lua/xdiff.h" +#include "nvim/lua/converter.h" +#include "nvim/lua/executor.h" +#include "nvim/api/private/helpers.h" + +typedef enum { + kNluaXdiffModeUnified = 0, + kNluaXdiffModeOnHunkCB, + kNluaXdiffModeLocations, +} NluaXdiffMode; + +typedef struct { + lua_State *lstate; + Error *err; +} hunkpriv_t; + +#ifdef INCLUDE_GENERATED_DECLARATIONS +# include "lua/xdiff.c.generated.h" +#endif + +static int write_string(void *priv, mmbuffer_t *mb, int nbuf) +{ + luaL_Buffer *buf = (luaL_Buffer *)priv; + for (int i = 0; i < nbuf; i++) { + const long size = mb[i].size; + for (long total = 0; total < size; total += LUAL_BUFFERSIZE) { + const int tocopy = MIN((int)(size - total), LUAL_BUFFERSIZE); + char *p = luaL_prepbuffer(buf); + if (!p) { + return -1; + } + memcpy(p, mb[i].ptr + total, (unsigned)tocopy); + luaL_addsize(buf, (unsigned)tocopy); + } + } + return 0; +} + +// hunk_func callback used when opts.hunk_lines = true +static int hunk_locations_cb(long start_a, long count_a, + long start_b, long count_b, void *cb_data) +{ + // Mimic extra offsets done by xdiff, see: + // src/nvim/xdiff/xemit.c:284 + // src/nvim/xdiff/xutils.c:(356,368) + if (count_a > 0) { + start_a += 1; + } + if (count_b > 0) { + start_b += 1; + } + + lua_State * lstate = (lua_State *)cb_data; + lua_createtable(lstate, 0, 0); + + lua_pushinteger(lstate, start_a); + lua_rawseti(lstate, -2, 1); + lua_pushinteger(lstate, count_a); + lua_rawseti(lstate, -2, 2); + lua_pushinteger(lstate, start_b); + lua_rawseti(lstate, -2, 3); + lua_pushinteger(lstate, count_b); + lua_rawseti(lstate, -2, 4); + + lua_rawseti(lstate, -2, (signed)lua_objlen(lstate, -2)+1); + + return 0; +} + +// hunk_func callback used when opts.on_hunk is given +static int call_on_hunk_cb(long start_a, long count_a, + long start_b, long count_b, void *cb_data) +{ + // Mimic extra offsets done by xdiff, see: + // src/nvim/xdiff/xemit.c:284 + // src/nvim/xdiff/xutils.c:(356,368) + if (count_a > 0) { + start_a += 1; + } + if (count_b > 0) { + start_b += 1; + } + + hunkpriv_t *priv = (hunkpriv_t *)cb_data; + lua_State * lstate = priv->lstate; + Error *err = priv->err; + const int fidx = lua_gettop(lstate); + lua_pushvalue(lstate, fidx); + lua_pushinteger(lstate, start_a); + lua_pushinteger(lstate, count_a); + lua_pushinteger(lstate, start_b); + lua_pushinteger(lstate, count_b); + + if (lua_pcall(lstate, 4, 1, 0) != 0) { + api_set_error(err, kErrorTypeException, + "error running function on_hunk: %s", + lua_tostring(lstate, -1)); + return -1; + } + + int r = 0; + if (lua_isnumber(lstate, -1)) { + r = (int)lua_tonumber(lstate, -1); + } + + lua_pop(lstate, 1); + lua_settop(lstate, fidx); + return r; +} + +static mmfile_t get_string_arg(lua_State *lstate, int idx) +{ + if (lua_type(lstate, idx) != LUA_TSTRING) { + luaL_argerror(lstate, idx, "expected string"); + } + mmfile_t mf; + mf.ptr = (char *)lua_tolstring(lstate, idx, (size_t *)&mf.size); + return mf; +} + +// Helper function for validating option types +static bool check_xdiff_opt(ObjectType actType, ObjectType expType, + const char *name, Error *err) +{ + if (actType != expType) { + const char * type_str = + expType == kObjectTypeString ? "string" : + expType == kObjectTypeInteger ? "integer" : + expType == kObjectTypeBoolean ? "boolean" : + expType == kObjectTypeLuaRef ? "function" : + "NA"; + + api_set_error(err, kErrorTypeValidation, "%s is not a %s", name, + type_str); + return true; + } + + return false; +} + +static NluaXdiffMode process_xdl_diff_opts(lua_State *lstate, + xdemitconf_t *cfg, + xpparam_t *params, Error *err) +{ + const DictionaryOf(LuaRef) opts = nlua_pop_Dictionary(lstate, true, err); + + NluaXdiffMode mode = kNluaXdiffModeUnified; + + bool had_on_hunk = false; + bool had_result_type_indices = false; + for (size_t i = 0; i < opts.size; i++) { + String k = opts.items[i].key; + Object *v = &opts.items[i].value; + if (strequal("on_hunk", k.data)) { + if (check_xdiff_opt(v->type, kObjectTypeLuaRef, "on_hunk", err)) { + goto exit_1; + } + had_on_hunk = true; + nlua_pushref(lstate, v->data.luaref); + } else if (strequal("result_type", k.data)) { + if (check_xdiff_opt(v->type, kObjectTypeString, "result_type", err)) { + goto exit_1; + } + if (strequal("unified", v->data.string.data)) { + } else if (strequal("indices", v->data.string.data)) { + had_result_type_indices = true; + } else { + api_set_error(err, kErrorTypeValidation, "not a valid result_type"); + goto exit_1; + } + } else if (strequal("algorithm", k.data)) { + if (check_xdiff_opt(v->type, kObjectTypeString, "algorithm", err)) { + goto exit_1; + } + if (strequal("myers", v->data.string.data)) { + // default + } else if (strequal("minimal", v->data.string.data)) { + cfg->flags |= XDF_NEED_MINIMAL; + } else if (strequal("patience", v->data.string.data)) { + cfg->flags |= XDF_PATIENCE_DIFF; + } else if (strequal("histogram", v->data.string.data)) { + cfg->flags |= XDF_HISTOGRAM_DIFF; + } else { + api_set_error(err, kErrorTypeValidation, "not a valid algorithm"); + goto exit_1; + } + } else if (strequal("ctxlen", k.data)) { + if (check_xdiff_opt(v->type, kObjectTypeInteger, "ctxlen", err)) { + goto exit_1; + } + cfg->ctxlen = v->data.integer; + } else if (strequal("interhunkctxlen", k.data)) { + if (check_xdiff_opt(v->type, kObjectTypeInteger, "interhunkctxlen", + err)) { + goto exit_1; + } + cfg->interhunkctxlen = v->data.integer; + } else { + struct { + const char *name; + unsigned long value; + } flags[] = { + { "ignore_whitespace" , XDF_IGNORE_WHITESPACE }, + { "ignore_whitespace_change" , XDF_IGNORE_WHITESPACE_CHANGE }, + { "ignore_whitespace_change_at_eol", XDF_IGNORE_WHITESPACE_AT_EOL }, + { "ignore_cr_at_eol" , XDF_IGNORE_CR_AT_EOL }, + { "ignore_blank_lines" , XDF_IGNORE_BLANK_LINES }, + { "indent_heuristic" , XDF_INDENT_HEURISTIC }, + { NULL , 0 }, + }; + bool key_used = false; + for (size_t j = 0; flags[j].name; j++) { + if (strequal(flags[j].name, k.data)) { + if (check_xdiff_opt(v->type, kObjectTypeBoolean, flags[j].name, + err)) { + goto exit_1; + } + if (v->data.boolean) { + params->flags |= flags[j].value; + } + key_used = true; + break; + } + } + + if (key_used) { + continue; + } + + api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data); + goto exit_1; + } + } + + if (had_on_hunk) { + mode = kNluaXdiffModeOnHunkCB; + cfg->hunk_func = call_on_hunk_cb; + } else if (had_result_type_indices) { + mode = kNluaXdiffModeLocations; + cfg->hunk_func = hunk_locations_cb; + } + +exit_1: + api_free_dictionary(opts); + return mode; +} + +int nlua_xdl_diff(lua_State *lstate) +{ + if (lua_gettop(lstate) < 2) { + return luaL_error(lstate, "Expected at least 2 arguments"); + } + mmfile_t ma = get_string_arg(lstate, 1); + mmfile_t mb = get_string_arg(lstate, 2); + + Error err = ERROR_INIT; + + xdemitconf_t cfg; + xpparam_t params; + xdemitcb_t ecb; + + memset(&cfg , 0, sizeof(cfg)); + memset(¶ms, 0, sizeof(params)); + memset(&ecb , 0, sizeof(ecb)); + + NluaXdiffMode mode = kNluaXdiffModeUnified; + + if (lua_gettop(lstate) == 3) { + if (lua_type(lstate, 3) != LUA_TTABLE) { + return luaL_argerror(lstate, 3, "expected table"); + } + + mode = process_xdl_diff_opts(lstate, &cfg, ¶ms, &err); + + if (ERROR_SET(&err)) { + goto exit_0; + } + } + + luaL_Buffer buf; + hunkpriv_t *priv = NULL; + switch (mode) { + case kNluaXdiffModeUnified: + luaL_buffinit(lstate, &buf); + ecb.priv = &buf; + ecb.outf = write_string; + break; + case kNluaXdiffModeOnHunkCB: + priv = xmalloc(sizeof(*priv)); + priv->lstate = lstate; + priv->err = &err; + ecb.priv = priv; + break; + case kNluaXdiffModeLocations: + lua_createtable(lstate, 0, 0); + ecb.priv = lstate; + break; + } + + if (xdl_diff(&ma, &mb, ¶ms, &cfg, &ecb) == -1) { + if (!ERROR_SET(&err)) { + api_set_error(&err, kErrorTypeException, + "Error while performing diff operation"); + } + } + + XFREE_CLEAR(priv); + +exit_0: + if (ERROR_SET(&err)) { + luaL_where(lstate, 1); + lua_pushstring(lstate, err.msg); + api_clear_error(&err); + lua_concat(lstate, 2); + return lua_error(lstate); + } else if (mode == kNluaXdiffModeUnified) { + luaL_pushresult(&buf); + return 1; + } else if (mode == kNluaXdiffModeLocations) { + return 1; + } + return 0; +} diff --git a/src/nvim/lua/xdiff.h b/src/nvim/lua/xdiff.h new file mode 100644 index 0000000000..cae7c98e81 --- /dev/null +++ b/src/nvim/lua/xdiff.h @@ -0,0 +1,12 @@ +#ifndef NVIM_LUA_XDIFF_H +#define NVIM_LUA_XDIFF_H + +#include <lua.h> +#include <lualib.h> +#include <lauxlib.h> + +#ifdef INCLUDE_GENERATED_DECLARATIONS +# include "lua/xdiff.h.generated.h" +#endif + +#endif // NVIM_LUA_XDIFF_H diff --git a/src/nvim/main.c b/src/nvim/main.c index 252aa81825..9fc82a75af 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -78,7 +78,6 @@ #include "nvim/api/ui.h" #include "nvim/api/private/defs.h" #include "nvim/api/private/helpers.h" -#include "nvim/api/private/handle.h" #include "nvim/api/private/dispatch.h" #ifndef WIN32 # include "nvim/os/pty_process_unix.h" @@ -126,8 +125,6 @@ void event_init(void) signal_init(); // finish mspgack-rpc initialization channel_init(); - remote_ui_init(); - api_vim_init(); terminal_init(); ui_init(); } @@ -160,8 +157,6 @@ void early_init(mparm_T *paramp) { env_init(); fs_init(); - handle_init(); - decor_init(); eval_init(); // init global variables init_path(argv0 ? argv0 : "nvim"); init_normal_cmds(); // Init the table of Normal mode commands. @@ -314,6 +309,9 @@ int main(int argc, char **argv) init_highlight(true, false); // Default highlight groups. TIME_MSG("init highlight"); + init_default_mappings(); // Default mappings. + TIME_MSG("init default mappings"); + // Set the break level after the terminal is initialized. debug_break_level = params.use_debug_break_level; diff --git a/src/nvim/map.c b/src/nvim/map.c index 7d97b7f13d..ccd332192e 100644 --- a/src/nvim/map.c +++ b/src/nvim/map.c @@ -54,56 +54,48 @@ INITIALIZER_DECLARE(T, U, __VA_ARGS__); \ __KHASH_IMPL(T##_##U##_map,, T, U, 1, T##_hash, T##_eq) \ \ - Map(T, U) *map_##T##_##U##_new() \ + void map_##T##_##U##_destroy(Map(T, U) *map) \ { \ - Map(T, U) *rv = xmalloc(sizeof(Map(T, U))); \ - rv->table = kh_init(T##_##U##_map); \ - return rv; \ - } \ - \ - void map_##T##_##U##_free(Map(T, U) *map) \ - { \ - kh_destroy(T##_##U##_map, map->table); \ - xfree(map); \ + kh_dealloc(T##_##U##_map, &map->table); \ } \ \ U map_##T##_##U##_get(Map(T, U) *map, T key) \ { \ khiter_t k; \ \ - if ((k = kh_get(T##_##U##_map, map->table, key)) == kh_end(map->table)) { \ + if ((k = kh_get(T##_##U##_map, &map->table, key)) == kh_end(&map->table)) { \ return INITIALIZER(T, U); \ } \ \ - return kh_val(map->table, k); \ + return kh_val(&map->table, k); \ } \ \ bool map_##T##_##U##_has(Map(T, U) *map, T key) \ { \ - return kh_get(T##_##U##_map, map->table, key) != kh_end(map->table); \ + return kh_get(T##_##U##_map, &map->table, key) != kh_end(&map->table); \ } \ \ T map_##T##_##U##_key(Map(T, U) *map, T key) \ { \ khiter_t k; \ \ - if ((k = kh_get(T##_##U##_map, map->table, key)) == kh_end(map->table)) { \ + if ((k = kh_get(T##_##U##_map, &map->table, key)) == kh_end(&map->table)) { \ abort(); /* Caller must check map_has(). */ \ } \ \ - return kh_key(map->table, k); \ + return kh_key(&map->table, k); \ } \ U map_##T##_##U##_put(Map(T, U) *map, T key, U value) \ { \ int ret; \ U rv = INITIALIZER(T, U); \ - khiter_t k = kh_put(T##_##U##_map, map->table, key, &ret); \ + khiter_t k = kh_put(T##_##U##_map, &map->table, key, &ret); \ \ if (!ret) { \ - rv = kh_val(map->table, k); \ + rv = kh_val(&map->table, k); \ } \ \ - kh_val(map->table, k) = value; \ + kh_val(&map->table, k) = value; \ return rv; \ } \ \ @@ -112,18 +104,18 @@ int ret; \ khiter_t k; \ if (put) { \ - k = kh_put(T##_##U##_map, map->table, key, &ret); \ + k = kh_put(T##_##U##_map, &map->table, key, &ret); \ if (ret) { \ - kh_val(map->table, k) = INITIALIZER(T, U); \ + kh_val(&map->table, k) = INITIALIZER(T, U); \ } \ } else { \ - k = kh_get(T##_##U##_map, map->table, key); \ - if (k == kh_end(map->table)) { \ + k = kh_get(T##_##U##_map, &map->table, key); \ + if (k == kh_end(&map->table)) { \ return NULL; \ } \ } \ \ - return &kh_val(map->table, k); \ + return &kh_val(&map->table, k); \ } \ \ U map_##T##_##U##_del(Map(T, U) *map, T key) \ @@ -131,9 +123,9 @@ U rv = INITIALIZER(T, U); \ khiter_t k; \ \ - if ((k = kh_get(T##_##U##_map, map->table, key)) != kh_end(map->table)) { \ - rv = kh_val(map->table, k); \ - kh_del(T##_##U##_map, map->table, k); \ + if ((k = kh_get(T##_##U##_map, &map->table, key)) != kh_end(&map->table)) { \ + rv = kh_val(&map->table, k); \ + kh_del(T##_##U##_map, &map->table, k); \ } \ \ return rv; \ @@ -141,7 +133,7 @@ \ void map_##T##_##U##_clear(Map(T, U) *map) \ { \ - kh_clear(T##_##U##_map, map->table); \ + kh_clear(T##_##U##_map, &map->table); \ } static inline khint_t String_hash(String s) @@ -194,11 +186,12 @@ static inline bool ColorKey_eq(ColorKey ae1, ColorKey ae2) MAP_IMPL(int, int, DEFAULT_INITIALIZER) MAP_IMPL(cstr_t, ptr_t, DEFAULT_INITIALIZER) +MAP_IMPL(cstr_t, int, DEFAULT_INITIALIZER) MAP_IMPL(ptr_t, ptr_t, DEFAULT_INITIALIZER) MAP_IMPL(uint64_t, ptr_t, DEFAULT_INITIALIZER) MAP_IMPL(uint64_t, ssize_t, SSIZE_INITIALIZER) MAP_IMPL(uint64_t, uint64_t, DEFAULT_INITIALIZER) -#define EXTMARK_NS_INITIALIZER { 0, 0 } +#define EXTMARK_NS_INITIALIZER { { MAP_INIT }, 1 } MAP_IMPL(uint64_t, ExtmarkNs, EXTMARK_NS_INITIALIZER) #define EXTMARK_ITEM_INITIALIZER { 0, 0, NULL } MAP_IMPL(uint64_t, ExtmarkItem, EXTMARK_ITEM_INITIALIZER) diff --git a/src/nvim/map.h b/src/nvim/map.h index 7bd3d31330..d6515878a2 100644 --- a/src/nvim/map.h +++ b/src/nvim/map.h @@ -18,11 +18,12 @@ KHASH_DECLARE(T##_##U##_map, T, U) \ \ typedef struct { \ - khash_t(T##_##U##_map) *table; \ + khash_t(T##_##U##_map) table; \ } Map(T, U); \ \ Map(T, U) *map_##T##_##U##_new(void); \ void map_##T##_##U##_free(Map(T, U) *map); \ + void map_##T##_##U##_destroy(Map(T, U) *map); \ U map_##T##_##U##_get(Map(T, U) *map, T key); \ bool map_##T##_##U##_has(Map(T, U) *map, T key); \ T map_##T##_##U##_key(Map(T, U) *map, T key); \ @@ -36,6 +37,7 @@ // MAP_DECLS(int, int) MAP_DECLS(cstr_t, ptr_t) +MAP_DECLS(cstr_t, int) MAP_DECLS(ptr_t, ptr_t) MAP_DECLS(uint64_t, ptr_t) MAP_DECLS(uint64_t, ssize_t) @@ -44,7 +46,7 @@ MAP_DECLS(uint64_t, uint64_t) // NB: this is the only way to define a struct both containing and contained // in a map... typedef struct ExtmarkNs { // For namespacing extmarks - Map(uint64_t, uint64_t) *map; // For fast lookup + Map(uint64_t, uint64_t) map[1]; // For fast lookup uint64_t free_id; // For automatically assigning id's } ExtmarkNs; @@ -57,8 +59,10 @@ MAP_DECLS(String, handle_T) MAP_DECLS(ColorKey, ColorItem) -#define map_new(T, U) map_##T##_##U##_new -#define map_free(T, U) map_##T##_##U##_free +#define MAP_INIT { { 0, 0, 0, 0, NULL, NULL, NULL } } +#define map_init(k, v, map) do { *(map) = (Map(k, v))MAP_INIT; } while (false) + +#define map_destroy(T, U) map_##T##_##U##_destroy #define map_get(T, U) map_##T##_##U##_get #define map_has(T, U) map_##T##_##U##_has #define map_key(T, U) map_##T##_##U##_key @@ -67,10 +71,9 @@ MAP_DECLS(ColorKey, ColorItem) #define map_del(T, U) map_##T##_##U##_del #define map_clear(T, U) map_##T##_##U##_clear -#define map_size(map) ((map)->table->size) +#define map_size(map) ((map)->table.size) -#define pmap_new(T) map_new(T, ptr_t) -#define pmap_free(T) map_free(T, ptr_t) +#define pmap_destroy(T) map_destroy(T, ptr_t) #define pmap_get(T) map_get(T, ptr_t) #define pmap_has(T) map_has(T, ptr_t) #define pmap_key(T) map_key(T, ptr_t) @@ -79,12 +82,13 @@ MAP_DECLS(ColorKey, ColorItem) /// @see pmap_del2 #define pmap_del(T) map_del(T, ptr_t) #define pmap_clear(T) map_clear(T, ptr_t) +#define pmap_init(k, map) map_init(k, ptr_t, map) #define map_foreach(map, key, value, block) \ - kh_foreach(map->table, key, value, block) + kh_foreach(&(map)->table, key, value, block) #define map_foreach_value(map, value, block) \ - kh_foreach_value(map->table, value, block) + kh_foreach_value(&(map)->table, value, block) void pmap_del2(PMap(cstr_t) *map, const char *key); diff --git a/src/nvim/marktree.c b/src/nvim/marktree.c index d0d843cbf8..a04f250fc3 100644 --- a/src/nvim/marktree.c +++ b/src/nvim/marktree.c @@ -250,7 +250,6 @@ void marktree_put_key(MarkTree *b, int row, int col, uint64_t id) if (!b->root) { b->root = (mtnode_t *)xcalloc(1, ILEN); - b->id2node = pmap_new(uint64_t)(); b->n_nodes++; } mtnode_t *r, *s; @@ -547,9 +546,9 @@ void marktree_clear(MarkTree *b) marktree_free_node(b->root); b->root = NULL; } - if (b->id2node) { - pmap_free(uint64_t)(b->id2node); - b->id2node = NULL; + if (b->id2node->table.keys) { + pmap_destroy(uint64_t)(b->id2node); + pmap_init(uint64_t, b->id2node); } b->n_keys = 0; b->n_nodes = 0; diff --git a/src/nvim/marktree.h b/src/nvim/marktree.h index 3b83e3c44d..7af23765c3 100644 --- a/src/nvim/marktree.h +++ b/src/nvim/marktree.h @@ -63,7 +63,7 @@ typedef struct { uint64_t next_id; // TODO(bfredl): the pointer to node could be part of the larger // Map(uint64_t, ExtmarkItem) essentially; - PMap(uint64_t) *id2node; + PMap(uint64_t) id2node[1]; } MarkTree; diff --git a/src/nvim/memline.c b/src/nvim/memline.c index 8229b8f6bc..4d435bc99f 100644 --- a/src/nvim/memline.c +++ b/src/nvim/memline.c @@ -382,7 +382,7 @@ error: */ void ml_setname(buf_T *buf) { - int success = FALSE; + bool success = false; memfile_T *mfp; char_u *fname; char_u *dirp; @@ -418,7 +418,7 @@ void ml_setname(buf_T *buf) /* if the file name is the same we don't have to do anything */ if (fnamecmp(fname, mfp->mf_fname) == 0) { xfree(fname); - success = TRUE; + success = true; break; } /* need to close the swap file before renaming */ @@ -429,7 +429,7 @@ void ml_setname(buf_T *buf) /* try to rename the swap file */ if (vim_rename(mfp->mf_fname, fname) == 0) { - success = TRUE; + success = true; mf_free_fnames(mfp); mf_set_fnames(mfp, fname); ml_upd_block0(buf, UB_SAME_DIR); @@ -758,12 +758,12 @@ void ml_recover(bool checkext) blocknr_T bnum; int page_count; int len; - int directly; + bool directly; linenr_T lnum; char_u *p; int i; long error; - int cannot_open; + bool cannot_open; linenr_T line_count; bool has_error; int idx; @@ -771,7 +771,7 @@ void ml_recover(bool checkext) int txt_start; off_T size; int called_from_main; - int serious_error = TRUE; + bool serious_error = true; long mtime; int attr; int orig_file_status = NOTDONE; @@ -791,10 +791,10 @@ void ml_recover(bool checkext) && vim_strchr((char_u *)"abcdefghijklmnopqrstuvw", TOLOWER_ASC(fname[len - 2])) != NULL && ASCII_ISALPHA(fname[len - 1])) { - directly = TRUE; - fname_used = vim_strsave(fname); /* make a copy for mf_open() */ + directly = true; + fname_used = vim_strsave(fname); // make a copy for mf_open() } else { - directly = FALSE; + directly = false; /* count the number of matching swap files */ len = recover_names(fname, FALSE, 0, NULL); @@ -1018,12 +1018,13 @@ void ml_recover(bool checkext) buf->b_ml.ml_stack = NULL; buf->b_ml.ml_stack_size = 0; /* no stack yet */ - if (curbuf->b_ffname == NULL) - cannot_open = TRUE; - else - cannot_open = FALSE; + if (curbuf->b_ffname == NULL) { + cannot_open = true; + } else { + cannot_open = false; + } - serious_error = FALSE; + serious_error = false; for (; !got_int; line_breakcheck()) { if (hp != NULL) mf_put(mfp, hp, false, false); /* release previous block */ @@ -1796,7 +1797,7 @@ theend: */ char_u *ml_get(linenr_T lnum) { - return ml_get_buf(curbuf, lnum, FALSE); + return ml_get_buf(curbuf, lnum, false); } /* @@ -2096,7 +2097,7 @@ static int ml_append_int( int total_moved = 0; /* init to shut up gcc */ DATA_BL *dp_right, *dp_left; int stack_idx; - int in_left; + bool in_left; int lineadd; blocknr_T bnum_left, bnum_right; linenr_T lnum_left, lnum_right; @@ -2113,22 +2114,22 @@ static int ml_append_int( */ if (db_idx < 0) { /* left block is new, right block is existing */ lines_moved = 0; - in_left = TRUE; - /* space_needed does not change */ - } else { /* left block is existing, right block is new */ + in_left = true; + // space_needed does not change + } else { // left block is existing, right block is new lines_moved = line_count - db_idx - 1; - if (lines_moved == 0) - in_left = FALSE; /* put new line in right block */ - /* space_needed does not change */ - else { + if (lines_moved == 0) { + in_left = false; // put new line in right block + // space_needed does not change + } else { data_moved = ((dp->db_index[db_idx]) & DB_INDEX_MASK) - dp->db_txt_start; total_moved = data_moved + lines_moved * INDEX_SIZE; if ((int)dp->db_free + total_moved >= space_needed) { - in_left = TRUE; /* put new line in left block */ + in_left = true; // put new line in left block space_needed = total_moved; } else { - in_left = FALSE; /* put new line in right block */ + in_left = false; // put new line in right block space_needed += total_moved; } } @@ -2761,7 +2762,7 @@ static void ml_flush_line(buf_T *buf) int start; int count; int i; - static int entered = FALSE; + static bool entered = false; if (buf->b_ml.ml_line_lnum == 0 || buf->b_ml.ml_mfp == NULL) return; /* nothing to do */ @@ -2770,7 +2771,7 @@ static void ml_flush_line(buf_T *buf) /* This code doesn't work recursively. */ if (entered) return; - entered = TRUE; + entered = true; buf->flush_count++; @@ -2833,7 +2834,7 @@ static void ml_flush_line(buf_T *buf) } xfree(new_line); - entered = FALSE; + entered = false; } buf->b_ml.ml_line_lnum = 0; diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c index a2d8859c68..e5743f345b 100644 --- a/src/nvim/msgpack_rpc/channel.c +++ b/src/nvim/msgpack_rpc/channel.c @@ -38,7 +38,7 @@ #define log_server_msg(...) #endif -static PMap(cstr_t) *event_strings = NULL; +static PMap(cstr_t) event_strings = MAP_INIT; static msgpack_sbuffer out_buffer; #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -48,7 +48,6 @@ static msgpack_sbuffer out_buffer; void rpc_init(void) { ch_before_blocking_events = multiqueue_new_child(main_loop.events); - event_strings = pmap_new(cstr_t)(); msgpack_sbuffer_init(&out_buffer); } @@ -60,7 +59,6 @@ void rpc_start(Channel *channel) RpcState *rpc = &channel->rpc; rpc->closed = false; rpc->unpacker = msgpack_unpacker_new(MSGPACK_UNPACKER_INIT_BUFFER_SIZE); - rpc->subscribed_events = pmap_new(cstr_t)(); rpc->next_request_id = 1; rpc->info = (Dictionary)ARRAY_DICT_INIT; kv_init(rpc->call_stack); @@ -183,11 +181,11 @@ void rpc_subscribe(uint64_t id, char *event) abort(); } - char *event_string = pmap_get(cstr_t)(event_strings, event); + char *event_string = pmap_get(cstr_t)(&event_strings, event); if (!event_string) { event_string = xstrdup(event); - pmap_put(cstr_t)(event_strings, event_string, event_string); + pmap_put(cstr_t)(&event_strings, event_string, event_string); } pmap_put(cstr_t)(channel->rpc.subscribed_events, event_string, event_string); @@ -497,7 +495,7 @@ static void broadcast_event(const char *name, Array args) kvec_t(Channel *) subscribed = KV_INITIAL_VALUE; Channel *channel; - map_foreach_value(channels, channel, { + map_foreach_value(&channels, channel, { if (channel->is_rpc && pmap_has(cstr_t)(channel->rpc.subscribed_events, name)) { kv_push(subscribed, channel); @@ -528,7 +526,7 @@ end: static void unsubscribe(Channel *channel, char *event) { - char *event_string = pmap_get(cstr_t)(event_strings, event); + char *event_string = pmap_get(cstr_t)(&event_strings, event); if (!event_string) { WLOG("RPC: ch %" PRIu64 ": tried to unsubscribe unknown event '%s'", channel->id, event); @@ -536,7 +534,7 @@ static void unsubscribe(Channel *channel, char *event) } pmap_del(cstr_t)(channel->rpc.subscribed_events, event_string); - map_foreach_value(channels, channel, { + map_foreach_value(&channels, channel, { if (channel->is_rpc && pmap_has(cstr_t)(channel->rpc.subscribed_events, event_string)) { return; @@ -544,7 +542,7 @@ static void unsubscribe(Channel *channel, char *event) }); // Since the string is no longer used by other channels, release it's memory - pmap_del(cstr_t)(event_strings, event_string); + pmap_del(cstr_t)(&event_strings, event_string); xfree(event_string); } @@ -583,7 +581,7 @@ void rpc_free(Channel *channel) unsubscribe(channel, event_string); }); - pmap_free(cstr_t)(channel->rpc.subscribed_events); + pmap_destroy(cstr_t)(channel->rpc.subscribed_events); kv_destroy(channel->rpc.call_stack); api_free_dictionary(channel->rpc.info); } diff --git a/src/nvim/msgpack_rpc/channel_defs.h b/src/nvim/msgpack_rpc/channel_defs.h index 6ef8c027f0..de328af1ce 100644 --- a/src/nvim/msgpack_rpc/channel_defs.h +++ b/src/nvim/msgpack_rpc/channel_defs.h @@ -27,7 +27,7 @@ typedef struct { } RequestEvent; typedef struct { - PMap(cstr_t) *subscribed_events; + PMap(cstr_t) subscribed_events[1]; bool closed; msgpack_unpacker *unpacker; uint32_t next_request_id; diff --git a/src/nvim/normal.c b/src/nvim/normal.c index e42ec92a4c..ffcf659d28 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -4931,7 +4931,8 @@ static void nv_ident(cmdarg_T *cap) snprintf(buf, buf_size, ".,.+%" PRId64, (int64_t)(cap->count0 - 1)); } - STRCAT(buf, "! "); + do_cmdline_cmd("tabnew"); + STRCAT(buf, "terminal "); if (cap->count0 == 0 && isman_s) { STRCAT(buf, "man"); } else { @@ -5028,6 +5029,17 @@ static void nv_ident(cmdarg_T *cap) g_tag_at_cursor = true; do_cmdline_cmd(buf); g_tag_at_cursor = false; + + if (cmdchar == 'K' && !kp_ex && !kp_help) { + // Start insert mode in terminal buffer + restart_edit = 'i'; + + add_map((char_u *)"<buffer> <esc> <Cmd>call jobstop(&channel)<CR>", TERM_FOCUS, true); + do_cmdline_cmd("autocmd TermClose <buffer> " + " if !v:event.status |" + " exec 'bdelete! ' .. expand('<abuf>') |" + " endif"); + } } xfree(buf); diff --git a/src/nvim/ops.c b/src/nvim/ops.c index a6eda26d75..a06db4a551 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -1121,18 +1121,13 @@ static void put_reedit_in_typebuf(int silent) } } -/* - * Insert register contents "s" into the typeahead buffer, so that it will be - * executed again. - * When "esc" is TRUE it is to be taken literally: Escape CSI characters and - * no remapping. - */ -static int put_in_typebuf( - char_u *s, - bool esc, - bool colon, // add ':' before the line - int silent -) +/// Insert register contents "s" into the typeahead buffer, so that it will be +/// executed again. +/// +/// @param esc when true then it is to be taken literally: Escape CSI +/// characters and no remapping. +/// @param colon add ':' before the line +static int put_in_typebuf(char_u *s, bool esc, bool colon, int silent) { int retval = OK; @@ -1567,8 +1562,8 @@ int op_delete(oparg_T *oap) if (oap->line_count > 1) { lnum = curwin->w_cursor.lnum; - ++curwin->w_cursor.lnum; - del_lines(oap->line_count - 1, TRUE); + curwin->w_cursor.lnum++; + del_lines(oap->line_count - 1, true); curwin->w_cursor.lnum = lnum; } if (u_save_cursor() == FAIL) @@ -1593,7 +1588,7 @@ int op_delete(oparg_T *oap) u_clearline(); // "U" command not possible after "2cc" } } else { - del_lines(oap->line_count, TRUE); + del_lines(oap->line_count, true); beginline(BL_WHITE | BL_FIX); u_clearline(); /* "U" command not possible after "dd" */ } @@ -3449,8 +3444,9 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags) (int)y_size-1, lastsize, totsize, kExtmarkUndo); } else if (y_type == kMTLineWise && flags & PUT_LINE_SPLIT) { - extmark_splice(curbuf, (int)new_cursor.lnum-1, col, 0, 0, 0, - (int)y_size+1, 0, totsize+1, kExtmarkUndo); + // Account for last pasted NL + last NL + extmark_splice(curbuf, (int)new_cursor.lnum-1, col + 1, 0, 0, 0, + (int)y_size+1, 0, totsize+2, kExtmarkUndo); } } diff --git a/src/nvim/options.lua b/src/nvim/options.lua index 8a45cb69fa..df2a8edc04 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -6,7 +6,7 @@ -- type='number', list=nil, scope={'global'}, -- deny_duplicates=nil, -- enable_if=nil, --- defaults={condition=nil, if_true={vi=224, vim=0}, if_false=nil}, +-- defaults={condition=nil, if_true=224, if_false=nil}, -- secure=nil, gettext=nil, noglob=nil, normal_fname_chars=nil, -- pri_mkrc=nil, deny_in_modelines=nil, normal_dname_chars=nil, -- modelineexpr=nil, @@ -21,7 +21,6 @@ -- scopes: global, buffer, window -- redraw options: statuslines, current_window, curent_window_only, -- current_buffer, all_windows, everything, curswant --- default: {vi=…[, vim=…]} -- defaults: {condition=#if condition, if_true=default, if_false=default} -- #if condition: -- string: #ifdef string @@ -57,14 +56,14 @@ return { type='number', scope={'global'}, redraw={'curswant'}, varname='p_aleph', - defaults={if_true={vi=224}} + defaults={if_true=224} }, { full_name='arabic', abbreviation='arab', short_desc=N_("Arabic as a default second language"), type='bool', scope={'window'}, redraw={'curswant'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='arabicshape', abbreviation='arshape', @@ -73,14 +72,14 @@ return { redraw={'all_windows', 'ui_option'}, varname='p_arshape', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='allowrevins', abbreviation='ari', short_desc=N_("allow CTRL-_ in Insert and Command-line mode"), type='bool', scope={'global'}, varname='p_ari', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='ambiwidth', abbreviation='ambw', @@ -88,42 +87,42 @@ return { type='string', scope={'global'}, redraw={'all_windows', 'ui_option'}, varname='p_ambw', - defaults={if_true={vi="single"}} + defaults={if_true="single"} }, { full_name='autochdir', abbreviation='acd', short_desc=N_("change directory to the file in the current window"), type='bool', scope={'global'}, varname='p_acd', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='autoindent', abbreviation='ai', short_desc=N_("take indent for new line from previous line"), type='bool', scope={'buffer'}, varname='p_ai', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='autoread', abbreviation='ar', short_desc=N_("autom. read file when changed outside of Vim"), type='bool', scope={'global', 'buffer'}, varname='p_ar', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='autowrite', abbreviation='aw', short_desc=N_("automatically write file if changed"), type='bool', scope={'global'}, varname='p_aw', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='autowriteall', abbreviation='awa', short_desc=N_("as 'autowrite', but works with more commands"), type='bool', scope={'global'}, varname='p_awa', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='background', abbreviation='bg', @@ -131,7 +130,7 @@ return { type='string', scope={'global'}, redraw={'all_windows'}, varname='p_bg', - defaults={if_true={vim="dark"}} + defaults={if_true="dark"} }, { full_name='backspace', abbreviation='bs', @@ -139,14 +138,14 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_bs', - defaults={if_true={vim="indent,eol,start"}} + defaults={if_true="indent,eol,start"} }, { full_name='backup', abbreviation='bk', short_desc=N_("keep backup file after overwriting a file"), type='bool', scope={'global'}, varname='p_bk', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='backupcopy', abbreviation='bkc', @@ -156,8 +155,8 @@ return { varname='p_bkc', defaults={ condition='UNIX', - if_true={vim="auto"}, - if_false={vim="auto"} + if_true="auto", + if_false="auto" }, }, { @@ -168,7 +167,7 @@ return { secure=true, expand='nodefault', varname='p_bdir', - defaults={if_true={vi=''}} + defaults={if_true=''} }, { full_name='backupext', abbreviation='bex', @@ -176,7 +175,7 @@ return { type='string', scope={'global'}, normal_fname_chars=true, varname='p_bex', - defaults={if_true={vi="~"}} + defaults={if_true="~"} }, { full_name='backupskip', abbreviation='bsk', @@ -184,7 +183,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_bsk', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='belloff', abbreviation='bo', @@ -192,7 +191,7 @@ return { type='string', list='comma', scope={'global'}, deny_duplicates=true, varname='p_bo', - defaults={if_true={vi="all"}} + defaults={if_true="all"} }, { full_name='binary', abbreviation='bin', @@ -200,7 +199,7 @@ return { type='bool', scope={'buffer'}, redraw={'statuslines'}, varname='p_bin', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='bomb', @@ -209,7 +208,7 @@ return { no_mkrc=true, redraw={'statuslines'}, varname='p_bomb', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='breakat', abbreviation='brk', @@ -217,14 +216,14 @@ return { type='string', list='flags', scope={'global'}, redraw={'all_windows'}, varname='p_breakat', - defaults={if_true={vi=" \t!@*-+;:,./?"}} + defaults={if_true=" \t!@*-+;:,./?"} }, { full_name='breakindent', abbreviation='bri', short_desc=N_("wrapped line repeats indent"), type='bool', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='breakindentopt', abbreviation='briopt', @@ -233,7 +232,7 @@ return { deny_duplicates=true, alloced=true, redraw={'current_buffer'}, - defaults={if_true={vi=""}}, + defaults={if_true=""}, }, { full_name='browsedir', abbreviation='bsdir', @@ -248,7 +247,7 @@ return { noglob=true, alloced=true, varname='p_bh', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='buflisted', abbreviation='bl', @@ -256,7 +255,7 @@ return { type='bool', scope={'buffer'}, noglob=true, varname='p_bl', - defaults={if_true={vi=1}} + defaults={if_true=1} }, { full_name='buftype', abbreviation='bt', @@ -265,7 +264,7 @@ return { noglob=true, alloced=true, varname='p_bt', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='casemap', abbreviation='cmp', @@ -273,7 +272,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_cmp', - defaults={if_true={vi="internal,keepascii"}} + defaults={if_true="internal,keepascii"} }, { full_name='cdpath', abbreviation='cd', @@ -283,14 +282,14 @@ return { expand=true, secure=true, varname='p_cdpath', - defaults={if_true={vi=",,"}} + defaults={if_true=",,"} }, { full_name='cedit', short_desc=N_("used to open the command-line window"), type='string', scope={'global'}, varname='p_cedit', - defaults={if_true={vim=macros('CTRL_F_STR')}} + defaults={if_true=macros('CTRL_F_STR')} }, { full_name='channel', @@ -299,7 +298,7 @@ return { no_mkrc=true, nodefault=true, varname='p_channel', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='charconvert', abbreviation='ccv', @@ -307,14 +306,14 @@ return { type='string', scope={'global'}, secure=true, varname='p_ccv', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='cindent', abbreviation='cin', short_desc=N_("do C program indenting"), type='bool', scope={'buffer'}, varname='p_cin', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='cinkeys', abbreviation='cink', @@ -323,7 +322,7 @@ return { deny_duplicates=true, alloced=true, varname='p_cink', - defaults={if_true={vi=indentkeys_default}} + defaults={if_true=indentkeys_default} }, { full_name='cinoptions', abbreviation='cino', @@ -332,7 +331,7 @@ return { deny_duplicates=true, alloced=true, varname='p_cino', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='cinwords', abbreviation='cinw', @@ -341,7 +340,7 @@ return { deny_duplicates=true, alloced=true, varname='p_cinw', - defaults={if_true={vi="if,else,while,do,for,switch"}} + defaults={if_true="if,else,while,do,for,switch"} }, { full_name='clipboard', abbreviation='cb', @@ -349,7 +348,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_cb', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='cmdheight', abbreviation='ch', @@ -357,14 +356,14 @@ return { type='number', scope={'global'}, redraw={'all_windows'}, varname='p_ch', - defaults={if_true={vi=1}} + defaults={if_true=1} }, { full_name='cmdwinheight', abbreviation='cwh', short_desc=N_("height of the command-line window"), type='number', scope={'global'}, varname='p_cwh', - defaults={if_true={vi=7}} + defaults={if_true=7} }, { full_name='colorcolumn', abbreviation='cc', @@ -372,7 +371,7 @@ return { type='string', list='onecomma', scope={'window'}, deny_duplicates=true, redraw={'current_window'}, - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='columns', abbreviation='co', @@ -381,7 +380,7 @@ return { no_mkrc=true, redraw={'everything'}, varname='p_columns', - defaults={if_true={vi=macros('DFLT_COLS')}} + defaults={if_true=macros('DFLT_COLS')} }, { full_name='comments', abbreviation='com', @@ -391,7 +390,7 @@ return { alloced=true, redraw={'curswant'}, varname='p_com', - defaults={if_true={vi="s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-"}} + defaults={if_true="s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-"} }, { full_name='commentstring', abbreviation='cms', @@ -400,7 +399,7 @@ return { alloced=true, redraw={'curswant'}, varname='p_cms', - defaults={if_true={vi="/*%s*/"}} + defaults={if_true="/*%s*/"} }, { full_name='compatible', abbreviation='cp', @@ -410,7 +409,7 @@ return { varname='p_force_off', -- pri_mkrc isn't needed here, optval_default() -- always returns TRUE for 'compatible' - defaults={if_true={vim=false}} + defaults={if_true=false} }, { full_name='complete', abbreviation='cpt', @@ -419,7 +418,7 @@ return { deny_duplicates=true, alloced=true, varname='p_cpt', - defaults={if_true={vim=".,w,b,u,t"}} + defaults={if_true=".,w,b,u,t"} }, { full_name='concealcursor', abbreviation='cocu', @@ -427,14 +426,14 @@ return { type='string', scope={'window'}, alloced=true, redraw={'current_window'}, - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='conceallevel', abbreviation='cole', short_desc=N_("whether concealable text is shown or hidden"), type='number', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='completefunc', abbreviation='cfu', @@ -443,7 +442,7 @@ return { secure=true, alloced=true, varname='p_cfu', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='completeopt', abbreviation='cot', @@ -451,28 +450,28 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_cot', - defaults={if_true={vi="menu,preview"}} + defaults={if_true="menu,preview"} }, { full_name='completeslash', abbreviation='csl', type='string', scope={'buffer'}, varname='p_csl', enable_if='BACKSLASH_IN_FILENAME', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='confirm', abbreviation='cf', short_desc=N_("ask what to do about unsaved/read-only files"), type='bool', scope={'global'}, varname='p_confirm', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='copyindent', abbreviation='ci', short_desc=N_("make 'autoindent' use existing indent structure"), type='bool', scope={'buffer'}, varname='p_ci', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='cpoptions', abbreviation='cpo', @@ -480,14 +479,14 @@ return { type='string', list='flags', scope={'global'}, redraw={'all_windows'}, varname='p_cpo', - defaults={if_true={vim=macros('CPO_VIM')}} + defaults={if_true=macros('CPO_VIM')} }, { full_name='cscopepathcomp', abbreviation='cspc', short_desc=N_("how many components of the path to show"), type='number', scope={'global'}, varname='p_cspc', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='cscopeprg', abbreviation='csprg', @@ -496,7 +495,7 @@ return { secure=true, expand=true, varname='p_csprg', - defaults={if_true={vi="cscope"}} + defaults={if_true="cscope"} }, { full_name='cscopequickfix', abbreviation='csqf', @@ -504,56 +503,56 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_csqf', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='cscoperelative', abbreviation='csre', short_desc=N_("Use cscope.out path basename as prefix"), type='bool', scope={'global'}, varname='p_csre', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='cscopetag', abbreviation='cst', short_desc=N_("use cscope for tag commands"), type='bool', scope={'global'}, varname='p_cst', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='cscopetagorder', abbreviation='csto', short_desc=N_("determines \":cstag\" search order"), type='number', scope={'global'}, varname='p_csto', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='cscopeverbose', abbreviation='csverb', short_desc=N_("give messages when adding a cscope database"), type='bool', scope={'global'}, varname='p_csverbose', - defaults={if_true={vi=1}} + defaults={if_true=1} }, { full_name='cursorbind', abbreviation='crb', short_desc=N_("move cursor in window as it moves in other windows"), type='bool', scope={'window'}, pv_name='p_crbind', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='cursorcolumn', abbreviation='cuc', short_desc=N_("highlight the screen column of the cursor"), type='bool', scope={'window'}, redraw={'current_window_only'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='cursorline', abbreviation='cul', short_desc=N_("highlight the screen line of the cursor"), type='bool', scope={'window'}, redraw={'current_window_only'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='cursorlineopt', abbreviation='culopt', @@ -561,14 +560,14 @@ return { type='string', list='onecomma', scope={'window'}, deny_duplicates=true, redraw={'current_window_only'}, - defaults={if_true={vi="both"}} + defaults={if_true="both"} }, { full_name='debug', short_desc=N_("to \"msg\" to see all error messages"), type='string', scope={'global'}, varname='p_debug', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='define', abbreviation='def', @@ -577,14 +576,14 @@ return { alloced=true, redraw={'curswant'}, varname='p_def', - defaults={if_true={vi="^\\s*#\\s*define"}} + defaults={if_true="^\\s*#\\s*define"} }, { full_name='delcombine', abbreviation='deco', short_desc=N_("delete combining characters on their own"), type='bool', scope={'global'}, varname='p_deco', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='dictionary', abbreviation='dict', @@ -594,7 +593,7 @@ return { normal_dname_chars=true, expand=true, varname='p_dict', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='diff', @@ -602,7 +601,7 @@ return { type='bool', scope={'window'}, noglob=true, redraw={'current_window'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='diffexpr', abbreviation='dex', @@ -611,7 +610,7 @@ return { secure=true, redraw={'curswant'}, varname='p_dex', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='diffopt', abbreviation='dip', @@ -621,14 +620,14 @@ return { alloced=true, redraw={'current_window'}, varname='p_dip', - defaults={if_true={vi="internal,filler,closeoff"}} + defaults={if_true="internal,filler,closeoff"} }, { full_name='digraph', abbreviation='dg', short_desc=N_("enable the entering of digraphs in Insert mode"), type='bool', scope={'global'}, varname='p_dg', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='directory', abbreviation='dir', @@ -638,7 +637,7 @@ return { secure=true, expand='nodefault', varname='p_dir', - defaults={if_true={vi=''}} + defaults={if_true=''} }, { full_name='display', abbreviation='dy', @@ -647,21 +646,21 @@ return { deny_duplicates=true, redraw={'all_windows'}, varname='p_dy', - defaults={if_true={vim="lastline,msgsep"}} + defaults={if_true="lastline,msgsep"} }, { full_name='eadirection', abbreviation='ead', short_desc=N_("in which direction 'equalalways' works"), type='string', scope={'global'}, varname='p_ead', - defaults={if_true={vi="both"}} + defaults={if_true="both"} }, { full_name='edcompatible', abbreviation='ed', short_desc=N_("No description"), type='bool', scope={'global'}, varname='p_force_off', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='emoji', abbreviation='emo', @@ -669,7 +668,7 @@ return { type='bool', scope={'global'}, redraw={'all_windows', 'ui_option'}, varname='p_emoji', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='encoding', abbreviation='enc', @@ -677,7 +676,7 @@ return { type='string', scope={'global'}, deny_in_modelines=true, varname='p_enc', - defaults={if_true={vi=macros('ENC_DFLT')}} + defaults={if_true=macros('ENC_DFLT')} }, { full_name='endofline', abbreviation='eol', @@ -686,7 +685,7 @@ return { no_mkrc=true, redraw={'statuslines'}, varname='p_eol', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='equalalways', abbreviation='ea', @@ -694,7 +693,7 @@ return { type='bool', scope={'global'}, redraw={'all_windows'}, varname='p_ea', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='equalprg', abbreviation='ep', @@ -703,14 +702,14 @@ return { secure=true, expand=true, varname='p_ep', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='errorbells', abbreviation='eb', short_desc=N_("ring the bell for error messages"), type='bool', scope={'global'}, varname='p_eb', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='errorfile', abbreviation='ef', @@ -719,7 +718,7 @@ return { secure=true, expand=true, varname='p_ef', - defaults={if_true={vi=macros('DFLT_ERRORFILE')}} + defaults={if_true=macros('DFLT_ERRORFILE')} }, { full_name='errorformat', abbreviation='efm', @@ -727,7 +726,7 @@ return { type='string', list='onecomma', scope={'global', 'buffer'}, deny_duplicates=true, varname='p_efm', - defaults={if_true={vi=macros('DFLT_EFM')}} + defaults={if_true=macros('DFLT_EFM')} }, { full_name='eventignore', abbreviation='ei', @@ -735,14 +734,14 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_ei', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='expandtab', abbreviation='et', short_desc=N_("use spaces when <Tab> is inserted"), type='bool', scope={'buffer'}, varname='p_et', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='exrc', abbreviation='ex', @@ -750,7 +749,7 @@ return { type='bool', scope={'global'}, secure=true, varname='p_exrc', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='fileencoding', abbreviation='fenc', @@ -760,7 +759,7 @@ return { alloced=true, redraw={'statuslines', 'current_buffer'}, varname='p_fenc', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='fileencodings', abbreviation='fencs', @@ -768,7 +767,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_fencs', - defaults={if_true={vi="ucs-bom,utf-8,default,latin1"}} + defaults={if_true="ucs-bom,utf-8,default,latin1"} }, { full_name='fileformat', abbreviation='ff', @@ -778,7 +777,7 @@ return { alloced=true, redraw={'curswant', 'statuslines'}, varname='p_ff', - defaults={if_true={vi=macros('DFLT_FF')}} + defaults={if_true=macros('DFLT_FF')} }, { full_name='fileformats', abbreviation='ffs', @@ -786,7 +785,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_ffs', - defaults={if_true={vim=macros('DFLT_FFS_VIM')}} + defaults={if_true=macros('DFLT_FFS_VIM')} }, { full_name='fileignorecase', abbreviation='fic', @@ -795,8 +794,8 @@ return { varname='p_fic', defaults={ condition='CASE_INSENSITIVE_FILENAME', - if_true={vi=true}, - if_false={vi=false}, + if_true=true, + if_false=false, } }, { @@ -808,7 +807,7 @@ return { alloced=true, expand=true, varname='p_ft', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='fillchars', abbreviation='fcs', @@ -818,7 +817,7 @@ return { alloced=true, redraw={'current_window'}, varname='p_fcs', - defaults={if_true={vi=''}} + defaults={if_true=''} }, { full_name='fixendofline', abbreviation='fixeol', @@ -826,7 +825,7 @@ return { type='bool', scope={'buffer'}, redraw={'statuslines'}, varname='p_fixeol', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='foldclose', abbreviation='fcl', @@ -835,7 +834,7 @@ return { deny_duplicates=true, redraw={'current_window'}, varname='p_fcl', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='foldcolumn', abbreviation='fdc', @@ -843,14 +842,14 @@ return { type='string', scope={'window'}, alloced=true, redraw={'current_window'}, - defaults={if_true={vi="0"}} + defaults={if_true="0"} }, { full_name='foldenable', abbreviation='fen', short_desc=N_("set to display all folds open"), type='bool', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='foldexpr', abbreviation='fde', @@ -859,7 +858,7 @@ return { modelineexpr=true, alloced=true, redraw={'current_window'}, - defaults={if_true={vi="0"}} + defaults={if_true="0"} }, { full_name='foldignore', abbreviation='fdi', @@ -867,14 +866,14 @@ return { type='string', scope={'window'}, alloced=true, redraw={'current_window'}, - defaults={if_true={vi="#"}} + defaults={if_true="#"} }, { full_name='foldlevel', abbreviation='fdl', short_desc=N_("close folds with a level higher than this"), type='number', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='foldlevelstart', abbreviation='fdls', @@ -882,7 +881,7 @@ return { type='number', scope={'global'}, redraw={'curswant'}, varname='p_fdls', - defaults={if_true={vi=-1}} + defaults={if_true=-1} }, { full_name='foldmarker', abbreviation='fmr', @@ -891,7 +890,7 @@ return { deny_duplicates=true, alloced=true, redraw={'current_window'}, - defaults={if_true={vi="{{{,}}}"}} + defaults={if_true="{{{,}}}"} }, { full_name='foldmethod', abbreviation='fdm', @@ -899,21 +898,21 @@ return { type='string', scope={'window'}, alloced=true, redraw={'current_window'}, - defaults={if_true={vi="manual"}} + defaults={if_true="manual"} }, { full_name='foldminlines', abbreviation='fml', short_desc=N_("minimum number of lines for a fold to be closed"), type='number', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=1}} + defaults={if_true=1} }, { full_name='foldnestmax', abbreviation='fdn', short_desc=N_("maximum fold depth"), type='number', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=20}} + defaults={if_true=20} }, { full_name='foldopen', abbreviation='fdo', @@ -922,7 +921,7 @@ return { deny_duplicates=true, redraw={'curswant'}, varname='p_fdo', - defaults={if_true={vi="block,hor,mark,percent,quickfix,search,tag,undo"}} + defaults={if_true="block,hor,mark,percent,quickfix,search,tag,undo"} }, { full_name='foldtext', abbreviation='fdt', @@ -931,7 +930,7 @@ return { modelineexpr=true, alloced=true, redraw={'current_window'}, - defaults={if_true={vi="foldtext()"}} + defaults={if_true="foldtext()"} }, { full_name='formatexpr', abbreviation='fex', @@ -940,7 +939,7 @@ return { modelineexpr=true, alloced=true, varname='p_fex', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='formatoptions', abbreviation='fo', @@ -948,7 +947,7 @@ return { type='string', list='flags', scope={'buffer'}, alloced=true, varname='p_fo', - defaults={if_true={vim=macros('DFLT_FO_VIM')}} + defaults={if_true=macros('DFLT_FO_VIM')} }, { full_name='formatlistpat', abbreviation='flp', @@ -956,7 +955,7 @@ return { type='string', scope={'buffer'}, alloced=true, varname='p_flp', - defaults={if_true={vi="^\\s*\\d\\+[\\]:.)}\\t ]\\s*"}} + defaults={if_true="^\\s*\\d\\+[\\]:.)}\\t ]\\s*"} }, { full_name='formatprg', abbreviation='fp', @@ -965,7 +964,7 @@ return { secure=true, expand=true, varname='p_fp', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='fsync', abbreviation='fs', @@ -973,14 +972,14 @@ return { type='bool', scope={'global'}, secure=true, varname='p_fs', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='gdefault', abbreviation='gd', short_desc=N_("the \":substitute\" flag 'g' is default on"), type='bool', scope={'global'}, varname='p_gd', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='grepformat', abbreviation='gfm', @@ -988,7 +987,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_gefm', - defaults={if_true={vi=macros('DFLT_GREPFORMAT')}} + defaults={if_true=macros('DFLT_GREPFORMAT')} }, { full_name='grepprg', abbreviation='gp', @@ -1001,8 +1000,8 @@ return { condition='WIN32', -- Add an extra file name so that grep will always -- insert a file name in the match line. */ - if_true={vi="findstr /n $* nul"}, - if_false={vi="grep -n $* /dev/null"} + if_true="findstr /n $* nul", + if_false="grep -n $* /dev/null" } }, { @@ -1011,7 +1010,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_guicursor', - defaults={if_true={vi="n-v-c-sm:block,i-ci-ve:ver25,r-cr-o:hor20"}} + defaults={if_true="n-v-c-sm:block,i-ci-ve:ver25,r-cr-o:hor20"} }, { full_name='guifont', abbreviation='gfn', @@ -1020,7 +1019,7 @@ return { deny_duplicates=true, varname='p_guifont', redraw={'ui_option'}, - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='guifontwide', abbreviation='gfw', @@ -1029,7 +1028,7 @@ return { deny_duplicates=true, redraw={'ui_option'}, varname='p_guifontwide', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='guioptions', abbreviation='go', @@ -1060,14 +1059,14 @@ return { secure=true, expand=true, varname='p_hf', - defaults={if_true={vi=macros('DFLT_HELPFILE')}} + defaults={if_true=macros('DFLT_HELPFILE')} }, { full_name='helpheight', abbreviation='hh', short_desc=N_("minimum height of a new help window"), type='number', scope={'global'}, varname='p_hh', - defaults={if_true={vi=20}} + defaults={if_true=20} }, { full_name='helplang', abbreviation='hlg', @@ -1075,14 +1074,14 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_hlg', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='hidden', abbreviation='hid', short_desc=N_("don't unload buffer when it is |abandon|ed"), type='bool', scope={'global'}, varname='p_hid', - defaults={if_true={vi=false}} + defaults={if_true=true} }, { full_name='highlight', abbreviation='hl', @@ -1090,28 +1089,28 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_hl', - defaults={if_true={vi=macros('HIGHLIGHT_INIT')}} + defaults={if_true=macros('HIGHLIGHT_INIT')} }, { full_name='history', abbreviation='hi', short_desc=N_("number of command-lines that are remembered"), type='number', scope={'global'}, varname='p_hi', - defaults={if_true={vim=10000}} + defaults={if_true=10000} }, { full_name='hkmap', abbreviation='hk', short_desc=N_("Hebrew keyboard mapping"), type='bool', scope={'global'}, varname='p_hkmap', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='hkmapp', abbreviation='hkp', short_desc=N_("phonetic Hebrew keyboard mapping"), type='bool', scope={'global'}, varname='p_hkmapp', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='hlsearch', abbreviation='hls', @@ -1119,14 +1118,14 @@ return { type='bool', scope={'global'}, redraw={'all_windows'}, varname='p_hls', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='icon', short_desc=N_("Vim set the text of the window icon"), type='bool', scope={'global'}, varname='p_icon', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='iconstring', @@ -1134,28 +1133,28 @@ return { type='string', scope={'global'}, modelineexpr=true, varname='p_iconstring', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='ignorecase', abbreviation='ic', short_desc=N_("ignore case in search patterns"), type='bool', scope={'global'}, varname='p_ic', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='imcmdline', abbreviation='imc', short_desc=N_("use IM when starting to edit a command line"), type='bool', scope={'global'}, enable_if=false, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='imdisable', abbreviation='imd', short_desc=N_("do not use the IM in any mode"), type='bool', scope={'global'}, enable_if=false, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='iminsert', abbreviation='imi', @@ -1163,7 +1162,7 @@ return { type='number', scope={'buffer'}, varname='p_iminsert', pv_name='p_imi', defaults={ - if_true={vi=macros('B_IMODE_NONE')}, + if_true=macros('B_IMODE_NONE'), } }, { @@ -1172,7 +1171,7 @@ return { type='number', scope={'buffer'}, varname='p_imsearch', pv_name='p_ims', defaults={ - if_true={vi=macros('B_IMODE_USE_INSERT')}, + if_true=macros('B_IMODE_USE_INSERT'), } }, { @@ -1181,7 +1180,7 @@ return { type='string', scope={'global'}, redraw={'all_windows'}, varname='p_icm', - defaults={if_true={vi=""}} + defaults={if_true="nosplit"} }, { full_name='include', abbreviation='inc', @@ -1189,7 +1188,7 @@ return { type='string', scope={'global', 'buffer'}, alloced=true, varname='p_inc', - defaults={if_true={vi="^\\s*#\\s*include"}} + defaults={if_true="^\\s*#\\s*include"} }, { full_name='includeexpr', abbreviation='inex', @@ -1198,14 +1197,14 @@ return { modelineexpr=true, alloced=true, varname='p_inex', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='incsearch', abbreviation='is', short_desc=N_("highlight match while typing search pattern"), type='bool', scope={'global'}, varname='p_is', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='indentexpr', abbreviation='inde', @@ -1214,7 +1213,7 @@ return { modelineexpr=true, alloced=true, varname='p_inde', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='indentkeys', abbreviation='indk', @@ -1223,21 +1222,21 @@ return { deny_duplicates=true, alloced=true, varname='p_indk', - defaults={if_true={vi=indentkeys_default}} + defaults={if_true=indentkeys_default} }, { full_name='infercase', abbreviation='inf', short_desc=N_("adjust case of match for keyword completion"), type='bool', scope={'buffer'}, varname='p_inf', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='insertmode', abbreviation='im', short_desc=N_("start the edit of a file in Insert mode"), type='bool', scope={'global'}, varname='p_im', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='isfname', abbreviation='isf', @@ -1249,8 +1248,8 @@ return { condition='BACKSLASH_IN_FILENAME', -- Excluded are: & and ^ are special in cmd.exe -- ( and ) are used in text separating fnames */ - if_true={vi="@,48-57,/,\\,.,-,_,+,,,#,$,%,{,},[,],:,@-@,!,~,="}, - if_false={vi="@,48-57,/,.,-,_,+,,,#,$,%,~,="} + if_true="@,48-57,/,\\,.,-,_,+,,,#,$,%,{,},[,],:,@-@,!,~,=", + if_false="@,48-57,/,.,-,_,+,,,#,$,%,~,=" } }, { @@ -1261,8 +1260,8 @@ return { varname='p_isi', defaults={ condition='WIN32', - if_true={vi="@,48-57,_,128-167,224-235"}, - if_false={vi="@,48-57,_,192-255"} + if_true="@,48-57,_,128-167,224-235", + if_false="@,48-57,_,192-255" } }, { @@ -1272,7 +1271,7 @@ return { deny_duplicates=true, alloced=true, varname='p_isk', - defaults={if_true={vim="@,48-57,_,192-255"}} + defaults={if_true="@,48-57,_,192-255"} }, { full_name='isprint', abbreviation='isp', @@ -1281,7 +1280,7 @@ return { deny_duplicates=true, redraw={'all_windows'}, varname='p_isp', - defaults={if_true={vi="@,161-255"} + defaults={if_true="@,161-255" } }, { @@ -1289,7 +1288,7 @@ return { short_desc=N_("two spaces after a period with a join command"), type='bool', scope={'global'}, varname='p_js', - defaults={if_true={vi=true}} + defaults={if_true=false} }, { full_name='jumpoptions', abbreviation='jop', @@ -1297,7 +1296,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_jop', - defaults={if_true={vim=''}} + defaults={if_true=''} }, { full_name='keymap', abbreviation='kmp', @@ -1308,7 +1307,7 @@ return { alloced=true, redraw={'statuslines', 'current_buffer'}, varname='p_keymap', pv_name='p_kmap', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='keymodel', abbreviation='km', @@ -1316,7 +1315,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_km', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='keywordprg', abbreviation='kp', @@ -1326,7 +1325,7 @@ return { expand=true, varname='p_kp', defaults={ - if_true={vi=":Man"}, + if_true=":Man", } }, { @@ -1336,7 +1335,7 @@ return { deny_duplicates=true, secure=true, varname='p_langmap', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='langmenu', abbreviation='lm', @@ -1344,21 +1343,21 @@ return { type='string', scope={'global'}, normal_fname_chars=true, varname='p_lm', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='langnoremap', abbreviation='lnr', short_desc=N_("do not apply 'langmap' to mapped characters"), type='bool', scope={'global'}, varname='p_lnr', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='langremap', abbreviation='lrm', short_desc=N_('No description'), type='bool', scope={'global'}, varname='p_lrm', - defaults={if_true={vim=false}} + defaults={if_true=false} }, { full_name='laststatus', abbreviation='ls', @@ -1366,21 +1365,21 @@ return { type='number', scope={'global'}, redraw={'all_windows'}, varname='p_ls', - defaults={if_true={vim=2}} + defaults={if_true=2} }, { full_name='lazyredraw', abbreviation='lz', short_desc=N_("don't redraw while executing macros"), type='bool', scope={'global'}, varname='p_lz', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='linebreak', abbreviation='lbr', short_desc=N_("wrap long lines at a blank"), type='bool', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='lines', @@ -1389,7 +1388,7 @@ return { no_mkrc=true, redraw={'everything'}, varname='p_lines', - defaults={if_true={vi=macros('DFLT_ROWS')}} + defaults={if_true=macros('DFLT_ROWS')} }, { full_name='linespace', abbreviation='lsp', @@ -1397,14 +1396,14 @@ return { type='number', scope={'global'}, redraw={'ui_option'}, varname='p_linespace', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='lisp', short_desc=N_("indenting for Lisp"), type='bool', scope={'buffer'}, varname='p_lisp', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='lispwords', abbreviation='lw', @@ -1412,14 +1411,14 @@ return { type='string', list='onecomma', scope={'global', 'buffer'}, deny_duplicates=true, varname='p_lispwords', pv_name='p_lw', - defaults={if_true={vi=macros('LISPWORD_VALUE')}} + defaults={if_true=macros('LISPWORD_VALUE')} }, { full_name='list', short_desc=N_("<Tab> and <EOL>"), type='bool', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='listchars', abbreviation='lcs', @@ -1429,21 +1428,21 @@ return { alloced=true, redraw={'current_window'}, varname='p_lcs', - defaults={if_true={vim="tab:> ,trail:-,nbsp:+"}} + defaults={if_true="tab:> ,trail:-,nbsp:+"} }, { full_name='loadplugins', abbreviation='lpl', short_desc=N_("load plugin scripts when starting up"), type='bool', scope={'global'}, varname='p_lpl', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='magic', short_desc=N_("special characters in search patterns"), type='bool', scope={'global'}, varname='p_magic', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='makeef', abbreviation='mef', @@ -1452,14 +1451,14 @@ return { secure=true, expand=true, varname='p_mef', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='makeencoding', abbreviation='menc', short_desc=N_("Converts the output of external commands"), type='string', scope={'global', 'buffer'}, varname='p_menc', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='makeprg', abbreviation='mp', @@ -1468,7 +1467,7 @@ return { secure=true, expand=true, varname='p_mp', - defaults={if_true={vi="make"}} + defaults={if_true="make"} }, { full_name='matchpairs', abbreviation='mps', @@ -1477,49 +1476,49 @@ return { deny_duplicates=true, alloced=true, varname='p_mps', - defaults={if_true={vi="(:),{:},[:]"}} + defaults={if_true="(:),{:},[:]"} }, { full_name='matchtime', abbreviation='mat', short_desc=N_("tenths of a second to show matching paren"), type='number', scope={'global'}, varname='p_mat', - defaults={if_true={vi=5}} + defaults={if_true=5} }, { full_name='maxcombine', abbreviation='mco', short_desc=N_("maximum nr of combining characters displayed"), type='number', scope={'global'}, varname='p_mco', - defaults={if_true={vi=6}} + defaults={if_true=6} }, { full_name='maxfuncdepth', abbreviation='mfd', short_desc=N_("maximum recursive depth for user functions"), type='number', scope={'global'}, varname='p_mfd', - defaults={if_true={vi=100}} + defaults={if_true=100} }, { full_name='maxmapdepth', abbreviation='mmd', short_desc=N_("maximum recursive depth for mapping"), type='number', scope={'global'}, varname='p_mmd', - defaults={if_true={vi=1000}} + defaults={if_true=1000} }, { full_name='maxmempattern', abbreviation='mmp', short_desc=N_("maximum memory (in Kbyte) used for pattern search"), type='number', scope={'global'}, varname='p_mmp', - defaults={if_true={vi=1000}} + defaults={if_true=1000} }, { full_name='menuitems', abbreviation='mis', short_desc=N_("maximum number of items in a menu"), type='number', scope={'global'}, varname='p_mis', - defaults={if_true={vi=25}} + defaults={if_true=25} }, { full_name='mkspellmem', abbreviation='msm', @@ -1528,14 +1527,14 @@ return { secure=true, expand=true, varname='p_msm', - defaults={if_true={vi="460000,2000,500"}} + defaults={if_true="460000,2000,500"} }, { full_name='modeline', abbreviation='ml', short_desc=N_("recognize modelines at start or end of file"), type='bool', scope={'buffer'}, varname='p_ml', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='modelineexpr', abbreviation='mle', @@ -1543,14 +1542,14 @@ return { type='bool', scope={'global'}, secure=true, varname='p_mle', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='modelines', abbreviation='mls', short_desc=N_("number of lines checked for modelines"), type='number', scope={'global'}, varname='p_mls', - defaults={if_true={vi=5}} + defaults={if_true=5} }, { full_name='modifiable', abbreviation='ma', @@ -1558,7 +1557,7 @@ return { type='bool', scope={'buffer'}, noglob=true, varname='p_ma', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='modified', abbreviation='mod', @@ -1567,21 +1566,21 @@ return { no_mkrc=true, redraw={'statuslines'}, varname='p_mod', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='more', short_desc=N_("listings when the whole screen is filled"), type='bool', scope={'global'}, varname='p_more', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='mouse', short_desc=N_("the use of mouse clicks"), type='string', list='flags', scope={'global'}, varname='p_mouse', - defaults={if_true={vim=""}} + defaults={if_true=""} }, { full_name='mousefocus', abbreviation='mousef', @@ -1589,21 +1588,21 @@ return { type='bool', scope={'global'}, redraw={'ui_option'}, varname='p_mousef', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='mousehide', abbreviation='mh', short_desc=N_("hide mouse pointer while typing"), type='bool', scope={'global'}, enable_if=false, - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='mousemodel', abbreviation='mousem', short_desc=N_("changes meaning of mouse buttons"), type='string', scope={'global'}, varname='p_mousem', - defaults={if_true={vi="extend"}} + defaults={if_true="extend"} }, { full_name='mouseshape', abbreviation='mouses', @@ -1617,7 +1616,7 @@ return { short_desc=N_("max time between mouse double-click"), type='number', scope={'global'}, varname='p_mouset', - defaults={if_true={vi=500}} + defaults={if_true=500} }, { full_name='nrformats', abbreviation='nf', @@ -1626,21 +1625,21 @@ return { deny_duplicates=true, alloced=true, varname='p_nf', - defaults={if_true={vim="bin,hex"}} + defaults={if_true="bin,hex"} }, { full_name='number', abbreviation='nu', short_desc=N_("print the line number in front of each line"), type='bool', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='numberwidth', abbreviation='nuw', short_desc=N_("number of columns used for the line number"), type='number', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vim=4}} + defaults={if_true=4} }, { full_name='omnifunc', abbreviation='ofu', @@ -1649,14 +1648,14 @@ return { secure=true, alloced=true, varname='p_ofu', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='opendevice', abbreviation='odev', short_desc=N_("allow reading/writing devices on MS-Windows"), type='bool', scope={'global'}, enable_if=false, - defaults={if_true={vim=false}} + defaults={if_true=false} }, { full_name='operatorfunc', abbreviation='opfunc', @@ -1664,7 +1663,7 @@ return { type='string', scope={'global'}, secure=true, varname='p_opfunc', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='packpath', abbreviation='pp', @@ -1674,14 +1673,14 @@ return { secure=true, expand=true, varname='p_pp', - defaults={if_true={vi=''}} + defaults={if_true=''} }, { full_name='paragraphs', abbreviation='para', short_desc=N_("nroff macros that separate paragraphs"), type='string', scope={'global'}, varname='p_para', - defaults={if_true={vi="IPLPPPQPP TPHPLIPpLpItpplpipbp"}} + defaults={if_true="IPLPPPQPP TPHPLIPpLpItpplpipbp"} }, { full_name='paste', @@ -1689,14 +1688,14 @@ return { type='bool', scope={'global'}, pri_mkrc=true, varname='p_paste', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='pastetoggle', abbreviation='pt', short_desc=N_("key code that causes 'paste' to toggle"), type='string', scope={'global'}, varname='p_pt', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='patchexpr', abbreviation='pex', @@ -1704,7 +1703,7 @@ return { type='string', scope={'global'}, secure=true, varname='p_pex', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='patchmode', abbreviation='pm', @@ -1712,7 +1711,7 @@ return { type='string', scope={'global'}, normal_fname_chars=true, varname='p_pm', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='path', abbreviation='pa', @@ -1721,21 +1720,21 @@ return { deny_duplicates=true, expand=true, varname='p_path', - defaults={if_true={vi=".,/usr/include,,"}} + defaults={if_true=".,/usr/include,,"} }, { full_name='preserveindent', abbreviation='pi', short_desc=N_("preserve the indent structure when reindenting"), type='bool', scope={'buffer'}, varname='p_pi', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='previewheight', abbreviation='pvh', short_desc=N_("height of the preview window"), type='number', scope={'global'}, varname='p_pvh', - defaults={if_true={vi=12}} + defaults={if_true=12} }, { full_name='previewwindow', abbreviation='pvw', @@ -1743,7 +1742,7 @@ return { type='bool', scope={'window'}, noglob=true, redraw={'statuslines'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='printdevice', abbreviation='pdev', @@ -1751,14 +1750,14 @@ return { type='string', scope={'global'}, secure=true, varname='p_pdev', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='printencoding', abbreviation='penc', short_desc=N_("encoding to be used for printing"), type='string', scope={'global'}, varname='p_penc', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='printexpr', abbreviation='pexpr', @@ -1766,35 +1765,35 @@ return { type='string', scope={'global'}, secure=true, varname='p_pexpr', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='printfont', abbreviation='pfn', short_desc=N_("name of the font to be used for :hardcopy"), type='string', scope={'global'}, varname='p_pfn', - defaults={if_true={vi="courier"}} + defaults={if_true="courier"} }, { full_name='printheader', abbreviation='pheader', short_desc=N_("format of the header used for :hardcopy"), type='string', scope={'global'}, varname='p_header', - defaults={if_true={vi="%<%f%h%m%=Page %N"}} + defaults={if_true="%<%f%h%m%=Page %N"} }, { full_name='printmbcharset', abbreviation='pmbcs', short_desc=N_("CJK character set to be used for :hardcopy"), type='string', scope={'global'}, varname='p_pmcs', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='printmbfont', abbreviation='pmbfn', short_desc=N_("font names to be used for CJK output of :hardcopy"), type='string', scope={'global'}, varname='p_pmfn', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='printoptions', abbreviation='popt', @@ -1802,14 +1801,14 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_popt', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='prompt', short_desc=N_("enable prompt in Ex mode"), type='bool', scope={'global'}, varname='p_force_on', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='pumblend', abbreviation='pb', @@ -1817,21 +1816,21 @@ return { type='number', scope={'global'}, redraw={'ui_option'}, varname='p_pb', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='pumheight', abbreviation='ph', short_desc=N_("maximum height of the popup menu"), type='number', scope={'global'}, varname='p_ph', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='pumwidth', abbreviation='pw', short_desc=N_("minimum width of the popup menu"), type='number', scope={'global'}, varname='p_pw', - defaults={if_true={vi=15}} + defaults={if_true=15} }, { full_name='pyxversion', abbreviation='pyx', @@ -1839,14 +1838,14 @@ return { type='number', scope={'global'}, secure=true, varname='p_pyx', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='quickfixtextfunc', abbreviation='qftf', short_desc=N_("customize the quickfix window"), type='string', scope={'global'}, varname='p_qftf', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='quoteescape', abbreviation='qe', @@ -1854,7 +1853,7 @@ return { type='string', scope={'buffer'}, alloced=true, varname='p_qe', - defaults={if_true={vi="\\"}} + defaults={if_true="\\"} }, { full_name='readonly', abbreviation='ro', @@ -1863,63 +1862,63 @@ return { noglob=true, redraw={'statuslines'}, varname='p_ro', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='redrawdebug', abbreviation='rdb', short_desc=N_("Changes the way redrawing works (debug)"), type='string', list='onecomma', scope={'global'}, varname='p_rdb', - defaults={if_true={vi=''}} + defaults={if_true=''} }, { full_name='redrawtime', abbreviation='rdt', short_desc=N_("timeout for 'hlsearch' and |:match| highlighting"), type='number', scope={'global'}, varname='p_rdt', - defaults={if_true={vi=2000}} + defaults={if_true=2000} }, { full_name='regexpengine', abbreviation='re', short_desc=N_("default regexp engine to use"), type='number', scope={'global'}, varname='p_re', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='relativenumber', abbreviation='rnu', short_desc=N_("show relative line number in front of each line"), type='bool', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='remap', short_desc=N_("mappings to work recursively"), type='bool', scope={'global'}, varname='p_remap', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='report', short_desc=N_("for reporting nr. of lines changed"), type='number', scope={'global'}, varname='p_report', - defaults={if_true={vi=2}} + defaults={if_true=2} }, { full_name='revins', abbreviation='ri', short_desc=N_("inserting characters will work backwards"), type='bool', scope={'global'}, varname='p_ri', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='rightleft', abbreviation='rl', short_desc=N_("window is right-to-left oriented"), type='bool', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='rightleftcmd', abbreviation='rlc', @@ -1927,7 +1926,7 @@ return { type='string', scope={'window'}, alloced=true, redraw={'current_window'}, - defaults={if_true={vi="search"}} + defaults={if_true="search"} }, { full_name='ruler', abbreviation='ru', @@ -1935,7 +1934,7 @@ return { type='bool', scope={'global'}, redraw={'statuslines'}, varname='p_ru', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='rulerformat', abbreviation='ruf', @@ -1945,7 +1944,7 @@ return { modelineexpr=true, redraw={'statuslines'}, varname='p_ruf', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='runtimepath', abbreviation='rtp', @@ -1955,7 +1954,7 @@ return { secure=true, expand='nodefault', varname='p_rtp', - defaults={if_true={vi=''}} + defaults={if_true=''} }, { full_name='scroll', abbreviation='scr', @@ -1963,7 +1962,7 @@ return { type='number', scope={'window'}, no_mkrc=true, pv_name='p_scroll', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='scrollback', abbreviation='scbk', @@ -1971,21 +1970,21 @@ return { type='number', scope={'buffer'}, varname='p_scbk', redraw={'current_buffer'}, - defaults={if_true={vi=-1}} + defaults={if_true=-1} }, { full_name='scrollbind', abbreviation='scb', short_desc=N_("scroll in window as other windows scroll"), type='bool', scope={'window'}, pv_name='p_scbind', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='scrolljump', abbreviation='sj', short_desc=N_("minimum number of lines to scroll"), type='number', scope={'global'}, varname='p_sj', - defaults={if_true={vi=1}} + defaults={if_true=1} }, { full_name='scrolloff', abbreviation='so', @@ -1993,7 +1992,7 @@ return { type='number', scope={'global', 'window'}, redraw={'all_windows'}, varname='p_so', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='scrollopt', abbreviation='sbo', @@ -2001,14 +2000,14 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_sbo', - defaults={if_true={vi="ver,jump"}} + defaults={if_true="ver,jump"} }, { full_name='sections', abbreviation='sect', short_desc=N_("nroff macros that separate sections"), type='string', scope={'global'}, varname='p_sections', - defaults={if_true={vi="SHNHH HUnhsh"}} + defaults={if_true="SHNHH HUnhsh"} }, { full_name='secure', @@ -2016,14 +2015,14 @@ return { type='bool', scope={'global'}, secure=true, varname='p_secure', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='selection', abbreviation='sel', short_desc=N_("what type of selection to use"), type='string', scope={'global'}, varname='p_sel', - defaults={if_true={vi="inclusive"}} + defaults={if_true="inclusive"} }, { full_name='selectmode', abbreviation='slm', @@ -2031,7 +2030,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_slm', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='sessionoptions', abbreviation='ssop', @@ -2039,9 +2038,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_ssop', - defaults={if_true={ - vim="blank,buffers,curdir,folds,help,tabpages,winsize" - }} + defaults={if_true="blank,buffers,curdir,folds,help,tabpages,winsize"} }, { full_name='shada', abbreviation='sd', @@ -2050,7 +2047,7 @@ return { deny_duplicates=true, secure=true, varname='p_shada', - defaults={if_true={vim="!,'100,<50,s10,h"}} + defaults={if_true="!,'100,<50,s10,h"} }, { full_name='shadafile', abbreviation='sdf', @@ -2060,7 +2057,7 @@ return { secure=true, expand=true, varname='p_shadafile', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='shell', abbreviation='sh', @@ -2071,8 +2068,8 @@ return { varname='p_sh', defaults={ condition='WIN32', - if_true={vi="cmd.exe"}, - if_false={vi="sh"} + if_true="cmd.exe", + if_false="sh" } }, { @@ -2083,8 +2080,8 @@ return { varname='p_shcf', defaults={ condition='WIN32', - if_true={vi="/s /c"}, - if_false={vi="-c"} + if_true="/s /c", + if_false="-c" } }, { @@ -2095,8 +2092,8 @@ return { varname='p_sp', defaults={ condition='WIN32', - if_true={vi=">%s 2>&1"}, - if_false={vi="| tee"}, + if_true=">%s 2>&1", + if_false="| tee", } }, { @@ -2105,7 +2102,7 @@ return { type='string', scope={'global'}, secure=true, varname='p_shq', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='shellredir', abbreviation='srr', @@ -2115,8 +2112,8 @@ return { varname='p_srr', defaults={ condition='WIN32', - if_true={vi=">%s 2>&1"}, - if_false={vi=">"} + if_true=">%s 2>&1", + if_false=">" } }, { @@ -2125,14 +2122,14 @@ return { type='bool', scope={'global'}, varname='p_ssl', enable_if='BACKSLASH_IN_FILENAME', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='shelltemp', abbreviation='stmp', short_desc=N_("whether to use a temp file for shell commands"), type='bool', scope={'global'}, varname='p_stmp', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='shellxquote', abbreviation='sxq', @@ -2142,8 +2139,8 @@ return { varname='p_sxq', defaults={ condition='WIN32', - if_true={vi="\""}, - if_false={vi=""}, + if_true="\"", + if_false="", } }, { @@ -2152,28 +2149,28 @@ return { type='string', scope={'global'}, secure=true, varname='p_sxe', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='shiftround', abbreviation='sr', short_desc=N_("round indent to multiple of shiftwidth"), type='bool', scope={'global'}, varname='p_sr', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='shiftwidth', abbreviation='sw', short_desc=N_("number of spaces to use for (auto)indent step"), type='number', scope={'buffer'}, varname='p_sw', - defaults={if_true={vi=8}} + defaults={if_true=8} }, { full_name='shortmess', abbreviation='shm', short_desc=N_("list of flags, reduce length of messages"), type='string', list='flags', scope={'global'}, varname='p_shm', - defaults={if_true={vim="filnxtToOF"}} + defaults={if_true="filnxtToOF"} }, { full_name='showbreak', abbreviation='sbr', @@ -2181,35 +2178,35 @@ return { type='string', scope={'global'}, redraw={'all_windows'}, varname='p_sbr', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='showcmd', abbreviation='sc', short_desc=N_("show (partial) command in status line"), type='bool', scope={'global'}, varname='p_sc', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='showfulltag', abbreviation='sft', short_desc=N_("show full tag pattern when completing tag"), type='bool', scope={'global'}, varname='p_sft', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='showmatch', abbreviation='sm', short_desc=N_("briefly jump to matching bracket if insert one"), type='bool', scope={'global'}, varname='p_sm', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='showmode', abbreviation='smd', short_desc=N_("message on status line to show current mode"), type='bool', scope={'global'}, varname='p_smd', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='showtabline', abbreviation='stal', @@ -2217,14 +2214,14 @@ return { type='number', scope={'global'}, redraw={'all_windows', 'ui_option'}, varname='p_stal', - defaults={if_true={vi=1}} + defaults={if_true=1} }, { full_name='sidescroll', abbreviation='ss', short_desc=N_("minimum number of columns to scroll horizontal"), type='number', scope={'global'}, varname='p_ss', - defaults={if_true={vi=1}} + defaults={if_true=1} }, { full_name='sidescrolloff', abbreviation='siso', @@ -2232,7 +2229,7 @@ return { type='number', scope={'global', 'window'}, redraw={'all_windows'}, varname='p_siso', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='signcolumn', abbreviation='scl', @@ -2240,42 +2237,42 @@ return { type='string', scope={'window'}, alloced=true, redraw={'current_window'}, - defaults={if_true={vi="auto"}} + defaults={if_true="auto"} }, { full_name='smartcase', abbreviation='scs', short_desc=N_("no ignore case when pattern has uppercase"), type='bool', scope={'global'}, varname='p_scs', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='smartindent', abbreviation='si', short_desc=N_("smart autoindenting for C programs"), type='bool', scope={'buffer'}, varname='p_si', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='smarttab', abbreviation='sta', short_desc=N_("use 'shiftwidth' when inserting <Tab>"), type='bool', scope={'global'}, varname='p_sta', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='softtabstop', abbreviation='sts', short_desc=N_("number of spaces that <Tab> uses while editing"), type='number', scope={'buffer'}, varname='p_sts', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='spell', short_desc=N_("spell checking"), type='bool', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='spellcapcheck', abbreviation='spc', @@ -2284,7 +2281,7 @@ return { alloced=true, redraw={'current_buffer'}, varname='p_spc', - defaults={if_true={vi="[.?!]\\_[\\])'\" ]\\+"}} + defaults={if_true="[.?!]\\_[\\])'\" ]\\+"} }, { full_name='spellfile', abbreviation='spf', @@ -2295,7 +2292,7 @@ return { alloced=true, expand=true, varname='p_spf', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='spelllang', abbreviation='spl', @@ -2306,7 +2303,7 @@ return { expand=true, redraw={'current_buffer'}, varname='p_spl', - defaults={if_true={vi="en"}} + defaults={if_true="en"} }, { full_name='spellsuggest', abbreviation='sps', @@ -2316,7 +2313,7 @@ return { secure=true, expand=true, varname='p_sps', - defaults={if_true={vi="best"}} + defaults={if_true="best"} }, { full_name='spelloptions', abbreviation='spo', @@ -2325,21 +2322,21 @@ return { secure=true, expand=true, varname='p_spo', - defaults={if_true={vim=""}} + defaults={if_true=""} }, { full_name='splitbelow', abbreviation='sb', short_desc=N_("new window from split is below the current one"), type='bool', scope={'global'}, varname='p_sb', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='splitright', abbreviation='spr', short_desc=N_("new window is put right of the current one"), type='bool', scope={'global'}, varname='p_spr', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='startofline', abbreviation='sol', @@ -2347,7 +2344,7 @@ return { type='bool', scope={'global'}, vim=false, varname='p_sol', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='statusline', abbreviation='stl', @@ -2357,7 +2354,7 @@ return { modelineexpr=true, redraw={'statuslines'}, varname='p_stl', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='suffixes', abbreviation='su', @@ -2365,7 +2362,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_su', - defaults={if_true={vi=".bak,~,.o,.h,.info,.swp,.obj"}} + defaults={if_true=".bak,~,.o,.h,.info,.swp,.obj"} }, { full_name='suffixesadd', abbreviation='sua', @@ -2374,7 +2371,7 @@ return { deny_duplicates=true, alloced=true, varname='p_sua', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='swapfile', abbreviation='swf', @@ -2382,7 +2379,7 @@ return { type='bool', scope={'buffer'}, redraw={'statuslines'}, varname='p_swf', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='switchbuf', abbreviation='swb', @@ -2390,7 +2387,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_swb', - defaults={if_true={vi=""}} + defaults={if_true="uselast"} }, { full_name='synmaxcol', abbreviation='smc', @@ -2398,7 +2395,7 @@ return { type='number', scope={'buffer'}, redraw={'current_buffer'}, varname='p_smc', - defaults={if_true={vi=3000}} + defaults={if_true=3000} }, { full_name='syntax', abbreviation='syn', @@ -2408,14 +2405,14 @@ return { normal_fname_chars=true, alloced=true, varname='p_syn', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='tagfunc', abbreviation='tfu', short_desc=N_("function used to perform tag searches"), type='string', scope={'buffer'}, varname='p_tfu', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='tabline', abbreviation='tal', @@ -2424,14 +2421,14 @@ return { modelineexpr=true, redraw={'all_windows'}, varname='p_tal', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='tabpagemax', abbreviation='tpm', short_desc=N_("maximum number of tab pages for |-p| and \"tab all\""), type='number', scope={'global'}, varname='p_tpm', - defaults={if_true={vim=50}} + defaults={if_true=50} }, { full_name='tabstop', abbreviation='ts', @@ -2439,35 +2436,35 @@ return { type='number', scope={'buffer'}, redraw={'current_buffer'}, varname='p_ts', - defaults={if_true={vi=8}} + defaults={if_true=8} }, { full_name='tagbsearch', abbreviation='tbs', short_desc=N_("use binary searching in tags files"), type='bool', scope={'global'}, varname='p_tbs', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='tagcase', abbreviation='tc', short_desc=N_("how to handle case when searching in tags files"), type='string', scope={'global', 'buffer'}, varname='p_tc', - defaults={if_true={vim="followic"}} + defaults={if_true="followic"} }, { full_name='taglength', abbreviation='tl', short_desc=N_("number of significant characters for a tag"), type='number', scope={'global'}, varname='p_tl', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='tagrelative', abbreviation='tr', short_desc=N_("file names in tag file are relative"), type='bool', scope={'global'}, varname='p_tr', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='tags', abbreviation='tag', @@ -2476,27 +2473,27 @@ return { deny_duplicates=true, expand=true, varname='p_tags', - defaults={if_true={vi="./tags;,tags"}} + defaults={if_true="./tags;,tags"} }, { full_name='tagstack', abbreviation='tgst', short_desc=N_("push tags onto the tag stack"), type='bool', scope={'global'}, varname='p_tgst', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='termbidi', abbreviation='tbidi', short_desc=N_("terminal takes care of bi-directionality"), type='bool', scope={'global'}, varname='p_tbidi', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='termencoding', abbreviation='tenc', short_desc=N_("Terminal encodig"), type='string', scope={'global'}, - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='termguicolors', abbreviation='tgc', @@ -2504,21 +2501,21 @@ return { type='bool', scope={'global'}, redraw={'ui_option'}, varname='p_tgc', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='termpastefilter', abbreviation='tpf', type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_tpf', - defaults={if_true={vim="BS,HT,ESC,DEL"}} + defaults={if_true="BS,HT,ESC,DEL"} }, { full_name='terse', short_desc=N_("hides notification of search wrap"), type='bool', scope={'global'}, varname='p_terse', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='textwidth', abbreviation='tw', @@ -2526,7 +2523,7 @@ return { type='number', scope={'buffer'}, redraw={'current_buffer'}, varname='p_tw', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='thesaurus', abbreviation='tsr', @@ -2536,42 +2533,42 @@ return { normal_dname_chars=true, expand=true, varname='p_tsr', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='tildeop', abbreviation='top', short_desc=N_("tilde command \"~\" behaves like an operator"), type='bool', scope={'global'}, varname='p_to', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='timeout', abbreviation='to', short_desc=N_("time out on mappings and key codes"), type='bool', scope={'global'}, varname='p_timeout', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='timeoutlen', abbreviation='tm', short_desc=N_("time out time in milliseconds"), type='number', scope={'global'}, varname='p_tm', - defaults={if_true={vi=1000}} + defaults={if_true=1000} }, { full_name='title', short_desc=N_("Vim set the title of the window"), type='bool', scope={'global'}, varname='p_title', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='titlelen', short_desc=N_("of 'columns' used for window title"), type='number', scope={'global'}, varname='p_titlelen', - defaults={if_true={vi=85}} + defaults={if_true=85} }, { full_name='titleold', @@ -2580,7 +2577,7 @@ return { secure=true, no_mkrc=true, varname='p_titleold', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='titlestring', @@ -2588,7 +2585,7 @@ return { type='string', scope={'global'}, modelineexpr=true, varname='p_titlestring', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='ttimeout', @@ -2596,7 +2593,7 @@ return { type='bool', scope={'global'}, redraw={'ui_option'}, varname='p_ttimeout', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='ttimeoutlen', abbreviation='ttm', @@ -2604,7 +2601,7 @@ return { type='number', scope={'global'}, redraw={'ui_option'}, varname='p_ttm', - defaults={if_true={vi=50}} + defaults={if_true=50} }, { full_name='ttyfast', abbreviation='tf', @@ -2612,7 +2609,7 @@ return { type='bool', scope={'global'}, no_mkrc=true, varname='p_force_on', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='undodir', abbreviation='udir', @@ -2622,49 +2619,49 @@ return { secure=true, expand='nodefault', varname='p_udir', - defaults={if_true={vi=''}} + defaults={if_true=''} }, { full_name='undofile', abbreviation='udf', short_desc=N_("save undo information in a file"), type='bool', scope={'buffer'}, varname='p_udf', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='undolevels', abbreviation='ul', short_desc=N_("maximum number of changes that can be undone"), type='number', scope={'global', 'buffer'}, varname='p_ul', - defaults={if_true={vi=1000}} + defaults={if_true=1000} }, { full_name='undoreload', abbreviation='ur', short_desc=N_("max nr of lines to save for undo on a buffer reload"), type='number', scope={'global'}, varname='p_ur', - defaults={if_true={vi=10000}} + defaults={if_true=10000} }, { full_name='updatecount', abbreviation='uc', short_desc=N_("after this many characters flush swap file"), type='number', scope={'global'}, varname='p_uc', - defaults={if_true={vi=200}} + defaults={if_true=200} }, { full_name='updatetime', abbreviation='ut', short_desc=N_("after this many milliseconds flush swap file"), type='number', scope={'global'}, varname='p_ut', - defaults={if_true={vi=4000}} + defaults={if_true=4000} }, { full_name='varsofttabstop', abbreviation='vsts', short_desc=N_("list of numbers of spaces that <Tab> uses while editing"), type='string', list='comma', scope={'buffer'}, varname='p_vsts', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='vartabstop', abbreviation='vts', @@ -2672,14 +2669,14 @@ return { type='string', list='comma', scope={'buffer'}, varname='p_vts', redraw={'current_buffer'}, - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='verbose', abbreviation='vbs', short_desc=N_("give informative messages"), type='number', scope={'global'}, varname='p_verbose', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='verbosefile', abbreviation='vfile', @@ -2688,7 +2685,7 @@ return { secure=true, expand=true, varname='p_vfile', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='viewdir', abbreviation='vdir', @@ -2697,7 +2694,7 @@ return { secure=true, expand='nodefault', varname='p_vdir', - defaults={if_true={vi=''}} + defaults={if_true=''} }, { full_name='viewoptions', abbreviation='vop', @@ -2705,7 +2702,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_vop', - defaults={if_true={vi="folds,options,cursor,curdir"}} + defaults={if_true="folds,cursor,curdir"} }, { -- Alias for "shada". @@ -2726,42 +2723,42 @@ return { deny_duplicates=true, redraw={'curswant'}, varname='p_ve', - defaults={if_true={vim=""}} + defaults={if_true=""} }, { full_name='visualbell', abbreviation='vb', short_desc=N_("use visual bell instead of beeping"), type='bool', scope={'global'}, varname='p_vb', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='warn', short_desc=N_("for shell command when buffer was changed"), type='bool', scope={'global'}, varname='p_warn', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='whichwrap', abbreviation='ww', short_desc=N_("allow specified keys to cross line boundaries"), type='string', list='flagscomma', scope={'global'}, varname='p_ww', - defaults={if_true={vim="b,s"}} + defaults={if_true="b,s"} }, { full_name='wildchar', abbreviation='wc', short_desc=N_("command-line character for wildcard expansion"), type='number', scope={'global'}, varname='p_wc', - defaults={if_true={vim=imacros('TAB')}} + defaults={if_true=imacros('TAB')} }, { full_name='wildcharm', abbreviation='wcm', short_desc=N_("like 'wildchar' but also works when mapped"), type='number', scope={'global'}, varname='p_wcm', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='wildignore', abbreviation='wig', @@ -2769,21 +2766,21 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_wig', - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='wildignorecase', abbreviation='wic', short_desc=N_("ignore case when completing file names"), type='bool', scope={'global'}, varname='p_wic', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='wildmenu', abbreviation='wmnu', short_desc=N_("use menu for command line completion"), type='bool', scope={'global'}, varname='p_wmnu', - defaults={if_true={vim=true}} + defaults={if_true=true} }, { full_name='wildmode', abbreviation='wim', @@ -2791,7 +2788,7 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=false, varname='p_wim', - defaults={if_true={vim="full"}} + defaults={if_true="full"} }, { full_name='wildoptions', abbreviation='wop', @@ -2799,21 +2796,21 @@ return { type='string', list='onecomma', scope={'global'}, deny_duplicates=true, varname='p_wop', - defaults={if_true={vim='pum,tagfile'}} + defaults={if_true='pum,tagfile'} }, { full_name='winaltkeys', abbreviation='wak', short_desc=N_("when the windows system handles ALT keys"), type='string', scope={'global'}, varname='p_wak', - defaults={if_true={vi="menu"}} + defaults={if_true="menu"} }, { full_name='winblend', abbreviation='winbl', short_desc=N_("Controls transparency level for floating windows"), type='number', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='winhighlight', abbreviation='winhl', @@ -2821,105 +2818,105 @@ return { type='string', scope={'window'}, alloced=true, redraw={'current_window'}, - defaults={if_true={vi=""}} + defaults={if_true=""} }, { full_name='window', abbreviation='wi', short_desc=N_("nr of lines to scroll for CTRL-F and CTRL-B"), type='number', scope={'global'}, varname='p_window', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='winheight', abbreviation='wh', short_desc=N_("minimum number of lines for the current window"), type='number', scope={'global'}, varname='p_wh', - defaults={if_true={vi=1}} + defaults={if_true=1} }, { full_name='winfixheight', abbreviation='wfh', short_desc=N_("keep window height when opening/closing windows"), type='bool', scope={'window'}, redraw={'statuslines'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='winfixwidth', abbreviation='wfw', short_desc=N_("keep window width when opening/closing windows"), type='bool', scope={'window'}, redraw={'statuslines'}, - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='winminheight', abbreviation='wmh', short_desc=N_("minimum number of lines for any window"), type='number', scope={'global'}, varname='p_wmh', - defaults={if_true={vi=1}} + defaults={if_true=1} }, { full_name='winminwidth', abbreviation='wmw', short_desc=N_("minimal number of columns for any window"), type='number', scope={'global'}, varname='p_wmw', - defaults={if_true={vi=1}} + defaults={if_true=1} }, { full_name='winwidth', abbreviation='wiw', short_desc=N_("minimal number of columns for current window"), type='number', scope={'global'}, varname='p_wiw', - defaults={if_true={vi=20}} + defaults={if_true=20} }, { full_name='wrap', short_desc=N_("lines wrap and continue on the next line"), type='bool', scope={'window'}, redraw={'current_window'}, - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='wrapmargin', abbreviation='wm', short_desc=N_("chars from the right where wrapping starts"), type='number', scope={'buffer'}, varname='p_wm', - defaults={if_true={vi=0}} + defaults={if_true=0} }, { full_name='wrapscan', abbreviation='ws', short_desc=N_("searches wrap around the end of the file"), type='bool', scope={'global'}, varname='p_ws', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='write', short_desc=N_("to a file is allowed"), type='bool', scope={'global'}, varname='p_write', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='writeany', abbreviation='wa', short_desc=N_("write to file with no need for \"!\" override"), type='bool', scope={'global'}, varname='p_wa', - defaults={if_true={vi=false}} + defaults={if_true=false} }, { full_name='writebackup', abbreviation='wb', short_desc=N_("make a backup before overwriting a file"), type='bool', scope={'global'}, varname='p_wb', - defaults={if_true={vi=true}} + defaults={if_true=true} }, { full_name='writedelay', abbreviation='wd', short_desc=N_("delay this many msec for each char (for debug)"), type='number', scope={'global'}, varname='p_wd', - defaults={if_true={vi=0}} + defaults={if_true=0} }, } } diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index 008f5ef63b..92b5e14824 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -35,12 +35,11 @@ // Because `uv_os_getenv` requires allocating, we must manage a map to maintain // the behavior of `os_getenv`. -static PMap(cstr_t) *envmap; +static PMap(cstr_t) envmap = MAP_INIT; static uv_mutex_t mutex; void env_init(void) { - envmap = pmap_new(cstr_t)(); uv_mutex_init(&mutex); } @@ -66,8 +65,8 @@ const char *os_getenv(const char *name) } uv_mutex_lock(&mutex); int r = 0; - if (pmap_has(cstr_t)(envmap, name) - && !!(e = (char *)pmap_get(cstr_t)(envmap, name))) { + if (pmap_has(cstr_t)(&envmap, name) + && !!(e = (char *)pmap_get(cstr_t)(&envmap, name))) { if (e[0] != '\0') { // Found non-empty cached env var. // NOTE: This risks incoherence if an in-process library changes the @@ -75,7 +74,7 @@ const char *os_getenv(const char *name) // that turns out to be a problem, we can just remove this codepath. goto end; } - pmap_del2(envmap, name); + pmap_del2(&envmap, name); } e = xmalloc(size); r = uv_os_getenv(name, e, &size); @@ -88,7 +87,7 @@ const char *os_getenv(const char *name) e = NULL; goto end; } - pmap_put(cstr_t)(envmap, xstrdup(name), e); + pmap_put(cstr_t)(&envmap, xstrdup(name), e); end: // Must do this before ELOG, log.c may call os_setenv. uv_mutex_unlock(&mutex); @@ -157,7 +156,7 @@ int os_setenv(const char *name, const char *value, int overwrite) assert(r != UV_EINVAL); // Destroy the old map item. Do this AFTER uv_os_setenv(), because `value` // could be a previous os_getenv() result. - pmap_del2(envmap, name); + pmap_del2(&envmap, name); // Must do this before ELOG, log.c may call os_setenv. uv_mutex_unlock(&mutex); if (r != 0) { @@ -174,7 +173,7 @@ int os_unsetenv(const char *name) return -1; } uv_mutex_lock(&mutex); - pmap_del2(envmap, name); + pmap_del2(&envmap, name); int r = uv_os_unsetenv(name); // Must do this before ELOG, log.c may call os_setenv. uv_mutex_unlock(&mutex); diff --git a/src/nvim/os_unix.c b/src/nvim/os_unix.c index be4bd9709b..44274e8f1d 100644 --- a/src/nvim/os_unix.c +++ b/src/nvim/os_unix.c @@ -7,7 +7,6 @@ #include <stdbool.h> #include <string.h> -#include "nvim/api/private/handle.h" #include "nvim/vim.h" #include "nvim/ascii.h" #include "nvim/os_unix.h" diff --git a/src/nvim/runtime.c b/src/nvim/runtime.c index c3cd210538..4da81f29e3 100644 --- a/src/nvim/runtime.c +++ b/src/nvim/runtime.c @@ -403,8 +403,10 @@ theend: return retval; } -/// Load scripts in "plugin" and "ftdetect" directories of the package. -static int load_pack_plugin(char_u *fname) +/// Load scripts in "plugin" directory of the package. +/// For opt packages, also load scripts in "ftdetect" (start packages already +/// load these from filetype.vim) +static int load_pack_plugin(bool opt, char_u *fname) { static const char *ftpat = "%s/ftdetect/*.vim"; // NOLINT @@ -421,7 +423,7 @@ static int load_pack_plugin(char_u *fname) // If runtime/filetype.vim wasn't loaded yet, the scripts will be // found when it loads. - if (eval_to_number(cmd) > 0) { + if (opt && eval_to_number(cmd) > 0) { do_cmdline_cmd("augroup filetypedetect"); vim_snprintf((char *)pat, len, ftpat, ffname); source_all_matches(pat); @@ -441,7 +443,7 @@ static int APP_ADD_DIR; static int APP_LOAD; static int APP_BOTH; -static void add_pack_plugin(char_u *fname, void *cookie) +static void add_pack_plugin(bool opt, char_u *fname, void *cookie) { if (cookie != &APP_LOAD) { char *buf = xmalloc(MAXPATHL); @@ -465,17 +467,27 @@ static void add_pack_plugin(char_u *fname, void *cookie) } if (cookie != &APP_ADD_DIR) { - load_pack_plugin(fname); + load_pack_plugin(opt, fname); } } +static void add_start_pack_plugin(char_u *fname, void *cookie) +{ + add_pack_plugin(false, fname, cookie); +} + +static void add_opt_pack_plugin(char_u *fname, void *cookie) +{ + add_pack_plugin(true, fname, cookie); +} + /// Add all packages in the "start" directory to 'runtimepath'. void add_pack_start_dirs(void) { do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR, // NOLINT - add_pack_plugin, &APP_ADD_DIR); + add_start_pack_plugin, &APP_ADD_DIR); do_in_path(p_pp, (char_u *)"start/*", DIP_ALL + DIP_DIR, // NOLINT - add_pack_plugin, &APP_ADD_DIR); + add_start_pack_plugin, &APP_ADD_DIR); } /// Load plugins from all packages in the "start" directory. @@ -483,9 +495,9 @@ void load_start_packages(void) { did_source_packages = true; do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR, // NOLINT - add_pack_plugin, &APP_LOAD); + add_start_pack_plugin, &APP_LOAD); do_in_path(p_pp, (char_u *)"start/*", DIP_ALL + DIP_DIR, // NOLINT - add_pack_plugin, &APP_LOAD); + add_start_pack_plugin, &APP_LOAD); } // ":packloadall" @@ -522,7 +534,8 @@ void ex_packadd(exarg_T *eap) res = do_in_path(p_pp, (char_u *)pat, DIP_ALL + DIP_DIR + (round == 2 && res == FAIL ? DIP_ERR : 0), - add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH); + round == 1 ? add_start_pack_plugin : add_opt_pack_plugin, + eap->forceit ? &APP_ADD_DIR : &APP_BOTH); xfree(pat); } } diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 38ed2816ba..208ae3488f 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -324,8 +324,7 @@ void update_curbuf(int type) /// @param type set to a NOT_VALID to force redraw of entire screen int update_screen(int type) { - static int did_intro = FALSE; - int did_one; + static bool did_intro = false; // Don't do anything if the screen structures are (not yet) valid. // A VimResized autocmd can invoke redrawing in the middle of a resize, @@ -578,7 +577,7 @@ int update_screen(int type) * Go from top to bottom through the windows, redrawing the ones that need * it. */ - did_one = FALSE; + bool did_one = false; search_hl.rm.regprog = NULL; @@ -597,7 +596,7 @@ int update_screen(int type) if (wp->w_redr_type != 0) { if (!did_one) { - did_one = TRUE; + did_one = true; start_search_hl(); } win_update(wp, &providers); @@ -635,7 +634,7 @@ int update_screen(int type) /* May put up an introductory message when not editing a file */ if (!did_intro) maybe_intro_message(); - did_intro = TRUE; + did_intro = true; for (size_t i = 0; i < kv_size(providers); i++) { DecorProvider *p = kv_A(providers, i); @@ -747,8 +746,7 @@ static void win_update(win_T *wp, Providers *providers) updating. 0 when no mid area updating. */ int bot_start = 999; /* first row of the bot area that needs updating. 999 when no bot area updating */ - int scrolled_down = FALSE; /* TRUE when scrolled down when - w_topline got smaller a bit */ + bool scrolled_down = false; // true when scrolled down when w_topline got smaller a bit bool top_to_mod = false; // redraw above mod_top int row; /* current window row to display */ @@ -756,8 +754,8 @@ static void win_update(win_T *wp, Providers *providers) int idx; /* current index in w_lines[] */ int srow; /* starting row of the current line */ - int eof = FALSE; /* if TRUE, we hit the end of the file */ - int didline = FALSE; /* if TRUE, we finished the last line */ + bool eof = false; // if true, we hit the end of the file + bool didline = false; // if true, we finished the last line int i; long j; static bool recursive = false; // being called recursively @@ -1339,7 +1337,7 @@ static void win_update(win_T *wp, Providers *providers) /* stop updating when hit the end of the file */ if (lnum > buf->b_ml.ml_line_count) { - eof = TRUE; + eof = true; break; } @@ -1596,7 +1594,7 @@ static void win_update(win_T *wp, Providers *providers) } if (lnum > buf->b_ml.ml_line_count) { - eof = TRUE; + eof = true; break; } } @@ -1841,10 +1839,10 @@ static void win_draw_end(win_T *wp, int c1, int c2, bool draw_margin, int row, } -/* - * Advance **color_cols and return TRUE when there are columns to draw. - */ -static int advance_color_col(int vcol, int **color_cols) +/// Advance **color_cols +/// +/// @return true when there are columns to draw. +static bool advance_color_col(int vcol, int **color_cols) { while (**color_cols >= 0 && vcol > **color_cols) ++*color_cols; @@ -2062,7 +2060,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int has_syntax = FALSE; /* this buffer has syntax highl. */ int save_did_emsg; int eol_hl_off = 0; // 1 if highlighted char after EOL - int draw_color_col = false; // highlight colorcolumn + bool draw_color_col = false; // highlight colorcolumn int *color_cols = NULL; // pointer to according columns array bool has_spell = false; // this buffer has spell checking # define SPWORDLEN 150 @@ -2139,7 +2137,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int syntax_seqnr = 0; int prev_syntax_id = 0; int conceal_attr = win_hl_attr(wp, HLF_CONCEAL); - int is_concealing = false; + bool is_concealing = false; int boguscols = 0; ///< nonexistent columns added to ///< force wrapping int vcol_off = 0; ///< offset for concealed characters @@ -2381,13 +2379,12 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, && wp->w_p_culopt_flags != CULOPT_NBR) { cul_screenline = (wp->w_p_wrap && (wp->w_p_culopt_flags & CULOPT_SCRLINE)); - cul_attr = win_hl_attr(wp, HLF_CUL); - HlAttrs ae = syn_attr2entry(cul_attr); - - // We make a compromise here (#7383): - // * low-priority CursorLine if fg is not set - // * high-priority ("same as Vim" priority) CursorLine if fg is set if (!cul_screenline) { + cul_attr = win_hl_attr(wp, HLF_CUL); + HlAttrs ae = syn_attr2entry(cul_attr); + // We make a compromise here (#7383): + // * low-priority CursorLine if fg is not set + // * high-priority ("same as Vim" priority) CursorLine if fg is set if (ae.rgb_fg_color == -1 && ae.cterm_fg_color == 0) { line_attr_lowprio = cul_attr; } else { @@ -2399,7 +2396,6 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, } } } else { - cul_attr = 0; margin_columns_win(wp, &left_curline_col, &right_curline_col); } area_highlighting = true; @@ -2432,7 +2428,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, line_attr_lowprio_save = line_attr_lowprio; } - line = ml_get_buf(wp->w_buffer, lnum, FALSE); + line = ml_get_buf(wp->w_buffer, lnum, false); ptr = line; if (has_spell && !number_only) { @@ -2564,8 +2560,8 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, wp->w_cursor.col = linecol; len = spell_move_to(wp, FORWARD, TRUE, TRUE, &spell_hlf); - /* spell_move_to() may call ml_get() and make "line" invalid */ - line = ml_get_buf(wp->w_buffer, lnum, FALSE); + // spell_move_to() may call ml_get() and make "line" invalid + line = ml_get_buf(wp->w_buffer, lnum, false); ptr = line + linecol; if (len == 0 || (int)wp->w_cursor.col > ptr - line) { @@ -2700,6 +2696,12 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, // Skip this quickly when working on the text. if (draw_state != WL_LINE) { + if (cul_screenline) { + cul_attr = 0; + line_attr = line_attr_save; + line_attr_lowprio = line_attr_lowprio_save; + } + if (draw_state == WL_CMDLINE - 1 && n_extra == 0) { draw_state = WL_CMDLINE; if (cmdwin_type != 0 && wp == curwin) { @@ -2855,9 +2857,6 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, if (diff_hlf != (hlf_T)0) { char_attr = win_hl_attr(wp, diff_hlf); - if (cul_attr) { - char_attr = hl_combine_attr(char_attr, cul_attr); - } } p_extra = NULL; c_extra = ' '; @@ -2943,21 +2942,20 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, } } - if (cul_screenline) { - if (draw_state == WL_LINE - && vcol >= left_curline_col - && vcol < right_curline_col) { - cul_attr = win_hl_attr(wp, HLF_CUL); - HlAttrs ae = syn_attr2entry(cul_attr); - if (ae.rgb_fg_color == -1 && ae.cterm_fg_color == 0) { - line_attr_lowprio = cul_attr; + if (cul_screenline && draw_state == WL_LINE + && vcol >= left_curline_col + && vcol < right_curline_col) { + cul_attr = win_hl_attr(wp, HLF_CUL); + HlAttrs ae = syn_attr2entry(cul_attr); + if (ae.rgb_fg_color == -1 && ae.cterm_fg_color == 0) { + line_attr_lowprio = cul_attr; + } else { + if (!(State & INSERT) && bt_quickfix(wp->w_buffer) + && qf_current_entry(wp) == lnum) { + line_attr = hl_combine_attr(cul_attr, line_attr); } else { line_attr = cul_attr; } - } else { - cul_attr = 0; - line_attr = line_attr_save; - line_attr_lowprio = line_attr_lowprio_save; } } @@ -3095,9 +3093,9 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, shl == &search_hl ? NULL : cur); pos_inprogress = !(cur == NULL || cur->pos.cur == 0); - /* Need to get the line again, a multi-line regexp - * may have made it invalid. */ - line = ml_get_buf(wp->w_buffer, lnum, FALSE); + // Need to get the line again, a multi-line regexp + // may have made it invalid. + line = ml_get_buf(wp->w_buffer, lnum, false); ptr = line + v; if (shl->lnum == lnum) { @@ -3408,9 +3406,9 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, } else did_emsg = save_did_emsg; - /* Need to get the line again, a multi-line regexp may - * have made it invalid. */ - line = ml_get_buf(wp->w_buffer, lnum, FALSE); + // Need to get the line again, a multi-line regexp may + // have made it invalid. + line = ml_get_buf(wp->w_buffer, lnum, false); ptr = line + v; if (!attr_pri) { @@ -3834,7 +3832,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, n_extra = 0; n_attr = 0; } else if (n_skip == 0) { - is_concealing = TRUE; + is_concealing = true; n_skip = 1; } mb_c = c; @@ -3847,7 +3845,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, } } else { prev_syntax_id = 0; - is_concealing = FALSE; + is_concealing = false; } if (n_skip > 0 && did_decrement_ptr) { @@ -4953,12 +4951,12 @@ win_redr_status_matches ( int fillchar; int attr; int i; - int highlight = TRUE; + bool highlight = true; char_u *selstart = NULL; int selstart_col = 0; char_u *selend = NULL; static int first_match = 0; - int add_left = FALSE; + bool add_left = false; char_u *s; int emenu; int l; @@ -4970,7 +4968,7 @@ win_redr_status_matches ( if (match == -1) { /* don't show match but original text */ match = 0; - highlight = FALSE; + highlight = false; } /* count 1 for the ending ">" */ clen = status_match_len(xp, L_MATCH(match)) + 3; @@ -4979,7 +4977,7 @@ win_redr_status_matches ( else if (match < first_match) { /* jumping left, as far as we can go */ first_match = match; - add_left = TRUE; + add_left = true; } else { /* check if match fits on the screen */ for (i = first_match; i < match; ++i) @@ -4997,8 +4995,9 @@ win_redr_status_matches ( break; } } - if (i == num_matches) - add_left = TRUE; + if (i == num_matches) { + add_left = true; + } } } if (add_left) @@ -5090,7 +5089,7 @@ win_redr_status_matches ( save_p_wmh = p_wmh; p_ls = 2; p_wmh = 0; - last_status(FALSE); + last_status(false); } wild_menu_showing = WM_SHOWN; } @@ -5215,7 +5214,7 @@ static void win_redr_status(win_T *wp) grid_puts(&default_grid, NameBuff, row, (int)(this_ru_col - STRLEN(NameBuff) - 1), attr); - win_redr_ruler(wp, TRUE); + win_redr_ruler(wp, true); } /* @@ -5238,14 +5237,14 @@ static void win_redr_status(win_T *wp) */ static void redraw_custom_statusline(win_T *wp) { - static int entered = false; + static bool entered = false; int saved_did_emsg = did_emsg; /* When called recursively return. This can happen when the statusline * contains an expression that triggers a redraw. */ if (entered) return; - entered = TRUE; + entered = true; did_emsg = false; win_redr_custom(wp, false); @@ -5261,12 +5260,11 @@ static void redraw_custom_statusline(win_T *wp) entered = false; } -/* - * Return TRUE if the status line of window "wp" is connected to the status - * line of the window right of it. If not, then it's a vertical separator. - * Only call if (wp->w_vsep_width != 0). - */ -int stl_connected(win_T *wp) +/// Only call if (wp->w_vsep_width != 0). +/// +/// @return true if the status line of window "wp" is connected to the status +/// line of the window right of it. If not, then it's a vertical separator. +bool stl_connected(win_T *wp) { frame_T *fr; @@ -5276,30 +5274,28 @@ int stl_connected(win_T *wp) if (fr->fr_next != NULL) break; } else { - if (fr->fr_next != NULL) - return TRUE; + if (fr->fr_next != NULL) { + return true; + } } fr = fr->fr_parent; } - return FALSE; + return false; } -/* - * Get the value to show for the language mappings, active 'keymap'. - */ -int -get_keymap_str ( - win_T *wp, - char_u *fmt, // format string containing one %s item - char_u *buf, // buffer for the result - int len // length of buffer -) +/// Get the value to show for the language mappings, active 'keymap'. +/// +/// @param fmt format string containing one %s item +/// @param buf buffer for the result +/// @param len length of buffer +bool get_keymap_str(win_T *wp, char_u *fmt, char_u *buf, int len) { char_u *p; - if (wp->w_buffer->b_p_iminsert != B_IMODE_LMAP) - return FALSE; + if (wp->w_buffer->b_p_iminsert != B_IMODE_LMAP) { + return false; + } { buf_T *old_curbuf = curbuf; @@ -5339,7 +5335,7 @@ win_redr_custom ( bool draw_ruler ) { - static int entered = FALSE; + static bool entered = false; int attr; int curattr; int row; @@ -5365,7 +5361,7 @@ win_redr_custom ( * Avoid trouble by not allowing recursion. */ if (entered) return; - entered = TRUE; + entered = true; /* setup environment for the task at hand */ if (wp == NULL) { @@ -5500,7 +5496,7 @@ win_redr_custom ( } theend: - entered = FALSE; + entered = false; } static void win_redr_border(win_T *wp) @@ -6065,7 +6061,7 @@ next_search_hl ( char_u *ml; matchcol = shl->rm.startpos[0].col; - ml = ml_get_buf(shl->buf, lnum, FALSE) + matchcol; + ml = ml_get_buf(shl->buf, lnum, false) + matchcol; if (*ml == NUL) { ++matchcol; shl->lnum = 0; @@ -7333,11 +7329,10 @@ int messaging(void) return !(p_lz && char_avail() && !KeyTyped); } -/* - * Show current status info in ruler and various other places - * If always is FALSE, only show ruler if position has changed. - */ -void showruler(int always) +/// Show current status info in ruler and various other places +/// +/// @param always if false, only show ruler if position has changed. +void showruler(bool always) { if (!always && !redrawing()) return; @@ -7357,7 +7352,7 @@ void showruler(int always) draw_tabline(); } -static void win_redr_ruler(win_T *wp, int always) +static void win_redr_ruler(win_T *wp, bool always) { static bool did_show_ext_ruler = false; @@ -7619,11 +7614,11 @@ static void margin_columns_win(win_T *wp, int *left_col, int *right_col) /// Set dimensions of the Nvim application "shell". void screen_resize(int width, int height) { - static int busy = FALSE; + static bool recursive = false; // Avoid recursiveness, can happen when setting the window size causes // another window-changed signal. - if (updating_screen || busy) { + if (updating_screen || recursive) { return; } @@ -7643,7 +7638,7 @@ void screen_resize(int width, int height) if (curwin->w_buffer == NULL) return; - ++busy; + recursive = true; Rows = height; Columns = width; @@ -7662,7 +7657,7 @@ void screen_resize(int width, int height) /* The window layout used to be adjusted here, but it now happens in * screenalloc() (also invoked from screenclear()). That is because the - * "busy" check above may skip this, but not screenalloc(). */ + * "recursive" check above may skip this, but not screenalloc(). */ if (State != ASKMORE && State != EXTERNCMD && State != CONFIRM) { screenclear(); @@ -7694,8 +7689,9 @@ void screen_resize(int width, int height) ui_comp_set_screen_valid(true); repeat_message(); } else { - if (curwin->w_p_scb) - do_check_scrollbind(TRUE); + if (curwin->w_p_scb) { + do_check_scrollbind(true); + } if (State & CMDLINE) { redraw_popupmenu = false; update_screen(NOT_VALID); @@ -7720,7 +7716,7 @@ void screen_resize(int width, int height) } ui_flush(); } - busy--; + recursive = false; } /// Check if the new Nvim application "shell" dimensions are valid. @@ -7778,4 +7774,3 @@ win_T *get_win_by_grid_handle(handle_T handle) return NULL; } - diff --git a/src/nvim/search.c b/src/nvim/search.c index e5d545b185..b0ee41b245 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -98,7 +98,7 @@ static int saved_spats_last_idx = 0; static bool saved_spats_no_hlsearch = false; static char_u *mr_pattern = NULL; // pattern used by search_regcomp() -static int mr_pattern_alloced = false; // mr_pattern was allocated +static bool mr_pattern_alloced = false; // mr_pattern was allocated /* * Type used by find_pattern_in_path() to remember which included files have @@ -159,19 +159,21 @@ search_regcomp( pat = spats[i].pat; magic = spats[i].magic; no_smartcase = spats[i].no_scs; - } else if (options & SEARCH_HIS) /* put new pattern in history */ - add_to_history(HIST_SEARCH, pat, TRUE, NUL); + } else if (options & SEARCH_HIS) { // put new pattern in history + add_to_history(HIST_SEARCH, pat, true, NUL); + } if (mr_pattern_alloced) { xfree(mr_pattern); - mr_pattern_alloced = FALSE; + mr_pattern_alloced = false; } if (curwin->w_p_rl && *curwin->w_p_rlc == 's') { mr_pattern = reverse_text(pat); - mr_pattern_alloced = TRUE; - } else + mr_pattern_alloced = true; + } else { mr_pattern = pat; + } /* * Save the currently used pattern in the appropriate place, @@ -293,7 +295,7 @@ void free_search_patterns(void) if (mr_pattern_alloced) { xfree(mr_pattern); - mr_pattern_alloced = FALSE; + mr_pattern_alloced = false; mr_pattern = NULL; } } @@ -556,12 +558,12 @@ int searchit( int at_first_line; int extra_col; int start_char_len; - int match_ok; + bool match_ok; long nmatched; int submatch = 0; bool first_match = true; int save_called_emsg = called_emsg; - int break_loop = false; + bool break_loop = false; linenr_T stop_lnum = 0; // stop after this line number when != 0 proftime_T *tm = NULL; // timeout limit or NULL int *timed_out = NULL; // set when timed out or NULL @@ -659,11 +661,12 @@ int searchit( matchpos = regmatch.startpos[0]; endpos = regmatch.endpos[0]; submatch = first_submatch(®match); - /* "lnum" may be past end of buffer for "\n\zs". */ - if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) + // "lnum" may be past end of buffer for "\n\zs". + if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) { ptr = (char_u *)""; - else - ptr = ml_get_buf(buf, lnum + matchpos.lnum, FALSE); + } else { + ptr = ml_get_buf(buf, lnum + matchpos.lnum, false); + } /* * Forward search in the first line: match should be after @@ -671,14 +674,12 @@ int searchit( * match (this is vi compatible) or on the next char. */ if (dir == FORWARD && at_first_line) { - match_ok = TRUE; - /* - * When the match starts in a next line it's certainly - * past the start position. - * When match lands on a NUL the cursor will be put - * one back afterwards, compare with that position, - * otherwise "/$" will get stuck on end of line. - */ + match_ok = true; + // When the match starts in a next line it's certainly + // past the start position. + // When match lands on a NUL the cursor will be put + // one back afterwards, compare with that position, + // otherwise "/$" will get stuck on end of line. while (matchpos.lnum == 0 && (((options & SEARCH_END) && first_match) ? (nmatched == 1 @@ -696,7 +697,7 @@ int searchit( if (nmatched > 1) { /* end is in next line, thus no match in * this line */ - match_ok = FALSE; + match_ok = false; break; } matchcol = endpos.col; @@ -750,7 +751,7 @@ int searchit( * When putting the new cursor at the end, compare * relative to the end of the match. */ - match_ok = FALSE; + match_ok = false; for (;; ) { /* Remember a position that is before the start * position, we use it if it's the last match in @@ -842,10 +843,9 @@ int searchit( pos->lnum = lnum + endpos.lnum; pos->col = endpos.col; if (endpos.col == 0) { - if (pos->lnum > 1) { /* just in case */ - --pos->lnum; - pos->col = (colnr_T)STRLEN(ml_get_buf(buf, - pos->lnum, FALSE)); + if (pos->lnum > 1) { // just in case + pos->lnum--; + pos->col = (colnr_T)STRLEN(ml_get_buf(buf, pos->lnum, false)); } } else { pos->col--; @@ -888,7 +888,7 @@ int searchit( if ((options & SEARCH_PEEK) && ((lnum - pos->lnum) & 0x3f) == 0 && char_avail()) { - break_loop = TRUE; + break_loop = true; break; } @@ -962,9 +962,10 @@ int searchit( /* A pattern like "\n\zs" may go past the last line. */ if (pos->lnum > buf->b_ml.ml_line_count) { pos->lnum = buf->b_ml.ml_line_count; - pos->col = (int)STRLEN(ml_get_buf(buf, pos->lnum, FALSE)); - if (pos->col > 0) - --pos->col; + pos->col = (int)STRLEN(ml_get_buf(buf, pos->lnum, false)); + if (pos->col > 0) { + pos->col--; + } } return submatch + 1; @@ -1465,7 +1466,7 @@ int search_for_exact_line(buf_T *buf, pos_T *pos, Direction dir, char_u *pat) break; if (start == 0) start = pos->lnum; - ptr = ml_get_buf(buf, pos->lnum, FALSE); + ptr = ml_get_buf(buf, pos->lnum, false); p = skipwhite(ptr); pos->col = (colnr_T) (p - ptr); @@ -1506,7 +1507,7 @@ int searchc(cmdarg_T *cap, int t_cmd) int col; char_u *p; int len; - int stop = TRUE; + bool stop = true; if (c != NUL) { /* normal search: remember args for repeat */ if (!KeyStuffed) { /* don't remember when redoing */ @@ -1539,8 +1540,9 @@ int searchc(cmdarg_T *cap, int t_cmd) /* Force a move of at least one char, so ";" and "," will move the * cursor, even if the cursor is right in front of char we are looking * at. */ - if (vim_strchr(p_cpo, CPO_SCOLON) == NULL && count == 1 && t_cmd) - stop = FALSE; + if (vim_strchr(p_cpo, CPO_SCOLON) == NULL && count == 1 && t_cmd) { + stop = false; + } } if (dir == BACKWARD) @@ -1620,7 +1622,7 @@ static bool check_prevcol(char_u *linep, int col, int ch, int *prevcol) if (prevcol) { *prevcol = col; } - return (col >= 0 && linep[col] == ch) ? true : false; + return col >= 0 && linep[col] == ch; } /* @@ -2257,22 +2259,25 @@ static int check_linecomment(const char_u *line) const char_u *p = line; // scan from start // skip Lispish one-line comments if (curbuf->b_p_lisp) { - if (vim_strchr(p, ';') != NULL) { /* there may be comments */ - int in_str = FALSE; /* inside of string */ + if (vim_strchr(p, ';') != NULL) { // there may be comments + bool in_str = false; // inside of string while ((p = vim_strpbrk(p, (char_u *)"\";")) != NULL) { if (*p == '"') { if (in_str) { - if (*(p - 1) != '\\') /* skip escaped quote */ - in_str = FALSE; + if (*(p - 1) != '\\') { // skip escaped quote + in_str = false; + } } else if (p == line || ((p - line) >= 2 - /* skip #\" form */ - && *(p - 1) != '\\' && *(p - 2) != '#')) - in_str = TRUE; + // skip #\" form + && *(p - 1) != '\\' && *(p - 2) != '#')) { + in_str = true; + } } else if (!in_str && ((p - line) < 2 - || (*(p - 1) != '\\' && *(p - 2) != '#'))) - break; /* found! */ - ++p; + || (*(p - 1) != '\\' && *(p - 2) != '#'))) { + break; // found! + } + p++; } } else p = NULL; @@ -2855,17 +2860,13 @@ finished: return OK; } -/* - * Move back to the end of the word. - * - * Returns FAIL if start of the file was reached. - */ -int -bckend_word( - long count, - int bigword, /* TRUE for "B" */ - int eol /* TRUE: stop at end of line. */ -) +/// Move back to the end of the word. +/// +/// @param bigword TRUE for "B" +/// @param eol if true, then stop at end of line. +/// +/// @return FAIL if start of the file was reached. +int bckend_word(long count, int bigword, bool eol) { int sclass; /* starting class */ int i; @@ -2903,16 +2904,17 @@ bckend_word( return OK; } -/* - * Skip a row of characters of the same class. - * Return TRUE when end-of-file reached, FALSE otherwise. - */ -static int skip_chars(int cclass, int dir) +/// Skip a row of characters of the same class. +/// +/// @return true when end-of-file reached, false otherwise. +static bool skip_chars(int cclass, int dir) { - while (cls() == cclass) - if ((dir == FORWARD ? inc_cursor() : dec_cursor()) == -1) - return TRUE; - return FALSE; + while (cls() == cclass) { + if ((dir == FORWARD ? inc_cursor() : dec_cursor()) == -1) { + return true; + } + } + return false; } /* @@ -2947,14 +2949,10 @@ static void find_first_blank(pos_T *posp) } } -/* - * Skip count/2 sentences and count/2 separating white spaces. - */ -static void -findsent_forward( - long count, - int at_start_sent /* cursor is at start of sentence */ -) +/// Skip count/2 sentences and count/2 separating white spaces. +/// +/// @param at_start_sent cursor is at start of sentence +static void findsent_forward(long count, bool at_start_sent) { while (count--) { findsent(FORWARD, 1L); @@ -3053,8 +3051,9 @@ current_word( if (bck_word(1L, bigword, TRUE) == FAIL) return FAIL; } else { - if (bckend_word(1L, bigword, TRUE) == FAIL) + if (bckend_word(1L, bigword, true) == FAIL) { return FAIL; + } (void)incl(&curwin->w_cursor); } } else { @@ -3126,9 +3125,9 @@ int current_sent(oparg_T *oap, long count, int include) { pos_T start_pos; pos_T pos; - int start_blank; + bool start_blank; int c; - int at_start_sent; + bool at_start_sent; long ncount; start_pos = curwin->w_cursor; @@ -3148,23 +3147,24 @@ extend: * - in a sentence or just after it * - at the start of a sentence */ - at_start_sent = TRUE; + at_start_sent = true; decl(&pos); while (lt(pos, curwin->w_cursor)) { c = gchar_pos(&pos); if (!ascii_iswhite(c)) { - at_start_sent = FALSE; + at_start_sent = false; break; } incl(&pos); } if (!at_start_sent) { findsent(BACKWARD, 1L); - if (equalpos(curwin->w_cursor, start_pos)) - at_start_sent = TRUE; /* exactly at start of sentence */ - else - /* inside a sentence, go to its end (start of next) */ + if (equalpos(curwin->w_cursor, start_pos)) { + at_start_sent = true; // exactly at start of sentence + } else { + // inside a sentence, go to its end (start of next) findsent(FORWARD, 1L); + } } if (include) /* "as" gets twice as much as "is" */ count *= 2; @@ -3185,13 +3185,13 @@ extend: * - in a sentence */ incl(&pos); - at_start_sent = TRUE; - if (!equalpos(pos, curwin->w_cursor)) { /* not just before a sentence */ - at_start_sent = FALSE; + at_start_sent = true; + if (!equalpos(pos, curwin->w_cursor)) { // not just before a sentence + at_start_sent = false; while (lt(pos, curwin->w_cursor)) { c = gchar_pos(&pos); if (!ascii_iswhite(c)) { - at_start_sent = TRUE; + at_start_sent = true; break; } incl(&pos); @@ -3218,10 +3218,10 @@ extend: while (c = gchar_pos(&pos), ascii_iswhite(c)) incl(&pos); if (equalpos(pos, curwin->w_cursor)) { - start_blank = TRUE; - find_first_blank(&start_pos); /* go back to first blank */ + start_blank = true; + find_first_blank(&start_pos); // go back to first blank } else { - start_blank = FALSE; + start_blank = false; findsent(BACKWARD, 1L); start_pos = curwin->w_cursor; } @@ -3232,10 +3232,11 @@ extend: if (start_blank) --ncount; } - if (ncount > 0) - findsent_forward(ncount, TRUE); - else + if (ncount > 0) { + findsent_forward(ncount, true); + } else { decl(&curwin->w_cursor); + } if (include) { /* @@ -3293,7 +3294,7 @@ current_block( pos_T *end_pos; pos_T old_start, old_end; char_u *save_cpo; - int sol = FALSE; /* '{' at start of line */ + bool sol = false; // '{' at start of line old_pos = curwin->w_cursor; old_end = curwin->w_cursor; /* remember where we started */ @@ -3351,7 +3352,7 @@ current_block( sol = (curwin->w_cursor.col == 0); decl(&curwin->w_cursor); while (inindent(1)) { - sol = TRUE; + sol = true; if (decl(&curwin->w_cursor) != 0) { break; } @@ -3410,11 +3411,10 @@ current_block( } -/* - * Return TRUE if the cursor is on a "<aaa>" tag. Ignore "<aaa/>". - * When "end_tag" is TRUE return TRUE if the cursor is on "</aaa>". - */ -static int in_html_tag(int end_tag) +/// @param end_tag when true, return true if the cursor is on "</aaa>". +/// +/// @return true if the cursor is on a "<aaa>" tag. Ignore "<aaa/>". +static bool in_html_tag(bool end_tag) { char_u *line = get_cursor_line_ptr(); char_u *p; @@ -3444,14 +3444,16 @@ static int in_html_tag(int end_tag) return *p == '/'; } - /* check that there is no '/' after the '<' */ - if (*p == '/') - return FALSE; + // check that there is no '/' after the '<' + if (*p == '/') { + return false; + } /* check that the matching '>' is not preceded by '/' */ for (;; ) { - if (inc(&pos) < 0) - return FALSE; + if (inc(&pos) < 0) { + return false; + } c = *ml_get_pos(&pos); if (c == '>') break; @@ -3502,16 +3504,20 @@ current_tagblock( if (inc_cursor() != 0) break; - if (in_html_tag(FALSE)) { - /* cursor on start tag, move to its '>' */ - while (*get_cursor_pos_ptr() != '>') - if (inc_cursor() < 0) + if (in_html_tag(false)) { + // cursor on start tag, move to its '>' + while (*get_cursor_pos_ptr() != '>') { + if (inc_cursor() < 0) { break; - } else if (in_html_tag(TRUE)) { - /* cursor on end tag, move to just before it */ - while (*get_cursor_pos_ptr() != '<') - if (dec_cursor() < 0) + } + } + } else if (in_html_tag(true)) { + // cursor on end tag, move to just before it + while (*get_cursor_pos_ptr() != '<') { + if (dec_cursor() < 0) { break; + } + } dec_cursor(); old_end = curwin->w_cursor; } @@ -4667,7 +4673,7 @@ find_pattern_in_path( char_u *line; char_u *p; char_u save_char; - int define_matched; + bool define_matched; regmatch_T regmatch; regmatch_T incl_regmatch; regmatch_T def_regmatch; @@ -4904,7 +4910,7 @@ find_pattern_in_path( */ p = line; search_line: - define_matched = FALSE; + define_matched = false; if (def_regmatch.regprog != NULL && vim_regexec(&def_regmatch, line, (colnr_T)0)) { /* @@ -4915,7 +4921,7 @@ search_line: p = def_regmatch.endp[0]; while (*p && !vim_iswordc(*p)) p++; - define_matched = TRUE; + define_matched = true; } /* diff --git a/src/nvim/spell.c b/src/nvim/spell.c index 28276884b0..610a359141 100644 --- a/src/nvim/spell.c +++ b/src/nvim/spell.c @@ -1399,7 +1399,7 @@ spell_move_to ( clearpos(&found_pos); while (!got_int) { - line = ml_get_buf(wp->w_buffer, lnum, FALSE); + line = ml_get_buf(wp->w_buffer, lnum, false); len = STRLEN(line); if (buflen < len + MAXWLEN + 2) { @@ -1425,7 +1425,7 @@ spell_move_to ( // Need to get the line again, may have looked at the previous // one. - line = ml_get_buf(wp->w_buffer, lnum, FALSE); + line = ml_get_buf(wp->w_buffer, lnum, false); } // Copy the line into "buf" and append the start of the next line if @@ -1433,7 +1433,7 @@ spell_move_to ( STRCPY(buf, line); if (lnum < wp->w_buffer->b_ml.ml_line_count) spell_cat_line(buf + STRLEN(buf), - ml_get_buf(wp->w_buffer, lnum + 1, FALSE), + ml_get_buf(wp->w_buffer, lnum + 1, false), MAXWLEN); p = buf + skip; endp = buf + len; diff --git a/src/nvim/spellfile.c b/src/nvim/spellfile.c index 15271e831c..8b95178c84 100644 --- a/src/nvim/spellfile.c +++ b/src/nvim/spellfile.c @@ -5035,7 +5035,7 @@ static void sug_write(spellinfo_T *spin, char_u *fname) for (linenr_T lnum = 1; lnum <= wcount; ++lnum) { // <sugline>: <sugnr> ... NUL - char_u *line = ml_get_buf(spin->si_spellbuf, lnum, FALSE); + char_u *line = ml_get_buf(spin->si_spellbuf, lnum, false); size_t len = STRLEN(line) + 1; if (fwrite(line, len, 1, fd) == 0) { EMSG(_(e_write)); diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index e9ee63970c..bdbbc4aacf 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -53,9 +53,9 @@ static bool did_syntax_onoff = false; /// Structure that stores information about a highlight group. /// The ID of a highlight group is also called group ID. It is the index in /// the highlight_ga array PLUS ONE. -struct hl_group { +typedef struct hl_group { char_u *sg_name; ///< highlight group name - char_u *sg_name_u; ///< uppercase of sg_name + char *sg_name_u; ///< uppercase of sg_name bool sg_cleared; ///< "hi clear" was used int sg_attr; ///< Screen attr @see ATTR_ENTRY int sg_link; ///< link to this highlight group ID @@ -80,7 +80,7 @@ struct hl_group { char *sg_rgb_sp_name; ///< RGB special color name int sg_blend; ///< blend level (0-100 inclusive), -1 if unset -}; +} HlGroup; /// \addtogroup SG_SET /// @{ @@ -91,6 +91,7 @@ struct hl_group { // builtin |highlight-groups| static garray_T highlight_ga = GA_EMPTY_INIT_VALUE; +Map(cstr_t, int) highlight_unames = MAP_INIT; static inline struct hl_group * HL_TABLE(void) { @@ -364,24 +365,24 @@ static reg_extmatch_T *next_match_extmatch = NULL; * The current state (within the line) of the recognition engine. * When current_state.ga_itemsize is 0 the current state is invalid. */ -static win_T *syn_win; // current window for highlighting -static buf_T *syn_buf; // current buffer for highlighting -static synblock_T *syn_block; // current buffer for highlighting -static proftime_T *syn_tm; // timeout limit -static linenr_T current_lnum = 0; // lnum of current state -static colnr_T current_col = 0; // column of current state -static int current_state_stored = 0; // TRUE if stored current state - // after setting current_finished -static int current_finished = 0; // current line has been finished -static garray_T current_state // current stack of state_items +static win_T *syn_win; // current window for highlighting +static buf_T *syn_buf; // current buffer for highlighting +static synblock_T *syn_block; // current buffer for highlighting +static proftime_T *syn_tm; // timeout limit +static linenr_T current_lnum = 0; // lnum of current state +static colnr_T current_col = 0; // column of current state +static bool current_state_stored = false; // true if stored current state + // after setting current_finished +static bool current_finished = false; // current line has been finished +static garray_T current_state // current stack of state_items = GA_EMPTY_INIT_VALUE; -static int16_t *current_next_list = NULL; // when non-zero, nextgroup list -static int current_next_flags = 0; // flags for current_next_list -static int current_line_id = 0; // unique number for current line +static int16_t *current_next_list = NULL; // when non-zero, nextgroup list +static int current_next_flags = 0; // flags for current_next_list +static int current_line_id = 0; // unique number for current line #define CUR_STATE(idx) ((stateitem_T *)(current_state.ga_data))[idx] -static int syn_time_on = FALSE; +static bool syn_time_on = false; # define IF_SYN_TIME(p) (p) // Set the timeout used for syntax highlighting. @@ -809,7 +810,7 @@ static void syn_sync(win_T *wp, linenr_T start_lnum, synstate_T *last_valid) cur_si = &CUR_STATE(current_state.ga_len - 1); cur_si->si_h_startpos.lnum = found_current_lnum; cur_si->si_h_startpos.col = found_current_col; - update_si_end(cur_si, (int)current_col, TRUE); + update_si_end(cur_si, (int)current_col, true); check_keepend(); } current_col = found_m_endpos.col; @@ -880,7 +881,7 @@ static int syn_match_linecont(linenr_T lnum) */ static void syn_start_line(void) { - current_finished = FALSE; + current_finished = false; current_col = 0; /* @@ -888,7 +889,7 @@ static void syn_start_line(void) * previous line and regions that have "keepend". */ if (!GA_EMPTY(¤t_state)) { - syn_update_ends(TRUE); + syn_update_ends(true); check_state_ends(); } @@ -897,15 +898,13 @@ static void syn_start_line(void) next_seqnr = 1; } -/* - * Check for items in the stack that need their end updated. - * When "startofline" is TRUE the last item is always updated. - * When "startofline" is FALSE the item with "keepend" is forcefully updated. - */ -static void syn_update_ends(int startofline) +/// Check for items in the stack that need their end updated. +/// +/// @param startofline if true the last item is always updated. +/// if false the item with "keepend" is forcefully updated. +static void syn_update_ends(bool startofline) { stateitem_T *cur_si; - int seen_keepend; if (startofline) { /* Check for a match carried over from a previous line with a @@ -940,8 +939,8 @@ static void syn_update_ends(int startofline) if (CUR_STATE(i).si_flags & HL_EXTEND) break; - seen_keepend = FALSE; - for (; i < current_state.ga_len; ++i) { + bool seen_keepend = false; + for (; i < current_state.ga_len; i++) { cur_si = &CUR_STATE(i); if ((cur_si->si_flags & HL_KEEPEND) || (seen_keepend && !startofline) @@ -952,8 +951,9 @@ static void syn_update_ends(int startofline) if (!(cur_si->si_flags & HL_MATCHCONT)) update_si_end(cur_si, (int)current_col, !startofline); - if (!startofline && (cur_si->si_flags & HL_KEEPEND)) - seen_keepend = TRUE; + if (!startofline && (cur_si->si_flags & HL_KEEPEND)) { + seen_keepend = true; + } } } check_keepend(); @@ -1151,17 +1151,15 @@ static void syn_stack_apply_changes_block(synblock_T *block, buf_T *buf) } } -/* - * Reduce the number of entries in the state stack for syn_buf. - * Returns TRUE if at least one entry was freed. - */ -static int syn_stack_cleanup(void) +/// Reduce the number of entries in the state stack for syn_buf. +/// +/// @return true if at least one entry was freed. +static bool syn_stack_cleanup(void) { synstate_T *p, *prev; disptick_T tick; - int above; int dist; - int retval = FALSE; + bool retval = false; if (syn_block->b_sst_first == NULL) { return retval; @@ -1179,16 +1177,17 @@ static int syn_stack_cleanup(void) * "b_sst_lasttick" (the display tick wraps around). */ tick = syn_block->b_sst_lasttick; - above = FALSE; + bool above = false; prev = syn_block->b_sst_first; for (p = prev->sst_next; p != NULL; prev = p, p = p->sst_next) { if (prev->sst_lnum + dist > p->sst_lnum) { if (p->sst_tick > syn_block->b_sst_lasttick) { if (!above || p->sst_tick < tick) tick = p->sst_tick; - above = TRUE; - } else if (!above && p->sst_tick < tick) + above = true; + } else if (!above && p->sst_tick < tick) { tick = p->sst_tick; + } } } @@ -1203,7 +1202,7 @@ static int syn_stack_cleanup(void) prev->sst_next = p->sst_next; syn_stack_free_entry(syn_block, p); p = prev; - retval = TRUE; + retval = true; } } return retval; @@ -1339,7 +1338,7 @@ static synstate_T *store_current_state(void) sp->sst_tick = display_tick; sp->sst_change_lnum = 0; } - current_state_stored = TRUE; + current_state_stored = true; return sp; } @@ -1384,11 +1383,10 @@ static void load_current_state(synstate_T *from) current_lnum = from->sst_lnum; } -/* - * Compare saved state stack "*sp" with the current state. - * Return TRUE when they are equal. - */ -static int syn_stack_equal(synstate_T *sp) +/// Compare saved state stack "*sp" with the current state. +/// +/// @return true when they are equal. +static bool syn_stack_equal(synstate_T *sp) { bufstate_T *bp; reg_extmatch_T *six, *bsx; @@ -1396,7 +1394,7 @@ static int syn_stack_equal(synstate_T *sp) /* First a quick check if the stacks have the same size end nextlist. */ if (sp->sst_stacksize != current_state.ga_len || sp->sst_next_list != current_next_list) { - return FALSE; + return false; } /* Need to compare all states on both stacks. */ @@ -1443,10 +1441,11 @@ static int syn_stack_equal(synstate_T *sp) if (j != NSUBEXP) break; } - if (i < 0) - return TRUE; + if (i < 0) { + return true; + } - return FALSE; + return false; } /* @@ -1489,14 +1488,13 @@ static void validate_current_state(void) ga_set_growsize(¤t_state, 3); } -/* - * Return TRUE if the syntax at start of lnum changed since last time. - * This will only be called just after get_syntax_attr() for the previous - * line, to check if the next line needs to be redrawn too. - */ -int syntax_check_changed(linenr_T lnum) +/// This will only be called just after get_syntax_attr() for the previous +/// line, to check if the next line needs to be redrawn too. +/// +/// @return true if the syntax at start of lnum changed since last time. +bool syntax_check_changed(linenr_T lnum) { - int retval = TRUE; + bool retval = true; synstate_T *sp; /* @@ -1519,8 +1517,9 @@ int syntax_check_changed(linenr_T lnum) * Compare the current state with the previously saved state of * the line. */ - if (syn_stack_equal(sp)) - retval = FALSE; + if (syn_stack_equal(sp)) { + retval = false; + } /* * Store the current state in b_sst_array[] for later use. @@ -1677,15 +1676,15 @@ static int syn_current_attr( (void)push_next_match(); } - current_finished = TRUE; - current_state_stored = FALSE; + current_finished = true; + current_state_stored = false; return 0; } /* if the current or next character is NUL, we will finish the line now */ if (line[current_col] == NUL || line[current_col + 1] == NUL) { - current_finished = TRUE; - current_state_stored = FALSE; + current_finished = true; + current_state_stored = false; } /* @@ -2151,16 +2150,14 @@ static int syn_current_attr( } -/* - * Check if we already matched pattern "idx" at the current column. - */ -static int did_match_already(int idx, garray_T *gap) +/// @return true if we already matched pattern "idx" at the current column. +static bool did_match_already(int idx, garray_T *gap) { for (int i = current_state.ga_len; --i >= 0; ) { if (CUR_STATE(i).si_m_startcol == (int)current_col && CUR_STATE(i).si_m_lnum == (int)current_lnum && CUR_STATE(i).si_idx == idx) { - return TRUE; + return true; } } @@ -2168,11 +2165,11 @@ static int did_match_already(int idx, garray_T *gap) * stack, and can only be matched once anyway. */ for (int i = gap->ga_len; --i >= 0; ) { if (((int *)(gap->ga_data))[i] == idx) { - return TRUE; + return true; } } - return FALSE; + return false; } /* @@ -2208,8 +2205,8 @@ static stateitem_T *push_next_match(void) cur_si->si_next_list = spp->sp_next_list; cur_si->si_extmatch = ref_extmatch(next_match_extmatch); if (spp->sp_type == SPTYPE_START && !(spp->sp_flags & HL_ONELINE)) { - /* Try to find the end pattern in the current line */ - update_si_end(cur_si, (int)(next_match_m_endpos.col), TRUE); + // Try to find the end pattern in the current line + update_si_end(cur_si, (int)(next_match_m_endpos.col), true); check_keepend(); } else { cur_si->si_m_endpos = next_match_m_endpos; @@ -2315,9 +2312,10 @@ static void check_state_ends(void) break; if (had_extend && keepend_level >= 0) { - syn_update_ends(FALSE); - if (GA_EMPTY(¤t_state)) + syn_update_ends(false); + if (GA_EMPTY(¤t_state)) { break; + } } cur_si = &CUR_STATE(current_state.ga_len - 1); @@ -2335,7 +2333,7 @@ static void check_state_ends(void) && SYN_ITEMS(syn_block)[cur_si->si_idx].sp_type == SPTYPE_START && !(cur_si->si_flags & (HL_MATCH | HL_KEEPEND))) { - update_si_end(cur_si, (int)current_col, TRUE); + update_si_end(cur_si, (int)current_col, true); check_keepend(); if ((current_next_flags & HL_HAS_EOL) && keepend_level < 0 @@ -2451,18 +2449,14 @@ static void check_keepend(void) } } -/* - * Update an entry in the current_state stack for a start-skip-end pattern. - * This finds the end of the current item, if it's in the current line. - * - * Return the flags for the matched END. - */ -static void -update_si_end( - stateitem_T *sip, - int startcol, /* where to start searching for the end */ - int force /* when TRUE overrule a previous end */ -) +/// Update an entry in the current_state stack for a start-skip-end pattern. +/// This finds the end of the current item, if it's in the current line. +/// +/// @param startcol where to start searching for the end +/// @param force when true overrule a previous end +/// +/// @return the flags for the matched END. +static void update_si_end(stateitem_T *sip, int startcol, bool force) { lpos_T hl_endpos; lpos_T end_endpos; @@ -2570,7 +2564,7 @@ find_endpos( regmmatch_T best_regmatch; /* startpos/endpos of best match */ lpos_T pos; char_u *line; - int had_match = false; + bool had_match = false; char_u buf_chartab[32]; // chartab array for syn option iskeyword /* just in case we are invoked for a keyword */ @@ -2752,7 +2746,7 @@ find_endpos( *flagsp = spp->sp_flags; - had_match = TRUE; + had_match = true; break; } @@ -2815,12 +2809,12 @@ syn_add_end_off( col = regmatch->endpos[0].col; off = spp->sp_offsets[idx]; } - /* Don't go past the end of the line. Matters for "rs=e+2" when there - * is a matchgroup. Watch out for match with last NL in the buffer. */ - if (result->lnum > syn_buf->b_ml.ml_line_count) + // Don't go past the end of the line. Matters for "rs=e+2" when there + // is a matchgroup. Watch out for match with last NL in the buffer. + if (result->lnum > syn_buf->b_ml.ml_line_count) { col = 0; - else if (off != 0) { - base = ml_get_buf(syn_buf, result->lnum, FALSE); + } else if (off != 0) { + base = ml_get_buf(syn_buf, result->lnum, false); p = base + col; if (off > 0) { while (off-- > 0 && *p != NUL) { @@ -2866,10 +2860,10 @@ syn_add_start_off( if (result->lnum > syn_buf->b_ml.ml_line_count) { /* a "\n" at the end of the pattern may take us below the last line */ result->lnum = syn_buf->b_ml.ml_line_count; - col = (int)STRLEN(ml_get_buf(syn_buf, result->lnum, FALSE)); + col = (int)STRLEN(ml_get_buf(syn_buf, result->lnum, false)); } if (off != 0) { - base = ml_get_buf(syn_buf, result->lnum, FALSE); + base = ml_get_buf(syn_buf, result->lnum, false); p = base + col; if (off > 0) { while (off-- && *p != NUL) { @@ -2890,7 +2884,7 @@ syn_add_start_off( */ static char_u *syn_getcurline(void) { - return ml_get_buf(syn_buf, current_lnum, FALSE); + return ml_get_buf(syn_buf, current_lnum, false); } /* @@ -2902,7 +2896,7 @@ static int syn_regexec(regmmatch_T *rmp, linenr_T lnum, colnr_T col, syn_time_T int r; int timed_out = 0; proftime_T pt; - const int l_syn_time_on = syn_time_on; + const bool l_syn_time_on = syn_time_on; if (l_syn_time_on) { pt = profile_start(); @@ -3372,7 +3366,7 @@ static void syn_cmd_clear(exarg_T *eap, int syncing) XFREE_CLEAR(SYN_CLSTR(curwin->w_s)[scl_id].scl_list); } } else { - id = syn_namen2id(arg, (int)(arg_end - arg)); + id = syn_name2id_len(arg, (int)(arg_end - arg)); if (id == 0) { EMSG2(_(e_nogroup), arg); break; @@ -3542,7 +3536,7 @@ syn_cmd_list( else syn_list_cluster(id - SYNID_CLUSTER); } else { - int id = syn_namen2id(arg, (int)(arg_end - arg)); + int id = syn_name2id_len(arg, (int)(arg_end - arg)); if (id == 0) { EMSG2(_(e_nogroup), arg); } else { @@ -4241,7 +4235,7 @@ static void syn_cmd_include(exarg_T *eap, int syncing) char_u *errormsg = NULL; int prev_toplvl_grp; int prev_syn_inc_tag; - int source = FALSE; + bool source = false; eap->nextcmd = find_nextcmd(arg); if (eap->skip) @@ -4541,9 +4535,9 @@ syn_cmd_region( int pat_count = 0; /* nr of syn_patterns found */ int syn_id; int matchgroup_id = 0; - int not_enough = FALSE; /* not enough arguments */ - int illegal = FALSE; /* illegal arguments */ - int success = FALSE; + bool not_enough = false; // not enough arguments + bool illegal = false; // illegal arguments + bool success = false; syn_opt_arg_T syn_opt_arg; int conceal_char = NUL; @@ -4601,7 +4595,7 @@ syn_cmd_region( } rest = skipwhite(rest + 1); if (*rest == NUL) { - not_enough = TRUE; + not_enough = true; break; } @@ -4612,7 +4606,7 @@ syn_cmd_region( else { matchgroup_id = syn_check_group(rest, (int)(p - rest)); if (matchgroup_id == 0) { - illegal = TRUE; + illegal = true; break; } } @@ -4706,8 +4700,8 @@ syn_cmd_region( } redraw_curbuf_later(SOME_VALID); - syn_stack_free_all(curwin->w_s); /* Need to recompute all syntax. */ - success = TRUE; /* don't free the progs and patterns now */ + syn_stack_free_all(curwin->w_s); // Need to recompute all syntax. + success = true; // don't free the progs and patterns now } } } @@ -5859,16 +5853,17 @@ int syn_get_foldlevel(win_T *wp, long lnum) */ void ex_syntime(exarg_T *eap) { - if (STRCMP(eap->arg, "on") == 0) - syn_time_on = TRUE; - else if (STRCMP(eap->arg, "off") == 0) - syn_time_on = FALSE; - else if (STRCMP(eap->arg, "clear") == 0) + if (STRCMP(eap->arg, "on") == 0) { + syn_time_on = true; + } else if (STRCMP(eap->arg, "off") == 0) { + syn_time_on = false; + } else if (STRCMP(eap->arg, "clear") == 0) { syntime_clear(); - else if (STRCMP(eap->arg, "report") == 0) + } else if (STRCMP(eap->arg, "report") == 0) { syntime_report(); - else + } else { EMSG2(_(e_invarg2), eap->arg); + } } static void syn_clear_time(syn_time_T *st) @@ -6420,7 +6415,7 @@ void init_highlight(bool both, bool reset) do_highlight(pp[i], reset, true); } } else if (!had_both) { - // Don't do anything before the call with both == TRUE from main(). + // Don't do anything before the call with both == true from main(). // Not everything has been setup then, and that call will overrule // everything anyway. return; @@ -6461,7 +6456,7 @@ int load_colors(char_u *name) { char_u *buf; int retval = FAIL; - static int recursive = false; + static bool recursive = false; // When being called recursively, this is probably because setting // 'background' caused the highlighting to be reloaded. This means it is @@ -6635,7 +6630,7 @@ void do_highlight(const char *line, const bool forceit, const bool init) // ":highlight {group-name}": list highlighting for one group. if (!doclear && !dolink && ends_excmd((uint8_t)(*linep))) { - id = syn_namen2id((const char_u *)line, (int)(name_end - line)); + id = syn_name2id_len((const char_u *)line, (int)(name_end - line)); if (id == 0) { emsgf(_("E411: highlight group not found: %s"), line); } else { @@ -7113,6 +7108,7 @@ void free_highlight(void) xfree(HL_TABLE()[i].sg_name_u); } ga_clear(&highlight_ga); + map_destroy(cstr_t, int)(&highlight_unames); } #endif @@ -7130,11 +7126,10 @@ void restore_cterm_colors(void) cterm_normal_bg_color = 0; } -/* - * Return TRUE if highlight group "idx" has any settings. - * When "check_link" is TRUE also check for an existing link. - */ -static int hl_has_settings(int idx, int check_link) +/// @param check_link if true also check for an existing link. +/// +/// @return TRUE if highlight group "idx" has any settings. +static int hl_has_settings(int idx, bool check_link) { return HL_TABLE()[idx].sg_cleared == 0 && (HL_TABLE()[idx].sg_attr != 0 @@ -7470,26 +7465,35 @@ static void set_hl_attr(int idx) } } +int syn_name2id(const char_u *name) + FUNC_ATTR_NONNULL_ALL +{ + return syn_name2id_len(name, STRLEN(name)); +} + /// Lookup a highlight group name and return its ID. /// /// @param highlight name e.g. 'Cursor', 'Normal' /// @return the highlight id, else 0 if \p name does not exist -int syn_name2id(const char_u *name) +int syn_name2id_len(const char_u *name, size_t len) FUNC_ATTR_NONNULL_ALL { - int i; - char_u name_u[200]; - - /* Avoid using stricmp() too much, it's slow on some systems */ - /* Avoid alloc()/free(), these are slow too. ID names over 200 chars - * don't deserve to be found! */ - STRLCPY(name_u, name, 200); - vim_strup(name_u); - for (i = highlight_ga.ga_len; --i >= 0; ) - if (HL_TABLE()[i].sg_name_u != NULL - && STRCMP(name_u, HL_TABLE()[i].sg_name_u) == 0) - break; - return i + 1; + char name_u[201]; + + if (len == 0 || len > 200) { + // ID names over 200 chars don't deserve to be found! + return 0; + } + + // Avoid using stricmp() too much, it's slow on some systems */ + // Avoid alloc()/free(), these are slow too. + memcpy(name_u, name, len); + name_u[len] = '\0'; + vim_strup((char_u *)name_u); + + // map_get(..., int) returns 0 when no key is present, which is + // the expected value for missing highlight group. + return map_get(cstr_t, int)(&highlight_unames, name_u); } /// Lookup a highlight group name and return its attributes. @@ -7524,17 +7528,6 @@ char_u *syn_id2name(int id) return HL_TABLE()[id - 1].sg_name; } -/* - * Like syn_name2id(), but take a pointer + length argument. - */ -int syn_namen2id(const char_u *linep, int len) -{ - char_u *name = vim_strnsave(linep, len); - int id = syn_name2id(name); - xfree(name); - - return id; -} /// Find highlight group name in the table and return its ID. /// If it doesn't exist yet, a new entry is created. @@ -7543,14 +7536,11 @@ int syn_namen2id(const char_u *linep, int len) /// @param len length of \p pp /// /// @return 0 for failure else the id of the group -int syn_check_group(const char_u *pp, int len) +int syn_check_group(const char_u *name, int len) { - char_u *name = vim_strnsave(pp, len); - int id = syn_name2id(name); + int id = syn_name2id_len(name, len); if (id == 0) { // doesn't exist yet - id = syn_add_group(name); - } else { - xfree(name); + return syn_add_group(vim_strnsave(name, len)); } return id; } @@ -7593,7 +7583,7 @@ static int syn_add_group(char_u *name) return 0; } - char_u *const name_up = vim_strsave_up(name); + char *const name_up = (char *)vim_strsave_up(name); // Append another syntax_highlight entry. struct hl_group* hlgp = GA_APPEND_VIA_PTR(struct hl_group, &highlight_ga); @@ -7605,7 +7595,11 @@ static int syn_add_group(char_u *name) hlgp->sg_blend = -1; hlgp->sg_name_u = name_up; - return highlight_ga.ga_len; /* ID is index plus one */ + int id = highlight_ga.ga_len; // ID is index plus one + + map_put(cstr_t, int)(&highlight_unames, name_up, id); + + return id; } /// When, just after calling syn_add_group(), an error is discovered, this @@ -7613,8 +7607,10 @@ static int syn_add_group(char_u *name) static void syn_unadd_group(void) { highlight_ga.ga_len--; - xfree(HL_TABLE()[highlight_ga.ga_len].sg_name); - xfree(HL_TABLE()[highlight_ga.ga_len].sg_name_u); + HlGroup *item = &HL_TABLE()[highlight_ga.ga_len]; + map_del(cstr_t, int)(&highlight_unames, item->sg_name_u); + xfree(item->sg_name); + xfree(item->sg_name_u); } @@ -7875,8 +7871,9 @@ const char *get_highlight_name(expand_T *const xp, int idx) /// Obtain a highlight group name. -/// When "skip_cleared" is TRUE don't return a cleared entry. -const char *get_highlight_name_ext(expand_T *xp, int idx, int skip_cleared) +/// +/// @param skip_cleared if true don't return a cleared entry. +const char *get_highlight_name_ext(expand_T *xp, int idx, bool skip_cleared) FUNC_ATTR_WARN_UNUSED_RESULT { if (idx < 0) { diff --git a/src/nvim/tag.c b/src/nvim/tag.c index d6c6b064b2..61d48eb4bf 100644 --- a/src/nvim/tag.c +++ b/src/nvim/tag.c @@ -1371,12 +1371,12 @@ find_tags( tagname_T tn; /* info for get_tagfname() */ int first_file; /* trying first tag file */ tagptrs_T tagp; - int did_open = FALSE; /* did open a tag file */ - int stop_searching = FALSE; /* stop when match found or error */ - int retval = FAIL; /* return value */ - int is_static; /* current tag line is static */ - int is_current; /* file name matches */ - int eof = FALSE; /* found end-of-file */ + bool did_open = false; // did open a tag file + bool stop_searching = false; // stop when match found or error + int retval = FAIL; // return value + int is_static; // current tag line is static + int is_current; // file name matches + bool eof = false; // found end-of-file char_u *p; char_u *s; int i; @@ -1429,12 +1429,12 @@ find_tags( vimconv_T vimconv; int findall = (mincount == MAXCOL || mincount == TAG_MANY); - /* find all matching tags */ - int sort_error = FALSE; /* tags file not sorted */ - int linear; /* do a linear search */ - int sortic = FALSE; /* tag file sorted in nocase */ - int line_error = FALSE; /* syntax error */ - int has_re = (flags & TAG_REGEXP); /* regexp used */ + // find all matching tags + bool sort_error = false; // tags file not sorted + int linear; // do a linear search + bool sortic = false; // tag file sorted in nocase + bool line_error = false; // syntax error + int has_re = (flags & TAG_REGEXP); // regexp used int help_only = (flags & TAG_HELP); int name_only = (flags & TAG_NAMES); int noic = (flags & TAG_NOIC); @@ -1621,7 +1621,7 @@ find_tags( verbose_leave(); } } - did_open = TRUE; /* remember that we found at least one file */ + did_open = true; // remember that we found at least one file state = TS_START; /* we're at the start of the file */ @@ -1638,13 +1638,13 @@ find_tags( if ((flags & TAG_INS_COMP)) /* Double brackets for gcc */ ins_compl_check_keys(30, false); if (got_int || compl_interrupted) { - stop_searching = TRUE; + stop_searching = true; break; } /* When mincount is TAG_MANY, stop when enough matches have been * found (for completion). */ if (mincount == TAG_MANY && match_count >= TAG_MANY) { - stop_searching = TRUE; + stop_searching = true; retval = OK; break; } @@ -1795,7 +1795,7 @@ line_read_in: state = TS_BINARY; else if (tag_file_sorted == '2') { state = TS_BINARY; - sortic = TRUE; + sortic = true; orgpat.regmatch.rm_ic = (p_ic || !noic); } else state = TS_LINEAR; @@ -1878,8 +1878,9 @@ parse_line: i = (int)tagp.tagname[0]; if (sortic) i = TOUPPER_ASC(tagp.tagname[0]); - if (i < search_info.low_char || i > search_info.high_char) - sort_error = TRUE; + if (i < search_info.low_char || i > search_info.high_char) { + sort_error = true; + } /* * Compare the current tag with the searched tag. @@ -1970,7 +1971,7 @@ parse_line: i = parse_tag_line(lbuf, &tagp); if (i == FAIL) { - line_error = TRUE; + line_error = true; break; } @@ -2175,7 +2176,7 @@ parse_line: tag_file_sorted = NUL; if (sort_error) { EMSG2(_("E432: Tags file not sorted: %s"), tag_fname); - sort_error = FALSE; + sort_error = false; } /* @@ -2183,7 +2184,7 @@ parse_line: */ if (match_count >= mincount) { retval = OK; - stop_searching = TRUE; + stop_searching = true; } if (stop_searching || use_cscope) @@ -3060,24 +3061,26 @@ expand_tags ( ) { int i; - int c; - int tagnmflag; - char_u tagnm[100]; + int extra_flag; + char_u *name_buf; + size_t name_buf_size = 100; tagptrs_T t_p; int ret; - if (tagnames) - tagnmflag = TAG_NAMES; - else - tagnmflag = 0; + name_buf = xmalloc(name_buf_size); + + if (tagnames) { + extra_flag = TAG_NAMES; + } else { + extra_flag = 0; + } if (pat[0] == '/') { ret = find_tags(pat + 1, num_file, file, - TAG_REGEXP | tagnmflag | TAG_VERBOSE | TAG_NO_TAGFUNC, + TAG_REGEXP | extra_flag | TAG_VERBOSE | TAG_NO_TAGFUNC, TAG_MANY, curbuf->b_ffname); } else { ret = find_tags(pat, num_file, file, - TAG_REGEXP | tagnmflag | TAG_VERBOSE - | TAG_NO_TAGFUNC | TAG_NOIC, + TAG_REGEXP | extra_flag | TAG_VERBOSE | TAG_NO_TAGFUNC | TAG_NOIC, TAG_MANY, curbuf->b_ffname); } if (ret == OK && !tagnames) { @@ -3085,18 +3088,29 @@ expand_tags ( * "<tagname>\0<kind>\0<filename>\0" */ for (i = 0; i < *num_file; i++) { + size_t len; + parse_match((*file)[i], &t_p); - c = (int)(t_p.tagname_end - t_p.tagname); - memmove(tagnm, t_p.tagname, (size_t)c); - tagnm[c++] = 0; - tagnm[c++] = (t_p.tagkind != NULL && *t_p.tagkind) - ? *t_p.tagkind : 'f'; - tagnm[c++] = 0; - memmove((*file)[i] + c, t_p.fname, t_p.fname_end - t_p.fname); - (*file)[i][c + (t_p.fname_end - t_p.fname)] = 0; - memmove((*file)[i], tagnm, (size_t)c); + len = t_p.tagname_end - t_p.tagname; + if (len > name_buf_size - 3) { + char_u *buf; + + name_buf_size = len + 3; + buf = xrealloc(name_buf, name_buf_size); + name_buf = buf; + } + + memmove(name_buf, t_p.tagname, len); + name_buf[len++] = 0; + name_buf[len++] = (t_p.tagkind != NULL && *t_p.tagkind) + ? *t_p.tagkind : 'f'; + name_buf[len++] = 0; + memmove((*file)[i] + len, t_p.fname, t_p.fname_end - t_p.fname); + (*file)[i][len + (t_p.fname_end - t_p.fname)] = 0; + memmove((*file)[i], name_buf, len); } } + xfree(name_buf); return ret; } diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index c07a956dde..3335fa500a 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -76,7 +76,6 @@ #include "nvim/event/time.h" #include "nvim/os/input.h" #include "nvim/api/private/helpers.h" -#include "nvim/api/private/handle.h" typedef struct terminal_state { VimState state; @@ -153,11 +152,10 @@ static VTermScreenCallbacks vterm_screen_callbacks = { .sb_popline = term_sb_pop, }; -static PMap(ptr_t) *invalidated_terminals; +static PMap(ptr_t) invalidated_terminals = MAP_INIT; void terminal_init(void) { - invalidated_terminals = pmap_new(ptr_t)(); time_watcher_init(&main_loop, &refresh_timer, NULL); // refresh_timer_cb will redraw the screen which can call vimscript refresh_timer.events = multiqueue_new_child(main_loop.events); @@ -168,8 +166,10 @@ void terminal_teardown(void) time_watcher_stop(&refresh_timer); multiqueue_free(refresh_timer.events); time_watcher_close(&refresh_timer, NULL); - pmap_free(ptr_t)(invalidated_terminals); - invalidated_terminals = NULL; + pmap_destroy(ptr_t)(&invalidated_terminals); + // terminal_destroy might be called after terminal_teardown is invoked + // make sure it is in an empty, valid state + pmap_init(ptr_t, &invalidated_terminals); } // public API {{{ @@ -260,7 +260,7 @@ Terminal *terminal_open(buf_T *buf, TerminalOptions opts) return rv; } -void terminal_close(Terminal *term, char *msg) +void terminal_close(Terminal *term, int status) { if (term->closed) { return; @@ -278,8 +278,8 @@ void terminal_close(Terminal *term, char *msg) buf_T *buf = handle_get_buffer(term->buf_handle); term->closed = true; - if (!msg || exiting) { - // If no msg was given, this was called by close_buffer(buffer.c). Or if + if (status == -1 || exiting) { + // If status is -1, this was called by close_buffer(buffer.c). Or if // exiting, we must inform the buffer the terminal no longer exists so that // close_buffer() doesn't call this again. term->buf_handle = 0; @@ -291,11 +291,16 @@ void terminal_close(Terminal *term, char *msg) term->opts.close_cb(term->opts.data); } } else { + char msg[sizeof("\r\n[Process exited ]") + NUMBUFLEN]; + snprintf(msg, sizeof msg, "\r\n[Process exited %d]", status); terminal_receive(term, msg, strlen(msg)); } - if (buf) { + if (buf && !is_autocmd_blocked()) { + dict_T *dict = get_vim_var_dict(VV_EVENT); + tv_dict_add_nr(dict, S_LEN("status"), status); apply_autocmds(EVENT_TERMCLOSE, NULL, NULL, false, buf); + tv_dict_clear(dict); } } @@ -521,14 +526,12 @@ void terminal_destroy(Terminal *term) } if (!term->refcount) { - // might be destroyed after terminal_teardown is invoked - if (invalidated_terminals - && pmap_has(ptr_t)(invalidated_terminals, term)) { + if (pmap_has(ptr_t)(&invalidated_terminals, term)) { // flush any pending changes to the buffer block_autocmds(); refresh_terminal(term); unblock_autocmds(); - pmap_del(ptr_t)(invalidated_terminals, term); + pmap_del(ptr_t)(&invalidated_terminals, term); } for (size_t i = 0; i < term->sb_current; i++) { xfree(term->sb_buffer[i]); @@ -865,7 +868,7 @@ static int term_sb_push(int cols, const VTermScreenCell *cells, void *data) } memcpy(sbrow->cells, cells, sizeof(cells[0]) * c); - pmap_put(ptr_t)(invalidated_terminals, term, NULL); + pmap_put(ptr_t)(&invalidated_terminals, term, NULL); return 1; } @@ -906,7 +909,7 @@ static int term_sb_pop(int cols, VTermScreenCell *cells, void *data) } xfree(sbrow); - pmap_put(ptr_t)(invalidated_terminals, term, NULL); + pmap_put(ptr_t)(&invalidated_terminals, term, NULL); return 1; } @@ -1208,7 +1211,7 @@ static void invalidate_terminal(Terminal *term, int start_row, int end_row) term->invalid_end = MAX(term->invalid_end, end_row); } - pmap_put(ptr_t)(invalidated_terminals, term, NULL); + pmap_put(ptr_t)(&invalidated_terminals, term, NULL); if (!refresh_pending) { time_watcher_start(&refresh_timer, refresh_timer_cb, REFRESH_DELAY, 0); refresh_pending = true; @@ -1250,10 +1253,10 @@ static void refresh_timer_cb(TimeWatcher *watcher, void *data) void *stub; (void)(stub); // don't process autocommands while updating terminal buffers block_autocmds(); - map_foreach(invalidated_terminals, term, stub, { + map_foreach(&invalidated_terminals, term, stub, { refresh_terminal(term); }); - pmap_clear(ptr_t)(invalidated_terminals); + pmap_clear(ptr_t)(&invalidated_terminals); unblock_autocmds(); } diff --git a/src/nvim/testdir/setup.vim b/src/nvim/testdir/setup.vim index fcbc28fdc0..b3df8c63e6 100644 --- a/src/nvim/testdir/setup.vim +++ b/src/nvim/testdir/setup.vim @@ -12,6 +12,7 @@ set directory^=. set fillchars=vert:\|,fold:- set laststatus=1 set listchars=eol:$ +set joinspaces set nohidden smarttab noautoindent noautoread complete-=i noruler noshowcmd set nrformats+=octal set shortmess-=F @@ -21,6 +22,14 @@ set undodir^=. set wildoptions= set startofline set sessionoptions+=options +set viewoptions+=options +set switchbuf= + +" Unmap Nvim default mappings. +unmap Y +unmap <C-L> +iunmap <C-U> +iunmap <C-W> " Prevent Nvim log from writing to stderr. let $NVIM_LOG_FILE = exists($NVIM_LOG_FILE) ? $NVIM_LOG_FILE : 'Xnvim.log' diff --git a/src/nvim/testdir/test42.in b/src/nvim/testdir/test42.in Binary files differindex d9057e72fb..456f9ddb07 100644 --- a/src/nvim/testdir/test42.in +++ b/src/nvim/testdir/test42.in diff --git a/src/nvim/testdir/test_autocmd.vim b/src/nvim/testdir/test_autocmd.vim index ad28118f16..015979e1be 100644 --- a/src/nvim/testdir/test_autocmd.vim +++ b/src/nvim/testdir/test_autocmd.vim @@ -998,6 +998,7 @@ func Test_bufunload_all() endfunc au BufUnload * call UnloadAllBufs() au VimLeave * call writefile(['Test Finished'], 'Xout') + set nohidden edit Xxx1 split Xxx2 q @@ -1955,7 +1956,7 @@ func Test_autocmd_sigusr1() let g:sigusr1_passed = 0 au Signal SIGUSR1 let g:sigusr1_passed = 1 - call system('/bin/kill -s usr1 ' . getpid()) + call system('kill -s usr1 ' . getpid()) call WaitForAssert({-> assert_true(g:sigusr1_passed)}) au! Signal diff --git a/src/nvim/testdir/test_command_count.vim b/src/nvim/testdir/test_command_count.vim index 55b230373f..c7dddf4164 100644 --- a/src/nvim/testdir/test_command_count.vim +++ b/src/nvim/testdir/test_command_count.vim @@ -33,7 +33,7 @@ func Test_command_count_0() delcommand RangeBuffers delcommand RangeBuffersAll - set hidden& + set nohidden set swapfile& endfunc diff --git a/src/nvim/testdir/test_cursorline.vim b/src/nvim/testdir/test_cursorline.vim index 4a0f2665fe..39d8b901ed 100644 --- a/src/nvim/testdir/test_cursorline.vim +++ b/src/nvim/testdir/test_cursorline.vim @@ -192,7 +192,29 @@ func Test_cursorline_screenline() call term_sendkeys(buf, "gj") call term_wait(buf) call VerifyScreenDump(buf, 'Test_'. filename. '_18', {}) + call term_sendkeys(buf, ":set breakindent& foldcolumn& signcolumn&\<cr>") endif + " showbreak should not be highlighted with CursorLine when 'number' is off + call term_sendkeys(buf, "gg0") + call term_sendkeys(buf, ":set list cursorlineopt=screenline listchars=space:-\<cr>") + call term_sendkeys(buf, ":set nonumber\<cr>") + call VerifyScreenDump(buf, 'Test_'. filename. '_19', {}) + call term_sendkeys(buf, "fagj") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_'. filename. '_20', {}) + call term_sendkeys(buf, "gj") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_'. filename. '_21', {}) + call term_sendkeys(buf, "gj") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_'. filename. '_22', {}) + call term_sendkeys(buf, "gj") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_'. filename. '_23', {}) + call term_sendkeys(buf, "gj") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_'. filename. '_24', {}) + call term_sendkeys(buf, ":set list& cursorlineopt& listchars&\<cr>") call StopVimInTerminal(buf) call delete(filename) diff --git a/src/nvim/testdir/test_diffmode.vim b/src/nvim/testdir/test_diffmode.vim index 8a709d3f0d..efa7f552e0 100644 --- a/src/nvim/testdir/test_diffmode.vim +++ b/src/nvim/testdir/test_diffmode.vim @@ -540,7 +540,7 @@ func Test_diffopt_hiddenoff() bwipe! bwipe! - set hidden& diffopt& + set nohidden diffopt& endfunc func Test_diffoff_hidden() @@ -577,7 +577,7 @@ func Test_diffoff_hidden() bwipe! bwipe! - set hidden& diffopt& + set nohidden diffopt& endfunc func Test_setting_cursor() @@ -990,6 +990,37 @@ func Test_diff_with_cursorline() call delete('Xtest_diff_cursorline') endfunc +func Test_diff_with_cursorline_breakindent() + CheckScreendump + + call writefile([ + \ 'hi CursorLine ctermbg=red ctermfg=white', + \ 'set noequalalways wrap diffopt=followwrap cursorline breakindent', + \ '50vnew', + \ 'call setline(1, [" "," "," "," "])', + \ 'exe "norm 20Afoo\<Esc>j20Afoo\<Esc>j20Afoo\<Esc>j20Abar\<Esc>"', + \ 'vnew', + \ 'call setline(1, [" "," "," "," "])', + \ 'exe "norm 20Abee\<Esc>j20Afoo\<Esc>j20Afoo\<Esc>j20Abaz\<Esc>"', + \ 'windo diffthis', + \ '2wincmd w', + \ ], 'Xtest_diff_cursorline_breakindent') + let buf = RunVimInTerminal('-S Xtest_diff_cursorline_breakindent', {}) + + call term_sendkeys(buf, "gg0") + call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_01', {}) + call term_sendkeys(buf, "j") + call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_02', {}) + call term_sendkeys(buf, "j") + call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_03', {}) + call term_sendkeys(buf, "j") + call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_04', {}) + + " clean up + call StopVimInTerminal(buf) + call delete('Xtest_diff_cursorline_breakindent') +endfunc + func Test_diff_with_syntax() CheckScreendump diff --git a/src/nvim/testdir/test_filetype.vim b/src/nvim/testdir/test_filetype.vim index 4ab58cd084..4d29d18330 100644 --- a/src/nvim/testdir/test_filetype.vim +++ b/src/nvim/testdir/test_filetype.vim @@ -151,7 +151,6 @@ let s:filename_checks = { \ 'dosini': ['.editorconfig', '/etc/pacman.conf', '/etc/yum.conf', 'file.ini', 'npmrc', '.npmrc', 'php.ini', 'php.ini-5', 'php.ini-file', '/etc/yum.repos.d/file', 'any/etc/pacman.conf', 'any/etc/yum.conf', 'any/etc/yum.repos.d/file', 'file.wrap'], \ 'dot': ['file.dot', 'file.gv'], \ 'dracula': ['file.drac', 'file.drc', 'filelvs', 'filelpe', 'drac.file', 'lpe', 'lvs', 'some-lpe', 'some-lvs'], - \ 'dsl': ['file.dsl'], \ 'dtd': ['file.dtd'], \ 'dts': ['file.dts', 'file.dtsi'], \ 'dune': ['jbuild', 'dune', 'dune-project', 'dune-workspace'], @@ -263,6 +262,7 @@ let s:filename_checks = { \ 'json': ['file.json', 'file.jsonp', 'file.json-patch', 'file.webmanifest', 'Pipfile.lock', 'file.ipynb'], \ 'jsonc': ['file.jsonc'], \ 'jsp': ['file.jsp'], + \ 'julia': ['file.jl'], \ 'kconfig': ['Kconfig', 'Kconfig.debug', 'Kconfig.file'], \ 'kivy': ['file.kv'], \ 'kix': ['file.kix'], @@ -754,6 +754,7 @@ func Test_pp_file() split Xfile.pp call assert_equal('pascal', &filetype) bwipe! + unlet g:filetype_pp " Test dist#ft#FTpp() call writefile(['{ pascal comment'], 'Xfile.pp') @@ -807,4 +808,21 @@ func Test_ex_file() filetype off endfunc +func Test_dsl_file() + filetype on + + call writefile([' <!doctype dsssl-spec ['], 'dslfile.dsl') + split dslfile.dsl + call assert_equal('dsl', &filetype) + bwipe! + + call writefile(['workspace {'], 'dslfile.dsl') + split dslfile.dsl + call assert_equal('structurizr', &filetype) + bwipe! + + call delete('dslfile.dsl') + filetype off +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_gf.vim b/src/nvim/testdir/test_gf.vim index ee548037ba..43efd6248e 100644 --- a/src/nvim/testdir/test_gf.vim +++ b/src/nvim/testdir/test_gf.vim @@ -145,7 +145,7 @@ func Test_gf_visual() bwipe! call delete('Xtest_gf_visual') - set hidden& + set nohidden endfunc func Test_gf_error() diff --git a/src/nvim/testdir/test_ins_complete.vim b/src/nvim/testdir/test_ins_complete.vim index 3da3648fec..0fb026f6b0 100644 --- a/src/nvim/testdir/test_ins_complete.vim +++ b/src/nvim/testdir/test_ins_complete.vim @@ -95,7 +95,7 @@ func Test_ins_complete() call delete('Xtest11.one') call delete('Xtest11.two') call delete('Xtestdata') - set cpt& cot& def& tags& tagbsearch& hidden& + set cpt& cot& def& tags& tagbsearch& nohidden cd .. call delete('Xdir', 'rf') endfunc diff --git a/src/nvim/testdir/test_join.vim b/src/nvim/testdir/test_join.vim index ac6ef8f29f..ecb969d10a 100644 --- a/src/nvim/testdir/test_join.vim +++ b/src/nvim/testdir/test_join.vim @@ -51,7 +51,7 @@ func Test_join_marks() /^This line/;'}-join call assert_equal([0, 4, 11, 0], getpos("'[")) - call assert_equal([0, 4, 67, 0], getpos("']")) + call assert_equal([0, 4, 66, 0], getpos("']")) enew! endfunc diff --git a/src/nvim/testdir/test_match.vim b/src/nvim/testdir/test_match.vim index fed7240eb2..505a052a19 100644 --- a/src/nvim/testdir/test_match.vim +++ b/src/nvim/testdir/test_match.vim @@ -157,7 +157,10 @@ func Test_match_error() endfunc func Test_matchadd_error() - call assert_fails("call matchadd('GroupDoesNotExist', 'X')", 'E28:') + call clearmatches() + " Nvim: not an error anymore: + call matchadd('GroupDoesNotExist', 'X') + call assert_equal([{'group': 'GroupDoesNotExist', 'pattern': 'X', 'priority': 10, 'id': 13}], getmatches()) call assert_fails("call matchadd('Search', '\\(')", 'E475:') call assert_fails("call matchadd('Search', 'XXX', 1, 123, 1)", 'E715:') call assert_fails("call matchadd('Error', 'XXX', 1, 3)", 'E798:') diff --git a/src/nvim/testdir/test_mksession.vim b/src/nvim/testdir/test_mksession.vim index fbe764bbf2..c96c6a9678 100644 --- a/src/nvim/testdir/test_mksession.vim +++ b/src/nvim/testdir/test_mksession.vim @@ -307,7 +307,7 @@ func Test_mksession_buffer_count() call delete('Xbaz') call delete('Xtest_mks.out') %bwipe! - set hidden& + set nohidden endfunc if has('extra_search') diff --git a/src/nvim/testdir/test_normal.vim b/src/nvim/testdir/test_normal.vim index 5c413d1e16..aff22f5d01 100644 --- a/src/nvim/testdir/test_normal.vim +++ b/src/nvim/testdir/test_normal.vim @@ -1227,7 +1227,7 @@ func Test_normal23_K() set iskeyword-=\| " Only expect "man" to work on Unix - if !has("unix") + if !has("unix") || has('nvim') " Nvim K uses :terminal. #15398 let &keywordprg = k bw! return diff --git a/src/nvim/testdir/test_options.vim b/src/nvim/testdir/test_options.vim index 8796af7a20..72c151142d 100644 --- a/src/nvim/testdir/test_options.vim +++ b/src/nvim/testdir/test_options.vim @@ -539,7 +539,7 @@ func Test_copy_winopt() call assert_equal(4,&numberwidth) bw! - set hidden& + set nohidden endfunc func Test_shortmess_F() diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim index 5090584e41..283e7bbafe 100644 --- a/src/nvim/testdir/test_quickfix.vim +++ b/src/nvim/testdir/test_quickfix.vim @@ -1911,7 +1911,7 @@ func Test_switchbuf() enew | only set switchbuf=useopen cexpr "Xqftestfile1:1:10" - call assert_equal('', &switchbuf) + call assert_equal('uselast', &switchbuf) call delete('Xqftestfile1') call delete('Xqftestfile2') diff --git a/src/nvim/testdir/test_tagjump.vim b/src/nvim/testdir/test_tagjump.vim index 68dcfb6890..0fa7f85f0d 100644 --- a/src/nvim/testdir/test_tagjump.vim +++ b/src/nvim/testdir/test_tagjump.vim @@ -170,7 +170,7 @@ func Test_tag_symbolic() call assert_equal('Xtest.c', expand('%:t')) call assert_equal(2, col('.')) - set hidden& + set nohidden set tags& enew! call delete('Xtags') @@ -548,6 +548,16 @@ func Test_tag_line_toolong() call assert_equal('Xsomewhere', expand('%')) call assert_equal(3, getcurpos()[1]) + " expansion on command line works with long lines when &wildoptions contains + " 'tagfile' + set wildoptions=tagfile + call writefile([ + \ 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa file /^pattern$/;" f' + \ ], 'Xtags') + call feedkeys(":tag \<Tab>", 'tx') + " Should not crash + call assert_true(v:true) + call delete('Xtags') call delete('Xsomewhere') set tags& diff --git a/src/nvim/testdir/test_window_cmd.vim b/src/nvim/testdir/test_window_cmd.vim index a522705238..039de0c623 100644 --- a/src/nvim/testdir/test_window_cmd.vim +++ b/src/nvim/testdir/test_window_cmd.vim @@ -608,7 +608,7 @@ func Test_window_prevwin() " reset q call delete('tmp.txt') - set hidden&vim autoread&vim + set nohidden autoread&vim delfunc Fun_RenewFile endfunc diff --git a/src/nvim/undo.c b/src/nvim/undo.c index 3096fe84c0..e1a7dbb2d3 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -1297,8 +1297,8 @@ void u_write_undo(const char *const name, const bool forceit, buf_T *const buf, goto theend; } - /* Undo must be synced. */ - u_sync(TRUE); + // Undo must be synced. + u_sync(true); /* * Write the header. @@ -1783,7 +1783,7 @@ void u_undo(int count) * be compatible. */ if (curbuf->b_u_synced == false) { - u_sync(TRUE); + u_sync(true); count = 1; } @@ -1943,9 +1943,10 @@ void undo_time(long step, bool sec, bool file, bool absolute) bool above = false; bool did_undo = true; - /* First make sure the current undoable change is synced. */ - if (curbuf->b_u_synced == false) - u_sync(TRUE); + // First make sure the current undoable change is synced. + if (curbuf->b_u_synced == false) { + u_sync(true); + } u_newcount = 0; u_oldcount = 0; @@ -2601,13 +2602,10 @@ static void u_undo_end( msgbuf); } -/* - * u_sync: stop adding to the current entry list - */ -void -u_sync( - int force // Also sync when no_u_sync is set. -) +/// u_sync: stop adding to the current entry list +/// +/// @param force if true, also sync when no_u_sync is set. +void u_sync(bool force) { // Skip it when already synced or syncing is disabled. if (curbuf->b_u_synced || (!force && no_u_sync > 0)) { @@ -2764,13 +2762,13 @@ void u_find_first_changed(void) return; for (lnum = 1; lnum < curbuf->b_ml.ml_line_count - && lnum <= uep->ue_size; ++lnum) - if (STRCMP(ml_get_buf(curbuf, lnum, FALSE), - uep->ue_array[lnum - 1]) != 0) { + && lnum <= uep->ue_size; lnum++) { + if (STRCMP(ml_get_buf(curbuf, lnum, false), uep->ue_array[lnum - 1]) != 0) { clearpos(&(uhp->uh_cursor)); uhp->uh_cursor.lnum = lnum; return; } + } if (curbuf->b_ml.ml_line_count != uep->ue_size) { /* lines added or deleted at the end, put the cursor there */ clearpos(&(uhp->uh_cursor)); diff --git a/src/nvim/version.c b/src/nvim/version.c index 48ef71613e..7c197f1b7f 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -39,7 +39,10 @@ NVIM_VERSION_PRERELEASE char *Version = VIM_VERSION_SHORT; char *longVersion = NVIM_VERSION_LONG; char *version_buildtype = "Build type: " NVIM_VERSION_BUILD_TYPE; +// Reproducible builds: omit compile info in Release builds. #15424 +#ifndef NDEBUG char *version_cflags = "Compilation: " NVIM_VERSION_CFLAGS; +#endif #ifdef INCLUDE_GENERATED_DECLARATIONS # include "version.c.generated.h" @@ -2143,7 +2146,9 @@ void list_version(void) MSG(longVersion); MSG(version_buildtype); list_lua_version(); +#ifndef NDEBUG MSG(version_cflags); +#endif #ifdef HAVE_PATHDEF diff --git a/src/nvim/window.c b/src/nvim/window.c index fe6ab5af55..eddbe14da2 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -5,7 +5,6 @@ #include <inttypes.h> #include <stdbool.h> -#include "nvim/api/private/handle.h" #include "nvim/api/private/helpers.h" #include "nvim/vim.h" #include "nvim/ascii.h" @@ -905,7 +904,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) int new_size = size; int i; int need_status = 0; - int do_equal = FALSE; + bool do_equal = false; int needed; int available; int oldwin_height = 0; @@ -991,9 +990,10 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) new_size = wmw1; } - /* if it doesn't fit in the current window, need win_equal() */ - if (oldwin->w_width - new_size - 1 < p_wmw) - do_equal = TRUE; + // if it doesn't fit in the current window, need win_equal() + if (oldwin->w_width - new_size - 1 < p_wmw) { + do_equal = true; + } // We don't like to take lines for the new window from a // 'winfixwidth' window. Take them from a window to the left or right @@ -1010,9 +1010,9 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) while (frp != NULL) { if (frp->fr_win != oldwin && frp->fr_win != NULL && (frp->fr_win->w_width > new_size - || frp->fr_win->w_width > oldwin->w_width - - new_size - 1)) { - do_equal = TRUE; + || frp->fr_win->w_width > (oldwin->w_width + - new_size - 1))) { + do_equal = true; break; } frp = frp->fr_next; @@ -1075,9 +1075,10 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) new_size = wmh1; } - /* if it doesn't fit in the current window, need win_equal() */ - if (oldwin_height - new_size - STATUS_HEIGHT < p_wmh) - do_equal = TRUE; + // if it doesn't fit in the current window, need win_equal() + if (oldwin_height - new_size - STATUS_HEIGHT < p_wmh) { + do_equal = true; + } /* We don't like to take lines for the new window from a * 'winfixheight' window. Take them from a window above or below @@ -1106,7 +1107,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) && (frp->fr_win->w_height > new_size || frp->fr_win->w_height > oldwin_height - new_size - STATUS_HEIGHT)) { - do_equal = TRUE; + do_equal = true; break; } frp = frp->fr_next; @@ -1121,19 +1122,19 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) && ((flags & WSP_BOT) || (flags & WSP_BELOW) || (!(flags & WSP_ABOVE) - && ( - (flags & WSP_VERT) ? p_spr : - p_sb)))) { - /* new window below/right of current one */ - if (new_wp == NULL) - wp = win_alloc(oldwin, FALSE); - else + && ((flags & WSP_VERT) ? p_spr : p_sb)))) { + // new window below/right of current one + if (new_wp == NULL) { + wp = win_alloc(oldwin, false); + } else { win_append(oldwin, wp); + } } else { - if (new_wp == NULL) - wp = win_alloc(oldwin->w_prev, FALSE); - else + if (new_wp == NULL) { + wp = win_alloc(oldwin->w_prev, false); + } else { win_append(oldwin->w_prev, wp); + } } if (new_wp == NULL) { @@ -1248,11 +1249,12 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) frame_add_vsep(curfrp); /* Set width of neighbor frame */ frame_new_width(curfrp, curfrp->fr_width - - (new_size + ((flags & WSP_TOP) != 0)), flags & WSP_TOP, - FALSE); - } else + - (new_size + ((flags & WSP_TOP) != 0)), flags & WSP_TOP, + false); + } else { win_new_width(oldwin, oldwin->w_width - (new_size + 1)); - if (before) { /* new window left of current one */ + } + if (before) { // new window left of current one wp->w_wincol = oldwin->w_wincol; oldwin->w_wincol += new_size + 1; } else /* new window right of current one */ @@ -1439,7 +1441,7 @@ static void win_init_some(win_T *newp, win_T *oldp) win_copy_options(oldp, newp); } -/// Return TRUE if "win" is floating window in the current tab page. +/// Return true if "win" is floating window in the current tab page. /// /// @param win window to check bool win_valid_floating(const win_T *win) @@ -1517,17 +1519,14 @@ int win_count(void) return count; } -/* - * Make "count" windows on the screen. - * Return actual number of windows on the screen. - * Must be called when there is just one window, filling the whole screen - * (excluding the command line). - */ -int -make_windows ( - int count, - int vertical /* split windows vertically if TRUE */ -) +/// Make "count" windows on the screen. +/// Must be called when there is just one window, filling the whole screen +/// (excluding the command line). +/// +/// @param vertical split windows vertically if true +/// +/// @return actual number of windows on the screen. +int make_windows(int count, bool vertical) { int maxcount; int todo; @@ -1552,8 +1551,9 @@ make_windows ( /* * add status line now, otherwise first window will be too big */ - if (count > 1) - last_status(TRUE); + if (count > 1) { + last_status(true); + } /* * Don't execute autocommands while creating the windows. Must do that @@ -1786,8 +1786,8 @@ static void win_totop(int size, int flags) (void)winframe_remove(curwin, &dir, NULL); } win_remove(curwin, NULL); - last_status(FALSE); /* may need to remove last status line */ - (void)win_comp_pos(); /* recompute window positions */ + last_status(false); // may need to remove last status line + (void)win_comp_pos(); // recompute window positions /* Split a window on the desired side and put the window there. */ (void)win_split_ins(size, flags, curwin, dir); @@ -1898,7 +1898,7 @@ static void win_equal_rec( int room = 0; int new_size; int has_next_curwin = 0; - int hnc; + bool hnc; if (topfr->fr_layout == FR_LEAF) { /* Set the width/height of this frame. @@ -2002,17 +2002,20 @@ static void win_equal_rec( wincount = (n + (fr->fr_next == NULL ? extra_sep : 0)) / (p_wmw + 1); m = frame_minwidth(fr, next_curwin); - if (has_next_curwin) + if (has_next_curwin) { hnc = frame_has_win(fr, next_curwin); - else - hnc = FALSE; - if (hnc) /* don't count next_curwin */ - --wincount; - if (totwincount == 0) + } else { + hnc = false; + } + if (hnc) { // don't count next_curwin + wincount--; + } + if (totwincount == 0) { new_size = room; - else + } else { new_size = (wincount * room + (totwincount / 2)) / totwincount; - if (hnc) { /* add next_curwin size */ + } + if (hnc) { // add next_curwin size next_curwin_size -= p_wiw - (m - n); new_size += next_curwin_size; room -= new_size - next_curwin_size; @@ -2123,17 +2126,20 @@ static void win_equal_rec( wincount = (n + (fr->fr_next == NULL ? extra_sep : 0)) / (p_wmh + 1); m = frame_minheight(fr, next_curwin); - if (has_next_curwin) + if (has_next_curwin) { hnc = frame_has_win(fr, next_curwin); - else - hnc = FALSE; - if (hnc) /* don't count next_curwin */ - --wincount; - if (totwincount == 0) + } else { + hnc = false; + } + if (hnc) { // don't count next_curwin + wincount--; + } + if (totwincount == 0) { new_size = room; - else + } else { new_size = (wincount * room + (totwincount / 2)) / totwincount; - if (hnc) { /* add next_curwin size */ + } + if (hnc) { // add next_curwin size next_curwin_size -= p_wh - (m - n); new_size += next_curwin_size; room -= new_size - next_curwin_size; @@ -2311,8 +2317,8 @@ static bool close_last_window_tabpage(win_T *win, bool free_buf, int win_close(win_T *win, bool free_buf) { win_T *wp; - int other_buffer = FALSE; - int close_curwin = FALSE; + bool other_buffer = false; + bool close_curwin = false; int dir; bool help_window = false; tabpage_T *prev_curtab = curtab; @@ -2377,7 +2383,7 @@ int win_close(win_T *win, bool free_buf) * to be the last one left, return now. */ if (wp->w_buffer != curbuf) { - other_buffer = TRUE; + other_buffer = true; win->w_closing = true; apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf); if (!win_valid(win)) @@ -2516,7 +2522,7 @@ int win_close(win_T *win, bool free_buf) } } curbuf = curwin->w_buffer; - close_curwin = TRUE; + close_curwin = true; // The cursor position may be invalid if the buffer changed after last // using the window. @@ -2545,7 +2551,7 @@ int win_close(win_T *win, bool free_buf) * If last window has a status line now and we don't want one, * remove the status line. */ - last_status(FALSE); + last_status(false); /* After closing the help window, try restoring the window layout from * before it was opened. */ @@ -2598,7 +2604,7 @@ void win_close_othertab(win_T *win, int free_buf, tabpage_T *tp) { int dir; tabpage_T *ptp = NULL; - int free_tp = FALSE; + bool free_tp = false; // Get here with win->w_buffer == NULL when win_close() detects the tab page // changed. @@ -2703,7 +2709,11 @@ static win_T *win_free_mem( // When deleting the current window of another tab page select a new // current window. if (tp != NULL && win == tp->tp_curwin) { - tp->tp_curwin = wp; + if (win_valid(tp->tp_prevwin) && tp->tp_prevwin != win) { + tp->tp_curwin = tp->tp_prevwin; + } else { + tp->tp_curwin = tp->tp_firstwin; + } } return wp; @@ -2798,7 +2808,7 @@ winframe_remove ( } } frame_new_height(frp2, frp2->fr_height + frp_close->fr_height, - frp2 == frp_close->fr_next ? TRUE : FALSE, FALSE); + frp2 == frp_close->fr_next, false); *dirp = 'v'; } else { /* When 'winfixwidth' is set, try to find another frame in the column @@ -2827,7 +2837,7 @@ winframe_remove ( } } frame_new_width(frp2, frp2->fr_width + frp_close->fr_width, - frp2 == frp_close->fr_next ? TRUE : FALSE, FALSE); + frp2 == frp_close->fr_next, false); *dirp = 'h'; } @@ -2983,18 +2993,14 @@ static bool frame_has_win(const frame_T *frp, const win_T *wp) return false; } -/* - * Set a new height for a frame. Recursively sets the height for contained - * frames and windows. Caller must take care of positions. - */ -static void -frame_new_height ( - frame_T *topfrp, - int height, - int topfirst, /* resize topmost contained frame first */ - int wfh /* obey 'winfixheight' when there is a choice; - may cause the height not to be set */ -) +/// Set a new height for a frame. Recursively sets the height for contained +/// frames and windows. Caller must take care of positions. +/// +/// @param topfirst resize topmost contained frame first. +/// @param wfh obey 'winfixheight' when there is a choice; +/// may cause the height not to be set. +static void frame_new_height(frame_T *topfrp, int height, bool topfirst, + bool wfh) FUNC_ATTR_NONNULL_ALL { frame_T *frp; @@ -3170,18 +3176,14 @@ static void frame_add_statusline(frame_T *frp) } } -/* - * Set width of a frame. Handles recursively going through contained frames. - * May remove separator line for windows at the right side (for win_close()). - */ -static void -frame_new_width ( - frame_T *topfrp, - int width, - int leftfirst, /* resize leftmost contained frame first */ - int wfw /* obey 'winfixwidth' when there is a choice; - may cause the width not to be set */ -) +/// Set width of a frame. Handles recursively going through contained frames. +/// May remove separator line for windows at the right side (for win_close()). +/// +/// @param leftfirst resize leftmost contained frame first. +/// @param wfw obey 'winfixwidth' when there is a choice; +/// may cause the width not to be set. +static void frame_new_width(frame_T *topfrp, int width, bool leftfirst, + bool wfw) { frame_T *frp; int extra_cols; @@ -3538,7 +3540,7 @@ void win_alloc_aucmd_win(void) */ static int win_alloc_firstwin(win_T *oldwin) { - curwin = win_alloc(NULL, FALSE); + curwin = win_alloc(NULL, false); if (oldwin == NULL) { /* Very first window, need to create an empty buffer for it and * initialize from scratch. */ @@ -3602,7 +3604,7 @@ static tabpage_T *alloc_tabpage(void) static int last_tp_handle = 0; tabpage_T *tp = xcalloc(1, sizeof(tabpage_T)); tp->handle = ++last_tp_handle; - handle_register_tabpage(tp); + pmap_put(handle_T)(&tabpage_handles, tp->handle, tp); // Init t: variables. tp->tp_vars = tv_dict_alloc(); @@ -3617,7 +3619,7 @@ void free_tabpage(tabpage_T *tp) { int idx; - handle_unregister_tabpage(tp); + pmap_del(handle_T)(&tabpage_handles, tp->handle); diff_clear(tp); for (idx = 0; idx < SNAP_COUNT; ++idx) clear_snapshot(tp, idx); @@ -4342,13 +4344,13 @@ void win_enter(win_T *wp, bool undo_sync) win_enter_ext(wp, undo_sync, false, false, true, true); } -/* - * Make window wp the current window. - * Can be called with "curwin_invalid" TRUE, which means that curwin has just - * been closed and isn't valid. - */ -static void win_enter_ext(win_T *wp, bool undo_sync, int curwin_invalid, - int trigger_new_autocmds, bool trigger_enter_autocmds, +/// Make window wp the current window. +/// +/// @param curwin_invalid curwin has just been closed and +/// isn't valid when true. +static void win_enter_ext(win_T *wp, bool undo_sync, bool curwin_invalid, + bool trigger_new_autocmds, + bool trigger_enter_autocmds, bool trigger_leave_autocmds) { int other_buffer = FALSE; @@ -4376,7 +4378,7 @@ static void win_enter_ext(win_T *wp, bool undo_sync, int curwin_invalid, // sync undo before leaving the current buffer if (undo_sync && curbuf != wp->w_buffer) { - u_sync(FALSE); + u_sync(false); } // Might need to scroll the old window before switching, e.g., when the @@ -4536,11 +4538,9 @@ win_T *buf_jump_open_tab(buf_T *buf) return NULL; } -/* - * Allocate a window structure and link it in the window list when "hidden" is - * FALSE. - */ -static win_T *win_alloc(win_T *after, int hidden) +/// @param hidden allocate a window structure and link it in the window if +// false. +static win_T *win_alloc(win_T *after, bool hidden) { static int last_win_id = LOWEST_WIN_ID - 1; @@ -4548,7 +4548,7 @@ static win_T *win_alloc(win_T *after, int hidden) win_T *new_wp = xcalloc(1, sizeof(win_T)); new_wp->handle = ++last_win_id; - handle_register_window(new_wp); + pmap_put(handle_T)(&window_handles, new_wp->handle, new_wp); grid_assign_handle(&new_wp->w_grid_alloc); @@ -4619,7 +4619,7 @@ win_free ( int i; wininfo_T *wip; - handle_unregister_window(wp); + pmap_del(handle_T)(&window_handles, wp->handle); clearFolding(wp); /* reduce the reference count to the argument list. */ @@ -4830,9 +4830,10 @@ void shell_new_rows(void) /* First try setting the heights of windows with 'winfixheight'. If * that doesn't result in the right height, forget about that option. */ - frame_new_height(topframe, h, FALSE, TRUE); - if (!frame_check_height(topframe, h)) - frame_new_height(topframe, h, FALSE, FALSE); + frame_new_height(topframe, h, false, true); + if (!frame_check_height(topframe, h)) { + frame_new_height(topframe, h, false, false); + } (void)win_comp_pos(); // recompute w_winrow and w_wincol win_reconfig_floats(); // The size of floats might change @@ -5078,8 +5079,9 @@ static void frame_setheight(frame_T *curfrp, int height) /* topframe: can only change the command line */ if (height > ROWS_AVAIL) height = ROWS_AVAIL; - if (height > 0) - frame_new_height(curfrp, height, FALSE, FALSE); + if (height > 0) { + frame_new_height(curfrp, height, false, false); + } } else if (curfrp->fr_parent->fr_layout == FR_ROW) { /* Row of frames: Also need to resize frames left and right of this * one. First check for the minimal height of these. */ @@ -5161,7 +5163,7 @@ static void frame_setheight(frame_T *curfrp, int height) /* * set the current frame to the new height */ - frame_new_height(curfrp, height, FALSE, FALSE); + frame_new_height(curfrp, height, false, false); /* * First take lines from the frames after the current frame. If @@ -5184,16 +5186,15 @@ static void frame_setheight(frame_T *curfrp, int height) if (frp->fr_height - room_reserved > take) room_reserved = frp->fr_height - take; take -= frp->fr_height - room_reserved; - frame_new_height(frp, room_reserved, FALSE, FALSE); + frame_new_height(frp, room_reserved, false, false); room_reserved = 0; } } else { if (frp->fr_height - take < h) { take -= frp->fr_height - h; - frame_new_height(frp, h, FALSE, FALSE); + frame_new_height(frp, h, false, false); } else { - frame_new_height(frp, frp->fr_height - take, - FALSE, FALSE); + frame_new_height(frp, frp->fr_height - take, false, false); take = 0; } } @@ -5324,7 +5325,7 @@ static void frame_setwidth(frame_T *curfrp, int width) /* * set the current frame to the new width */ - frame_new_width(curfrp, width, FALSE, FALSE); + frame_new_width(curfrp, width, false, false); /* * First take lines from the frames right of the current frame. If @@ -5347,16 +5348,15 @@ static void frame_setwidth(frame_T *curfrp, int width) if (frp->fr_width - room_reserved > take) room_reserved = frp->fr_width - take; take -= frp->fr_width - room_reserved; - frame_new_width(frp, room_reserved, FALSE, FALSE); + frame_new_width(frp, room_reserved, false, false); room_reserved = 0; } } else { if (frp->fr_width - take < w) { take -= frp->fr_width - w; - frame_new_width(frp, w, FALSE, FALSE); + frame_new_width(frp, w, false, false); } else { - frame_new_width(frp, frp->fr_width - take, - FALSE, FALSE); + frame_new_width(frp, frp->fr_width - take, false, false); take = 0; } } @@ -5409,16 +5409,14 @@ void win_setminwidth(void) } } -/* - * Status line of dragwin is dragged "offset" lines down (negative is up). - */ +/// Status line of dragwin is dragged "offset" lines down (negative is up). void win_drag_status_line(win_T *dragwin, int offset) { frame_T *curfr; frame_T *fr; int room; int row; - int up; /* if TRUE, drag status line up, otherwise down */ + bool up; // if true, drag status line up, otherwise down int n; fr = dragwin->w_frame; @@ -5444,8 +5442,8 @@ void win_drag_status_line(win_T *dragwin, int offset) fr = fr->fr_parent; } - if (offset < 0) { /* drag up */ - up = TRUE; + if (offset < 0) { // drag up + up = true; offset = -offset; /* sum up the room of the current frame and above it */ if (fr == curfr) { @@ -5459,12 +5457,10 @@ void win_drag_status_line(win_T *dragwin, int offset) break; } } - fr = curfr->fr_next; /* put fr at frame that grows */ - } else { /* drag down */ - up = FALSE; - /* - * Only dragging the last status line can reduce p_ch. - */ + fr = curfr->fr_next; // put fr at frame that grows + } else { // drag down + up = false; + // Only dragging the last status line can reduce p_ch. room = Rows - cmdline_row; if (curfr->fr_next == NULL) room -= 1; @@ -5488,8 +5484,9 @@ void win_drag_status_line(win_T *dragwin, int offset) * Grow frame fr by "offset" lines. * Doesn't happen when dragging the last status line up. */ - if (fr != NULL) - frame_new_height(fr, fr->fr_height + offset, up, FALSE); + if (fr != NULL) { + frame_new_height(fr, fr->fr_height + offset, up, false); + } if (up) fr = curfr; /* current frame gets smaller */ @@ -5503,9 +5500,9 @@ void win_drag_status_line(win_T *dragwin, int offset) n = frame_minheight(fr, NULL); if (fr->fr_height - offset <= n) { offset -= fr->fr_height - n; - frame_new_height(fr, n, !up, FALSE); + frame_new_height(fr, n, !up, false); } else { - frame_new_height(fr, fr->fr_height - offset, !up, FALSE); + frame_new_height(fr, fr->fr_height - offset, !up, false); break; } if (up) @@ -5535,7 +5532,7 @@ void win_drag_vsep_line(win_T *dragwin, int offset) frame_T *curfr; frame_T *fr; int room; - int left; /* if TRUE, drag separator line left, otherwise right */ + bool left; // if true, drag separator line left, otherwise right int n; fr = dragwin->w_frame; @@ -5564,8 +5561,8 @@ void win_drag_vsep_line(win_T *dragwin, int offset) } } - if (offset < 0) { /* drag left */ - left = TRUE; + if (offset < 0) { // drag left + left = true; offset = -offset; /* sum up the room of the current frame and left of it */ room = 0; @@ -5574,10 +5571,10 @@ void win_drag_vsep_line(win_T *dragwin, int offset) if (fr == curfr) break; } - fr = curfr->fr_next; /* put fr at frame that grows */ - } else { /* drag right */ - left = FALSE; - /* sum up the room of frames right of the current one */ + fr = curfr->fr_next; // put fr at frame that grows + } else { // drag right + left = false; + // sum up the room of frames right of the current one room = 0; FOR_ALL_FRAMES(fr, curfr->fr_next) { room += fr->fr_width - frame_minwidth(fr, NULL); @@ -5600,8 +5597,8 @@ void win_drag_vsep_line(win_T *dragwin, int offset) return; // Safety check, should not happen. } - /* grow frame fr by offset lines */ - frame_new_width(fr, fr->fr_width + offset, left, FALSE); + // grow frame fr by offset lines + frame_new_width(fr, fr->fr_width + offset, left, false); /* shrink other frames: current and at the left or at the right */ if (left) @@ -5613,9 +5610,9 @@ void win_drag_vsep_line(win_T *dragwin, int offset) n = frame_minwidth(fr, NULL); if (fr->fr_width - offset <= n) { offset -= fr->fr_width - n; - frame_new_width(fr, n, !left, FALSE); + frame_new_width(fr, n, !left, false); } else { - frame_new_width(fr, fr->fr_width - offset, !left, FALSE); + frame_new_width(fr, fr->fr_width - offset, !left, false); break; } if (left) @@ -5927,7 +5924,7 @@ void command_height(void) */ static void frame_add_height(frame_T *frp, int n) { - frame_new_height(frp, frp->fr_height + n, FALSE, FALSE); + frame_new_height(frp, frp->fr_height + n, false, false); for (;; ) { frp = frp->fr_parent; if (frp == NULL) @@ -6092,21 +6089,18 @@ file_name_in_line ( return find_file_name_in_path(ptr, len, options, count, rel_fname); } -/* - * Add or remove a status line for the bottom window(s), according to the - * value of 'laststatus'. - */ -void -last_status ( - int morewin /* pretend there are two or more windows */ -) +/// Add or remove a status line for the bottom window(s), according to the +/// value of 'laststatus'. +/// +/// @param morewin pretend there are two or more windows if true. +void last_status(bool morewin) { /* Don't make a difference between horizontal or vertical split. */ last_status_rec(topframe, (p_ls == 2 || (p_ls == 1 && (morewin || !one_window())))); } -static void last_status_rec(frame_T *fr, int statusline) +static void last_status_rec(frame_T *fr, bool statusline) { frame_T *fp; win_T *wp; @@ -6135,7 +6129,7 @@ static void last_status_rec(frame_T *fr, int statusline) } wp->w_status_height = 1; if (fp != fr) { - frame_new_height(fp, fp->fr_height - 1, FALSE, FALSE); + frame_new_height(fp, fp->fr_height - 1, false, false); frame_fix_height(wp); (void)win_comp_pos(); } else @@ -6214,12 +6208,11 @@ bool only_one_window(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT return count <= 1; } -/* - * Correct the cursor line number in other windows. Used after changing the - * current buffer, and before applying autocommands. - * When "do_curwin" is TRUE, also check current window. - */ -void check_lnums(int do_curwin) +/// Correct the cursor line number in other windows. Used after changing the +/// current buffer, and before applying autocommands. +/// +/// @param do_curwin when true, also check current window. +void check_lnums(bool do_curwin) { FOR_ALL_TAB_WINDOWS(tp, wp) { if ((do_curwin || wp != curwin) && wp->w_buffer == curbuf) { @@ -6367,8 +6360,8 @@ static win_T *restore_snapshot_rec(frame_T *sn, frame_T *fr) fr->fr_height = sn->fr_height; fr->fr_width = sn->fr_width; if (fr->fr_layout == FR_LEAF) { - frame_new_height(fr, fr->fr_height, FALSE, FALSE); - frame_new_width(fr, fr->fr_width, FALSE, FALSE); + frame_new_height(fr, fr->fr_height, false, false); + frame_new_width(fr, fr->fr_width, false, false); wp = sn->fr_win; } if (sn->fr_next != NULL) { @@ -6406,15 +6399,16 @@ static win_T *get_snapshot_focus(int idx) return win_valid(sn->fr_win) ? sn->fr_win : NULL; } -/* - * Set "win" to be the curwin and "tp" to be the current tab page. - * restore_win() MUST be called to undo, also when FAIL is returned. - * No autocommands will be executed until restore_win() is called. - * When "no_display" is TRUE the display won't be affected, no redraw is - * triggered, another tabpage access is limited. - * Returns FAIL if switching to "win" failed. - */ -int switch_win(win_T **save_curwin, tabpage_T **save_curtab, win_T *win, tabpage_T *tp, int no_display) +/// Set "win" to be the curwin and "tp" to be the current tab page. +/// restore_win() MUST be called to undo, also when FAIL is returned. +/// No autocommands will be executed until restore_win() is called. +/// +/// @param no_display if true the display won't be affected, no redraw is +/// triggered, another tabpage access is limited. +/// +/// @return FAIL if switching to "win" failed. +int switch_win(win_T **save_curwin, tabpage_T **save_curtab, win_T *win, + tabpage_T *tp, bool no_display) { block_autocmds(); return switch_win_noblock(save_curwin, save_curtab, win, tp, no_display); @@ -6422,7 +6416,7 @@ int switch_win(win_T **save_curwin, tabpage_T **save_curtab, win_T *win, tabpage // As switch_win() but without blocking autocommands. int switch_win_noblock(win_T **save_curwin, tabpage_T **save_curtab, - win_T *win, tabpage_T *tp, int no_display) + win_T *win, tabpage_T *tp, bool no_display) { *save_curwin = curwin; if (tp != NULL) { @@ -6543,8 +6537,7 @@ int match_add(win_T *wp, const char *const grp, const char *const pat, cur = cur->next; } } - if ((hlg_id = syn_name2id((const char_u *)grp)) == 0) { - EMSG2(_(e_nogroup), grp); + if ((hlg_id = syn_check_group((const char_u *)grp, strlen(grp))) == 0) { return -1; } if (pat != NULL && (regprog = vim_regcomp((char_u *)pat, RE_MAGIC)) == NULL) { @@ -6695,8 +6688,9 @@ fail: /// Delete match with ID 'id' in the match list of window 'wp'. -/// Print error messages if 'perr' is TRUE. -int match_delete(win_T *wp, int id, int perr) +/// +/// @param perr print error messages if true. +int match_delete(win_T *wp, int id, bool perr) { matchitem_T *cur = wp->w_match_head; matchitem_T *prev = cur; |