diff options
Diffstat (limited to 'src')
154 files changed, 3990 insertions, 9217 deletions
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index d80add2835..7c2c2feebc 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -11,22 +11,28 @@ endif() endif() set(GENERATED_DIR ${PROJECT_BINARY_DIR}/src/nvim/auto) -set(DISPATCH_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/msgpack-gen.lua) +set(DISPATCH_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/gendispatch.lua) file(GLOB API_HEADERS api/*.h) file(GLOB MSGPACK_RPC_HEADERS msgpack_rpc/*.h) -set(MSGPACK_DISPATCH ${GENERATED_DIR}/msgpack_dispatch.c) +set(API_METADATA ${PROJECT_BINARY_DIR}/api_metadata.mpack) +set(FUNCS_DATA ${PROJECT_BINARY_DIR}/funcs_data.mpack) set(HEADER_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/gendeclarations.lua) set(GENERATED_INCLUDES_DIR ${PROJECT_BINARY_DIR}/include) +set(GENERATED_API_DISPATCH ${GENERATED_DIR}/api/private/dispatch.c) set(GENERATED_EX_CMDS_ENUM ${GENERATED_INCLUDES_DIR}/ex_cmds_enum.generated.h) set(GENERATED_EX_CMDS_DEFS ${GENERATED_DIR}/ex_cmds_defs.generated.h) +set(GENERATED_FUNCS_HASH_INPUT ${GENERATED_DIR}/funcs.generated.h.gperf) +set(GENERATED_FUNCS ${GENERATED_DIR}/funcs.generated.h) set(GENERATED_EVENTS_ENUM ${GENERATED_INCLUDES_DIR}/auevents_enum.generated.h) set(GENERATED_EVENTS_NAMES_MAP ${GENERATED_DIR}/auevents_name_map.generated.h) set(GENERATED_OPTIONS ${GENERATED_DIR}/options.generated.h) set(EX_CMDS_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/genex_cmds.lua) +set(FUNCS_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/geneval.lua) set(EVENTS_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/gen_events.lua) set(OPTIONS_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/genoptions.lua) set(EVENTS_LIST_FILE ${PROJECT_SOURCE_DIR}/src/nvim/auevents.lua) set(EX_CMDS_DEFS_FILE ${PROJECT_SOURCE_DIR}/src/nvim/ex_cmds.lua) +set(EVAL_DEFS_FILE ${PROJECT_SOURCE_DIR}/src/nvim/eval.lua) set(OPTIONS_LIST_FILE ${PROJECT_SOURCE_DIR}/src/nvim/options.lua) set(UNICODE_TABLES_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/genunicodetables.lua) set(UNICODE_DIR ${PROJECT_SOURCE_DIR}/unicode) @@ -36,6 +42,7 @@ set(EASTASIANWIDTH_FILE ${UNICODE_DIR}/EastAsianWidth.txt) set(GENERATED_UNICODE_TABLES ${GENERATED_DIR}/unicode_tables.generated.h) include_directories(${GENERATED_DIR}) +include_directories(${CACHED_GENERATED_DIR}) include_directories(${GENERATED_INCLUDES_DIR}) file(MAKE_DIRECTORY ${GENERATED_DIR}) @@ -82,7 +89,7 @@ endforeach() list(REMOVE_ITEM NEOVIM_SOURCES ${to_remove}) -# Handle legacy files that don't yet pass -Wconversion. +# Legacy files that do not yet pass -Wconversion. set(CONV_SOURCES buffer.c diff.c @@ -112,6 +119,15 @@ endforeach() if(NOT MSVC) set_source_files_properties( ${CONV_SOURCES} PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-conversion") + # gperf generates ANSI-C with incorrect linkage, ignore it. + check_c_compiler_flag(-Wno-static-in-inline HAS_WNO_STATIC_IN_INLINE_FLAG) + if(HAS_WNO_STATIC_IN_INLINE_FLAG) + set_source_files_properties( + eval.c PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-static-in-inline -Wno-conversion") + else() + set_source_files_properties( + eval.c PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-conversion") + endif() endif() if(DEFINED MIN_LOG_LEVEL) @@ -138,9 +154,13 @@ separate_arguments(C_FLAGS_${build_type}_ARRAY UNIX_COMMAND ${CMAKE_C_FLAGS_${bu set(gen_cflags ${gen_cflags} ${C_FLAGS_${build_type}_ARRAY} ${C_FLAGS_ARRAY}) foreach(sfile ${NEOVIM_SOURCES} - "${PROJECT_SOURCE_DIR}/src/nvim/regexp_nfa.c") + "${PROJECT_SOURCE_DIR}/src/nvim/regexp_nfa.c" + ${GENERATED_API_DISPATCH}) get_filename_component(full_d ${sfile} PATH) file(RELATIVE_PATH d "${PROJECT_SOURCE_DIR}/src/nvim" "${full_d}") + if(${d} MATCHES "^[.][.]") + file(RELATIVE_PATH d "${GENERATED_DIR}" "${full_d}") + endif() get_filename_component(f ${sfile} NAME) get_filename_component(r ${sfile} NAME_WE) if(NOT ${d} EQUAL ".") @@ -183,17 +203,18 @@ add_custom_command(OUTPUT ${GENERATED_UNICODE_TABLES} ${EASTASIANWIDTH_FILE} ) -add_custom_command(OUTPUT ${MSGPACK_DISPATCH} - COMMAND ${LUA_PRG} ${DISPATCH_GENERATOR} ${API_HEADERS} ${MSGPACK_DISPATCH} +add_custom_command(OUTPUT ${GENERATED_API_DISPATCH} ${API_METADATA} + COMMAND ${LUA_PRG} ${DISPATCH_GENERATOR} ${CMAKE_CURRENT_LIST_DIR} ${API_HEADERS} ${GENERATED_API_DISPATCH} ${API_METADATA} DEPENDS ${API_HEADERS} ${MSGPACK_RPC_HEADERS} ${DISPATCH_GENERATOR} + ${CMAKE_CURRENT_LIST_DIR}/api/dispatch_deprecated.lua ) list(APPEND NEOVIM_GENERATED_SOURCES "${PROJECT_BINARY_DIR}/config/auto/pathdef.c" - "${MSGPACK_DISPATCH}" + "${GENERATED_API_DISPATCH}" "${GENERATED_EX_CMDS_ENUM}" "${GENERATED_EX_CMDS_DEFS}" "${GENERATED_EVENTS_ENUM}" @@ -208,6 +229,19 @@ add_custom_command(OUTPUT ${GENERATED_EX_CMDS_ENUM} ${GENERATED_EX_CMDS_DEFS} DEPENDS ${EX_CMDS_GENERATOR} ${EX_CMDS_DEFS_FILE} ) +if(NOT GPERF_PRG) + message(FATAL_ERROR "gperf was not found.") +endif() +add_custom_command(OUTPUT ${GENERATED_FUNCS} ${FUNCS_DATA} + COMMAND ${LUA_PRG} ${FUNCS_GENERATOR} + ${PROJECT_SOURCE_DIR}/src/nvim ${GENERATED_DIR} ${API_METADATA} ${FUNCS_DATA} + COMMAND ${GPERF_PRG} + ${GENERATED_FUNCS_HASH_INPUT} --output-file=${GENERATED_FUNCS} + DEPENDS ${FUNCS_GENERATOR} ${EVAL_DEFS_FILE} ${API_METADATA} +) +list(APPEND NEOVIM_GENERATED_SOURCES + "${GENERATED_FUNCS}") + add_custom_command(OUTPUT ${GENERATED_EVENTS_ENUM} ${GENERATED_EVENTS_NAMES_MAP} COMMAND ${LUA_PRG} ${EVENTS_GENERATOR} ${PROJECT_SOURCE_DIR}/src/nvim ${GENERATED_EVENTS_ENUM} ${GENERATED_EVENTS_NAMES_MAP} @@ -259,6 +293,21 @@ add_executable(nvim ${NEOVIM_GENERATED_SOURCES} ${NEOVIM_SOURCES} target_link_libraries(nvim ${NVIM_EXEC_LINK_LIBRARIES}) install_helper(TARGETS nvim) +if(WIN32) + # Copy DLLs to bin/ and install them along with nvim + add_custom_target(nvim_dll_deps ALL DEPENDS nvim + COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/windows_runtime_deps + COMMAND ${CMAKE_COMMAND} + "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" + -DBINARY="${PROJECT_BINARY_DIR}/bin/nvim${CMAKE_EXECUTABLE_SUFFIX}" + -DDST=${PROJECT_BINARY_DIR}/windows_runtime_deps + -P ${PROJECT_SOURCE_DIR}/cmake/WindowsDllCopy.cmake + COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_BINARY_DIR}/windows_runtime_deps/ + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + install(DIRECTORY ${PROJECT_BINARY_DIR}/windows_runtime_deps/ + DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif() + if(CLANG_ASAN_UBSAN) message(STATUS "Enabling Clang address sanitizer and undefined behavior sanitizer for nvim.") check_c_compiler_flag(-fno-sanitize-recover=all SANITIZE_RECOVER_ALL) diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index 55b535c78c..c4415ddf94 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -14,7 +14,6 @@ #include "nvim/memline.h" #include "nvim/memory.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/ex_cmds.h" #include "nvim/mark.h" #include "nvim/fileio.h" @@ -32,7 +31,7 @@ /// @param buffer The buffer handle /// @param[out] err Details of an error that may have occurred /// @return The line count -Integer buffer_line_count(Buffer buffer, Error *err) +Integer nvim_buf_line_count(Buffer buffer, Error *err) { buf_T *buf = find_buffer_by_handle(buffer, err); @@ -45,11 +44,11 @@ Integer buffer_line_count(Buffer buffer, Error *err) /// Gets a buffer line /// -/// @deprecated use buffer_get_lines instead. +/// @deprecated use nvim_buf_get_lines instead. /// for positive indices (including 0) use -/// "buffer_get_lines(buffer, index, index+1, true)" +/// "nvim_buf_get_lines(buffer, index, index+1, true)" /// for negative indices use -/// "buffer_get_lines(buffer, index-1, index, true)" +/// "nvim_buf_get_lines(buffer, index-1, index, true)" /// /// @param buffer The buffer handle /// @param index The line index @@ -60,7 +59,7 @@ String buffer_get_line(Buffer buffer, Integer index, Error *err) String rv = { .size = 0 }; index = convert_index(index); - Array slice = buffer_get_lines(buffer, index, index+1, true, err); + Array slice = nvim_buf_get_lines(0, buffer, index, index+1, true, err); if (!err->set && slice.size) { rv = slice.items[0].data.string; @@ -73,11 +72,11 @@ String buffer_get_line(Buffer buffer, Integer index, Error *err) /// Sets a buffer line /// -/// @deprecated use buffer_set_lines instead. +/// @deprecated use nvim_buf_set_lines instead. /// for positive indices use -/// "buffer_set_lines(buffer, index, index+1, true, [line])" +/// "nvim_buf_set_lines(buffer, index, index+1, true, [line])" /// for negative indices use -/// "buffer_set_lines(buffer, index-1, index, true, [line])" +/// "nvim_buf_set_lines(buffer, index-1, index, true, [line])" /// /// @param buffer The buffer handle /// @param index The line index @@ -88,16 +87,16 @@ void buffer_set_line(Buffer buffer, Integer index, String line, Error *err) Object l = STRING_OBJ(line); Array array = { .items = &l, .size = 1 }; index = convert_index(index); - buffer_set_lines(buffer, index, index+1, true, array, err); + nvim_buf_set_lines(0, buffer, index, index+1, true, array, err); } /// Deletes a buffer line /// -/// @deprecated use buffer_set_lines instead. +/// @deprecated use nvim_buf_set_lines instead. /// for positive indices use -/// "buffer_set_lines(buffer, index, index+1, true, [])" +/// "nvim_buf_set_lines(buffer, index, index+1, true, [])" /// for negative indices use -/// "buffer_set_lines(buffer, index-1, index, true, [])" +/// "nvim_buf_set_lines(buffer, index-1, index, true, [])" /// @param buffer The buffer handle /// @param index The line index /// @param[out] err Details of an error that may have occurred @@ -105,12 +104,12 @@ void buffer_del_line(Buffer buffer, Integer index, Error *err) { Array array = ARRAY_DICT_INIT; index = convert_index(index); - buffer_set_lines(buffer, index, index+1, true, array, err); + nvim_buf_set_lines(0, buffer, index, index+1, true, array, err); } /// Retrieves a line range from the buffer /// -/// @deprecated use buffer_get_lines(buffer, newstart, newend, false) +/// @deprecated use nvim_buf_get_lines(buffer, newstart, newend, false) /// where newstart = start + int(not include_start) - int(start < 0) /// newend = end + int(include_end) - int(end < 0) /// int(bool) = 1 if bool is true else 0 @@ -122,15 +121,15 @@ void buffer_del_line(Buffer buffer, Integer index, Error *err) /// @param[out] err Details of an error that may have occurred /// @return An array of lines ArrayOf(String) buffer_get_line_slice(Buffer buffer, - Integer start, - Integer end, - Boolean include_start, - Boolean include_end, - Error *err) + Integer start, + Integer end, + Boolean include_start, + Boolean include_end, + Error *err) { start = convert_index(start) + !include_start; end = convert_index(end) + include_end; - return buffer_get_lines(buffer, start , end, false, err); + return nvim_buf_get_lines(0, buffer, start , end, false, err); } @@ -149,11 +148,12 @@ ArrayOf(String) buffer_get_line_slice(Buffer buffer, /// @param strict_indexing whether out-of-bounds should be an error. /// @param[out] err Details of an error that may have occurred /// @return An array of lines -ArrayOf(String) buffer_get_lines(Buffer buffer, - Integer start, - Integer end, - Boolean strict_indexing, - Error *err) +ArrayOf(String) nvim_buf_get_lines(uint64_t channel_id, + Buffer buffer, + Integer start, + Integer end, + Boolean strict_indexing, + Error *err) { Array rv = ARRAY_DICT_INIT; buf_T *buf = find_buffer_by_handle(buffer, err); @@ -191,7 +191,9 @@ ArrayOf(String) buffer_get_lines(Buffer buffer, Object str = STRING_OBJ(cstr_to_string(bufstr)); // Vim represents NULs as NLs, but this may confuse clients. - strchrsub(str.data.string.data, '\n', '\0'); + if (channel_id != INVALID_CHANNEL) { + strchrsub(str.data.string.data, '\n', '\0'); + } rv.items[i] = str; } @@ -212,7 +214,7 @@ end: /// Replaces a line range on the buffer /// -/// @deprecated use buffer_set_lines(buffer, newstart, newend, false, lines) +/// @deprecated use nvim_buf_set_lines(buffer, newstart, newend, false, lines) /// where newstart = start + int(not include_start) + int(start < 0) /// newend = end + int(include_end) + int(end < 0) /// int(bool) = 1 if bool is true else 0 @@ -226,16 +228,16 @@ end: // array will simply delete the line range) /// @param[out] err Details of an error that may have occurred void buffer_set_line_slice(Buffer buffer, - Integer start, - Integer end, - Boolean include_start, - Boolean include_end, - ArrayOf(String) replacement, - Error *err) + Integer start, + Integer end, + Boolean include_start, + Boolean include_end, + ArrayOf(String) replacement, // NOLINT + Error *err) { start = convert_index(start) + !include_start; end = convert_index(end) + include_end; - buffer_set_lines(buffer, start, end, false, replacement, err); + nvim_buf_set_lines(0, buffer, start, end, false, replacement, err); } @@ -257,12 +259,13 @@ void buffer_set_line_slice(Buffer buffer, /// @param strict_indexing whether out-of-bounds should be an error. /// @param replacement An array of lines to use as replacement /// @param[out] err Details of an error that may have occurred -void buffer_set_lines(Buffer buffer, - Integer start, - Integer end, - Boolean strict_indexing, - ArrayOf(String) replacement, - Error *err) +void nvim_buf_set_lines(uint64_t channel_id, + Buffer buffer, + Integer start, + Integer end, + Boolean strict_indexing, + ArrayOf(String) replacement, // NOLINT + Error *err) { buf_T *buf = find_buffer_by_handle(buffer, err); @@ -309,7 +312,7 @@ void buffer_set_lines(Buffer buffer, // line and convert NULs to newlines to avoid truncation. lines[i] = xmallocz(l.size); for (size_t j = 0; j < l.size; j++) { - if (l.data[j] == '\n') { + if (l.data[j] == '\n' && channel_id != INVALID_CHANNEL) { api_set_error(err, Exception, _("string cannot contain newlines")); new_len = i + 1; goto end; @@ -412,7 +415,7 @@ end: /// @param name The variable name /// @param[out] err Details of an error that may have occurred /// @return The variable value -Object buffer_get_var(Buffer buffer, String name, Error *err) +Object nvim_buf_get_var(Buffer buffer, String name, Error *err) { buf_T *buf = find_buffer_by_handle(buffer, err); @@ -429,6 +432,41 @@ Object buffer_get_var(Buffer buffer, String name, Error *err) /// @param name The variable name /// @param value The variable value /// @param[out] err Details of an error that may have occurred +void nvim_buf_set_var(Buffer buffer, String name, Object value, Error *err) +{ + buf_T *buf = find_buffer_by_handle(buffer, err); + + if (!buf) { + return; + } + + dict_set_value(buf->b_vars, name, value, false, false, err); +} + +/// Removes a buffer-scoped (b:) variable +/// +/// @param buffer The buffer handle +/// @param name The variable name +/// @param[out] err Details of an error that may have occurred +void nvim_buf_del_var(Buffer buffer, String name, Error *err) +{ + buf_T *buf = find_buffer_by_handle(buffer, err); + + if (!buf) { + return; + } + + dict_set_value(buf->b_vars, name, NIL, true, false, err); +} + +/// Sets a buffer-scoped (b:) variable +/// +/// @deprecated +/// +/// @param buffer The buffer handle +/// @param name The variable name +/// @param value The variable value +/// @param[out] err Details of an error that may have occurred /// @return The old value or nil if there was no previous value. /// /// @warning It may return nil if there was no previous value @@ -441,18 +479,17 @@ Object buffer_set_var(Buffer buffer, String name, Object value, Error *err) return (Object) OBJECT_INIT; } - return dict_set_value(buf->b_vars, name, value, false, err); + return dict_set_value(buf->b_vars, name, value, false, true, err); } /// Removes a buffer-scoped (b:) variable /// +/// @deprecated +/// /// @param buffer The buffer handle /// @param name The variable name /// @param[out] err Details of an error that may have occurred -/// @return The old value or nil if there was no previous value. -/// -/// @warning It may return nil if there was no previous value -/// or if previous value was `v:null`. +/// @return The old value Object buffer_del_var(Buffer buffer, String name, Error *err) { buf_T *buf = find_buffer_by_handle(buffer, err); @@ -461,16 +498,17 @@ Object buffer_del_var(Buffer buffer, String name, Error *err) return (Object) OBJECT_INIT; } - return dict_set_value(buf->b_vars, name, NIL, true, err); + return dict_set_value(buf->b_vars, name, NIL, true, true, err); } + /// Gets a buffer option value /// /// @param buffer The buffer handle /// @param name The option name /// @param[out] err Details of an error that may have occurred /// @return The option value -Object buffer_get_option(Buffer buffer, String name, Error *err) +Object nvim_buf_get_option(Buffer buffer, String name, Error *err) { buf_T *buf = find_buffer_by_handle(buffer, err); @@ -488,7 +526,7 @@ Object buffer_get_option(Buffer buffer, String name, Error *err) /// @param name The option name /// @param value The option value /// @param[out] err Details of an error that may have occurred -void buffer_set_option(Buffer buffer, String name, Object value, Error *err) +void nvim_buf_set_option(Buffer buffer, String name, Object value, Error *err) { buf_T *buf = find_buffer_by_handle(buffer, err); @@ -504,7 +542,7 @@ void buffer_set_option(Buffer buffer, String name, Object value, Error *err) /// @param buffer The buffer handle /// @param[out] err Details of an error that may have occurred /// @return The buffer number -Integer buffer_get_number(Buffer buffer, Error *err) +Integer nvim_buf_get_number(Buffer buffer, Error *err) { Integer rv = 0; buf_T *buf = find_buffer_by_handle(buffer, err); @@ -521,7 +559,7 @@ Integer buffer_get_number(Buffer buffer, Error *err) /// @param buffer The buffer handle /// @param[out] err Details of an error that may have occurred /// @return The buffer name -String buffer_get_name(Buffer buffer, Error *err) +String nvim_buf_get_name(Buffer buffer, Error *err) { String rv = STRING_INIT; buf_T *buf = find_buffer_by_handle(buffer, err); @@ -538,7 +576,7 @@ String buffer_get_name(Buffer buffer, Error *err) /// @param buffer The buffer handle /// @param name The buffer name /// @param[out] err Details of an error that may have occurred -void buffer_set_name(Buffer buffer, String name, Error *err) +void nvim_buf_set_name(Buffer buffer, String name, Error *err) { buf_T *buf = find_buffer_by_handle(buffer, err); @@ -567,7 +605,7 @@ void buffer_set_name(Buffer buffer, String name, Error *err) /// /// @param buffer The buffer handle /// @return true if the buffer is valid, false otherwise -Boolean buffer_is_valid(Buffer buffer) +Boolean nvim_buf_is_valid(Buffer buffer) { Error stub = ERROR_INIT; return find_buffer_by_handle(buffer, &stub) != NULL; @@ -575,7 +613,7 @@ Boolean buffer_is_valid(Buffer buffer) /// Inserts a sequence of lines to a buffer at a certain index /// -/// @deprecated use buffer_set_lines(buffer, lnum, lnum, true, lines) +/// @deprecated use nvim_buf_set_lines(buffer, lnum, lnum, true, lines) /// /// @param buffer The buffer handle /// @param lnum Insert the lines after `lnum`. If negative, it will append @@ -589,7 +627,7 @@ void buffer_insert(Buffer buffer, { // "lnum" will be the index of the line after inserting, // no matter if it is negative or not - buffer_set_lines(buffer, lnum, lnum, true, lines, err); + nvim_buf_set_lines(0, buffer, lnum, lnum, true, lines, err); } /// Return a tuple (row,col) representing the position of the named mark @@ -598,7 +636,7 @@ void buffer_insert(Buffer buffer, /// @param name The mark's name /// @param[out] err Details of an error that may have occurred /// @return The (row, col) tuple -ArrayOf(Integer, 2) buffer_get_mark(Buffer buffer, String name, Error *err) +ArrayOf(Integer, 2) nvim_buf_get_mark(Buffer buffer, String name, Error *err) { Array rv = ARRAY_DICT_INIT; buf_T *buf = find_buffer_by_handle(buffer, err); @@ -648,7 +686,7 @@ ArrayOf(Integer, 2) buffer_get_mark(Buffer buffer, String name, Error *err) /// called with src_id = 0, an unique source id is generated and returned. /// Succesive calls can pass in it as "src_id" to add new highlights to the same /// source group. All highlights in the same group can then be cleared with -/// buffer_clear_highlight. If the highlight never will be manually deleted +/// nvim_buf_clear_highlight. If the highlight never will be manually deleted /// pass in -1 for "src_id". /// /// If "hl_group" is the empty string no highlight is added, but a new src_id @@ -666,13 +704,13 @@ ArrayOf(Integer, 2) buffer_get_mark(Buffer buffer, String name, Error *err) /// or -1 to highlight to end of line /// @param[out] err Details of an error that may have occurred /// @return The src_id that was used -Integer buffer_add_highlight(Buffer buffer, - Integer src_id, - String hl_group, - Integer line, - Integer col_start, - Integer col_end, - Error *err) +Integer nvim_buf_add_highlight(Buffer buffer, + Integer src_id, + String hl_group, + Integer line, + Integer col_start, + Integer col_end, + Error *err) { buf_T *buf = find_buffer_by_handle(buffer, err); if (!buf) { @@ -691,7 +729,7 @@ Integer buffer_add_highlight(Buffer buffer, col_end = MAXCOL; } - int hlg_id = syn_name2id((char_u*)hl_group.data); + int hlg_id = syn_name2id((char_u *)(hl_group.data ? hl_group.data : "")); src_id = bufhl_add_hl(buf, (int)src_id, hlg_id, (linenr_T)line+1, (colnr_T)col_start+1, (colnr_T)col_end); return src_id; @@ -708,11 +746,11 @@ Integer buffer_add_highlight(Buffer buffer, /// @param line_end End of range of lines to clear (exclusive) /// or -1 to clear to end of file. /// @param[out] err Details of an error that may have occurred -void buffer_clear_highlight(Buffer buffer, - Integer src_id, - Integer line_start, - Integer line_end, - Error *err) +void nvim_buf_clear_highlight(Buffer buffer, + Integer src_id, + Integer line_start, + Integer line_end, + Error *err) { buf_T *buf = find_buffer_by_handle(buffer, err); if (!buf) { diff --git a/src/nvim/api/dispatch_deprecated.lua b/src/nvim/api/dispatch_deprecated.lua new file mode 100644 index 0000000000..5650a77ac0 --- /dev/null +++ b/src/nvim/api/dispatch_deprecated.lua @@ -0,0 +1,69 @@ +local deprecated_aliases = { + nvim_buf_add_highlight="buffer_add_highlight", + nvim_buf_clear_highlight="buffer_clear_highlight", + nvim_buf_get_lines="buffer_get_lines", + nvim_buf_get_mark="buffer_get_mark", + nvim_buf_get_name="buffer_get_name", + nvim_buf_get_number="buffer_get_number", + nvim_buf_get_option="buffer_get_option", + nvim_buf_get_var="buffer_get_var", + nvim_buf_is_valid="buffer_is_valid", + nvim_buf_line_count="buffer_line_count", + nvim_buf_set_lines="buffer_set_lines", + nvim_buf_set_name="buffer_set_name", + nvim_buf_set_option="buffer_set_option", + nvim_call_function="vim_call_function", + nvim_command="vim_command", + nvim_command_output="vim_command_output", + nvim_del_current_line="vim_del_current_line", + nvim_err_write="vim_err_write", + nvim_err_writeln="vim_report_error", + nvim_eval="vim_eval", + nvim_feedkeys="vim_feedkeys", + nvim_get_api_info="vim_get_api_info", + nvim_get_color_by_name="vim_name_to_color", + nvim_get_color_map="vim_get_color_map", + nvim_get_current_buf="vim_get_current_buffer", + nvim_get_current_line="vim_get_current_line", + nvim_get_current_tabpage="vim_get_current_tabpage", + nvim_get_current_win="vim_get_current_window", + nvim_get_option="vim_get_option", + nvim_get_var="vim_get_var", + nvim_get_vvar="vim_get_vvar", + nvim_input="vim_input", + nvim_list_bufs="vim_get_buffers", + nvim_list_runtime_paths="vim_list_runtime_paths", + nvim_list_tabpages="vim_get_tabpages", + nvim_list_wins="vim_get_windows", + nvim_out_write="vim_out_write", + nvim_replace_termcodes="vim_replace_termcodes", + nvim_set_current_buf="vim_set_current_buffer", + nvim_set_current_dir="vim_change_directory", + nvim_set_current_line="vim_set_current_line", + nvim_set_current_tabpage="vim_set_current_tabpage", + nvim_set_current_win="vim_set_current_window", + nvim_set_option="vim_set_option", + nvim_strwidth="vim_strwidth", + nvim_subscribe="vim_subscribe", + nvim_tabpage_get_var="tabpage_get_var", + nvim_tabpage_get_win="tabpage_get_window", + nvim_tabpage_is_valid="tabpage_is_valid", + nvim_tabpage_list_wins="tabpage_get_windows", + nvim_ui_detach="ui_detach", + nvim_ui_try_resize="ui_try_resize", + nvim_unsubscribe="vim_unsubscribe", + nvim_win_get_buf="window_get_buffer", + nvim_win_get_cursor="window_get_cursor", + nvim_win_get_height="window_get_height", + nvim_win_get_option="window_get_option", + nvim_win_get_position="window_get_position", + nvim_win_get_tabpage="window_get_tabpage", + nvim_win_get_var="window_get_var", + nvim_win_get_width="window_get_width", + nvim_win_is_valid="window_is_valid", + nvim_win_set_cursor="window_set_cursor", + nvim_win_set_height="window_set_height", + nvim_win_set_option="window_set_option", + nvim_win_set_width="window_set_width", +} +return deprecated_aliases diff --git a/src/nvim/api/private/defs.h b/src/nvim/api/private/defs.h index 5fb95a163f..a6710193ff 100644 --- a/src/nvim/api/private/defs.h +++ b/src/nvim/api/private/defs.h @@ -9,13 +9,15 @@ #define STRING_INIT {.data = NULL, .size = 0} #define OBJECT_INIT { .type = kObjectTypeNil } #define ERROR_INIT { .set = false } -#define REMOTE_TYPE(type) typedef uint64_t type +#define REMOTE_TYPE(type) typedef handle_T type #ifdef INCLUDE_GENERATED_DECLARATIONS # define ArrayOf(...) Array # define DictionaryOf(...) Dictionary #endif +typedef int handle_T; + // Basic types typedef enum { kErrorTypeException, @@ -31,6 +33,9 @@ typedef enum { /// Used as the message ID of notifications. #define NO_RESPONSE UINT64_MAX +/// Used as channel_id when the call is local +#define INVALID_CHANNEL UINT64_MAX + typedef struct { ErrorType type; char msg[1024]; diff --git a/src/nvim/api/private/dispatch.h b/src/nvim/api/private/dispatch.h new file mode 100644 index 0000000000..d91456c306 --- /dev/null +++ b/src/nvim/api/private/dispatch.h @@ -0,0 +1,23 @@ +#ifndef NVIM_API_PRIVATE_DISPATCH_H +#define NVIM_API_PRIVATE_DISPATCH_H + +#include "nvim/api/private/defs.h" + +typedef Object (*ApiDispatchWrapper)(uint64_t channel_id, + uint64_t request_id, + Array args, + Error *error); + +/// The rpc_method_handlers table, used in msgpack_rpc_dispatch(), stores +/// functions of this type. +typedef struct { + ApiDispatchWrapper fn; + bool async; // function is always safe to run immediately instead of being + // put in a request queue for handling when nvim waits for input. +} MsgpackRpcRequestHandler; + +#ifdef INCLUDE_GENERATED_DECLARATIONS +# include "api/private/dispatch.h.generated.h" +#endif + +#endif // NVIM_API_PRIVATE_DISPATCH_H diff --git a/src/nvim/api/private/handle.c b/src/nvim/api/private/handle.c index 69df7294ad..acb0fb332a 100644 --- a/src/nvim/api/private/handle.c +++ b/src/nvim/api/private/handle.c @@ -5,30 +5,26 @@ #include "nvim/map.h" #include "nvim/api/private/handle.h" -#define HANDLE_INIT(name) name##_handles = pmap_new(uint64_t)() +#define HANDLE_INIT(name) name##_handles = pmap_new(handle_T)() #define HANDLE_IMPL(type, name) \ - static PMap(uint64_t) *name##_handles = NULL; \ + static PMap(handle_T) *name##_handles = NULL; /* NOLINT */ \ \ - type *handle_get_##name(uint64_t handle) \ + type *handle_get_##name(handle_T handle) \ { \ - return pmap_get(uint64_t)(name##_handles, handle); \ + return pmap_get(handle_T)(name##_handles, handle); \ } \ \ void handle_register_##name(type *name) \ { \ - assert(!name->handle); \ - name->handle = next_handle++; \ - pmap_put(uint64_t)(name##_handles, name->handle, name); \ + pmap_put(handle_T)(name##_handles, name->handle, name); \ } \ \ void handle_unregister_##name(type *name) \ { \ - pmap_del(uint64_t)(name##_handles, name->handle); \ + pmap_del(handle_T)(name##_handles, name->handle); \ } -static uint64_t next_handle = 1; - HANDLE_IMPL(buf_T, buffer) HANDLE_IMPL(win_T, window) HANDLE_IMPL(tabpage_T, tabpage) diff --git a/src/nvim/api/private/handle.h b/src/nvim/api/private/handle.h index 804e266dc3..30bbfbee1b 100644 --- a/src/nvim/api/private/handle.h +++ b/src/nvim/api/private/handle.h @@ -3,9 +3,10 @@ #include "nvim/vim.h" #include "nvim/buffer_defs.h" +#include "nvim/api/private/defs.h" #define HANDLE_DECLS(type, name) \ - type *handle_get_##name(uint64_t handle); \ + type *handle_get_##name(handle_T handle); \ void handle_register_##name(type *name); \ void handle_unregister_##name(type *name); diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c index c88bf2127a..fc114bae16 100644 --- a/src/nvim/api/private/helpers.c +++ b/src/nvim/api/private/helpers.c @@ -104,10 +104,11 @@ Object dict_get_value(dict_T *dict, String key, Error *err) /// @param value The new value /// @param del Delete key in place of setting it. Argument `value` is ignored in /// this case. +/// @param retval If true the old value will be converted and returned. /// @param[out] err Details of an error that may have occurred -/// @return the old value, if any +/// @return The old value if `retval` is true and the key was present, else NIL Object dict_set_value(dict_T *dict, String key, Object value, bool del, - Error *err) + bool retval, Error *err) { Object rv = OBJECT_INIT; @@ -135,7 +136,9 @@ Object dict_set_value(dict_T *dict, String key, Object value, bool del, api_set_error(err, Validation, _("Key \"%s\" doesn't exist"), key.data); } else { // Return the old value - rv = vim_to_object(&di->di_tv); + if (retval) { + rv = vim_to_object(&di->di_tv); + } // Delete the entry hashitem_T *hi = hash_find(&dict->dv_hashtab, di->di_key); hash_remove(&dict->dv_hashtab, hi); @@ -156,7 +159,9 @@ Object dict_set_value(dict_T *dict, String key, Object value, bool del, dict_add(dict, di); } else { // Return the old value - rv = vim_to_object(&di->di_tv); + if (retval) { + rv = vim_to_object(&di->di_tv); + } clear_tv(&di->di_tv); } @@ -507,6 +512,10 @@ Object vim_to_object(typval_T *obj) buf_T *find_buffer_by_handle(Buffer buffer, Error *err) { + if (buffer == 0) { + return curbuf; + } + buf_T *rv = handle_get_buffer(buffer); if (!rv) { @@ -518,6 +527,10 @@ buf_T *find_buffer_by_handle(Buffer buffer, Error *err) win_T * find_window_by_handle(Window window, Error *err) { + if (window == 0) { + return curwin; + } + win_T *rv = handle_get_window(window); if (!rv) { @@ -529,6 +542,10 @@ win_T * find_window_by_handle(Window window, Error *err) tabpage_T * find_tab_by_handle(Tabpage tabpage, Error *err) { + if (tabpage == 0) { + return curtab; + } + tabpage_T *rv = handle_get_tabpage(tabpage); if (!rv) { @@ -572,10 +589,16 @@ String cstr_as_string(char *str) FUNC_ATTR_PURE return (String) {.data = str, .size = strlen(str)}; } +/// Converts from type Object to a VimL value. +/// +/// @param obj Object to convert from. +/// @param tv Conversion result is placed here. On failure member v_type is +/// set to VAR_UNKNOWN (no allocation was made for this variable). +/// returns true if conversion is successful, otherwise false. bool object_to_vim(Object obj, typval_T *tv, Error *err) { tv->v_type = VAR_UNKNOWN; - tv->v_lock = 0; + tv->v_lock = VAR_UNLOCKED; switch (obj.type) { case kObjectTypeNil: @@ -616,9 +639,8 @@ bool object_to_vim(Object obj, typval_T *tv, Error *err) } break; - case kObjectTypeArray: - tv->v_type = VAR_LIST; - tv->vval.v_list = list_alloc(); + case kObjectTypeArray: { + list_T *list = list_alloc(); for (uint32_t i = 0; i < obj.data.array.size; i++) { Object item = obj.data.array.items[i]; @@ -627,45 +649,51 @@ bool object_to_vim(Object obj, typval_T *tv, Error *err) if (!object_to_vim(item, &li->li_tv, err)) { // cleanup listitem_free(li); - list_free(tv->vval.v_list, true); + list_free(list, true); return false; } - list_append(tv->vval.v_list, li); + list_append(list, li); } - tv->vval.v_list->lv_refcount++; + list->lv_refcount++; + + tv->v_type = VAR_LIST; + tv->vval.v_list = list; break; + } - case kObjectTypeDictionary: - tv->v_type = VAR_DICT; - tv->vval.v_dict = dict_alloc(); + case kObjectTypeDictionary: { + dict_T *dict = dict_alloc(); for (uint32_t i = 0; i < obj.data.dictionary.size; i++) { KeyValuePair item = obj.data.dictionary.items[i]; String key = item.key; if (key.size == 0) { - api_set_error(err, - Validation, + api_set_error(err, Validation, _("Empty dictionary keys aren't allowed")); // cleanup - dict_free(tv->vval.v_dict, true); + dict_free(dict, true); return false; } - dictitem_T *di = dictitem_alloc((uint8_t *) key.data); + dictitem_T *di = dictitem_alloc((uint8_t *)key.data); if (!object_to_vim(item.value, &di->di_tv, err)) { // cleanup dictitem_free(di); - dict_free(tv->vval.v_dict, true); + dict_free(dict, true); return false; } - dict_add(tv->vval.v_dict, di); + dict_add(dict, di); } - tv->vval.v_dict->dv_refcount++; + dict->dv_refcount++; + + tv->v_type = VAR_DICT; + tv->vval.v_dict = dict; break; + } default: abort(); } @@ -764,12 +792,15 @@ static void init_type_metadata(Dictionary *metadata) Dictionary buffer_metadata = ARRAY_DICT_INIT; PUT(buffer_metadata, "id", INTEGER_OBJ(kObjectTypeBuffer)); + PUT(buffer_metadata, "prefix", STRING_OBJ(cstr_to_string("nvim_buf_"))); Dictionary window_metadata = ARRAY_DICT_INIT; PUT(window_metadata, "id", INTEGER_OBJ(kObjectTypeWindow)); + PUT(window_metadata, "prefix", STRING_OBJ(cstr_to_string("nvim_win_"))); Dictionary tabpage_metadata = ARRAY_DICT_INIT; PUT(tabpage_metadata, "id", INTEGER_OBJ(kObjectTypeTabpage)); + PUT(tabpage_metadata, "prefix", STRING_OBJ(cstr_to_string("nvim_tabpage_"))); PUT(types, "Buffer", DICTIONARY_OBJ(buffer_metadata)); PUT(types, "Window", DICTIONARY_OBJ(window_metadata)); diff --git a/src/nvim/api/tabpage.c b/src/nvim/api/tabpage.c index c8311b0aa0..8b1fb041e2 100644 --- a/src/nvim/api/tabpage.c +++ b/src/nvim/api/tabpage.c @@ -14,7 +14,7 @@ /// @param tabpage The tabpage /// @param[out] err Details of an error that may have occurred /// @return The windows in `tabpage` -ArrayOf(Window) tabpage_get_windows(Tabpage tabpage, Error *err) +ArrayOf(Window) nvim_tabpage_list_wins(Tabpage tabpage, Error *err) { Array rv = ARRAY_DICT_INIT; tabpage_T *tab = find_tab_by_handle(tabpage, err); @@ -43,7 +43,7 @@ ArrayOf(Window) tabpage_get_windows(Tabpage tabpage, Error *err) /// @param name The variable name /// @param[out] err Details of an error that may have occurred /// @return The variable value -Object tabpage_get_var(Tabpage tabpage, String name, Error *err) +Object nvim_tabpage_get_var(Tabpage tabpage, String name, Error *err) { tabpage_T *tab = find_tab_by_handle(tabpage, err); @@ -60,6 +60,44 @@ Object tabpage_get_var(Tabpage tabpage, String name, Error *err) /// @param name The variable name /// @param value The variable value /// @param[out] err Details of an error that may have occurred +void nvim_tabpage_set_var(Tabpage tabpage, + String name, + Object value, + Error *err) +{ + tabpage_T *tab = find_tab_by_handle(tabpage, err); + + if (!tab) { + return; + } + + dict_set_value(tab->tp_vars, name, value, false, false, err); +} + +/// Removes a tab-scoped (t:) variable +/// +/// @param tabpage handle +/// @param name The variable name +/// @param[out] err Details of an error that may have occurred +void nvim_tabpage_del_var(Tabpage tabpage, String name, Error *err) +{ + tabpage_T *tab = find_tab_by_handle(tabpage, err); + + if (!tab) { + return; + } + + dict_set_value(tab->tp_vars, name, NIL, true, false, err); +} + +/// Sets a tab-scoped (t:) variable +/// +/// @deprecated +/// +/// @param tabpage handle +/// @param name The variable name +/// @param value The variable value +/// @param[out] err Details of an error that may have occurred /// @return The old value or nil if there was no previous value. /// /// @warning It may return nil if there was no previous value @@ -72,18 +110,17 @@ Object tabpage_set_var(Tabpage tabpage, String name, Object value, Error *err) return (Object) OBJECT_INIT; } - return dict_set_value(tab->tp_vars, name, value, false, err); + return dict_set_value(tab->tp_vars, name, value, false, true, err); } /// Removes a tab-scoped (t:) variable /// +/// @deprecated +/// /// @param tabpage handle /// @param name The variable name /// @param[out] err Details of an error that may have occurred -/// @return The old value or nil if there was no previous value. -/// -/// @warning It may return nil if there was no previous value -/// or if previous value was `v:null`. +/// @return The old value Object tabpage_del_var(Tabpage tabpage, String name, Error *err) { tabpage_T *tab = find_tab_by_handle(tabpage, err); @@ -92,7 +129,7 @@ Object tabpage_del_var(Tabpage tabpage, String name, Error *err) return (Object) OBJECT_INIT; } - return dict_set_value(tab->tp_vars, name, NIL, true, err); + return dict_set_value(tab->tp_vars, name, NIL, true, true, err); } /// Gets the current window in a tab page @@ -100,7 +137,7 @@ Object tabpage_del_var(Tabpage tabpage, String name, Error *err) /// @param tabpage The tab page handle /// @param[out] err Details of an error that may have occurred /// @return The Window handle -Window tabpage_get_window(Tabpage tabpage, Error *err) +Window nvim_tabpage_get_win(Tabpage tabpage, Error *err) { Window rv = 0; tabpage_T *tab = find_tab_by_handle(tabpage, err); @@ -110,7 +147,7 @@ Window tabpage_get_window(Tabpage tabpage, Error *err) } if (tab == curtab) { - return vim_get_current_window(); + return nvim_get_current_win(); } else { FOR_ALL_WINDOWS_IN_TAB(wp, tab) { if (wp == tab->tp_curwin) { @@ -126,7 +163,7 @@ Window tabpage_get_window(Tabpage tabpage, Error *err) /// /// @param tabpage The tab page handle /// @return true if the tab page is valid, false otherwise -Boolean tabpage_is_valid(Tabpage tabpage) +Boolean nvim_tabpage_is_valid(Tabpage tabpage) { Error stub = ERROR_INIT; return find_tab_by_handle(tabpage, &stub) != NULL; diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c index 1703d49296..56b41f1eea 100644 --- a/src/nvim/api/ui.c +++ b/src/nvim/api/ui.c @@ -8,8 +8,10 @@ #include "nvim/memory.h" #include "nvim/map.h" #include "nvim/msgpack_rpc/channel.h" +#include "nvim/api/ui.h" #include "nvim/api/private/defs.h" #include "nvim/api/private/helpers.h" +#include "nvim/popupmnu.h" #ifdef INCLUDE_GENERATED_DECLARATIONS # include "api/ui.c.generated.h" @@ -44,8 +46,9 @@ void remote_ui_disconnect(uint64_t channel_id) xfree(ui); } -void ui_attach(uint64_t channel_id, Integer width, Integer height, - Boolean enable_rgb, Error *err) +void nvim_ui_attach(uint64_t channel_id, Integer width, Integer height, + Dictionary options, Error *err) + FUNC_API_NOEVAL { if (pmap_has(uint64_t)(connected_uis, channel_id)) { api_set_error(err, Exception, _("UI already attached for channel")); @@ -57,14 +60,11 @@ void ui_attach(uint64_t channel_id, Integer width, Integer height, _("Expected width > 0 and height > 0")); return; } - UIData *data = xmalloc(sizeof(UIData)); - data->channel_id = channel_id; - data->buffer = (Array)ARRAY_DICT_INIT; UI *ui = xcalloc(1, sizeof(UI)); ui->width = (int)width; ui->height = (int)height; - ui->rgb = enable_rgb; - ui->data = data; + ui->rgb = true; + ui->pum_external = false; ui->resize = remote_ui_resize; ui->clear = remote_ui_clear; ui->eol_clear = remote_ui_eol_clear; @@ -88,37 +88,100 @@ void ui_attach(uint64_t channel_id, Integer width, Integer height, ui->suspend = remote_ui_suspend; ui->set_title = remote_ui_set_title; ui->set_icon = remote_ui_set_icon; + ui->event = remote_ui_event; + + for (size_t i = 0; i < options.size; i++) { + ui_set_option(ui, options.items[i].key, options.items[i].value, err); + if (err->set) { + xfree(ui); + return; + } + } + + UIData *data = xmalloc(sizeof(UIData)); + data->channel_id = channel_id; + data->buffer = (Array)ARRAY_DICT_INIT; + ui->data = data; + pmap_put(uint64_t)(connected_uis, channel_id, ui); ui_attach_impl(ui); - return; } -void ui_detach(uint64_t channel_id, Error *err) +/// @deprecated +void ui_attach(uint64_t channel_id, Integer width, Integer height, + Boolean enable_rgb, Error *err) +{ + Dictionary opts = ARRAY_DICT_INIT; + PUT(opts, "rgb", BOOLEAN_OBJ(enable_rgb)); + nvim_ui_attach(channel_id, width, height, opts, err); + api_free_dictionary(opts); +} + +void nvim_ui_detach(uint64_t channel_id, Error *err) + FUNC_API_NOEVAL { if (!pmap_has(uint64_t)(connected_uis, channel_id)) { api_set_error(err, Exception, _("UI is not attached for channel")); + return; } remote_ui_disconnect(channel_id); } -Object ui_try_resize(uint64_t channel_id, Integer width, - Integer height, Error *err) + +void nvim_ui_try_resize(uint64_t channel_id, Integer width, + Integer height, Error *err) + FUNC_API_NOEVAL { if (!pmap_has(uint64_t)(connected_uis, channel_id)) { api_set_error(err, Exception, _("UI is not attached for channel")); + return; } if (width <= 0 || height <= 0) { api_set_error(err, Validation, _("Expected width > 0 and height > 0")); - return NIL; + return; } UI *ui = pmap_get(uint64_t)(connected_uis, channel_id); ui->width = (int)width; ui->height = (int)height; ui_refresh(); - return NIL; +} + +void nvim_ui_set_option(uint64_t channel_id, String name, + Object value, Error *error) + FUNC_API_NOEVAL +{ + if (!pmap_has(uint64_t)(connected_uis, channel_id)) { + api_set_error(error, Exception, _("UI is not attached for channel")); + return; + } + UI *ui = pmap_get(uint64_t)(connected_uis, channel_id); + + ui_set_option(ui, name, value, error); + if (!error->set) { + ui_refresh(); + } +} + +static void ui_set_option(UI *ui, String name, Object value, Error *error) { + if (strcmp(name.data, "rgb") == 0) { + if (value.type != kObjectTypeBoolean) { + api_set_error(error, Validation, _("rgb must be a Boolean")); + return; + } + ui->rgb = value.data.boolean; + } else if (strcmp(name.data, "popupmenu_external") == 0) { + if (value.type != kObjectTypeBoolean) { + api_set_error(error, Validation, + _("popupmenu_external must be a Boolean")); + return; + } + ui->pum_external = value.data.boolean; + } else { + api_set_error(error, Validation, _("No such ui option")); + } } static void push_call(UI *ui, char *name, Array args) @@ -341,3 +404,19 @@ static void remote_ui_set_icon(UI *ui, char *icon) ADD(args, STRING_OBJ(cstr_to_string(icon))); push_call(ui, "set_icon", args); } + +static void remote_ui_event(UI *ui, char *name, Array args, bool *args_consumed) +{ + Array my_args = ARRAY_DICT_INIT; + // Objects are currently single-reference + // make a copy, but only if necessary + if (*args_consumed) { + for (size_t i = 0; i < args.size; i++) { + ADD(my_args, copy_object(args.items[i])); + } + } else { + my_args = args; + *args_consumed = true; + } + push_call(ui, name, my_args); +} diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index ac7cc65ee4..d8cdad961b 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -14,6 +14,7 @@ #include "nvim/msgpack_rpc/channel.h" #include "nvim/vim.h" #include "nvim/buffer.h" +#include "nvim/file_search.h" #include "nvim/window.h" #include "nvim/types.h" #include "nvim/ex_docmd.h" @@ -21,7 +22,7 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/eval.h" -#include "nvim/misc2.h" +#include "nvim/option.h" #include "nvim/syntax.h" #include "nvim/getchar.h" #include "nvim/os/input.h" @@ -36,7 +37,7 @@ /// /// @param str The command str /// @param[out] err Details of an error that may have occurred -void vim_command(String str, Error *err) +void nvim_command(String str, Error *err) { // Run the command try_start(); @@ -52,17 +53,13 @@ void vim_command(String str, Error *err) /// @param escape_csi the string needs escaping for K_SPECIAL/CSI bytes /// @see feedkeys() /// @see vim_strsave_escape_csi -void vim_feedkeys(String keys, String mode, Boolean escape_csi) +void nvim_feedkeys(String keys, String mode, Boolean escape_csi) { bool remap = true; bool insert = false; bool typed = false; bool execute = false; - if (keys.size == 0) { - return; - } - for (size_t i = 0; i < mode.size; ++i) { switch (mode.data[i]) { case 'n': remap = false; break; @@ -73,6 +70,10 @@ void vim_feedkeys(String keys, String mode, Boolean escape_csi) } } + if (keys.size == 0 && !execute) { + return; + } + char *keys_esc; if (escape_csi) { // Need to escape K_SPECIAL and CSI before putting the string in the @@ -92,18 +93,23 @@ void vim_feedkeys(String keys, String mode, Boolean escape_csi) typebuf_was_filled = true; } if (execute) { + int save_msg_scroll = msg_scroll; + + /* Avoid a 1 second delay when the keys start Insert mode. */ + msg_scroll = false; exec_normal(true); + msg_scroll |= save_msg_scroll; } } -/// Passes input keys to Neovim. Unlike `vim_feedkeys`, this will use a +/// Passes input keys to Neovim. Unlike `nvim_feedkeys`, this will use a /// lower-level input buffer and the call is not deferred. /// This is the most reliable way to emulate real user input. /// /// @param keys to be typed /// @return The number of bytes actually written, which can be lower than /// requested if the buffer becomes full. -Integer vim_input(String keys) +Integer nvim_input(String keys) FUNC_API_ASYNC { return (Integer)input_enqueue(keys); @@ -113,7 +119,7 @@ Integer vim_input(String keys) /// /// @see replace_termcodes /// @see cpoptions -String vim_replace_termcodes(String str, Boolean from_part, Boolean do_lt, +String nvim_replace_termcodes(String str, Boolean from_part, Boolean do_lt, Boolean special) { if (str.size == 0) { @@ -133,10 +139,10 @@ String vim_replace_termcodes(String str, Boolean from_part, Boolean do_lt, return cstr_as_string(ptr); } -String vim_command_output(String str, Error *err) +String nvim_command_output(String str, Error *err) { do_cmdline_cmd("redir => v:command_output"); - vim_command(str, err); + nvim_command(str, err); do_cmdline_cmd("redir END"); if (err->set) { @@ -153,7 +159,7 @@ String vim_command_output(String str, Error *err) /// @param str The expression str /// @param[out] err Details of an error that may have occurred /// @return The expanded object -Object vim_eval(String str, Error *err) +Object nvim_eval(String str, Error *err) { Object rv = OBJECT_INIT; // Evaluate the expression @@ -180,7 +186,7 @@ Object vim_eval(String str, Error *err) /// @param args Functions arguments packed in an Array /// @param[out] err Details of an error that may have occurred /// @return Result of the function call -Object vim_call_function(String fname, Array args, Error *err) +Object nvim_call_function(String fname, Array args, Error *err) { Object rv = OBJECT_INIT; if (args.size > MAX_FUNC_ARGS) { @@ -229,7 +235,7 @@ free_vim_args: /// @param str Some text /// @param[out] err Details of an error that may have occurred /// @return The number of cells -Integer vim_strwidth(String str, Error *err) +Integer nvim_strwidth(String str, Error *err) { if (str.size > INT_MAX) { api_set_error(err, Validation, _("String length is too high")); @@ -242,7 +248,7 @@ Integer vim_strwidth(String str, Error *err) /// Gets a list of paths contained in 'runtimepath' /// /// @return The list of paths -ArrayOf(String) vim_list_runtime_paths(void) +ArrayOf(String) nvim_list_runtime_paths(void) { Array rv = ARRAY_DICT_INIT; uint8_t *rtp = p_rtp; @@ -283,7 +289,7 @@ ArrayOf(String) vim_list_runtime_paths(void) /// /// @param dir The new working directory /// @param[out] err Details of an error that may have occurred -void vim_change_directory(String dir, Error *err) +void nvim_set_current_dir(String dir, Error *err) { if (dir.size >= MAXPATHL) { api_set_error(err, Validation, _("Directory string is too long")); @@ -311,7 +317,7 @@ void vim_change_directory(String dir, Error *err) /// /// @param[out] err Details of an error that may have occurred /// @return The current line string -String vim_get_current_line(Error *err) +String nvim_get_current_line(Error *err) { return buffer_get_line(curbuf->handle, curwin->w_cursor.lnum - 1, err); } @@ -320,7 +326,7 @@ String vim_get_current_line(Error *err) /// /// @param line The line contents /// @param[out] err Details of an error that may have occurred -void vim_set_current_line(String line, Error *err) +void nvim_set_current_line(String line, Error *err) { buffer_set_line(curbuf->handle, curwin->w_cursor.lnum - 1, line, err); } @@ -328,7 +334,7 @@ void vim_set_current_line(String line, Error *err) /// Deletes the current line /// /// @param[out] err Details of an error that may have occurred -void vim_del_current_line(Error *err) +void nvim_del_current_line(Error *err) { buffer_del_line(curbuf->handle, curwin->w_cursor.lnum - 1, err); } @@ -338,7 +344,7 @@ void vim_del_current_line(Error *err) /// @param name The variable name /// @param[out] err Details of an error that may have occurred /// @return The variable value -Object vim_get_var(String name, Error *err) +Object nvim_get_var(String name, Error *err) { return dict_get_value(&globvardict, name, err); } @@ -348,26 +354,46 @@ Object vim_get_var(String name, Error *err) /// @param name The variable name /// @param value The variable value /// @param[out] err Details of an error that may have occurred +void nvim_set_var(String name, Object value, Error *err) +{ + dict_set_value(&globvardict, name, value, false, false, err); +} + +/// Removes a global variable +/// +/// @param name The variable name +/// @param[out] err Details of an error that may have occurred +void nvim_del_var(String name, Error *err) +{ + dict_set_value(&globvardict, name, NIL, true, false, err); +} + +/// Sets a global variable +/// +/// @deprecated +/// +/// @param name The variable name +/// @param value The variable value +/// @param[out] err Details of an error that may have occurred /// @return The old value or nil if there was no previous value. /// /// @warning It may return nil if there was no previous value /// or if previous value was `v:null`. Object vim_set_var(String name, Object value, Error *err) { - return dict_set_value(&globvardict, name, value, false, err); + return dict_set_value(&globvardict, name, value, false, true, err); } /// Removes a global variable /// +/// @deprecated +/// /// @param name The variable name /// @param[out] err Details of an error that may have occurred -/// @return The old value or nil if there was no previous value. -/// -/// @warning It may return nil if there was no previous value -/// or if previous value was `v:null`. +/// @return The old value Object vim_del_var(String name, Error *err) { - return dict_set_value(&globvardict, name, NIL, true, err); + return dict_set_value(&globvardict, name, NIL, true, true, err); } /// Gets a vim variable @@ -375,7 +401,7 @@ Object vim_del_var(String name, Error *err) /// @param name The variable name /// @param[out] err Details of an error that may have occurred /// @return The variable value -Object vim_get_vvar(String name, Error *err) +Object nvim_get_vvar(String name, Error *err) { return dict_get_value(&vimvardict, name, err); } @@ -385,7 +411,7 @@ Object vim_get_vvar(String name, Error *err) /// @param name The option name /// @param[out] err Details of an error that may have occurred /// @return The option value -Object vim_get_option(String name, Error *err) +Object nvim_get_option(String name, Error *err) { return get_option_from(NULL, SREQ_GLOBAL, name, err); } @@ -395,7 +421,7 @@ Object vim_get_option(String name, Error *err) /// @param name The option name /// @param value The new option value /// @param[out] err Details of an error that may have occurred -void vim_set_option(String name, Object value, Error *err) +void nvim_set_option(String name, Object value, Error *err) { set_option_to(NULL, SREQ_GLOBAL, name, value, err); } @@ -403,7 +429,7 @@ void vim_set_option(String name, Object value, Error *err) /// Writes a message to vim output buffer /// /// @param str The message -void vim_out_write(String str) +void nvim_out_write(String str) { write_msg(str, false); } @@ -411,25 +437,25 @@ void vim_out_write(String str) /// Writes a message to vim error buffer /// /// @param str The message -void vim_err_write(String str) +void nvim_err_write(String str) { write_msg(str, true); } /// Higher level error reporting function that ensures all str contents -/// are written by sending a trailing linefeed to `vim_err_write` +/// are written by sending a trailing linefeed to `nvim_err_write` /// /// @param str The message -void vim_report_error(String str) +void nvim_err_writeln(String str) { - vim_err_write(str); - vim_err_write((String) {.data = "\n", .size = 1}); + nvim_err_write(str); + nvim_err_write((String) { .data = "\n", .size = 1 }); } /// Gets the current list of buffer handles /// /// @return The number of buffers -ArrayOf(Buffer) vim_get_buffers(void) +ArrayOf(Buffer) nvim_list_bufs(void) { Array rv = ARRAY_DICT_INIT; @@ -450,7 +476,7 @@ ArrayOf(Buffer) vim_get_buffers(void) /// Gets the current buffer /// /// @reqturn The buffer handle -Buffer vim_get_current_buffer(void) +Buffer nvim_get_current_buf(void) { return curbuf->handle; } @@ -459,7 +485,7 @@ Buffer vim_get_current_buffer(void) /// /// @param id The buffer handle /// @param[out] err Details of an error that may have occurred -void vim_set_current_buffer(Buffer buffer, Error *err) +void nvim_set_current_buf(Buffer buffer, Error *err) { buf_T *buf = find_buffer_by_handle(buffer, err); @@ -472,7 +498,7 @@ void vim_set_current_buffer(Buffer buffer, Error *err) if (!try_end(err) && result == FAIL) { api_set_error(err, Exception, - _("Failed to switch to buffer %" PRIu64), + _("Failed to switch to buffer %d"), buffer); } } @@ -480,7 +506,7 @@ void vim_set_current_buffer(Buffer buffer, Error *err) /// Gets the current list of window handles /// /// @return The number of windows -ArrayOf(Window) vim_get_windows(void) +ArrayOf(Window) nvim_list_wins(void) { Array rv = ARRAY_DICT_INIT; @@ -501,7 +527,7 @@ ArrayOf(Window) vim_get_windows(void) /// Gets the current window /// /// @return The window handle -Window vim_get_current_window(void) +Window nvim_get_current_win(void) { return curwin->handle; } @@ -509,7 +535,7 @@ Window vim_get_current_window(void) /// Sets the current window /// /// @param handle The window handle -void vim_set_current_window(Window window, Error *err) +void nvim_set_current_win(Window window, Error *err) { win_T *win = find_window_by_handle(window, err); @@ -522,7 +548,7 @@ void vim_set_current_window(Window window, Error *err) if (!try_end(err) && win != curwin) { api_set_error(err, Exception, - _("Failed to switch to window %" PRIu64), + _("Failed to switch to window %d"), window); } } @@ -530,7 +556,7 @@ void vim_set_current_window(Window window, Error *err) /// Gets the current list of tabpage handles /// /// @return The number of tab pages -ArrayOf(Tabpage) vim_get_tabpages(void) +ArrayOf(Tabpage) nvim_list_tabpages(void) { Array rv = ARRAY_DICT_INIT; @@ -551,7 +577,7 @@ ArrayOf(Tabpage) vim_get_tabpages(void) /// Gets the current tab page /// /// @return The tab page handle -Tabpage vim_get_current_tabpage(void) +Tabpage nvim_get_current_tabpage(void) { return curtab->handle; } @@ -560,7 +586,7 @@ Tabpage vim_get_current_tabpage(void) /// /// @param handle The tab page handle /// @param[out] err Details of an error that may have occurred -void vim_set_current_tabpage(Tabpage tabpage, Error *err) +void nvim_set_current_tabpage(Tabpage tabpage, Error *err) { tabpage_T *tp = find_tab_by_handle(tabpage, err); @@ -573,7 +599,7 @@ void vim_set_current_tabpage(Tabpage tabpage, Error *err) if (!try_end(err) && tp != curtab) { api_set_error(err, Exception, - _("Failed to switch to tabpage %" PRIu64), + _("Failed to switch to tabpage %d"), tabpage); } } @@ -582,7 +608,8 @@ void vim_set_current_tabpage(Tabpage tabpage, Error *err) /// /// @param channel_id The channel id (passed automatically by the dispatcher) /// @param event The event type string -void vim_subscribe(uint64_t channel_id, String event) +void nvim_subscribe(uint64_t channel_id, String event) + FUNC_API_NOEVAL { size_t length = (event.size < METHOD_MAXLEN ? event.size : METHOD_MAXLEN); char e[METHOD_MAXLEN + 1]; @@ -595,7 +622,8 @@ void vim_subscribe(uint64_t channel_id, String event) /// /// @param channel_id The channel id (passed automatically by the dispatcher) /// @param event The event type string -void vim_unsubscribe(uint64_t channel_id, String event) +void nvim_unsubscribe(uint64_t channel_id, String event) + FUNC_API_NOEVAL { size_t length = (event.size < METHOD_MAXLEN ? event.size : @@ -606,12 +634,12 @@ void vim_unsubscribe(uint64_t channel_id, String event) channel_unsubscribe(channel_id, e); } -Integer vim_name_to_color(String name) +Integer nvim_get_color_by_name(String name) { return name_to_color((uint8_t *)name.data); } -Dictionary vim_get_color_map(void) +Dictionary nvim_get_color_map(void) { Dictionary colors = ARRAY_DICT_INIT; @@ -623,8 +651,8 @@ Dictionary vim_get_color_map(void) } -Array vim_get_api_info(uint64_t channel_id) - FUNC_API_ASYNC +Array nvim_get_api_info(uint64_t channel_id) + FUNC_API_ASYNC FUNC_API_NOEVAL { Array rv = ARRAY_DICT_INIT; diff --git a/src/nvim/api/window.c b/src/nvim/api/window.c index f644453358..166e43f698 100644 --- a/src/nvim/api/window.c +++ b/src/nvim/api/window.c @@ -11,7 +11,6 @@ #include "nvim/window.h" #include "nvim/screen.h" #include "nvim/move.h" -#include "nvim/misc2.h" /// Gets the current buffer in a window @@ -19,7 +18,7 @@ /// @param window The window handle /// @param[out] err Details of an error that may have occurred /// @return The buffer handle -Buffer window_get_buffer(Window window, Error *err) +Buffer nvim_win_get_buf(Window window, Error *err) { win_T *win = find_window_by_handle(window, err); @@ -35,7 +34,7 @@ Buffer window_get_buffer(Window window, Error *err) /// @param window The window handle /// @param[out] err Details of an error that may have occurred /// @return the (row, col) tuple -ArrayOf(Integer, 2) window_get_cursor(Window window, Error *err) +ArrayOf(Integer, 2) nvim_win_get_cursor(Window window, Error *err) { Array rv = ARRAY_DICT_INIT; win_T *win = find_window_by_handle(window, err); @@ -53,7 +52,7 @@ ArrayOf(Integer, 2) window_get_cursor(Window window, Error *err) /// @param window The window handle /// @param pos the (row, col) tuple representing the new position /// @param[out] err Details of an error that may have occurred -void window_set_cursor(Window window, ArrayOf(Integer, 2) pos, Error *err) +void nvim_win_set_cursor(Window window, ArrayOf(Integer, 2) pos, Error *err) { win_T *win = find_window_by_handle(window, err); @@ -99,7 +98,7 @@ void window_set_cursor(Window window, ArrayOf(Integer, 2) pos, Error *err) /// @param window The window handle /// @param[out] err Details of an error that may have occurred /// @return the height in rows -Integer window_get_height(Window window, Error *err) +Integer nvim_win_get_height(Window window, Error *err) { win_T *win = find_window_by_handle(window, err); @@ -116,7 +115,7 @@ Integer window_get_height(Window window, Error *err) /// @param window The window handle /// @param height the new height in rows /// @param[out] err Details of an error that may have occurred -void window_set_height(Window window, Integer height, Error *err) +void nvim_win_set_height(Window window, Integer height, Error *err) { win_T *win = find_window_by_handle(window, err); @@ -142,7 +141,7 @@ void window_set_height(Window window, Integer height, Error *err) /// @param window The window handle /// @param[out] err Details of an error that may have occurred /// @return the width in columns -Integer window_get_width(Window window, Error *err) +Integer nvim_win_get_width(Window window, Error *err) { win_T *win = find_window_by_handle(window, err); @@ -159,7 +158,7 @@ Integer window_get_width(Window window, Error *err) /// @param window The window handle /// @param width the new width in columns /// @param[out] err Details of an error that may have occurred -void window_set_width(Window window, Integer width, Error *err) +void nvim_win_set_width(Window window, Integer width, Error *err) { win_T *win = find_window_by_handle(window, err); @@ -186,7 +185,7 @@ void window_set_width(Window window, Integer width, Error *err) /// @param name The variable name /// @param[out] err Details of an error that may have occurred /// @return The variable value -Object window_get_var(Window window, String name, Error *err) +Object nvim_win_get_var(Window window, String name, Error *err) { win_T *win = find_window_by_handle(window, err); @@ -203,6 +202,41 @@ Object window_get_var(Window window, String name, Error *err) /// @param name The variable name /// @param value The variable value /// @param[out] err Details of an error that may have occurred +void nvim_win_set_var(Window window, String name, Object value, Error *err) +{ + win_T *win = find_window_by_handle(window, err); + + if (!win) { + return; + } + + dict_set_value(win->w_vars, name, value, false, false, err); +} + +/// Removes a window-scoped (w:) variable +/// +/// @param window The window handle +/// @param name The variable name +/// @param[out] err Details of an error that may have occurred +void nvim_win_del_var(Window window, String name, Error *err) +{ + win_T *win = find_window_by_handle(window, err); + + if (!win) { + return; + } + + dict_set_value(win->w_vars, name, NIL, true, false, err); +} + +/// Sets a window-scoped (w:) variable +/// +/// @deprecated +/// +/// @param window The window handle +/// @param name The variable name +/// @param value The variable value +/// @param[out] err Details of an error that may have occurred /// @return The old value or nil if there was no previous value. /// /// @warning It may return nil if there was no previous value @@ -215,18 +249,17 @@ Object window_set_var(Window window, String name, Object value, Error *err) return (Object) OBJECT_INIT; } - return dict_set_value(win->w_vars, name, value, false, err); + return dict_set_value(win->w_vars, name, value, false, true, err); } /// Removes a window-scoped (w:) variable /// +/// @deprecated +/// /// @param window The window handle /// @param name The variable name /// @param[out] err Details of an error that may have occurred -/// @return The old value or nil if there was no previous value. -/// -/// @warning It may return nil if there was no previous value -/// or if previous value was `v:null`. +/// @return The old value Object window_del_var(Window window, String name, Error *err) { win_T *win = find_window_by_handle(window, err); @@ -235,7 +268,7 @@ Object window_del_var(Window window, String name, Error *err) return (Object) OBJECT_INIT; } - return dict_set_value(win->w_vars, name, NIL, true, err); + return dict_set_value(win->w_vars, name, NIL, true, true, err); } /// Gets a window option value @@ -244,7 +277,7 @@ Object window_del_var(Window window, String name, Error *err) /// @param name The option name /// @param[out] err Details of an error that may have occurred /// @return The option value -Object window_get_option(Window window, String name, Error *err) +Object nvim_win_get_option(Window window, String name, Error *err) { win_T *win = find_window_by_handle(window, err); @@ -262,7 +295,7 @@ Object window_get_option(Window window, String name, Error *err) /// @param name The option name /// @param value The option value /// @param[out] err Details of an error that may have occurred -void window_set_option(Window window, String name, Object value, Error *err) +void nvim_win_set_option(Window window, String name, Object value, Error *err) { win_T *win = find_window_by_handle(window, err); @@ -278,7 +311,7 @@ void window_set_option(Window window, String name, Object value, Error *err) /// @param window The window handle /// @param[out] err Details of an error that may have occurred /// @return The (row, col) tuple with the window position -ArrayOf(Integer, 2) window_get_position(Window window, Error *err) +ArrayOf(Integer, 2) nvim_win_get_position(Window window, Error *err) { Array rv = ARRAY_DICT_INIT; win_T *win = find_window_by_handle(window, err); @@ -296,7 +329,7 @@ ArrayOf(Integer, 2) window_get_position(Window window, Error *err) /// @param window The window handle /// @param[out] err Details of an error that may have occurred /// @return The tab page that contains the window -Tabpage window_get_tabpage(Window window, Error *err) +Tabpage nvim_win_get_tabpage(Window window, Error *err) { Tabpage rv = 0; win_T *win = find_window_by_handle(window, err); @@ -312,7 +345,7 @@ Tabpage window_get_tabpage(Window window, Error *err) /// /// @param window The window handle /// @return true if the window is valid, false otherwise -Boolean window_is_valid(Window window) +Boolean nvim_win_is_valid(Window window) { Error stub = ERROR_INIT; return find_window_by_handle(window, &stub) != NULL; diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index c934d44e70..b42ad1c18a 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -36,6 +36,7 @@ #include "nvim/ex_eval.h" #include "nvim/ex_getln.h" #include "nvim/fileio.h" +#include "nvim/file_search.h" #include "nvim/fold.h" #include "nvim/getchar.h" #include "nvim/hashtab.h" @@ -48,7 +49,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/move.h" #include "nvim/option.h" @@ -1397,8 +1397,7 @@ buflist_new ( } if (buf != curbuf || curbuf == NULL) { buf = xcalloc(1, sizeof(buf_T)); - handle_register_buffer(buf); - /* init b: variables */ + // init b: variables buf->b_vars = dict_alloc(); init_var_dict(buf->b_vars, &buf->b_bufvar, VAR_SCOPE); } @@ -1451,11 +1450,12 @@ buflist_new ( lastbuf = buf; buf->b_fnum = top_file_num++; - if (top_file_num < 0) { /* wrap around (may cause duplicates) */ + handle_register_buffer(buf); + if (top_file_num < 0) { // wrap around (may cause duplicates) EMSG(_("W14: Warning: List of file names overflow")); if (emsg_silent == 0) { ui_flush(); - os_delay(3000L, true); /* make sure it is noticed */ + os_delay(3000L, true); // make sure it is noticed } top_file_num = 1; } @@ -5231,12 +5231,12 @@ wipe_buffer ( int aucmd /* When TRUE trigger autocommands. */ ) { - if (buf->b_fnum == top_file_num - 1) - --top_file_num; - - if (!aucmd) /* Don't trigger BufDelete autocommands here. */ + if (!aucmd) { + // Don't trigger BufDelete autocommands here. block_autocmds(); - close_buffer(NULL, buf, DOBUF_WIPE, FALSE); - if (!aucmd) + } + close_buffer(NULL, buf, DOBUF_WIPE, false); + if (!aucmd) { unblock_autocmds(); + } } diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index b515c4e1e4..ab5987612c 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -461,9 +461,10 @@ typedef struct { */ struct file_buffer { - uint64_t handle; // unique identifier for the buffer - memline_T b_ml; /* associated memline (also contains line - count) */ + handle_T handle; // unique id for the buffer (buffer number) +#define b_fnum handle + + memline_T b_ml; // associated memline (also contains line count buf_T *b_next; /* links in list of buffers */ buf_T *b_prev; @@ -487,8 +488,6 @@ struct file_buffer { bool file_id_valid; FileID file_id; - int b_fnum; /* buffer number for this file. */ - bool b_changed; /* 'modified': Set to true if something in the file has been changed and not written out. */ int b_changedtick; /* incremented for each change, also for undo */ @@ -799,28 +798,27 @@ struct diffblock_S { # define SNAP_AUCMD_IDX 1 # define SNAP_COUNT 2 -/* - * Tab pages point to the top frame of each tab page. - * Note: Most values are NOT valid for the current tab page! Use "curwin", - * "firstwin", etc. for that. "tp_topframe" is always valid and can be - * compared against "topframe" to find the current tab page. - */ +/// Tab pages point to the top frame of each tab page. +/// Note: Most values are NOT valid for the current tab page! Use "curwin", +/// "firstwin", etc. for that. "tp_topframe" is always valid and can be +/// compared against "topframe" to find the current tab page. typedef struct tabpage_S tabpage_T; struct tabpage_S { - uint64_t handle; - tabpage_T *tp_next; /* next tabpage or NULL */ - frame_T *tp_topframe; /* topframe for the windows */ - win_T *tp_curwin; /* current window in this Tab page */ - win_T *tp_prevwin; /* previous window in this Tab page */ - win_T *tp_firstwin; /* first window in this Tab page */ - win_T *tp_lastwin; /* last window in this Tab page */ - long tp_old_Rows; /* Rows when Tab page was left */ - long tp_old_Columns; /* Columns when Tab page was left */ - long tp_ch_used; /* value of 'cmdheight' when frame size - was set */ + handle_T handle; + tabpage_T *tp_next; ///< next tabpage or NULL + frame_T *tp_topframe; ///< topframe for the windows + win_T *tp_curwin; ///< current window in this Tab page + win_T *tp_prevwin; ///< previous window in this Tab page + win_T *tp_firstwin; ///< first window in this Tab page + win_T *tp_lastwin; ///< last window in this Tab page + long tp_old_Rows; ///< Rows when Tab page was left + long tp_old_Columns; ///< Columns when Tab page was left + long tp_ch_used; ///< value of 'cmdheight' when frame size + ///< was set + diff_T *tp_first_diff; buf_T *(tp_diffbuf[DB_COUNT]); - int tp_diff_invalid; ///< list of diffs is outdated */ + int tp_diff_invalid; ///< list of diffs is outdated frame_T *(tp_snapshot[SNAP_COUNT]); ///< window layout snapshots dictitem_T tp_winvar; ///< variable for "t:" Dictionary dict_T *tp_vars; ///< internal variables, local to tab page @@ -936,9 +934,10 @@ struct matchitem { * All row numbers are relative to the start of the window, except w_winrow. */ struct window_S { - uint64_t handle; - buf_T *w_buffer; /* buffer we are a window into (used - often, keep it the first item!) */ + handle_T handle; ///< unique identifier for the window + + buf_T *w_buffer; ///< buffer we are a window into (used + ///< often, keep it the first item!) synblock_T *w_s; /* for :ownsyntax */ diff --git a/src/nvim/charset.c b/src/nvim/charset.c index 22ca0fb0cc..78f5d96fc7 100644 --- a/src/nvim/charset.c +++ b/src/nvim/charset.c @@ -19,10 +19,11 @@ #include "nvim/memline.h" #include "nvim/memory.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/move.h" +#include "nvim/option.h" #include "nvim/os_unix.h" +#include "nvim/state.h" #include "nvim/strings.h" #include "nvim/path.h" @@ -1739,8 +1740,11 @@ char_u* skiptowhite_esc(char_u *p) { /// @return Number read from the string. intmax_t getdigits(char_u **pp) { + errno = 0; intmax_t number = strtoimax((char *)*pp, (char **)pp, 10); - assert(errno != ERANGE); + if (number == INTMAX_MAX || number == INTMAX_MIN) { + assert(errno != ERANGE); + } return number; } diff --git a/src/nvim/cursor.c b/src/nvim/cursor.c index afaa6022c9..3ba9da34f2 100644 --- a/src/nvim/cursor.c +++ b/src/nvim/cursor.c @@ -9,6 +9,7 @@ #include "nvim/misc1.h" #include "nvim/move.h" #include "nvim/screen.h" +#include "nvim/state.h" #include "nvim/vim.h" #include "nvim/ascii.h" diff --git a/src/nvim/cursor.h b/src/nvim/cursor.h index 09cc5a813c..1cbe8a609e 100644 --- a/src/nvim/cursor.h +++ b/src/nvim/cursor.h @@ -4,7 +4,6 @@ #include <stdbool.h> #include "nvim/vim.h" -#include "nvim/misc2.h" #ifdef INCLUDE_GENERATED_DECLARATIONS # include "cursor.h.generated.h" diff --git a/src/nvim/cursor_shape.c b/src/nvim/cursor_shape.c index 87425ca567..b50462664c 100644 --- a/src/nvim/cursor_shape.c +++ b/src/nvim/cursor_shape.c @@ -3,7 +3,6 @@ #include "nvim/vim.h" #include "nvim/ascii.h" #include "nvim/cursor_shape.h" -#include "nvim/misc2.h" #include "nvim/ex_getln.h" #include "nvim/charset.h" #include "nvim/strings.h" diff --git a/src/nvim/diff.c b/src/nvim/diff.c index 4826e70727..ef5acf4845 100644 --- a/src/nvim/diff.c +++ b/src/nvim/diff.c @@ -21,7 +21,6 @@ #include "nvim/memline.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/memory.h" #include "nvim/move.h" #include "nvim/normal.h" diff --git a/src/nvim/digraph.c b/src/nvim/digraph.c index aad145b3e5..6ba6e659a6 100644 --- a/src/nvim/digraph.c +++ b/src/nvim/digraph.c @@ -17,7 +17,6 @@ #include "nvim/getchar.h" #include "nvim/mbyte.h" #include "nvim/message.h" -#include "nvim/misc2.h" #include "nvim/memory.h" #include "nvim/garray.h" #include "nvim/normal.h" @@ -1691,8 +1690,11 @@ static void printdigraph(digr_T *dp) msg_putchar('\n'); } - if (msg_col) { - while (msg_col % list_width != 0) { + + // Make msg_col a multiple of list_width by using spaces. + if (msg_col % list_width != 0) { + int spaces = (msg_col / list_width + 1) * list_width - msg_col; + while (spaces--) { msg_putchar(' '); } } diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 98ec9ae280..18d5ea533d 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -29,7 +29,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/keymap.h" #include "nvim/move.h" #include "nvim/normal.h" @@ -463,6 +462,8 @@ static void insert_enter(InsertState *s) o_lnum = curwin->w_cursor.lnum; } + foldUpdateAll(curwin); + foldOpenCursor(); if (s->cmdchar != 'r' && s->cmdchar != 'v') { apply_autocmds(EVENT_INSERTLEAVE, NULL, NULL, false, curbuf); } @@ -2472,6 +2473,7 @@ void ins_compl_show_pum(void) int cur = -1; colnr_T col; int lead_len = 0; + bool array_changed = false; if (!pum_wanted() || !pum_enough_matches()) return; @@ -2483,7 +2485,8 @@ void ins_compl_show_pum(void) update_screen(0); if (compl_match_array == NULL) { - /* Need to build the popup menu list. */ + array_changed = true; + // Need to build the popup menu list. compl_match_arraysize = 0; compl = compl_first_match; /* @@ -2586,7 +2589,7 @@ void ins_compl_show_pum(void) // Use the cursor to get all wrapping and other settings right. col = curwin->w_cursor.col; curwin->w_cursor.col = compl_col; - pum_display(compl_match_array, compl_match_arraysize, cur); + pum_display(compl_match_array, compl_match_arraysize, cur, array_changed); curwin->w_cursor.col = col; } @@ -3530,21 +3533,15 @@ int ins_compl_add_tv(typval_T *tv, int dir) char_u *(cptext[CPT_COUNT]); if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL) { - word = get_dict_string(tv->vval.v_dict, (char_u *)"word", FALSE); - cptext[CPT_ABBR] = get_dict_string(tv->vval.v_dict, - (char_u *)"abbr", FALSE); - cptext[CPT_MENU] = get_dict_string(tv->vval.v_dict, - (char_u *)"menu", FALSE); - cptext[CPT_KIND] = get_dict_string(tv->vval.v_dict, - (char_u *)"kind", FALSE); - cptext[CPT_INFO] = get_dict_string(tv->vval.v_dict, - (char_u *)"info", FALSE); - if (get_dict_string(tv->vval.v_dict, (char_u *)"icase", FALSE) != NULL) - icase = get_dict_number(tv->vval.v_dict, (char_u *)"icase"); - if (get_dict_string(tv->vval.v_dict, (char_u *)"dup", FALSE) != NULL) - adup = get_dict_number(tv->vval.v_dict, (char_u *)"dup"); - if (get_dict_string(tv->vval.v_dict, (char_u *)"empty", FALSE) != NULL) - aempty = get_dict_number(tv->vval.v_dict, (char_u *)"empty"); + word = get_dict_string(tv->vval.v_dict, "word", false); + cptext[CPT_ABBR] = get_dict_string(tv->vval.v_dict, "abbr", false); + cptext[CPT_MENU] = get_dict_string(tv->vval.v_dict, "menu", false); + cptext[CPT_KIND] = get_dict_string(tv->vval.v_dict, "kind", false); + cptext[CPT_INFO] = get_dict_string(tv->vval.v_dict, "info", false); + + icase = get_dict_number(tv->vval.v_dict, "icase"); + adup = get_dict_number(tv->vval.v_dict, "dup"); + aempty = get_dict_number(tv->vval.v_dict, "empty"); } else { word = get_tv_string_chk(tv); memset(cptext, 0, sizeof(cptext)); diff --git a/src/nvim/eval.c b/src/nvim/eval.c index a5333d74be..c762ce9fff 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -44,7 +44,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/keymap.h" #include "nvim/map.h" #include "nvim/file_search.h" @@ -63,6 +62,7 @@ #include "nvim/search.h" #include "nvim/sha256.h" #include "nvim/spell.h" +#include "nvim/state.h" #include "nvim/strings.h" #include "nvim/syntax.h" #include "nvim/tag.h" @@ -90,6 +90,8 @@ #include "nvim/os/dl.h" #include "nvim/os/input.h" #include "nvim/event/loop.h" +#include "nvim/lib/kvec.h" +#include "nvim/lib/khash.h" #include "nvim/lib/queue.h" #include "nvim/eval/typval_encode.h" @@ -408,6 +410,7 @@ typedef struct { Terminal *term; bool stopped; bool exited; + bool rpc; int refcount; ufunc_T *on_stdout, *on_stderr, *on_exit; dict_T *self; @@ -435,11 +438,28 @@ typedef struct { TimeWatcher tw; int timer_id; int repeat_count; + int refcount; long timeout; bool stopped; ufunc_T *callback; } timer_T; +typedef void (*FunPtr)(void); + +/// Prototype of C function that implements VimL function +typedef void (*VimLFunc)(typval_T *args, typval_T *rvar, FunPtr data); + +/// Structure holding VimL function definition +typedef struct fst { + char *name; ///< Name of the function. + uint8_t min_argc; ///< Minimal number of arguments. + uint8_t max_argc; ///< Maximal number of arguments. + VimLFunc func; ///< Function implementation. + FunPtr data; ///< Userdata for function implementation. +} VimLFuncDef; + +KHASH_MAP_INIT_STR(functions, VimLFuncDef) + #ifdef INCLUDE_GENERATED_DECLARATIONS # include "eval.c.generated.h" #endif @@ -447,8 +467,7 @@ typedef struct { #define FNE_INCL_BR 1 /* find_name_end(): include [] in name */ #define FNE_CHECK_START 2 /* find_name_end(): check name starts with valid character */ -static uint64_t current_job_id = 1; -static PMap(uint64_t) *jobs = NULL; +static PMap(uint64_t) *jobs = NULL; static uint64_t last_timer_id = 0; static PMap(uint64_t) *timers = NULL; @@ -6481,19 +6500,20 @@ static ufunc_T *find_ufunc(uint8_t *name) return rv; } -/* - * Get a string item from a dictionary. - * When "save" is TRUE allocate memory for it. - * Returns NULL if the entry doesn't exist. - */ -char_u *get_dict_string(dict_T *d, char_u *key, int save) +/// Get a string item from a dictionary. +/// +/// @param save whether memory should be allocated for the return value +/// +/// @return the entry or NULL if the entry doesn't exist. +char_u *get_dict_string(dict_T *d, char *key, bool save) { dictitem_T *di; char_u *s; - di = dict_find(d, key, -1); - if (di == NULL) + di = dict_find(d, (char_u *)key, -1); + if (di == NULL) { return NULL; + } s = get_tv_string(&di->di_tv); if (save) { s = vim_strsave(s); @@ -6501,15 +6521,15 @@ char_u *get_dict_string(dict_T *d, char_u *key, int save) return s; } -/* - * Get a number item from a dictionary. - * Returns 0 if the entry doesn't exist. - */ -long get_dict_number(dict_T *d, char_u *key) +/// Get a number item from a dictionary. +/// +/// @return the entry or 0 if the entry doesn't exist. +long get_dict_number(dict_T *d, char *key) { - dictitem_T *di = dict_find(d, key, -1); - if (di == NULL) + dictitem_T *di = dict_find(d, (char_u *)key, -1); + if (di == NULL) { return 0; + } return get_tv_number(&di->di_tv); } @@ -6679,327 +6699,9 @@ static int get_env_tv(char_u **arg, typval_T *rettv, int evaluate) return OK; } -/* - * Array with names and number of arguments of all internal functions - * MUST BE KEPT SORTED IN strcmp() ORDER FOR BINARY SEARCH! - */ -static struct fst { - char *f_name; /* function name */ - char f_min_argc; /* minimal number of arguments */ - char f_max_argc; /* maximal number of arguments */ - void (*f_func)(typval_T *args, typval_T *rvar); - /* implementation of function */ -} functions[] = -{ - { "abs", 1, 1, f_abs }, - { "acos", 1, 1, f_acos }, // WJMc - { "add", 2, 2, f_add }, - { "and", 2, 2, f_and }, - { "api_info", 0, 0, f_api_info }, - { "append", 2, 2, f_append }, - { "argc", 0, 0, f_argc }, - { "argidx", 0, 0, f_argidx }, - { "arglistid", 0, 2, f_arglistid }, - { "argv", 0, 1, f_argv }, - { "asin", 1, 1, f_asin }, // WJMc - { "assert_equal", 2, 3, f_assert_equal }, - { "assert_exception", 1, 2, f_assert_exception }, - { "assert_fails", 1, 2, f_assert_fails }, - { "assert_false", 1, 2, f_assert_false }, - { "assert_match", 2, 3, f_assert_match }, - { "assert_notequal", 2, 3, f_assert_notequal }, - { "assert_notmatch", 2, 3, f_assert_notmatch }, - { "assert_true", 1, 2, f_assert_true }, - { "atan", 1, 1, f_atan }, - { "atan2", 2, 2, f_atan2 }, - { "browse", 4, 4, f_browse }, - { "browsedir", 2, 2, f_browsedir }, - { "bufexists", 1, 1, f_bufexists }, - { "buffer_exists", 1, 1, f_bufexists }, // obsolete - { "buffer_name", 1, 1, f_bufname }, // obsolete - { "buffer_number", 1, 1, f_bufnr }, // obsolete - { "buflisted", 1, 1, f_buflisted }, - { "bufloaded", 1, 1, f_bufloaded }, - { "bufname", 1, 1, f_bufname }, - { "bufnr", 1, 2, f_bufnr }, - { "bufwinnr", 1, 1, f_bufwinnr }, - { "byte2line", 1, 1, f_byte2line }, - { "byteidx", 2, 2, f_byteidx }, - { "byteidxcomp", 2, 2, f_byteidxcomp }, - { "call", 2, 3, f_call }, - { "ceil", 1, 1, f_ceil }, - { "changenr", 0, 0, f_changenr }, - { "char2nr", 1, 2, f_char2nr }, - { "cindent", 1, 1, f_cindent }, - { "clearmatches", 0, 0, f_clearmatches }, - { "col", 1, 1, f_col }, - { "complete", 2, 2, f_complete }, - { "complete_add", 1, 1, f_complete_add }, - { "complete_check", 0, 0, f_complete_check }, - { "confirm", 1, 4, f_confirm }, - { "copy", 1, 1, f_copy }, - { "cos", 1, 1, f_cos }, - { "cosh", 1, 1, f_cosh }, - { "count", 2, 4, f_count }, - { "cscope_connection", 0, 3, f_cscope_connection }, - { "cursor", 1, 3, f_cursor }, - { "deepcopy", 1, 2, f_deepcopy }, - { "delete", 1, 2, f_delete }, - { "dictwatcheradd", 3, 3, f_dictwatcheradd }, - { "dictwatcherdel", 3, 3, f_dictwatcherdel }, - { "did_filetype", 0, 0, f_did_filetype }, - { "diff_filler", 1, 1, f_diff_filler }, - { "diff_hlID", 2, 2, f_diff_hlID }, - { "empty", 1, 1, f_empty }, - { "escape", 2, 2, f_escape }, - { "eval", 1, 1, f_eval }, - { "eventhandler", 0, 0, f_eventhandler }, - { "executable", 1, 1, f_executable }, - { "execute", 1, 1, f_execute }, - { "exepath", 1, 1, f_exepath }, - { "exists", 1, 1, f_exists }, - { "exp", 1, 1, f_exp }, - { "expand", 1, 3, f_expand }, - { "extend", 2, 3, f_extend }, - { "feedkeys", 1, 2, f_feedkeys }, - { "file_readable", 1, 1, f_filereadable }, // obsolete - { "filereadable", 1, 1, f_filereadable }, - { "filewritable", 1, 1, f_filewritable }, - { "filter", 2, 2, f_filter }, - { "finddir", 1, 3, f_finddir }, - { "findfile", 1, 3, f_findfile }, - { "float2nr", 1, 1, f_float2nr }, - { "floor", 1, 1, f_floor }, - { "fmod", 2, 2, f_fmod }, - { "fnameescape", 1, 1, f_fnameescape }, - { "fnamemodify", 2, 2, f_fnamemodify }, - { "foldclosed", 1, 1, f_foldclosed }, - { "foldclosedend", 1, 1, f_foldclosedend }, - { "foldlevel", 1, 1, f_foldlevel }, - { "foldtext", 0, 0, f_foldtext }, - { "foldtextresult", 1, 1, f_foldtextresult }, - { "foreground", 0, 0, f_foreground }, - { "function", 1, 1, f_function }, - { "garbagecollect", 0, 1, f_garbagecollect }, - { "get", 2, 3, f_get }, - { "getbufline", 2, 3, f_getbufline }, - { "getbufvar", 2, 3, f_getbufvar }, - { "getchar", 0, 1, f_getchar }, - { "getcharmod", 0, 0, f_getcharmod }, - { "getcharsearch", 0, 0, f_getcharsearch }, - { "getcmdline", 0, 0, f_getcmdline }, - { "getcmdpos", 0, 0, f_getcmdpos }, - { "getcmdtype", 0, 0, f_getcmdtype }, - { "getcmdwintype", 0, 0, f_getcmdwintype }, - { "getcompletion", 2, 2, f_getcompletion }, - { "getcurpos", 0, 0, f_getcurpos }, - { "getcwd", 0, 2, f_getcwd }, - { "getfontname", 0, 1, f_getfontname }, - { "getfperm", 1, 1, f_getfperm }, - { "getfsize", 1, 1, f_getfsize }, - { "getftime", 1, 1, f_getftime }, - { "getftype", 1, 1, f_getftype }, - { "getline", 1, 2, f_getline }, - { "getloclist", 1, 1, f_getqflist }, - { "getmatches", 0, 0, f_getmatches }, - { "getpid", 0, 0, f_getpid }, - { "getpos", 1, 1, f_getpos }, - { "getqflist", 0, 0, f_getqflist }, - { "getreg", 0, 3, f_getreg }, - { "getregtype", 0, 1, f_getregtype }, - { "gettabvar", 2, 3, f_gettabvar }, - { "gettabwinvar", 3, 4, f_gettabwinvar }, - { "getwinposx", 0, 0, f_getwinposx }, - { "getwinposy", 0, 0, f_getwinposy }, - { "getwinvar", 2, 3, f_getwinvar }, - { "glob", 1, 4, f_glob }, - { "glob2regpat", 1, 1, f_glob2regpat }, - { "globpath", 2, 5, f_globpath }, - { "has", 1, 1, f_has }, - { "has_key", 2, 2, f_has_key }, - { "haslocaldir", 0, 2, f_haslocaldir }, - { "hasmapto", 1, 3, f_hasmapto }, - { "highlightID", 1, 1, f_hlID }, // obsolete - { "highlight_exists", 1, 1, f_hlexists }, // obsolete - { "histadd", 2, 2, f_histadd }, - { "histdel", 1, 2, f_histdel }, - { "histget", 1, 2, f_histget }, - { "histnr", 1, 1, f_histnr }, - { "hlID", 1, 1, f_hlID }, - { "hlexists", 1, 1, f_hlexists }, - { "hostname", 0, 0, f_hostname }, - { "iconv", 3, 3, f_iconv }, - { "indent", 1, 1, f_indent }, - { "index", 2, 4, f_index }, - { "input", 1, 3, f_input }, - { "inputdialog", 1, 3, f_inputdialog }, - { "inputlist", 1, 1, f_inputlist }, - { "inputrestore", 0, 0, f_inputrestore }, - { "inputsave", 0, 0, f_inputsave }, - { "inputsecret", 1, 2, f_inputsecret }, - { "insert", 2, 3, f_insert }, - { "invert", 1, 1, f_invert }, - { "isdirectory", 1, 1, f_isdirectory }, - { "islocked", 1, 1, f_islocked }, - { "items", 1, 1, f_items }, - { "jobclose", 1, 2, f_jobclose }, - { "jobpid", 1, 1, f_jobpid }, - { "jobresize", 3, 3, f_jobresize }, - { "jobsend", 2, 2, f_jobsend }, - { "jobstart", 1, 2, f_jobstart }, - { "jobstop", 1, 1, f_jobstop }, - { "jobwait", 1, 2, f_jobwait }, - { "join", 1, 2, f_join }, - { "json_decode", 1, 1, f_json_decode }, - { "json_encode", 1, 1, f_json_encode }, - { "keys", 1, 1, f_keys }, - { "last_buffer_nr", 0, 0, f_last_buffer_nr }, // obsolete - { "len", 1, 1, f_len }, - { "libcall", 3, 3, f_libcall }, - { "libcallnr", 3, 3, f_libcallnr }, - { "line", 1, 1, f_line }, - { "line2byte", 1, 1, f_line2byte }, - { "lispindent", 1, 1, f_lispindent }, - { "localtime", 0, 0, f_localtime }, - { "log", 1, 1, f_log }, - { "log10", 1, 1, f_log10 }, - { "map", 2, 2, f_map }, - { "maparg", 1, 4, f_maparg }, - { "mapcheck", 1, 3, f_mapcheck }, - { "match", 2, 4, f_match }, - { "matchadd", 2, 5, f_matchadd }, - { "matchaddpos", 2, 5, f_matchaddpos }, - { "matcharg", 1, 1, f_matcharg }, - { "matchdelete", 1, 1, f_matchdelete }, - { "matchend", 2, 4, f_matchend }, - { "matchlist", 2, 4, f_matchlist }, - { "matchstr", 2, 4, f_matchstr }, - { "max", 1, 1, f_max }, - { "min", 1, 1, f_min }, - { "mkdir", 1, 3, f_mkdir }, - { "mode", 0, 1, f_mode }, - { "msgpackdump", 1, 1, f_msgpackdump }, - { "msgpackparse", 1, 1, f_msgpackparse }, - { "nextnonblank", 1, 1, f_nextnonblank }, - { "nr2char", 1, 2, f_nr2char }, - { "or", 2, 2, f_or }, - { "pathshorten", 1, 1, f_pathshorten }, - { "pow", 2, 2, f_pow }, - { "prevnonblank", 1, 1, f_prevnonblank }, - { "printf", 2, MAX_FUNC_ARGS, f_printf }, - { "pumvisible", 0, 0, f_pumvisible }, - { "py3eval", 1, 1, f_py3eval }, - { "pyeval", 1, 1, f_pyeval }, - { "range", 1, 3, f_range }, - { "readfile", 1, 3, f_readfile }, - { "reltime", 0, 2, f_reltime }, - { "reltimefloat", 1, 1, f_reltimefloat }, - { "reltimestr", 1, 1, f_reltimestr }, - { "remove", 2, 3, f_remove }, - { "rename", 2, 2, f_rename }, - { "repeat", 2, 2, f_repeat }, - { "resolve", 1, 1, f_resolve }, - { "reverse", 1, 1, f_reverse }, - { "round", 1, 1, f_round }, - { "rpcnotify", 2, MAX_FUNC_ARGS, f_rpcnotify }, - { "rpcrequest", 2, MAX_FUNC_ARGS, f_rpcrequest }, - { "rpcstart", 1, 2, f_rpcstart }, - { "rpcstop", 1, 1, f_rpcstop }, - { "screenattr", 2, 2, f_screenattr }, - { "screenchar", 2, 2, f_screenchar }, - { "screencol", 0, 0, f_screencol }, - { "screenrow", 0, 0, f_screenrow }, - { "search", 1, 4, f_search }, - { "searchdecl", 1, 3, f_searchdecl }, - { "searchpair", 3, 7, f_searchpair }, - { "searchpairpos", 3, 7, f_searchpairpos }, - { "searchpos", 1, 4, f_searchpos }, - { "serverlist", 0, 0, f_serverlist }, - { "serverstart", 0, 1, f_serverstart }, - { "serverstop", 1, 1, f_serverstop }, - { "setbufvar", 3, 3, f_setbufvar }, - { "setcharsearch", 1, 1, f_setcharsearch }, - { "setcmdpos", 1, 1, f_setcmdpos }, - { "setfperm", 2, 2, f_setfperm }, - { "setline", 2, 2, f_setline }, - { "setloclist", 2, 4, f_setloclist }, - { "setmatches", 1, 1, f_setmatches }, - { "setpos", 2, 2, f_setpos }, - { "setqflist", 1, 3, f_setqflist }, - { "setreg", 2, 3, f_setreg }, - { "settabvar", 3, 3, f_settabvar }, - { "settabwinvar", 4, 4, f_settabwinvar }, - { "setwinvar", 3, 3, f_setwinvar }, - { "sha256", 1, 1, f_sha256 }, - { "shellescape", 1, 2, f_shellescape }, - { "shiftwidth", 0, 0, f_shiftwidth }, - { "simplify", 1, 1, f_simplify }, - { "sin", 1, 1, f_sin }, - { "sinh", 1, 1, f_sinh }, - { "sort", 1, 3, f_sort }, - { "soundfold", 1, 1, f_soundfold }, - { "spellbadword", 0, 1, f_spellbadword }, - { "spellsuggest", 1, 3, f_spellsuggest }, - { "split", 1, 3, f_split }, - { "sqrt", 1, 1, f_sqrt }, - { "str2float", 1, 1, f_str2float }, - { "str2nr", 1, 2, f_str2nr }, - { "strchars", 1, 2, f_strchars }, - { "strdisplaywidth", 1, 2, f_strdisplaywidth }, - { "strftime", 1, 2, f_strftime }, - { "stridx", 2, 3, f_stridx }, - { "string", 1, 1, f_string }, - { "strlen", 1, 1, f_strlen }, - { "strpart", 2, 3, f_strpart }, - { "strridx", 2, 3, f_strridx }, - { "strtrans", 1, 1, f_strtrans }, - { "strwidth", 1, 1, f_strwidth }, - { "submatch", 1, 2, f_submatch }, - { "substitute", 4, 4, f_substitute }, - { "synID", 3, 3, f_synID }, - { "synIDattr", 2, 3, f_synIDattr }, - { "synIDtrans", 1, 1, f_synIDtrans }, - { "synconcealed", 2, 2, f_synconcealed }, - { "synstack", 2, 2, f_synstack }, - { "system", 1, 2, f_system }, - { "systemlist", 1, 3, f_systemlist }, - { "tabpagebuflist", 0, 1, f_tabpagebuflist }, - { "tabpagenr", 0, 1, f_tabpagenr }, - { "tabpagewinnr", 1, 2, f_tabpagewinnr }, - { "tagfiles", 0, 0, f_tagfiles }, - { "taglist", 1, 1, f_taglist }, - { "tan", 1, 1, f_tan }, - { "tanh", 1, 1, f_tanh }, - { "tempname", 0, 0, f_tempname }, - { "termopen", 1, 2, f_termopen }, - { "test", 1, 1, f_test }, - { "timer_start", 2, 3, f_timer_start }, - { "timer_stop", 1, 1, f_timer_stop }, - { "tolower", 1, 1, f_tolower }, - { "toupper", 1, 1, f_toupper }, - { "tr", 3, 3, f_tr }, - { "trunc", 1, 1, f_trunc }, - { "type", 1, 1, f_type }, - { "undofile", 1, 1, f_undofile }, - { "undotree", 0, 0, f_undotree }, - { "uniq", 1, 3, f_uniq }, - { "values", 1, 1, f_values }, - { "virtcol", 1, 1, f_virtcol }, - { "visualmode", 0, 1, f_visualmode }, - { "wildmenumode", 0, 0, f_wildmenumode }, - { "winbufnr", 1, 1, f_winbufnr }, - { "wincol", 0, 0, f_wincol }, - { "winheight", 1, 1, f_winheight }, - { "winline", 0, 0, f_winline }, - { "winnr", 0, 1, f_winnr }, - { "winrestcmd", 0, 0, f_winrestcmd }, - { "winrestview", 1, 1, f_winrestview }, - { "winsaveview", 0, 0, f_winsaveview }, - { "winwidth", 1, 1, f_winwidth }, - { "wordcount", 0, 0, f_wordcount }, - { "writefile", 2, 3, f_writefile }, - { "xor", 2, 2, f_xor }, -}; +#ifdef INCLUDE_GENERATED_DECLARATIONS +# include "funcs.generated.h" +#endif /* @@ -7018,15 +6720,25 @@ char_u *get_function_name(expand_T *xp, int idx) if (name != NULL) return name; } - if (++intidx < (int)ARRAY_SIZE(functions)) { - STRCPY(IObuff, functions[intidx].f_name); - STRCAT(IObuff, "("); - if (functions[intidx].f_max_argc == 0) - STRCAT(IObuff, ")"); - return IObuff; + while ( (size_t)++intidx < ARRAY_SIZE(functions) + && functions[intidx].name[0] == '\0') { } - return NULL; + if ((size_t)intidx >= ARRAY_SIZE(functions)) { + return NULL; + } + + const char *const key = functions[intidx].name; + const size_t key_len = strlen(key); + memcpy(IObuff, key, key_len); + IObuff[key_len] = '('; + if (functions[intidx].max_argc == 0) { + IObuff[key_len + 1] = ')'; + IObuff[key_len + 2] = NUL; + } else { + IObuff[key_len + 1] = NUL; + } + return IObuff; } /* @@ -7051,32 +6763,16 @@ char_u *get_expr_name(expand_T *xp, int idx) -/* - * Find internal function in table above. - * Return index, or -1 if not found - */ -static int -find_internal_func ( - char_u *name /* name of the function */ -) +/// Find internal function in hash functions +/// +/// @param[in] name Name of the function. +/// +/// Returns pointer to the function definition or NULL if not found. +static VimLFuncDef *find_internal_func(const char *const name) + FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE FUNC_ATTR_NONNULL_ALL { - int first = 0; - int last = (int)ARRAY_SIZE(functions) - 1; - - /* - * Find the function name in the table. Binary search. - */ - while (first <= last) { - int x = first + ((unsigned)(last - first)) / 2; - int cmp = STRCMP(name, functions[x].f_name); - if (cmp < 0) - last = x - 1; - else if (cmp > 0) - first = x + 1; - else - return x; - } - return -1; + size_t len = strlen(name); + return find_internal_func_gperf(name, len); } /* @@ -7194,7 +6890,6 @@ call_func ( #define ERROR_NONE 5 #define ERROR_OTHER 6 int error = ERROR_NONE; - int i; int llen; ufunc_T *fp; #define FLEN_FIXED 40 @@ -7216,12 +6911,13 @@ call_func ( fname_buf[0] = K_SPECIAL; fname_buf[1] = KS_EXTRA; fname_buf[2] = (int)KE_SNR; - i = 3; - if (eval_fname_sid(name)) { /* "<SID>" or "s:" */ - if (current_SID <= 0) + int i = 3; + if (eval_fname_sid(name)) { // "<SID>" or "s:" + if (current_SID <= 0) { error = ERROR_SCRIPT; - else { - sprintf((char *)fname_buf + 3, "%" PRId64 "_", (int64_t)current_SID); + } else { + vim_snprintf((char *)fname_buf + 3, ARRAY_SIZE(fname_buf) - 3, + "%" PRId64 "_", (int64_t)current_SID); i = (int)STRLEN(fname_buf); } } @@ -7288,18 +6984,16 @@ call_func ( } } } else { - /* - * Find the function name in the table, call its implementation. - */ - i = find_internal_func(fname); - if (i >= 0) { - if (argcount < functions[i].f_min_argc) + // Find the function name in the table, call its implementation. + VimLFuncDef *const fdef = find_internal_func((char *)fname); + if (fdef != NULL) { + if (argcount < fdef->min_argc) { error = ERROR_TOOFEW; - else if (argcount > functions[i].f_max_argc) + } else if (argcount > fdef->max_argc) { error = ERROR_TOOMANY; - else { + } else { argvars[argcount].v_type = VAR_UNKNOWN; - functions[i].f_func(argvars, rettv); + fdef->func(argvars, rettv, fdef->data); error = ERROR_NONE; } } @@ -7410,13 +7104,10 @@ static inline int get_float_arg(typval_T *argvars, float_T *f) // Some versions of glibc on i386 have an optimization that makes it harder to // call math functions indirectly from inside an inlined function, causing // compile-time errors. Avoid `inline` in that case. #3072 -#ifndef ARCH_32 -inline -#endif -static void float_op_wrapper(typval_T *argvars, typval_T *rettv, - float_T (*function)(float_T)) +static void float_op_wrapper(typval_T *argvars, typval_T *rettv, FunPtr fptr) { float_T f; + float_T (*function)(float_T) = (float_T (*)(float_T))fptr; rettv->v_type = VAR_FLOAT; if (get_float_arg(argvars, &f) == OK) { @@ -7426,13 +7117,40 @@ static void float_op_wrapper(typval_T *argvars, typval_T *rettv, } } +static void api_wrapper(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + ApiDispatchWrapper fn = (ApiDispatchWrapper)fptr; + + Array args = ARRAY_DICT_INIT; + + for (typval_T *tv = argvars; tv->v_type != VAR_UNKNOWN; tv++) { + ADD(args, vim_to_object(tv)); + } + + Error err = ERROR_INIT; + Object result = fn(INVALID_CHANNEL, NO_RESPONSE, args, &err); + + if (err.set) { + nvim_err_writeln(cstr_as_string(err.msg)); + goto end; + } + + if (!object_to_vim(result, rettv, &err)) { + EMSG2(_("Error converting the call result: %s"), err.msg); + } + +end: + api_free_array(args); + api_free_object(result); +} + /* * "abs(expr)" function */ -static void f_abs(typval_T *argvars, typval_T *rettv) +static void f_abs(typval_T *argvars, typval_T *rettv, FunPtr fptr) { if (argvars[0].v_type == VAR_FLOAT) { - float_op_wrapper(argvars, rettv, &fabs); + float_op_wrapper(argvars, rettv, (FunPtr)&fabs); } else { varnumber_T n; int error = FALSE; @@ -7448,17 +7166,9 @@ static void f_abs(typval_T *argvars, typval_T *rettv) } /* - * "acos()" function - */ -static void f_acos(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &acos); -} - -/* * "add(list, item)" function */ -static void f_add(typval_T *argvars, typval_T *rettv) +static void f_add(typval_T *argvars, typval_T *rettv, FunPtr fptr) { list_T *l; @@ -7477,7 +7187,7 @@ static void f_add(typval_T *argvars, typval_T *rettv) /* * "and(expr, expr)" function */ -static void f_and(typval_T *argvars, typval_T *rettv) +static void f_and(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL) & get_tv_number_chk(&argvars[1], NULL); @@ -7485,7 +7195,7 @@ static void f_and(typval_T *argvars, typval_T *rettv) /// "api_info()" function -static void f_api_info(typval_T *argvars, typval_T *rettv) +static void f_api_info(typval_T *argvars, typval_T *rettv, FunPtr fptr) { Dictionary metadata = api_metadata(); (void)object_to_vim(DICTIONARY_OBJ(metadata), rettv, NULL); @@ -7495,7 +7205,7 @@ static void f_api_info(typval_T *argvars, typval_T *rettv) /* * "append(lnum, string/list)" function */ -static void f_append(typval_T *argvars, typval_T *rettv) +static void f_append(typval_T *argvars, typval_T *rettv, FunPtr fptr) { long lnum; char_u *line; @@ -7550,7 +7260,7 @@ static void f_append(typval_T *argvars, typval_T *rettv) /* * "argc()" function */ -static void f_argc(typval_T *argvars, typval_T *rettv) +static void f_argc(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = ARGCOUNT; } @@ -7558,13 +7268,13 @@ static void f_argc(typval_T *argvars, typval_T *rettv) /* * "argidx()" function */ -static void f_argidx(typval_T *argvars, typval_T *rettv) +static void f_argidx(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = curwin->w_arg_idx; } /// "arglistid" function -static void f_arglistid(typval_T *argvars, typval_T *rettv) +static void f_arglistid(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = -1; win_T *wp = find_tabwin(&argvars[0], &argvars[1]); @@ -7576,7 +7286,7 @@ static void f_arglistid(typval_T *argvars, typval_T *rettv) /* * "argv(nr)" function */ -static void f_argv(typval_T *argvars, typval_T *rettv) +static void f_argv(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int idx; @@ -7683,19 +7393,19 @@ static void assert_equal_common(typval_T *argvars, assert_type_T atype) } // "assert_equal(expected, actual[, msg])" function -static void f_assert_equal(typval_T *argvars, typval_T *rettv) +static void f_assert_equal(typval_T *argvars, typval_T *rettv, FunPtr fptr) { assert_equal_common(argvars, ASSERT_EQUAL); } // "assert_notequal(expected, actual[, msg])" function -static void f_assert_notequal(typval_T *argvars, typval_T *rettv) +static void f_assert_notequal(typval_T *argvars, typval_T *rettv, FunPtr fptr) { assert_equal_common(argvars, ASSERT_NOTEQUAL); } /// "assert_exception(string[, msg])" function -static void f_assert_exception(typval_T *argvars, typval_T *rettv) +static void f_assert_exception(typval_T *argvars, typval_T *rettv, FunPtr fptr) { garray_T ga; @@ -7716,7 +7426,7 @@ static void f_assert_exception(typval_T *argvars, typval_T *rettv) } /// "assert_fails(cmd [, error])" function -static void f_assert_fails(typval_T *argvars, typval_T *rettv) +static void f_assert_fails(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *cmd = get_tv_string_chk(&argvars[0]); garray_T ga; @@ -7776,7 +7486,7 @@ static void assert_bool(typval_T *argvars, bool is_true) } // "assert_false(actual[, msg])" function -static void f_assert_false(typval_T *argvars, typval_T *rettv) +static void f_assert_false(typval_T *argvars, typval_T *rettv, FunPtr fptr) { assert_bool(argvars, false); } @@ -7800,43 +7510,27 @@ static void assert_match_common(typval_T *argvars, assert_type_T atype) } /// "assert_match(pattern, actual[, msg])" function -static void f_assert_match(typval_T *argvars, typval_T *rettv) +static void f_assert_match(typval_T *argvars, typval_T *rettv, FunPtr fptr) { assert_match_common(argvars, ASSERT_MATCH); } /// "assert_notmatch(pattern, actual[, msg])" function -static void f_assert_notmatch(typval_T *argvars, typval_T *rettv) +static void f_assert_notmatch(typval_T *argvars, typval_T *rettv, FunPtr fptr) { assert_match_common(argvars, ASSERT_NOTMATCH); } // "assert_true(actual[, msg])" function -static void f_assert_true(typval_T *argvars, typval_T *rettv) +static void f_assert_true(typval_T *argvars, typval_T *rettv, FunPtr fptr) { assert_bool(argvars, true); } /* - * "asin()" function - */ -static void f_asin(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &asin); -} - -/* - * "atan()" function - */ -static void f_atan(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &atan); -} - -/* * "atan2()" function */ -static void f_atan2(typval_T *argvars, typval_T *rettv) +static void f_atan2(typval_T *argvars, typval_T *rettv, FunPtr fptr) { float_T fx, fy; @@ -7851,7 +7545,7 @@ static void f_atan2(typval_T *argvars, typval_T *rettv) /* * "browse(save, title, initdir, default)" function */ -static void f_browse(typval_T *argvars, typval_T *rettv) +static void f_browse(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_string = NULL; rettv->v_type = VAR_STRING; @@ -7860,9 +7554,9 @@ static void f_browse(typval_T *argvars, typval_T *rettv) /* * "browsedir(title, initdir)" function */ -static void f_browsedir(typval_T *argvars, typval_T *rettv) +static void f_browsedir(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - f_browse(argvars, rettv); + f_browse(argvars, rettv, NULL); } @@ -7898,7 +7592,7 @@ static buf_T *find_buffer(typval_T *avar) /* * "bufexists(expr)" function */ -static void f_bufexists(typval_T *argvars, typval_T *rettv) +static void f_bufexists(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = (find_buffer(&argvars[0]) != NULL); } @@ -7906,7 +7600,7 @@ static void f_bufexists(typval_T *argvars, typval_T *rettv) /* * "buflisted(expr)" function */ -static void f_buflisted(typval_T *argvars, typval_T *rettv) +static void f_buflisted(typval_T *argvars, typval_T *rettv, FunPtr fptr) { buf_T *buf; @@ -7917,7 +7611,7 @@ static void f_buflisted(typval_T *argvars, typval_T *rettv) /* * "bufloaded(expr)" function */ -static void f_bufloaded(typval_T *argvars, typval_T *rettv) +static void f_bufloaded(typval_T *argvars, typval_T *rettv, FunPtr fptr) { buf_T *buf; @@ -7967,7 +7661,7 @@ static buf_T *get_buf_tv(typval_T *tv, int curtab_only) /* * "bufname(expr)" function */ -static void f_bufname(typval_T *argvars, typval_T *rettv) +static void f_bufname(typval_T *argvars, typval_T *rettv, FunPtr fptr) { buf_T *buf; @@ -7985,7 +7679,7 @@ static void f_bufname(typval_T *argvars, typval_T *rettv) /* * "bufnr(expr)" function */ -static void f_bufnr(typval_T *argvars, typval_T *rettv) +static void f_bufnr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { buf_T *buf; int error = FALSE; @@ -8015,7 +7709,7 @@ static void f_bufnr(typval_T *argvars, typval_T *rettv) /* * "bufwinnr(nr)" function */ -static void f_bufwinnr(typval_T *argvars, typval_T *rettv) +static void f_bufwinnr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ ++emsg_off; @@ -8037,7 +7731,7 @@ static void f_bufwinnr(typval_T *argvars, typval_T *rettv) /* * "byte2line(byte)" function */ -static void f_byte2line(typval_T *argvars, typval_T *rettv) +static void f_byte2line(typval_T *argvars, typval_T *rettv, FunPtr fptr) { long boff = 0; @@ -8076,7 +7770,7 @@ static void byteidx(typval_T *argvars, typval_T *rettv, int comp) /* * "byteidx()" function */ -static void f_byteidx(typval_T *argvars, typval_T *rettv) +static void f_byteidx(typval_T *argvars, typval_T *rettv, FunPtr fptr) { byteidx(argvars, rettv, FALSE); } @@ -8084,7 +7778,7 @@ static void f_byteidx(typval_T *argvars, typval_T *rettv) /* * "byteidxcomp()" function */ -static void f_byteidxcomp(typval_T *argvars, typval_T *rettv) +static void f_byteidxcomp(typval_T *argvars, typval_T *rettv, FunPtr fptr) { byteidx(argvars, rettv, TRUE); } @@ -8124,7 +7818,7 @@ int func_call(char_u *name, typval_T *args, dict_T *selfdict, typval_T *rettv) /* * "call(func, arglist)" function */ -static void f_call(typval_T *argvars, typval_T *rettv) +static void f_call(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *func; dict_T *selfdict = NULL; @@ -8155,17 +7849,9 @@ static void f_call(typval_T *argvars, typval_T *rettv) } /* - * "ceil({float})" function - */ -static void f_ceil(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &ceil); -} - -/* * "changenr()" function */ -static void f_changenr(typval_T *argvars, typval_T *rettv) +static void f_changenr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = curbuf->b_u_seq_cur; } @@ -8173,7 +7859,7 @@ static void f_changenr(typval_T *argvars, typval_T *rettv) /* * "char2nr(string)" function */ -static void f_char2nr(typval_T *argvars, typval_T *rettv) +static void f_char2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { if (has_mbyte) { int utf8 = 0; @@ -8192,7 +7878,7 @@ static void f_char2nr(typval_T *argvars, typval_T *rettv) /* * "cindent(lnum)" function */ -static void f_cindent(typval_T *argvars, typval_T *rettv) +static void f_cindent(typval_T *argvars, typval_T *rettv, FunPtr fptr) { pos_T pos; linenr_T lnum; @@ -8210,7 +7896,7 @@ static void f_cindent(typval_T *argvars, typval_T *rettv) /* * "clearmatches()" function */ -static void f_clearmatches(typval_T *argvars, typval_T *rettv) +static void f_clearmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr) { clear_matches(curwin); } @@ -8218,7 +7904,7 @@ static void f_clearmatches(typval_T *argvars, typval_T *rettv) /* * "col(string)" function */ -static void f_col(typval_T *argvars, typval_T *rettv) +static void f_col(typval_T *argvars, typval_T *rettv, FunPtr fptr) { colnr_T col = 0; pos_T *fp; @@ -8255,7 +7941,7 @@ static void f_col(typval_T *argvars, typval_T *rettv) /* * "complete()" function */ -static void f_complete(typval_T *argvars, typval_T *rettv) +static void f_complete(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int startcol; @@ -8284,7 +7970,7 @@ static void f_complete(typval_T *argvars, typval_T *rettv) /* * "complete_add()" function */ -static void f_complete_add(typval_T *argvars, typval_T *rettv) +static void f_complete_add(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = ins_compl_add_tv(&argvars[0], 0); } @@ -8292,7 +7978,7 @@ static void f_complete_add(typval_T *argvars, typval_T *rettv) /* * "complete_check()" function */ -static void f_complete_check(typval_T *argvars, typval_T *rettv) +static void f_complete_check(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int saved = RedrawingDisabled; @@ -8305,7 +7991,7 @@ static void f_complete_check(typval_T *argvars, typval_T *rettv) /* * "confirm(message, buttons[, default [, type]])" function */ -static void f_confirm(typval_T *argvars, typval_T *rettv) +static void f_confirm(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *message; char_u *buttons = NULL; @@ -8353,31 +8039,15 @@ static void f_confirm(typval_T *argvars, typval_T *rettv) /* * "copy()" function */ -static void f_copy(typval_T *argvars, typval_T *rettv) +static void f_copy(typval_T *argvars, typval_T *rettv, FunPtr fptr) { var_item_copy(NULL, &argvars[0], rettv, false, 0); } /* - * "cos()" function - */ -static void f_cos(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &cos); -} - -/* - * "cosh()" function - */ -static void f_cosh(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &cosh); -} - -/* * "count()" function */ -static void f_count(typval_T *argvars, typval_T *rettv) +static void f_count(typval_T *argvars, typval_T *rettv, FunPtr fptr) { long n = 0; int ic = FALSE; @@ -8442,7 +8112,7 @@ static void f_count(typval_T *argvars, typval_T *rettv) * * Checks the existence of a cscope connection. */ -static void f_cscope_connection(typval_T *argvars, typval_T *rettv) +static void f_cscope_connection(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int num = 0; char_u *dbpath = NULL; @@ -8466,7 +8136,7 @@ static void f_cscope_connection(typval_T *argvars, typval_T *rettv) /// Moves the cursor to the specified line and column. /// /// @returns 0 when the position could be set, -1 otherwise. -static void f_cursor(typval_T *argvars, typval_T *rettv) +static void f_cursor(typval_T *argvars, typval_T *rettv, FunPtr fptr) { long line, col; long coladd = 0; @@ -8522,7 +8192,7 @@ static void f_cursor(typval_T *argvars, typval_T *rettv) /* * "deepcopy()" function */ -static void f_deepcopy(typval_T *argvars, typval_T *rettv) +static void f_deepcopy(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int noref = 0; @@ -8538,7 +8208,7 @@ static void f_deepcopy(typval_T *argvars, typval_T *rettv) } // "delete()" function -static void f_delete(typval_T *argvars, typval_T *rettv) +static void f_delete(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u nbuf[NUMBUFLEN]; char_u *name; @@ -8576,7 +8246,7 @@ static void f_delete(typval_T *argvars, typval_T *rettv) } // dictwatcheradd(dict, key, funcref) function -static void f_dictwatcheradd(typval_T *argvars, typval_T *rettv) +static void f_dictwatcheradd(typval_T *argvars, typval_T *rettv, FunPtr fptr) { if (check_restricted() || check_secure()) { return; @@ -8621,7 +8291,7 @@ static void f_dictwatcheradd(typval_T *argvars, typval_T *rettv) } // dictwatcherdel(dict, key, funcref) function -static void f_dictwatcherdel(typval_T *argvars, typval_T *rettv) +static void f_dictwatcherdel(typval_T *argvars, typval_T *rettv, FunPtr fptr) { if (check_restricted() || check_secure()) { return; @@ -8682,7 +8352,7 @@ static void f_dictwatcherdel(typval_T *argvars, typval_T *rettv) /* * "did_filetype()" function */ -static void f_did_filetype(typval_T *argvars, typval_T *rettv) +static void f_did_filetype(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = did_filetype; } @@ -8690,7 +8360,7 @@ static void f_did_filetype(typval_T *argvars, typval_T *rettv) /* * "diff_filler()" function */ -static void f_diff_filler(typval_T *argvars, typval_T *rettv) +static void f_diff_filler(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = diff_check_fill(curwin, get_tv_lnum(argvars)); } @@ -8698,7 +8368,7 @@ static void f_diff_filler(typval_T *argvars, typval_T *rettv) /* * "diff_hlID()" function */ -static void f_diff_hlID(typval_T *argvars, typval_T *rettv) +static void f_diff_hlID(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum = get_tv_lnum(argvars); static linenr_T prev_lnum = 0; @@ -8747,7 +8417,7 @@ static void f_diff_hlID(typval_T *argvars, typval_T *rettv) /* * "empty({expr})" function */ -static void f_empty(typval_T *argvars, typval_T *rettv) +static void f_empty(typval_T *argvars, typval_T *rettv, FunPtr fptr) { bool n = true; @@ -8785,7 +8455,7 @@ static void f_empty(typval_T *argvars, typval_T *rettv) /* * "escape({string}, {chars})" function */ -static void f_escape(typval_T *argvars, typval_T *rettv) +static void f_escape(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u buf[NUMBUFLEN]; @@ -8797,7 +8467,7 @@ static void f_escape(typval_T *argvars, typval_T *rettv) /* * "eval()" function */ -static void f_eval(typval_T *argvars, typval_T *rettv) +static void f_eval(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *s; @@ -8821,7 +8491,7 @@ static void f_eval(typval_T *argvars, typval_T *rettv) /* * "eventhandler()" function */ -static void f_eventhandler(typval_T *argvars, typval_T *rettv) +static void f_eventhandler(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = vgetc_busy; } @@ -8829,7 +8499,7 @@ static void f_eventhandler(typval_T *argvars, typval_T *rettv) /* * "executable()" function */ -static void f_executable(typval_T *argvars, typval_T *rettv) +static void f_executable(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *name = get_tv_string(&argvars[0]); @@ -8839,7 +8509,7 @@ static void f_executable(typval_T *argvars, typval_T *rettv) } // "execute(command)" function -static void f_execute(typval_T *argvars, typval_T *rettv) +static void f_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int save_msg_silent = msg_silent; garray_T *save_capture_ga = capture_ga; @@ -8871,7 +8541,7 @@ static void f_execute(typval_T *argvars, typval_T *rettv) } /// "exepath()" function -static void f_exepath(typval_T *argvars, typval_T *rettv) +static void f_exepath(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *arg = get_tv_string(&argvars[0]); char_u *path = NULL; @@ -8885,7 +8555,7 @@ static void f_exepath(typval_T *argvars, typval_T *rettv) /* * "exists()" function */ -static void f_exists(typval_T *argvars, typval_T *rettv) +static void f_exists(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *p; char_u *name; @@ -8946,17 +8616,9 @@ static void f_exists(typval_T *argvars, typval_T *rettv) } /* - * "exp()" function - */ -static void f_exp(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &exp); -} - -/* * "expand()" function */ -static void f_expand(typval_T *argvars, typval_T *rettv) +static void f_expand(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *s; size_t len; @@ -9085,7 +8747,7 @@ void dict_extend(dict_T *d1, dict_T *d2, char_u *action) * "extend(list, list [, idx])" function * "extend(dict, dict [, action])" function */ -static void f_extend(typval_T *argvars, typval_T *rettv) +static void f_extend(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *arg_errmsg = (char_u *)N_("extend() argument"); @@ -9157,7 +8819,7 @@ static void f_extend(typval_T *argvars, typval_T *rettv) /* * "feedkeys()" function */ -static void f_feedkeys(typval_T *argvars, typval_T *rettv) +static void f_feedkeys(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *keys, *flags = NULL; char_u nbuf[NUMBUFLEN]; @@ -9169,18 +8831,17 @@ static void f_feedkeys(typval_T *argvars, typval_T *rettv) return; keys = get_tv_string(&argvars[0]); - if (*keys != NUL) { - if (argvars[1].v_type != VAR_UNKNOWN) { - flags = get_tv_string_buf(&argvars[1], nbuf); - } - vim_feedkeys(cstr_as_string((char *)keys), - cstr_as_string((char *)flags), true); + if (argvars[1].v_type != VAR_UNKNOWN) { + flags = get_tv_string_buf(&argvars[1], nbuf); } + + nvim_feedkeys(cstr_as_string((char *)keys), + cstr_as_string((char *)flags), true); } /// "filereadable()" function -static void f_filereadable(typval_T *argvars, typval_T *rettv) +static void f_filereadable(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *p = get_tv_string(&argvars[0]); rettv->vval.v_number = @@ -9191,7 +8852,7 @@ static void f_filereadable(typval_T *argvars, typval_T *rettv) * Return 0 for not writable, 1 for writable file, 2 for a dir which we have * rights to write into. */ -static void f_filewritable(typval_T *argvars, typval_T *rettv) +static void f_filewritable(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char *filename = (char *)get_tv_string(&argvars[0]); rettv->vval.v_number = os_file_is_writable(filename); @@ -9406,7 +9067,7 @@ theend: /* * "filter()" function */ -static void f_filter(typval_T *argvars, typval_T *rettv) +static void f_filter(typval_T *argvars, typval_T *rettv, FunPtr fptr) { filter_map(argvars, rettv, FALSE); } @@ -9414,7 +9075,7 @@ static void f_filter(typval_T *argvars, typval_T *rettv) /* * "finddir({fname}[, {path}[, {count}]])" function */ -static void f_finddir(typval_T *argvars, typval_T *rettv) +static void f_finddir(typval_T *argvars, typval_T *rettv, FunPtr fptr) { findfilendir(argvars, rettv, FINDFILE_DIR); } @@ -9422,7 +9083,7 @@ static void f_finddir(typval_T *argvars, typval_T *rettv) /* * "findfile({fname}[, {path}[, {count}]])" function */ -static void f_findfile(typval_T *argvars, typval_T *rettv) +static void f_findfile(typval_T *argvars, typval_T *rettv, FunPtr fptr) { findfilendir(argvars, rettv, FINDFILE_FILE); } @@ -9430,7 +9091,7 @@ static void f_findfile(typval_T *argvars, typval_T *rettv) /* * "float2nr({float})" function */ -static void f_float2nr(typval_T *argvars, typval_T *rettv) +static void f_float2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { float_T f; @@ -9445,17 +9106,9 @@ static void f_float2nr(typval_T *argvars, typval_T *rettv) } /* - * "floor({float})" function - */ -static void f_floor(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &floor); -} - -/* * "fmod()" function */ -static void f_fmod(typval_T *argvars, typval_T *rettv) +static void f_fmod(typval_T *argvars, typval_T *rettv, FunPtr fptr) { float_T fx, fy; @@ -9470,7 +9123,7 @@ static void f_fmod(typval_T *argvars, typval_T *rettv) /* * "fnameescape({string})" function */ -static void f_fnameescape(typval_T *argvars, typval_T *rettv) +static void f_fnameescape(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_string = vim_strsave_fnameescape( get_tv_string(&argvars[0]), FALSE); @@ -9480,7 +9133,7 @@ static void f_fnameescape(typval_T *argvars, typval_T *rettv) /* * "fnamemodify({fname}, {mods})" function */ -static void f_fnamemodify(typval_T *argvars, typval_T *rettv) +static void f_fnamemodify(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *fname; char_u *mods; @@ -9531,7 +9184,7 @@ static void foldclosed_both(typval_T *argvars, typval_T *rettv, int end) /* * "foldclosed()" function */ -static void f_foldclosed(typval_T *argvars, typval_T *rettv) +static void f_foldclosed(typval_T *argvars, typval_T *rettv, FunPtr fptr) { foldclosed_both(argvars, rettv, FALSE); } @@ -9539,7 +9192,7 @@ static void f_foldclosed(typval_T *argvars, typval_T *rettv) /* * "foldclosedend()" function */ -static void f_foldclosedend(typval_T *argvars, typval_T *rettv) +static void f_foldclosedend(typval_T *argvars, typval_T *rettv, FunPtr fptr) { foldclosed_both(argvars, rettv, TRUE); } @@ -9547,7 +9200,7 @@ static void f_foldclosedend(typval_T *argvars, typval_T *rettv) /* * "foldlevel()" function */ -static void f_foldlevel(typval_T *argvars, typval_T *rettv) +static void f_foldlevel(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum; @@ -9559,7 +9212,7 @@ static void f_foldlevel(typval_T *argvars, typval_T *rettv) /* * "foldtext()" function */ -static void f_foldtext(typval_T *argvars, typval_T *rettv) +static void f_foldtext(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum; char_u *s; @@ -9612,7 +9265,7 @@ static void f_foldtext(typval_T *argvars, typval_T *rettv) /* * "foldtextresult(lnum)" function */ -static void f_foldtextresult(typval_T *argvars, typval_T *rettv) +static void f_foldtextresult(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum; char_u *text; @@ -9639,14 +9292,14 @@ static void f_foldtextresult(typval_T *argvars, typval_T *rettv) /* * "foreground()" function */ -static void f_foreground(typval_T *argvars, typval_T *rettv) +static void f_foreground(typval_T *argvars, typval_T *rettv, FunPtr fptr) { } /* * "function()" function */ -static void f_function(typval_T *argvars, typval_T *rettv) +static void f_function(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *s; @@ -9678,7 +9331,7 @@ static void f_function(typval_T *argvars, typval_T *rettv) /* * "garbagecollect()" function */ -static void f_garbagecollect(typval_T *argvars, typval_T *rettv) +static void f_garbagecollect(typval_T *argvars, typval_T *rettv, FunPtr fptr) { /* This is postponed until we are back at the toplevel, because we may be * using Lists and Dicts internally. E.g.: ":echo [garbagecollect()]". */ @@ -9691,7 +9344,7 @@ static void f_garbagecollect(typval_T *argvars, typval_T *rettv) /* * "get()" function */ -static void f_get(typval_T *argvars, typval_T *rettv) +static void f_get(typval_T *argvars, typval_T *rettv, FunPtr fptr) { listitem_T *li; list_T *l; @@ -9767,7 +9420,7 @@ static void get_buffer_lines(buf_T *buf, linenr_T start, linenr_T end, int retli /* * "getbufline()" function */ -static void f_getbufline(typval_T *argvars, typval_T *rettv) +static void f_getbufline(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum; linenr_T end; @@ -9790,7 +9443,7 @@ static void f_getbufline(typval_T *argvars, typval_T *rettv) /* * "getbufvar()" function */ -static void f_getbufvar(typval_T *argvars, typval_T *rettv) +static void f_getbufvar(typval_T *argvars, typval_T *rettv, FunPtr fptr) { buf_T *buf; buf_T *save_curbuf; @@ -9843,7 +9496,7 @@ static void f_getbufvar(typval_T *argvars, typval_T *rettv) /* * "getchar()" function */ -static void f_getchar(typval_T *argvars, typval_T *rettv) +static void f_getchar(typval_T *argvars, typval_T *rettv, FunPtr fptr) { varnumber_T n; int error = FALSE; @@ -9927,7 +9580,7 @@ static void f_getchar(typval_T *argvars, typval_T *rettv) /* * "getcharmod()" function */ -static void f_getcharmod(typval_T *argvars, typval_T *rettv) +static void f_getcharmod(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = mod_mask; } @@ -9935,7 +9588,7 @@ static void f_getcharmod(typval_T *argvars, typval_T *rettv) /* * "getcharsearch()" function */ -static void f_getcharsearch(typval_T *argvars, typval_T *rettv) +static void f_getcharsearch(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv_dict_alloc(rettv); @@ -9949,7 +9602,7 @@ static void f_getcharsearch(typval_T *argvars, typval_T *rettv) /* * "getcmdline()" function */ -static void f_getcmdline(typval_T *argvars, typval_T *rettv) +static void f_getcmdline(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = get_cmdline_str(); @@ -9958,7 +9611,7 @@ static void f_getcmdline(typval_T *argvars, typval_T *rettv) /* * "getcmdpos()" function */ -static void f_getcmdpos(typval_T *argvars, typval_T *rettv) +static void f_getcmdpos(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = get_cmdline_pos() + 1; } @@ -9966,7 +9619,7 @@ static void f_getcmdpos(typval_T *argvars, typval_T *rettv) /* * "getcmdtype()" function */ -static void f_getcmdtype(typval_T *argvars, typval_T *rettv) +static void f_getcmdtype(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = xmallocz(1); @@ -9976,7 +9629,7 @@ static void f_getcmdtype(typval_T *argvars, typval_T *rettv) /* * "getcmdwintype()" function */ -static void f_getcmdwintype(typval_T *argvars, typval_T *rettv) +static void f_getcmdwintype(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; @@ -9985,12 +9638,12 @@ static void f_getcmdwintype(typval_T *argvars, typval_T *rettv) } // "getcompletion()" function -static void f_getcompletion(typval_T *argvars, typval_T *rettv) +static void f_getcompletion(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *pat; expand_T xpc; - int options = WILD_KEEP_ALL | WILD_SILENT | WILD_USE_NL - | WILD_LIST_NOTFOUND | WILD_NO_BEEP; + int options = WILD_SILENT | WILD_USE_NL | WILD_ADD_SLASH + | WILD_NO_BEEP; if (p_wic) { options |= WILD_ICASE; @@ -10015,12 +9668,11 @@ static void f_getcompletion(typval_T *argvars, typval_T *rettv) } pat = addstar(xpc.xp_pattern, xpc.xp_pattern_len, xpc.xp_context); - if ((rettv_list_alloc(rettv) != FAIL) && (pat != NULL)) { - int i; - + rettv_list_alloc(rettv); + if (pat != NULL) { ExpandOne(&xpc, pat, NULL, options, WILD_ALL_KEEP); - for (i = 0; i < xpc.xp_numfiles; i++) { + for (int i = 0; i < xpc.xp_numfiles; i++) { list_append_string(rettv->vval.v_list, xpc.xp_files[i], -1); } } @@ -10037,7 +9689,7 @@ static void f_getcompletion(typval_T *argvars, typval_T *rettv) /// @pre An argument may not be -1 if preceding arguments are not all -1. /// /// @post The return value will be a string. -static void f_getcwd(typval_T *argvars, typval_T *rettv) +static void f_getcwd(typval_T *argvars, typval_T *rettv, FunPtr fptr) { // Possible scope of working directory to return. CdScope scope = kCdScopeInvalid; @@ -10122,26 +9774,20 @@ static void f_getcwd(typval_T *argvars, typval_T *rettv) if (from) { break; } - case kCdScopeTab: // FALLTHROUGH + case kCdScopeTab: // FALLTHROUGH assert(tp); from = tp->localdir; if (from) { break; } - case kCdScopeGlobal: // FALLTHROUGH - // The `globaldir` variable is not always set. - if (globaldir) { + case kCdScopeGlobal: // FALLTHROUGH + if (globaldir) { // `globaldir` is not always set. from = globaldir; - } else { - // We have to copy the OS path directly into output string. - if (os_dirname(cwd, MAXPATHL) == FAIL) { - EMSG(_("E41: Could not display path.")); - goto end; - } + } else if (os_dirname(cwd, MAXPATHL) == FAIL) { // Get the OS CWD. + from = (char_u *)""; // Return empty string on failure. } break; - case kCdScopeInvalid: - // We should never get here + case kCdScopeInvalid: // We should never get here assert(false); } @@ -10153,14 +9799,14 @@ static void f_getcwd(typval_T *argvars, typval_T *rettv) #ifdef BACKSLASH_IN_FILENAME slash_adjust(rettv->vval.v_string); #endif -end: + xfree(cwd); } /* * "getfontname()" function */ -static void f_getfontname(typval_T *argvars, typval_T *rettv) +static void f_getfontname(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; @@ -10169,7 +9815,7 @@ static void f_getfontname(typval_T *argvars, typval_T *rettv) /* * "getfperm({fname})" function */ -static void f_getfperm(typval_T *argvars, typval_T *rettv) +static void f_getfperm(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *perm = NULL; char_u flags[] = "rwx"; @@ -10190,7 +9836,7 @@ static void f_getfperm(typval_T *argvars, typval_T *rettv) /* * "getfsize({fname})" function */ -static void f_getfsize(typval_T *argvars, typval_T *rettv) +static void f_getfsize(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char *fname = (char *)get_tv_string(&argvars[0]); @@ -10217,7 +9863,7 @@ static void f_getfsize(typval_T *argvars, typval_T *rettv) /* * "getftime({fname})" function */ -static void f_getftime(typval_T *argvars, typval_T *rettv) +static void f_getftime(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char *fname = (char *)get_tv_string(&argvars[0]); @@ -10232,7 +9878,7 @@ static void f_getftime(typval_T *argvars, typval_T *rettv) /* * "getftype({fname})" function */ -static void f_getftype(typval_T *argvars, typval_T *rettv) +static void f_getftype(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *fname; char_u *type = NULL; @@ -10308,7 +9954,7 @@ static void f_getftype(typval_T *argvars, typval_T *rettv) /* * "getline(lnum, [end])" function */ -static void f_getline(typval_T *argvars, typval_T *rettv) +static void f_getline(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum; linenr_T end; @@ -10329,7 +9975,7 @@ static void f_getline(typval_T *argvars, typval_T *rettv) /* * "getmatches()" function */ -static void f_getmatches(typval_T *argvars, typval_T *rettv) +static void f_getmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr) { matchitem_T *cur = curwin->w_match_head; int i; @@ -10378,7 +10024,7 @@ static void f_getmatches(typval_T *argvars, typval_T *rettv) /* * "getpid()" function */ -static void f_getpid(typval_T *argvars, typval_T *rettv) +static void f_getpid(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = os_get_pid(); } @@ -10414,7 +10060,7 @@ static void getpos_both(typval_T *argvars, typval_T *rettv, bool getcurpos) /* * "getcurpos(string)" function */ -static void f_getcurpos(typval_T *argvars, typval_T *rettv) +static void f_getcurpos(typval_T *argvars, typval_T *rettv, FunPtr fptr) { getpos_both(argvars, rettv, true); } @@ -10422,7 +10068,7 @@ static void f_getcurpos(typval_T *argvars, typval_T *rettv) /* * "getpos(string)" function */ -static void f_getpos(typval_T *argvars, typval_T *rettv) +static void f_getpos(typval_T *argvars, typval_T *rettv, FunPtr fptr) { getpos_both(argvars, rettv, false); } @@ -10430,7 +10076,7 @@ static void f_getpos(typval_T *argvars, typval_T *rettv) /* * "getqflist()" and "getloclist()" functions */ -static void f_getqflist(typval_T *argvars, typval_T *rettv) +static void f_getqflist(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv_list_alloc(rettv); win_T *wp = NULL; @@ -10444,7 +10090,7 @@ static void f_getqflist(typval_T *argvars, typval_T *rettv) } /// "getreg()" function -static void f_getreg(typval_T *argvars, typval_T *rettv) +static void f_getreg(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *strregname; int regname; @@ -10490,7 +10136,7 @@ static void f_getreg(typval_T *argvars, typval_T *rettv) /* * "getregtype()" function */ -static void f_getregtype(typval_T *argvars, typval_T *rettv) +static void f_getregtype(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *strregname; int regname; @@ -10522,7 +10168,7 @@ static void f_getregtype(typval_T *argvars, typval_T *rettv) /* * "gettabvar()" function */ -static void f_gettabvar(typval_T *argvars, typval_T *rettv) +static void f_gettabvar(typval_T *argvars, typval_T *rettv, FunPtr fptr) { win_T *oldcurwin; tabpage_T *tp, *oldtabpage; @@ -10561,7 +10207,7 @@ static void f_gettabvar(typval_T *argvars, typval_T *rettv) /* * "gettabwinvar()" function */ -static void f_gettabwinvar(typval_T *argvars, typval_T *rettv) +static void f_gettabwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr) { getwinvar(argvars, rettv, 1); } @@ -10569,7 +10215,7 @@ static void f_gettabwinvar(typval_T *argvars, typval_T *rettv) /* * "getwinposx()" function */ -static void f_getwinposx(typval_T *argvars, typval_T *rettv) +static void f_getwinposx(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = -1; } @@ -10577,7 +10223,7 @@ static void f_getwinposx(typval_T *argvars, typval_T *rettv) /* * "getwinposy()" function */ -static void f_getwinposy(typval_T *argvars, typval_T *rettv) +static void f_getwinposy(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = -1; } @@ -10641,7 +10287,7 @@ static win_T *find_tabwin(typval_T *wvp, typval_T *tvp) } /// "getwinvar()" function -static void f_getwinvar(typval_T *argvars, typval_T *rettv) +static void f_getwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr) { getwinvar(argvars, rettv, 0); } @@ -10712,7 +10358,7 @@ getwinvar ( /* * "glob()" function */ -static void f_glob(typval_T *argvars, typval_T *rettv) +static void f_glob(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int options = WILD_SILENT|WILD_USE_NL; expand_T xpc; @@ -10756,7 +10402,7 @@ static void f_glob(typval_T *argvars, typval_T *rettv) } /// "globpath()" function -static void f_globpath(typval_T *argvars, typval_T *rettv) +static void f_globpath(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int flags = 0; // Flags for globpath. int error = false; @@ -10807,7 +10453,7 @@ static void f_globpath(typval_T *argvars, typval_T *rettv) } // "glob2regpat()" function -static void f_glob2regpat(typval_T *argvars, typval_T *rettv) +static void f_glob2regpat(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *pat = get_tv_string_chk(&argvars[0]); // NULL on type error @@ -10820,7 +10466,7 @@ static void f_glob2regpat(typval_T *argvars, typval_T *rettv) /* * "has()" function */ -static void f_has(typval_T *argvars, typval_T *rettv) +static void f_has(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int i; char_u *name; @@ -10988,7 +10634,7 @@ static void f_has(typval_T *argvars, typval_T *rettv) /* * "has_key()" function */ -static void f_has_key(typval_T *argvars, typval_T *rettv) +static void f_has_key(typval_T *argvars, typval_T *rettv, FunPtr fptr) { if (argvars[0].v_type != VAR_DICT) { EMSG(_(e_dictreq)); @@ -11012,7 +10658,7 @@ static void f_has_key(typval_T *argvars, typval_T *rettv) /// @pre An argument may not be -1 if preceding arguments are not all -1. /// /// @post The return value will be either the number `1` or `0`. -static void f_haslocaldir(typval_T *argvars, typval_T *rettv) +static void f_haslocaldir(typval_T *argvars, typval_T *rettv, FunPtr fptr) { // Possible scope of working directory to return. CdScope scope = kCdScopeInvalid; @@ -11105,7 +10751,7 @@ static void f_haslocaldir(typval_T *argvars, typval_T *rettv) /* * "hasmapto()" function */ -static void f_hasmapto(typval_T *argvars, typval_T *rettv) +static void f_hasmapto(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *name; char_u *mode; @@ -11130,7 +10776,7 @@ static void f_hasmapto(typval_T *argvars, typval_T *rettv) /* * "histadd()" function */ -static void f_histadd(typval_T *argvars, typval_T *rettv) +static void f_histadd(typval_T *argvars, typval_T *rettv, FunPtr fptr) { HistoryType histype; char_u *str; @@ -11156,7 +10802,7 @@ static void f_histadd(typval_T *argvars, typval_T *rettv) /* * "histdel()" function */ -static void f_histdel(typval_T *argvars, typval_T *rettv) +static void f_histdel(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int n; char_u buf[NUMBUFLEN]; @@ -11183,7 +10829,7 @@ static void f_histdel(typval_T *argvars, typval_T *rettv) /* * "histget()" function */ -static void f_histget(typval_T *argvars, typval_T *rettv) +static void f_histget(typval_T *argvars, typval_T *rettv, FunPtr fptr) { HistoryType type; int idx; @@ -11208,7 +10854,7 @@ static void f_histget(typval_T *argvars, typval_T *rettv) /* * "histnr()" function */ -static void f_histnr(typval_T *argvars, typval_T *rettv) +static void f_histnr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int i; @@ -11227,7 +10873,7 @@ static void f_histnr(typval_T *argvars, typval_T *rettv) /* * "highlightID(name)" function */ -static void f_hlID(typval_T *argvars, typval_T *rettv) +static void f_hlID(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = syn_name2id(get_tv_string(&argvars[0])); } @@ -11235,7 +10881,7 @@ static void f_hlID(typval_T *argvars, typval_T *rettv) /* * "highlight_exists()" function */ -static void f_hlexists(typval_T *argvars, typval_T *rettv) +static void f_hlexists(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = highlight_exists(get_tv_string(&argvars[0])); } @@ -11243,7 +10889,7 @@ static void f_hlexists(typval_T *argvars, typval_T *rettv) /* * "hostname()" function */ -static void f_hostname(typval_T *argvars, typval_T *rettv) +static void f_hostname(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char hostname[256]; @@ -11255,7 +10901,7 @@ static void f_hostname(typval_T *argvars, typval_T *rettv) /* * iconv() function */ -static void f_iconv(typval_T *argvars, typval_T *rettv) +static void f_iconv(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u buf1[NUMBUFLEN]; char_u buf2[NUMBUFLEN]; @@ -11285,7 +10931,7 @@ static void f_iconv(typval_T *argvars, typval_T *rettv) /* * "indent()" function */ -static void f_indent(typval_T *argvars, typval_T *rettv) +static void f_indent(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum; @@ -11299,7 +10945,7 @@ static void f_indent(typval_T *argvars, typval_T *rettv) /* * "index()" function */ -static void f_index(typval_T *argvars, typval_T *rettv) +static void f_index(typval_T *argvars, typval_T *rettv, FunPtr fptr) { list_T *l; listitem_T *item; @@ -11430,7 +11076,7 @@ static void get_user_input(typval_T *argvars, typval_T *rettv, int inputdialog) * "input()" function * Also handles inputsecret() when inputsecret is set. */ -static void f_input(typval_T *argvars, typval_T *rettv) +static void f_input(typval_T *argvars, typval_T *rettv, FunPtr fptr) { get_user_input(argvars, rettv, FALSE); } @@ -11438,7 +11084,7 @@ static void f_input(typval_T *argvars, typval_T *rettv) /* * "inputdialog()" function */ -static void f_inputdialog(typval_T *argvars, typval_T *rettv) +static void f_inputdialog(typval_T *argvars, typval_T *rettv, FunPtr fptr) { get_user_input(argvars, rettv, TRUE); } @@ -11446,7 +11092,7 @@ static void f_inputdialog(typval_T *argvars, typval_T *rettv) /* * "inputlist()" function */ -static void f_inputlist(typval_T *argvars, typval_T *rettv) +static void f_inputlist(typval_T *argvars, typval_T *rettv, FunPtr fptr) { listitem_T *li; int selected; @@ -11482,7 +11128,7 @@ static garray_T ga_userinput = {0, 0, sizeof(tasave_T), 4, NULL}; /* * "inputrestore()" function */ -static void f_inputrestore(typval_T *argvars, typval_T *rettv) +static void f_inputrestore(typval_T *argvars, typval_T *rettv, FunPtr fptr) { if (!GA_EMPTY(&ga_userinput)) { --ga_userinput.ga_len; @@ -11498,7 +11144,7 @@ static void f_inputrestore(typval_T *argvars, typval_T *rettv) /* * "inputsave()" function */ -static void f_inputsave(typval_T *argvars, typval_T *rettv) +static void f_inputsave(typval_T *argvars, typval_T *rettv, FunPtr fptr) { // Add an entry to the stack of typeahead storage. tasave_T *p = GA_APPEND_VIA_PTR(tasave_T, &ga_userinput); @@ -11508,19 +11154,19 @@ static void f_inputsave(typval_T *argvars, typval_T *rettv) /* * "inputsecret()" function */ -static void f_inputsecret(typval_T *argvars, typval_T *rettv) +static void f_inputsecret(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - ++cmdline_star; - ++inputsecret_flag; - f_input(argvars, rettv); - --cmdline_star; - --inputsecret_flag; + cmdline_star++; + inputsecret_flag++; + f_input(argvars, rettv, NULL); + cmdline_star--; + inputsecret_flag--; } /* * "insert()" function */ -static void f_insert(typval_T *argvars, typval_T *rettv) +static void f_insert(typval_T *argvars, typval_T *rettv, FunPtr fptr) { long before = 0; listitem_T *item; @@ -11559,7 +11205,7 @@ static void f_insert(typval_T *argvars, typval_T *rettv) /* * "invert(expr)" function */ -static void f_invert(typval_T *argvars, typval_T *rettv) +static void f_invert(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = ~get_tv_number_chk(&argvars[0], NULL); } @@ -11567,7 +11213,7 @@ static void f_invert(typval_T *argvars, typval_T *rettv) /* * "isdirectory()" function */ -static void f_isdirectory(typval_T *argvars, typval_T *rettv) +static void f_isdirectory(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = os_isdir(get_tv_string(&argvars[0])); } @@ -11575,7 +11221,7 @@ static void f_isdirectory(typval_T *argvars, typval_T *rettv) /* * "islocked()" function */ -static void f_islocked(typval_T *argvars, typval_T *rettv) +static void f_islocked(typval_T *argvars, typval_T *rettv, FunPtr fptr) { lval_T lv; char_u *end; @@ -11687,13 +11333,13 @@ static void dict_list(typval_T *argvars, typval_T *rettv, int what) /* * "items(dict)" function */ -static void f_items(typval_T *argvars, typval_T *rettv) +static void f_items(typval_T *argvars, typval_T *rettv, FunPtr fptr) { dict_list(argvars, rettv, 2); } // "jobclose(id[, stream])" function -static void f_jobclose(typval_T *argvars, typval_T *rettv) +static void f_jobclose(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; @@ -11719,21 +11365,40 @@ static void f_jobclose(typval_T *argvars, typval_T *rettv) if (argvars[1].v_type == VAR_STRING) { char *stream = (char *)argvars[1].vval.v_string; if (!strcmp(stream, "stdin")) { - process_close_in(proc); + if (data->rpc) { + EMSG(_("Invalid stream on rpc job, use jobclose(id, 'rpc')")); + } else { + process_close_in(proc); + } } else if (!strcmp(stream, "stdout")) { - process_close_out(proc); + if (data->rpc) { + EMSG(_("Invalid stream on rpc job, use jobclose(id, 'rpc')")); + } else { + process_close_out(proc); + } } else if (!strcmp(stream, "stderr")) { process_close_err(proc); + } else if (!strcmp(stream, "rpc")) { + if (data->rpc) { + channel_close(data->id); + } else { + EMSG(_("Invalid job stream: Not an rpc job")); + } } else { EMSG2(_("Invalid job stream \"%s\""), stream); } } else { - process_close_streams(proc); + if (data->rpc) { + channel_close(data->id); + process_close_err(proc); + } else { + process_close_streams(proc); + } } } // "jobpid(id)" function -static void f_jobpid(typval_T *argvars, typval_T *rettv) +static void f_jobpid(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; @@ -11758,7 +11423,7 @@ static void f_jobpid(typval_T *argvars, typval_T *rettv) } // "jobsend()" function -static void f_jobsend(typval_T *argvars, typval_T *rettv) +static void f_jobsend(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; @@ -11785,6 +11450,11 @@ static void f_jobsend(typval_T *argvars, typval_T *rettv) return; } + if (data->rpc) { + EMSG(_("Can't send raw data to rpc channel")); + return; + } + ssize_t input_len; char *input = (char *) save_tv_as_string(&argvars[1], &input_len, false); if (!input) { @@ -11798,7 +11468,7 @@ static void f_jobsend(typval_T *argvars, typval_T *rettv) } // "jobresize(job, width, height)" function -static void f_jobresize(typval_T *argvars, typval_T *rettv) +static void f_jobresize(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; @@ -11885,7 +11555,7 @@ static char **tv_to_argv(typval_T *cmd_tv, char **cmd) } // "jobstart()" function -static void f_jobstart(typval_T *argvars, typval_T *rettv) +static void f_jobstart(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; @@ -11906,13 +11576,24 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv) return; } + dict_T *job_opts = NULL; + bool detach = false, rpc = false, pty = false; ufunc_T *on_stdout = NULL, *on_stderr = NULL, *on_exit = NULL; char *cwd = NULL; if (argvars[1].v_type == VAR_DICT) { job_opts = argvars[1].vval.v_dict; - char *new_cwd = (char *)get_dict_string(job_opts, (char_u *)"cwd", false); + detach = get_dict_number(job_opts, "detach") != 0; + rpc = get_dict_number(job_opts, "rpc") != 0; + pty = get_dict_number(job_opts, "pty") != 0; + if (pty && rpc) { + EMSG2(_(e_invarg2), "job cannot have both 'pty' and 'rpc' options set"); + shell_free_argv(argv); + return; + } + + char *new_cwd = (char *)get_dict_string(job_opts, "cwd", false); if (new_cwd && strlen(new_cwd) > 0) { cwd = new_cwd; // The new cwd must be a directory. @@ -11929,28 +11610,26 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv) } } - bool pty = job_opts && get_dict_number(job_opts, (uint8_t *)"pty") != 0; - bool detach = job_opts && get_dict_number(job_opts, (uint8_t *)"detach") != 0; TerminalJobData *data = common_job_init(argv, on_stdout, on_stderr, on_exit, - job_opts, pty, detach, cwd); + job_opts, pty, rpc, detach, cwd); Process *proc = (Process *)&data->proc; if (pty) { - uint16_t width = get_dict_number(job_opts, (uint8_t *)"width"); + uint16_t width = get_dict_number(job_opts, "width"); if (width > 0) { data->proc.pty.width = width; } - uint16_t height = get_dict_number(job_opts, (uint8_t *)"height"); + uint16_t height = get_dict_number(job_opts, "height"); if (height > 0) { data->proc.pty.height = height; } - char *term = (char *)get_dict_string(job_opts, (uint8_t *)"TERM", true); + char *term = (char *)get_dict_string(job_opts, "TERM", true); if (term) { data->proc.pty.term_name = term; } } - if (!on_stdout) { + if (!rpc && !on_stdout) { proc->out = NULL; } if (!on_stderr) { @@ -11960,7 +11639,7 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv) } // "jobstop()" function -static void f_jobstop(typval_T *argvars, typval_T *rettv) +static void f_jobstop(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; @@ -11988,7 +11667,7 @@ static void f_jobstop(typval_T *argvars, typval_T *rettv) } // "jobwait(ids[, timeout])" function -static void f_jobwait(typval_T *argvars, typval_T *rettv) +static void f_jobwait(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; @@ -12098,7 +11777,7 @@ static void f_jobwait(typval_T *argvars, typval_T *rettv) /* * "join()" function */ -static void f_join(typval_T *argvars, typval_T *rettv) +static void f_join(typval_T *argvars, typval_T *rettv, FunPtr fptr) { garray_T ga; char_u *sep; @@ -12126,7 +11805,7 @@ static void f_join(typval_T *argvars, typval_T *rettv) } /// json_decode() function -static void f_json_decode(typval_T *argvars, typval_T *rettv) +static void f_json_decode(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char numbuf[NUMBUFLEN]; char *s = NULL; @@ -12160,7 +11839,7 @@ static void f_json_decode(typval_T *argvars, typval_T *rettv) } /// json_encode() function -static void f_json_encode(typval_T *argvars, typval_T *rettv) +static void f_json_encode(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = (char_u *) encode_tv2json(&argvars[0], NULL); @@ -12169,7 +11848,7 @@ static void f_json_encode(typval_T *argvars, typval_T *rettv) /* * "keys()" function */ -static void f_keys(typval_T *argvars, typval_T *rettv) +static void f_keys(typval_T *argvars, typval_T *rettv, FunPtr fptr) { dict_list(argvars, rettv, 0); } @@ -12177,7 +11856,7 @@ static void f_keys(typval_T *argvars, typval_T *rettv) /* * "last_buffer_nr()" function. */ -static void f_last_buffer_nr(typval_T *argvars, typval_T *rettv) +static void f_last_buffer_nr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int n = 0; @@ -12193,7 +11872,7 @@ static void f_last_buffer_nr(typval_T *argvars, typval_T *rettv) /* * "len()" function */ -static void f_len(typval_T *argvars, typval_T *rettv) +static void f_len(typval_T *argvars, typval_T *rettv, FunPtr fptr) { switch (argvars[0].v_type) { case VAR_STRING: @@ -12264,7 +11943,7 @@ static void libcall_common(typval_T *argvars, typval_T *rettv, int out_type) /* * "libcall()" function */ -static void f_libcall(typval_T *argvars, typval_T *rettv) +static void f_libcall(typval_T *argvars, typval_T *rettv, FunPtr fptr) { libcall_common(argvars, rettv, VAR_STRING); } @@ -12272,7 +11951,7 @@ static void f_libcall(typval_T *argvars, typval_T *rettv) /* * "libcallnr()" function */ -static void f_libcallnr(typval_T *argvars, typval_T *rettv) +static void f_libcallnr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { libcall_common(argvars, rettv, VAR_NUMBER); } @@ -12280,7 +11959,7 @@ static void f_libcallnr(typval_T *argvars, typval_T *rettv) /* * "line(string)" function */ -static void f_line(typval_T *argvars, typval_T *rettv) +static void f_line(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum = 0; pos_T *fp; @@ -12295,7 +11974,7 @@ static void f_line(typval_T *argvars, typval_T *rettv) /* * "line2byte(lnum)" function */ -static void f_line2byte(typval_T *argvars, typval_T *rettv) +static void f_line2byte(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum; @@ -12311,7 +11990,7 @@ static void f_line2byte(typval_T *argvars, typval_T *rettv) /* * "lispindent(lnum)" function */ -static void f_lispindent(typval_T *argvars, typval_T *rettv) +static void f_lispindent(typval_T *argvars, typval_T *rettv, FunPtr fptr) { pos_T pos; linenr_T lnum; @@ -12329,7 +12008,7 @@ static void f_lispindent(typval_T *argvars, typval_T *rettv) /* * "localtime()" function */ -static void f_localtime(typval_T *argvars, typval_T *rettv) +static void f_localtime(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = (varnumber_T)time(NULL); } @@ -12405,26 +12084,9 @@ static void get_maparg(typval_T *argvars, typval_T *rettv, int exact) } /* - * "log()" function - */ -static void f_log(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &log); -} - -/* - * "log10()" function - */ -static void f_log10(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &log10); -} - - -/* * "map()" function */ -static void f_map(typval_T *argvars, typval_T *rettv) +static void f_map(typval_T *argvars, typval_T *rettv, FunPtr fptr) { filter_map(argvars, rettv, TRUE); } @@ -12432,7 +12094,7 @@ static void f_map(typval_T *argvars, typval_T *rettv) /* * "maparg()" function */ -static void f_maparg(typval_T *argvars, typval_T *rettv) +static void f_maparg(typval_T *argvars, typval_T *rettv, FunPtr fptr) { get_maparg(argvars, rettv, TRUE); } @@ -12440,7 +12102,7 @@ static void f_maparg(typval_T *argvars, typval_T *rettv) /* * "mapcheck()" function */ -static void f_mapcheck(typval_T *argvars, typval_T *rettv) +static void f_mapcheck(typval_T *argvars, typval_T *rettv, FunPtr fptr) { get_maparg(argvars, rettv, FALSE); } @@ -12605,7 +12267,7 @@ theend: /* * "match()" function */ -static void f_match(typval_T *argvars, typval_T *rettv) +static void f_match(typval_T *argvars, typval_T *rettv, FunPtr fptr) { find_some_match(argvars, rettv, 1); } @@ -12613,7 +12275,7 @@ static void f_match(typval_T *argvars, typval_T *rettv) /* * "matchadd()" function */ -static void f_matchadd(typval_T *argvars, typval_T *rettv) +static void f_matchadd(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u buf[NUMBUFLEN]; char_u *grp = get_tv_string_buf_chk(&argvars[0], buf); /* group */ @@ -12639,7 +12301,7 @@ static void f_matchadd(typval_T *argvars, typval_T *rettv) if (dict_find(argvars[4].vval.v_dict, (char_u *)"conceal", -1) != NULL) { conceal_char = get_dict_string(argvars[4].vval.v_dict, - (char_u *)"conceal", false); + "conceal", false); } } } @@ -12656,7 +12318,7 @@ static void f_matchadd(typval_T *argvars, typval_T *rettv) conceal_char); } -static void f_matchaddpos(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ALL +static void f_matchaddpos(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = -1; @@ -12695,7 +12357,7 @@ static void f_matchaddpos(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ if (dict_find(argvars[4].vval.v_dict, (char_u *)"conceal", -1) != NULL) { conceal_char = get_dict_string(argvars[4].vval.v_dict, - (char_u *)"conceal", false); + "conceal", false); } } } @@ -12717,7 +12379,7 @@ static void f_matchaddpos(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ /* * "matcharg()" function */ -static void f_matcharg(typval_T *argvars, typval_T *rettv) +static void f_matcharg(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv_list_alloc(rettv); @@ -12739,7 +12401,7 @@ static void f_matcharg(typval_T *argvars, typval_T *rettv) /* * "matchdelete()" function */ -static void f_matchdelete(typval_T *argvars, typval_T *rettv) +static void f_matchdelete(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = match_delete(curwin, (int)get_tv_number(&argvars[0]), TRUE); @@ -12748,7 +12410,7 @@ static void f_matchdelete(typval_T *argvars, typval_T *rettv) /* * "matchend()" function */ -static void f_matchend(typval_T *argvars, typval_T *rettv) +static void f_matchend(typval_T *argvars, typval_T *rettv, FunPtr fptr) { find_some_match(argvars, rettv, 0); } @@ -12756,7 +12418,7 @@ static void f_matchend(typval_T *argvars, typval_T *rettv) /* * "matchlist()" function */ -static void f_matchlist(typval_T *argvars, typval_T *rettv) +static void f_matchlist(typval_T *argvars, typval_T *rettv, FunPtr fptr) { find_some_match(argvars, rettv, 3); } @@ -12764,7 +12426,7 @@ static void f_matchlist(typval_T *argvars, typval_T *rettv) /* * "matchstr()" function */ -static void f_matchstr(typval_T *argvars, typval_T *rettv) +static void f_matchstr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { find_some_match(argvars, rettv, 2); } @@ -12824,7 +12486,7 @@ static void max_min(typval_T *argvars, typval_T *rettv, int domax) /* * "max()" function */ -static void f_max(typval_T *argvars, typval_T *rettv) +static void f_max(typval_T *argvars, typval_T *rettv, FunPtr fptr) { max_min(argvars, rettv, TRUE); } @@ -12832,7 +12494,7 @@ static void f_max(typval_T *argvars, typval_T *rettv) /* * "min()" function */ -static void f_min(typval_T *argvars, typval_T *rettv) +static void f_min(typval_T *argvars, typval_T *rettv, FunPtr fptr) { max_min(argvars, rettv, FALSE); } @@ -12840,7 +12502,7 @@ static void f_min(typval_T *argvars, typval_T *rettv) /* * "mkdir()" function */ -static void f_mkdir(typval_T *argvars, typval_T *rettv) +static void f_mkdir(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *dir; char_u buf[NUMBUFLEN]; @@ -12882,7 +12544,7 @@ static void f_mkdir(typval_T *argvars, typval_T *rettv) /* * "mode()" function */ -static void f_mode(typval_T *argvars, typval_T *rettv) +static void f_mode(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u buf[3]; @@ -12936,7 +12598,7 @@ static void f_mode(typval_T *argvars, typval_T *rettv) } /// "msgpackdump()" function -static void f_msgpackdump(typval_T *argvars, typval_T *rettv) +static void f_msgpackdump(typval_T *argvars, typval_T *rettv, FunPtr fptr) FUNC_ATTR_NONNULL_ALL { if (argvars[0].v_type != VAR_LIST) { @@ -12964,7 +12626,7 @@ static void f_msgpackdump(typval_T *argvars, typval_T *rettv) } /// "msgpackparse" function -static void f_msgpackparse(typval_T *argvars, typval_T *rettv) +static void f_msgpackparse(typval_T *argvars, typval_T *rettv, FunPtr fptr) FUNC_ATTR_NONNULL_ALL { if (argvars[0].v_type != VAR_LIST) { @@ -13045,7 +12707,7 @@ f_msgpackparse_exit: /* * "nextnonblank()" function */ -static void f_nextnonblank(typval_T *argvars, typval_T *rettv) +static void f_nextnonblank(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum; @@ -13063,7 +12725,7 @@ static void f_nextnonblank(typval_T *argvars, typval_T *rettv) /* * "nr2char()" function */ -static void f_nr2char(typval_T *argvars, typval_T *rettv) +static void f_nr2char(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u buf[NUMBUFLEN]; @@ -13087,7 +12749,7 @@ static void f_nr2char(typval_T *argvars, typval_T *rettv) /* * "or(expr, expr)" function */ -static void f_or(typval_T *argvars, typval_T *rettv) +static void f_or(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL) | get_tv_number_chk(&argvars[1], NULL); @@ -13096,7 +12758,7 @@ static void f_or(typval_T *argvars, typval_T *rettv) /* * "pathshorten()" function */ -static void f_pathshorten(typval_T *argvars, typval_T *rettv) +static void f_pathshorten(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = get_tv_string_chk(&argvars[0]); @@ -13109,7 +12771,7 @@ static void f_pathshorten(typval_T *argvars, typval_T *rettv) /* * "pow()" function */ -static void f_pow(typval_T *argvars, typval_T *rettv) +static void f_pow(typval_T *argvars, typval_T *rettv, FunPtr fptr) { float_T fx, fy; @@ -13124,7 +12786,7 @@ static void f_pow(typval_T *argvars, typval_T *rettv) /* * "prevnonblank()" function */ -static void f_prevnonblank(typval_T *argvars, typval_T *rettv) +static void f_prevnonblank(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum; @@ -13146,7 +12808,7 @@ static va_list ap; /* * "printf()" function */ -static void f_printf(typval_T *argvars, typval_T *rettv) +static void f_printf(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; @@ -13172,7 +12834,7 @@ static void f_printf(typval_T *argvars, typval_T *rettv) /* * "pumvisible()" function */ -static void f_pumvisible(typval_T *argvars, typval_T *rettv) +static void f_pumvisible(typval_T *argvars, typval_T *rettv, FunPtr fptr) { if (pum_visible()) rettv->vval.v_number = 1; @@ -13181,7 +12843,7 @@ static void f_pumvisible(typval_T *argvars, typval_T *rettv) /* * "pyeval()" function */ -static void f_pyeval(typval_T *argvars, typval_T *rettv) +static void f_pyeval(typval_T *argvars, typval_T *rettv, FunPtr fptr) { script_host_eval("python", argvars, rettv); } @@ -13189,7 +12851,7 @@ static void f_pyeval(typval_T *argvars, typval_T *rettv) /* * "py3eval()" function */ -static void f_py3eval(typval_T *argvars, typval_T *rettv) +static void f_py3eval(typval_T *argvars, typval_T *rettv, FunPtr fptr) { script_host_eval("python3", argvars, rettv); } @@ -13197,7 +12859,7 @@ static void f_py3eval(typval_T *argvars, typval_T *rettv) /* * "range()" function */ -static void f_range(typval_T *argvars, typval_T *rettv) +static void f_range(typval_T *argvars, typval_T *rettv, FunPtr fptr) { long start; long end; @@ -13232,7 +12894,7 @@ static void f_range(typval_T *argvars, typval_T *rettv) /* * "readfile()" function */ -static void f_readfile(typval_T *argvars, typval_T *rettv) +static void f_readfile(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int binary = FALSE; char_u *fname; @@ -13431,7 +13093,7 @@ static int list2proftime(typval_T *arg, proftime_T *tm) FUNC_ATTR_NONNULL_ALL /// one argument it returns the time passed since the argument. /// With two arguments it returns the time passed between /// the two arguments. -static void f_reltime(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ALL +static void f_reltime(typval_T *argvars, typval_T *rettv, FunPtr fptr) { proftime_T res; proftime_T start; @@ -13477,7 +13139,7 @@ static void f_reltime(typval_T *argvars, typval_T *rettv) FUNC_ATTR_NONNULL_ALL /// @return The string representation of the argument, the format is the /// number of seconds followed by a dot, followed by the number /// of microseconds. -static void f_reltimestr(typval_T *argvars, typval_T *rettv) +static void f_reltimestr(typval_T *argvars, typval_T *rettv, FunPtr fptr) FUNC_ATTR_NONNULL_ALL { proftime_T tm; @@ -13492,7 +13154,7 @@ static void f_reltimestr(typval_T *argvars, typval_T *rettv) /* * "remove()" function */ -static void f_remove(typval_T *argvars, typval_T *rettv) +static void f_remove(typval_T *argvars, typval_T *rettv, FunPtr fptr) { list_T *l; listitem_T *item, *item2; @@ -13577,7 +13239,7 @@ static void f_remove(typval_T *argvars, typval_T *rettv) /* * "rename({from}, {to})" function */ -static void f_rename(typval_T *argvars, typval_T *rettv) +static void f_rename(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u buf[NUMBUFLEN]; @@ -13591,7 +13253,7 @@ static void f_rename(typval_T *argvars, typval_T *rettv) /* * "repeat()" function */ -static void f_repeat(typval_T *argvars, typval_T *rettv) +static void f_repeat(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *p; int n; @@ -13625,7 +13287,7 @@ static void f_repeat(typval_T *argvars, typval_T *rettv) /* * "resolve()" function */ -static void f_resolve(typval_T *argvars, typval_T *rettv) +static void f_resolve(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *p; #ifdef HAVE_READLINK @@ -13799,7 +13461,7 @@ fail: /* * "reverse({list})" function */ -static void f_reverse(typval_T *argvars, typval_T *rettv) +static void f_reverse(typval_T *argvars, typval_T *rettv, FunPtr fptr) { list_T *l; listitem_T *li, *ni; @@ -13970,16 +13632,8 @@ theend: return retval; } -/* - * "round({float})" function - */ -static void f_round(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &round); -} - // "rpcnotify()" function -static void f_rpcnotify(typval_T *argvars, typval_T *rettv) +static void f_rpcnotify(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; @@ -14015,7 +13669,7 @@ static void f_rpcnotify(typval_T *argvars, typval_T *rettv) } // "rpcrequest()" function -static void f_rpcrequest(typval_T *argvars, typval_T *rettv) +static void f_rpcrequest(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; @@ -14088,7 +13742,7 @@ static void f_rpcrequest(typval_T *argvars, typval_T *rettv) } if (err.set) { - vim_report_error(cstr_as_string(err.msg)); + nvim_err_writeln(cstr_as_string(err.msg)); goto end; } @@ -14100,8 +13754,8 @@ end: api_free_object(result); } -// "rpcstart()" function -static void f_rpcstart(typval_T *argvars, typval_T *rettv) +// "rpcstart()" function (DEPRECATED) +static void f_rpcstart(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; @@ -14153,17 +13807,14 @@ static void f_rpcstart(typval_T *argvars, typval_T *rettv) // The last item of argv must be NULL argv[i] = NULL; - uint64_t channel_id = channel_from_process(argv); - - if (!channel_id) { - EMSG(_(e_api_spawn_failed)); - } - rettv->vval.v_number = (varnumber_T)channel_id; + TerminalJobData *data = common_job_init(argv, NULL, NULL, NULL, + NULL, false, true, false, NULL); + common_job_start(data, rettv); } // "rpcstop()" function -static void f_rpcstop(typval_T *argvars, typval_T *rettv) +static void f_rpcstop(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = 0; @@ -14178,13 +13829,18 @@ static void f_rpcstop(typval_T *argvars, typval_T *rettv) return; } - rettv->vval.v_number = channel_close(argvars[0].vval.v_number); + // if called with a job, stop it, else closes the channel + if (pmap_get(uint64_t)(jobs, argvars[0].vval.v_number)) { + f_jobstop(argvars, rettv, NULL); + } else { + rettv->vval.v_number = channel_close(argvars[0].vval.v_number); + } } /* * "screenattr()" function */ -static void f_screenattr(typval_T *argvars, typval_T *rettv) +static void f_screenattr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int row; int col; @@ -14203,7 +13859,7 @@ static void f_screenattr(typval_T *argvars, typval_T *rettv) /* * "screenchar()" function */ -static void f_screenchar(typval_T *argvars, typval_T *rettv) +static void f_screenchar(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int row; int col; @@ -14230,7 +13886,7 @@ static void f_screenchar(typval_T *argvars, typval_T *rettv) * * First column is 1 to be consistent with virtcol(). */ -static void f_screencol(typval_T *argvars, typval_T *rettv) +static void f_screencol(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = ui_current_col() + 1; } @@ -14238,7 +13894,7 @@ static void f_screencol(typval_T *argvars, typval_T *rettv) /* * "screenrow()" function */ -static void f_screenrow(typval_T *argvars, typval_T *rettv) +static void f_screenrow(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = ui_current_row() + 1; } @@ -14246,7 +13902,7 @@ static void f_screenrow(typval_T *argvars, typval_T *rettv) /* * "search()" function */ -static void f_search(typval_T *argvars, typval_T *rettv) +static void f_search(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int flags = 0; @@ -14256,7 +13912,7 @@ static void f_search(typval_T *argvars, typval_T *rettv) /* * "searchdecl()" function */ -static void f_searchdecl(typval_T *argvars, typval_T *rettv) +static void f_searchdecl(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int locally = 1; int thisblock = 0; @@ -14349,7 +14005,7 @@ theend: /* * "searchpair()" function */ -static void f_searchpair(typval_T *argvars, typval_T *rettv) +static void f_searchpair(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = searchpair_cmn(argvars, NULL); } @@ -14357,7 +14013,7 @@ static void f_searchpair(typval_T *argvars, typval_T *rettv) /* * "searchpairpos()" function */ -static void f_searchpairpos(typval_T *argvars, typval_T *rettv) +static void f_searchpairpos(typval_T *argvars, typval_T *rettv, FunPtr fptr) { pos_T match_pos; int lnum = 0; @@ -14522,7 +14178,7 @@ do_searchpair ( /* * "searchpos()" function */ -static void f_searchpos(typval_T *argvars, typval_T *rettv) +static void f_searchpos(typval_T *argvars, typval_T *rettv, FunPtr fptr) { pos_T match_pos; int lnum = 0; @@ -14545,7 +14201,7 @@ static void f_searchpos(typval_T *argvars, typval_T *rettv) } /// "serverlist()" function -static void f_serverlist(typval_T *argvars, typval_T *rettv) +static void f_serverlist(typval_T *argvars, typval_T *rettv, FunPtr fptr) { size_t n; char **addrs = server_address_list(&n); @@ -14563,7 +14219,7 @@ static void f_serverlist(typval_T *argvars, typval_T *rettv) } /// "serverstart()" function -static void f_serverstart(typval_T *argvars, typval_T *rettv) +static void f_serverstart(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; // Address of the new server @@ -14591,7 +14247,7 @@ static void f_serverstart(typval_T *argvars, typval_T *rettv) } /// "serverstop()" function -static void f_serverstop(typval_T *argvars, typval_T *rettv) +static void f_serverstop(typval_T *argvars, typval_T *rettv, FunPtr fptr) { if (check_restricted() || check_secure()) { return; @@ -14610,7 +14266,7 @@ static void f_serverstop(typval_T *argvars, typval_T *rettv) /* * "setbufvar()" function */ -static void f_setbufvar(typval_T *argvars, typval_T *rettv) +static void f_setbufvar(typval_T *argvars, typval_T *rettv, FunPtr fptr) { buf_T *buf; aco_save_T aco; @@ -14652,7 +14308,7 @@ static void f_setbufvar(typval_T *argvars, typval_T *rettv) } } -static void f_setcharsearch(typval_T *argvars, typval_T *rettv) +static void f_setcharsearch(typval_T *argvars, typval_T *rettv, FunPtr fptr) { dict_T *d; dictitem_T *di; @@ -14664,7 +14320,7 @@ static void f_setcharsearch(typval_T *argvars, typval_T *rettv) } if ((d = argvars[0].vval.v_dict) != NULL) { - csearch = get_dict_string(d, (char_u *)"char", FALSE); + csearch = get_dict_string(d, "char", false); if (csearch != NULL) { if (enc_utf8) { int pcc[MAX_MCO]; @@ -14689,7 +14345,7 @@ static void f_setcharsearch(typval_T *argvars, typval_T *rettv) /* * "setcmdpos()" function */ -static void f_setcmdpos(typval_T *argvars, typval_T *rettv) +static void f_setcmdpos(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int pos = (int)get_tv_number(&argvars[0]) - 1; @@ -14699,7 +14355,7 @@ static void f_setcmdpos(typval_T *argvars, typval_T *rettv) /// "setfperm({fname}, {mode})" function -static void f_setfperm(typval_T *argvars, typval_T *rettv) +static void f_setfperm(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = 0; @@ -14732,7 +14388,7 @@ static void f_setfperm(typval_T *argvars, typval_T *rettv) /* * "setline()" function */ -static void f_setline(typval_T *argvars, typval_T *rettv) +static void f_setline(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum; char_u *line = NULL; @@ -14857,7 +14513,7 @@ skip_args: /* * "setloclist()" function */ -static void f_setloclist(typval_T *argvars, typval_T *rettv) +static void f_setloclist(typval_T *argvars, typval_T *rettv, FunPtr fptr) { win_T *win; @@ -14872,7 +14528,7 @@ static void f_setloclist(typval_T *argvars, typval_T *rettv) /* * "setmatches()" function */ -static void f_setmatches(typval_T *argvars, typval_T *rettv) +static void f_setmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr) { list_T *l; listitem_T *li; @@ -14938,16 +14594,16 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv) } } - char_u *group = get_dict_string(d, (char_u *)"group", false); - int priority = get_dict_number(d, (char_u *)"priority"); - int id = get_dict_number(d, (char_u *)"id"); + char_u *group = get_dict_string(d, "group", false); + int priority = get_dict_number(d, "priority"); + int id = get_dict_number(d, "id"); char_u *conceal = dict_find(d, (char_u *)"conceal", -1) != NULL - ? get_dict_string(d, (char_u *)"conceal", + ? get_dict_string(d, "conceal", false) : NULL; if (i == 0) { match_add(curwin, group, - get_dict_string(d, (char_u *)"pattern", false), + get_dict_string(d, "pattern", false), priority, id, NULL, conceal); } else { match_add(curwin, group, NULL, priority, id, s, conceal); @@ -14963,7 +14619,7 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv) /* * "setpos()" function */ -static void f_setpos(typval_T *argvars, typval_T *rettv) +static void f_setpos(typval_T *argvars, typval_T *rettv, FunPtr fptr) { pos_T pos; int fnum; @@ -15005,7 +14661,7 @@ static void f_setpos(typval_T *argvars, typval_T *rettv) /* * "setqflist()" function */ -static void f_setqflist(typval_T *argvars, typval_T *rettv) +static void f_setqflist(typval_T *argvars, typval_T *rettv, FunPtr fptr) { set_qf_ll_list(NULL, argvars, rettv); } @@ -15013,7 +14669,7 @@ static void f_setqflist(typval_T *argvars, typval_T *rettv) /* * "setreg()" function */ -static void f_setreg(typval_T *argvars, typval_T *rettv) +static void f_setreg(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int regname; char_u *strregname; @@ -15108,7 +14764,7 @@ free_lstval: /* * "settabvar()" function */ -static void f_settabvar(typval_T *argvars, typval_T *rettv) +static void f_settabvar(typval_T *argvars, typval_T *rettv, FunPtr fptr) { tabpage_T *save_curtab; tabpage_T *tp; @@ -15145,7 +14801,7 @@ static void f_settabvar(typval_T *argvars, typval_T *rettv) /* * "settabwinvar()" function */ -static void f_settabwinvar(typval_T *argvars, typval_T *rettv) +static void f_settabwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr) { setwinvar(argvars, rettv, 1); } @@ -15153,7 +14809,7 @@ static void f_settabwinvar(typval_T *argvars, typval_T *rettv) /* * "setwinvar()" function */ -static void f_setwinvar(typval_T *argvars, typval_T *rettv) +static void f_setwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr) { setwinvar(argvars, rettv, 0); } @@ -15213,7 +14869,7 @@ static void setwinvar(typval_T *argvars, typval_T *rettv, int off) } /// f_sha256 - sha256({string}) function -static void f_sha256(typval_T *argvars, typval_T *rettv) +static void f_sha256(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *p = get_tv_string(&argvars[0]); const char_u *hash = sha256_bytes(p, (int) STRLEN(p) , NULL, 0); @@ -15226,7 +14882,7 @@ static void f_sha256(typval_T *argvars, typval_T *rettv) /* * "shellescape({string})" function */ -static void f_shellescape(typval_T *argvars, typval_T *rettv) +static void f_shellescape(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_string = vim_strsave_shellescape( get_tv_string(&argvars[0]), non_zero_arg(&argvars[1]), true); @@ -15236,7 +14892,7 @@ static void f_shellescape(typval_T *argvars, typval_T *rettv) /* * shiftwidth() function */ -static void f_shiftwidth(typval_T *argvars, typval_T *rettv) +static void f_shiftwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = get_sw_value(curbuf); } @@ -15244,7 +14900,7 @@ static void f_shiftwidth(typval_T *argvars, typval_T *rettv) /* * "simplify()" function */ -static void f_simplify(typval_T *argvars, typval_T *rettv) +static void f_simplify(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *p; @@ -15254,22 +14910,6 @@ static void f_simplify(typval_T *argvars, typval_T *rettv) rettv->v_type = VAR_STRING; } -/* - * "sin()" function - */ -static void f_sin(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &sin); -} - -/* - * "sinh()" function - */ -static void f_sinh(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &sinh); -} - /// struct used in the array that's given to qsort() typedef struct { listitem_T *item; @@ -15617,13 +15257,13 @@ theend: } /// "sort"({list})" function -static void f_sort(typval_T *argvars, typval_T *rettv) +static void f_sort(typval_T *argvars, typval_T *rettv, FunPtr fptr) { do_sort_uniq(argvars, rettv, true); } /// "uniq({list})" function -static void f_uniq(typval_T *argvars, typval_T *rettv) +static void f_uniq(typval_T *argvars, typval_T *rettv, FunPtr fptr) { do_sort_uniq(argvars, rettv, false); } @@ -15631,7 +15271,7 @@ static void f_uniq(typval_T *argvars, typval_T *rettv) // // "reltimefloat()" function // -static void f_reltimefloat(typval_T *argvars , typval_T *rettv) +static void f_reltimefloat(typval_T *argvars , typval_T *rettv, FunPtr fptr) FUNC_ATTR_NONNULL_ALL { proftime_T tm; @@ -15646,7 +15286,7 @@ static void f_reltimefloat(typval_T *argvars , typval_T *rettv) /* * "soundfold({word})" function */ -static void f_soundfold(typval_T *argvars, typval_T *rettv) +static void f_soundfold(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *s; @@ -15658,7 +15298,7 @@ static void f_soundfold(typval_T *argvars, typval_T *rettv) /* * "spellbadword()" function */ -static void f_spellbadword(typval_T *argvars, typval_T *rettv) +static void f_spellbadword(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *word = (char_u *)""; hlf_T attr = HLF_COUNT; @@ -15702,7 +15342,7 @@ static void f_spellbadword(typval_T *argvars, typval_T *rettv) /* * "spellsuggest()" function */ -static void f_spellsuggest(typval_T *argvars, typval_T *rettv) +static void f_spellsuggest(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *str; int typeerr = FALSE; @@ -15742,7 +15382,7 @@ static void f_spellsuggest(typval_T *argvars, typval_T *rettv) } } -static void f_split(typval_T *argvars, typval_T *rettv) +static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *str; char_u *end; @@ -15811,17 +15451,9 @@ static void f_split(typval_T *argvars, typval_T *rettv) } /* - * "sqrt()" function - */ -static void f_sqrt(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &sqrt); -} - -/* * "str2float()" function */ -static void f_str2float(typval_T *argvars, typval_T *rettv) +static void f_str2float(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *p = skipwhite(get_tv_string(&argvars[0])); @@ -15832,7 +15464,7 @@ static void f_str2float(typval_T *argvars, typval_T *rettv) } // "str2nr()" function -static void f_str2nr(typval_T *argvars, typval_T *rettv) +static void f_str2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int base = 10; char_u *p; @@ -15871,7 +15503,7 @@ static void f_str2nr(typval_T *argvars, typval_T *rettv) /* * "strftime({format}[, {time}])" function */ -static void f_strftime(typval_T *argvars, typval_T *rettv) +static void f_strftime(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u result_buf[256]; time_t seconds; @@ -15922,7 +15554,7 @@ static void f_strftime(typval_T *argvars, typval_T *rettv) /* * "stridx()" function */ -static void f_stridx(typval_T *argvars, typval_T *rettv) +static void f_stridx(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u buf[NUMBUFLEN]; char_u *needle; @@ -15955,7 +15587,7 @@ static void f_stridx(typval_T *argvars, typval_T *rettv) /* * "string()" function */ -static void f_string(typval_T *argvars, typval_T *rettv) +static void f_string(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = (char_u *) encode_tv2string(&argvars[0], NULL); @@ -15964,7 +15596,7 @@ static void f_string(typval_T *argvars, typval_T *rettv) /* * "strlen()" function */ -static void f_strlen(typval_T *argvars, typval_T *rettv) +static void f_strlen(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = (varnumber_T)(STRLEN( get_tv_string(&argvars[0]))); @@ -15973,7 +15605,7 @@ static void f_strlen(typval_T *argvars, typval_T *rettv) /* * "strchars()" function */ -static void f_strchars(typval_T *argvars, typval_T *rettv) +static void f_strchars(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *s = get_tv_string(&argvars[0]); int skipcc = 0; @@ -15998,7 +15630,7 @@ static void f_strchars(typval_T *argvars, typval_T *rettv) /* * "strdisplaywidth()" function */ -static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv) +static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *s = get_tv_string(&argvars[0]); int col = 0; @@ -16012,7 +15644,7 @@ static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv) /* * "strwidth()" function */ -static void f_strwidth(typval_T *argvars, typval_T *rettv) +static void f_strwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *s = get_tv_string(&argvars[0]); @@ -16022,7 +15654,7 @@ static void f_strwidth(typval_T *argvars, typval_T *rettv) /* * "strpart()" function */ -static void f_strpart(typval_T *argvars, typval_T *rettv) +static void f_strpart(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *p; int n; @@ -16062,7 +15694,7 @@ static void f_strpart(typval_T *argvars, typval_T *rettv) /* * "strridx()" function */ -static void f_strridx(typval_T *argvars, typval_T *rettv) +static void f_strridx(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u buf[NUMBUFLEN]; char_u *needle; @@ -16108,7 +15740,7 @@ static void f_strridx(typval_T *argvars, typval_T *rettv) /* * "strtrans()" function */ -static void f_strtrans(typval_T *argvars, typval_T *rettv) +static void f_strtrans(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = transstr(get_tv_string(&argvars[0])); @@ -16117,7 +15749,7 @@ static void f_strtrans(typval_T *argvars, typval_T *rettv) /* * "submatch()" function */ -static void f_submatch(typval_T *argvars, typval_T *rettv) +static void f_submatch(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int error = FALSE; int no = (int)get_tv_number_chk(&argvars[0], &error); @@ -16146,7 +15778,7 @@ static void f_submatch(typval_T *argvars, typval_T *rettv) /* * "substitute()" function */ -static void f_substitute(typval_T *argvars, typval_T *rettv) +static void f_substitute(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u patbuf[NUMBUFLEN]; char_u subbuf[NUMBUFLEN]; @@ -16167,7 +15799,7 @@ static void f_substitute(typval_T *argvars, typval_T *rettv) /* * "synID(lnum, col, trans)" function */ -static void f_synID(typval_T *argvars, typval_T *rettv) +static void f_synID(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int id = 0; long lnum; @@ -16189,7 +15821,7 @@ static void f_synID(typval_T *argvars, typval_T *rettv) /* * "synIDattr(id, what [, mode])" function */ -static void f_synIDattr(typval_T *argvars, typval_T *rettv) +static void f_synIDattr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *p = NULL; int id; @@ -16265,7 +15897,7 @@ static void f_synIDattr(typval_T *argvars, typval_T *rettv) /* * "synIDtrans(id)" function */ -static void f_synIDtrans(typval_T *argvars, typval_T *rettv) +static void f_synIDtrans(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int id; @@ -16282,7 +15914,7 @@ static void f_synIDtrans(typval_T *argvars, typval_T *rettv) /* * "synconcealed(lnum, col)" function */ -static void f_synconcealed(typval_T *argvars, typval_T *rettv) +static void f_synconcealed(typval_T *argvars, typval_T *rettv, FunPtr fptr) { long lnum; long col; @@ -16329,7 +15961,7 @@ static void f_synconcealed(typval_T *argvars, typval_T *rettv) /* * "synstack(lnum, col)" function */ -static void f_synstack(typval_T *argvars, typval_T *rettv) +static void f_synstack(typval_T *argvars, typval_T *rettv, FunPtr fptr) { long lnum; long col; @@ -16460,12 +16092,12 @@ static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv, } /// f_system - the VimL system() function -static void f_system(typval_T *argvars, typval_T *rettv) +static void f_system(typval_T *argvars, typval_T *rettv, FunPtr fptr) { get_system_output_as_rettv(argvars, rettv, false); } -static void f_systemlist(typval_T *argvars, typval_T *rettv) +static void f_systemlist(typval_T *argvars, typval_T *rettv, FunPtr fptr) { get_system_output_as_rettv(argvars, rettv, true); } @@ -16474,7 +16106,7 @@ static void f_systemlist(typval_T *argvars, typval_T *rettv) /* * "tabpagebuflist()" function */ -static void f_tabpagebuflist(typval_T *argvars, typval_T *rettv) +static void f_tabpagebuflist(typval_T *argvars, typval_T *rettv, FunPtr fptr) { tabpage_T *tp; win_T *wp = NULL; @@ -16499,7 +16131,7 @@ static void f_tabpagebuflist(typval_T *argvars, typval_T *rettv) /* * "tabpagenr()" function */ -static void f_tabpagenr(typval_T *argvars, typval_T *rettv) +static void f_tabpagenr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int nr = 1; char_u *arg; @@ -16563,7 +16195,7 @@ static int get_winnr(tabpage_T *tp, typval_T *argvar) /* * "tabpagewinnr()" function */ -static void f_tabpagewinnr(typval_T *argvars, typval_T *rettv) +static void f_tabpagewinnr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int nr = 1; tabpage_T *tp; @@ -16580,7 +16212,7 @@ static void f_tabpagewinnr(typval_T *argvars, typval_T *rettv) /* * "tagfiles()" function */ -static void f_tagfiles(typval_T *argvars, typval_T *rettv) +static void f_tagfiles(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *fname; tagname_T tn; @@ -16601,7 +16233,7 @@ static void f_tagfiles(typval_T *argvars, typval_T *rettv) /* * "taglist()" function */ -static void f_taglist(typval_T *argvars, typval_T *rettv) +static void f_taglist(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *tag_pattern; @@ -16617,14 +16249,14 @@ static void f_taglist(typval_T *argvars, typval_T *rettv) /* * "tempname()" function */ -static void f_tempname(typval_T *argvars, typval_T *rettv) +static void f_tempname(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = vim_tempname(); } // "termopen(cmd[, cwd])" function -static void f_termopen(typval_T *argvars, typval_T *rettv) +static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr) { if (check_restricted() || check_secure()) { return; @@ -16654,7 +16286,7 @@ static void f_termopen(typval_T *argvars, typval_T *rettv) if (argvars[1].v_type == VAR_DICT) { job_opts = argvars[1].vval.v_dict; - char *new_cwd = (char *)get_dict_string(job_opts, (char_u *)"cwd", false); + char *new_cwd = (char *)get_dict_string(job_opts, "cwd", false); if (new_cwd && strlen(new_cwd) > 0) { cwd = new_cwd; // The new cwd must be a directory. @@ -16672,7 +16304,7 @@ static void f_termopen(typval_T *argvars, typval_T *rettv) } TerminalJobData *data = common_job_init(argv, on_stdout, on_stderr, on_exit, - job_opts, true, false, cwd); + job_opts, true, false, false, cwd); data->proc.pty.width = curwin->w_width; data->proc.pty.height = curwin->w_height; data->proc.pty.term_name = xstrdup("xterm-256color"); @@ -16699,9 +16331,9 @@ static void f_termopen(typval_T *argvars, typval_T *rettv) // Save the job id and pid in b:terminal_job_{id,pid} Error err; dict_set_value(curbuf->b_vars, cstr_as_string("terminal_job_id"), - INTEGER_OBJ(rettv->vval.v_number), false, &err); + INTEGER_OBJ(rettv->vval.v_number), false, false, &err); dict_set_value(curbuf->b_vars, cstr_as_string("terminal_job_pid"), - INTEGER_OBJ(pid), false, &err); + INTEGER_OBJ(pid), false, false, &err); Terminal *term = terminal_open(topts); data->term = term; @@ -16713,30 +16345,13 @@ static void f_termopen(typval_T *argvars, typval_T *rettv) /* * "test(list)" function: Just checking the walls... */ -static void f_test(typval_T *argvars, typval_T *rettv) +static void f_test(typval_T *argvars, typval_T *rettv, FunPtr fptr) { /* Used for unit testing. Change the code below to your liking. */ } -/* - * "tan()" function - */ -static void f_tan(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &tan); -} - -/* - * "tanh()" function - */ -static void f_tanh(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &tanh); -} - - /// "timer_start(timeout, callback, opts)" function -static void f_timer_start(typval_T *argvars, typval_T *rettv) +static void f_timer_start(typval_T *argvars, typval_T *rettv, FunPtr fptr) { long timeout = get_tv_number(&argvars[0]); timer_T *timer; @@ -16752,7 +16367,7 @@ static void f_timer_start(typval_T *argvars, typval_T *rettv) return; } if (dict_find(dict, (char_u *)"repeat", -1) != NULL) { - repeat = get_dict_number(dict, (char_u *)"repeat"); + repeat = get_dict_number(dict, "repeat"); if (repeat == 0) { repeat = 1; } @@ -16771,6 +16386,7 @@ static void f_timer_start(typval_T *argvars, typval_T *rettv) func->uf_refcount++; timer = xmalloc(sizeof *timer); + timer->refcount = 1; timer->stopped = false; timer->repeat_count = repeat; timer->timeout = timeout; @@ -16790,7 +16406,7 @@ static void f_timer_start(typval_T *argvars, typval_T *rettv) // "timer_stop(timerid)" function -static void f_timer_stop(typval_T *argvars, typval_T *rettv) +static void f_timer_stop(typval_T *argvars, typval_T *rettv, FunPtr fptr) { if (argvars[0].v_type != VAR_NUMBER) { EMSG(_(e_number_exp)); @@ -16813,6 +16429,7 @@ static void timer_due_cb(TimeWatcher *tw, void *data) if (timer->stopped) { return; } + timer->refcount++; // if repeat was negative repeat forever if (timer->repeat_count >= 0 && --timer->repeat_count == 0) { timer_stop(timer); @@ -16836,6 +16453,7 @@ static void timer_due_cb(TimeWatcher *tw, void *data) // when the main loop is blocked. time_watcher_start(&timer->tw, timer_due_cb, 0, 0); } + timer_decref(timer); } static void timer_stop(timer_T *timer) @@ -16846,17 +16464,24 @@ static void timer_stop(timer_T *timer) } timer->stopped = true; time_watcher_stop(&timer->tw); - time_watcher_close(&timer->tw, timer_free_cb); + time_watcher_close(&timer->tw, timer_close_cb); } // invoked on next event loop tick, so queue is empty -static void timer_free_cb(TimeWatcher *tw, void *data) +static void timer_close_cb(TimeWatcher *tw, void *data) { timer_T *timer = (timer_T *)data; queue_free(timer->tw.events); user_func_unref(timer->callback); pmap_del(uint64_t)(timers, timer->timer_id); - xfree(timer); + timer_decref(timer); +} + +static void timer_decref(timer_T *timer) +{ + if (--timer->refcount == 0) { + xfree(timer); + } } void timer_teardown(void) @@ -16870,7 +16495,7 @@ void timer_teardown(void) /* * "tolower(string)" function */ -static void f_tolower(typval_T *argvars, typval_T *rettv) +static void f_tolower(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *p = vim_strsave(get_tv_string(&argvars[0])); rettv->v_type = VAR_STRING; @@ -16901,7 +16526,7 @@ static void f_tolower(typval_T *argvars, typval_T *rettv) /* * "toupper(string)" function */ -static void f_toupper(typval_T *argvars, typval_T *rettv) +static void f_toupper(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; rettv->vval.v_string = strup_save(get_tv_string(&argvars[0])); @@ -16910,7 +16535,7 @@ static void f_toupper(typval_T *argvars, typval_T *rettv) /* * "tr(string, fromstr, tostr)" function */ -static void f_tr(typval_T *argvars, typval_T *rettv) +static void f_tr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *in_str; char_u *fromstr; @@ -17008,17 +16633,9 @@ error: } /* - * "trunc({float})" function - */ -static void f_trunc(typval_T *argvars, typval_T *rettv) -{ - float_op_wrapper(argvars, rettv, &trunc); -} - -/* * "type(expr)" function */ -static void f_type(typval_T *argvars, typval_T *rettv) +static void f_type(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int n = -1; @@ -17054,7 +16671,7 @@ static void f_type(typval_T *argvars, typval_T *rettv) /* * "undofile(name)" function */ -static void f_undofile(typval_T *argvars, typval_T *rettv) +static void f_undofile(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->v_type = VAR_STRING; { @@ -17077,7 +16694,7 @@ static void f_undofile(typval_T *argvars, typval_T *rettv) /* * "undotree()" function */ -static void f_undotree(typval_T *argvars, typval_T *rettv) +static void f_undotree(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv_dict_alloc(rettv); @@ -17100,7 +16717,7 @@ static void f_undotree(typval_T *argvars, typval_T *rettv) /* * "values(dict)" function */ -static void f_values(typval_T *argvars, typval_T *rettv) +static void f_values(typval_T *argvars, typval_T *rettv, FunPtr fptr) { dict_list(argvars, rettv, 1); } @@ -17108,7 +16725,7 @@ static void f_values(typval_T *argvars, typval_T *rettv) /* * "virtcol(string)" function */ -static void f_virtcol(typval_T *argvars, typval_T *rettv) +static void f_virtcol(typval_T *argvars, typval_T *rettv, FunPtr fptr) { colnr_T vcol = 0; pos_T *fp; @@ -17127,7 +16744,7 @@ static void f_virtcol(typval_T *argvars, typval_T *rettv) /* * "visualmode()" function */ -static void f_visualmode(typval_T *argvars, typval_T *rettv) +static void f_visualmode(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u str[2]; @@ -17144,16 +16761,48 @@ static void f_visualmode(typval_T *argvars, typval_T *rettv) /* * "wildmenumode()" function */ -static void f_wildmenumode(typval_T *argvars, typval_T *rettv) +static void f_wildmenumode(typval_T *argvars, typval_T *rettv, FunPtr fptr) { if (wild_menu_showing) rettv->vval.v_number = 1; } +/// "win_findbuf()" function +static void f_win_findbuf(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + rettv_list_alloc(rettv); + win_findbuf(argvars, rettv->vval.v_list); +} + +/// "win_getid()" function +static void f_win_getid(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + rettv->vval.v_number = win_getid(argvars); +} + +/// "win_gotoid()" function +static void f_win_gotoid(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + rettv->vval.v_number = win_gotoid(argvars); +} + +/// "win_id2tabwin()" function +static void f_win_id2tabwin(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + rettv_list_alloc(rettv); + win_id2tabwin(argvars, rettv->vval.v_list); +} + +/// "win_id2win()" function +static void f_win_id2win(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + rettv->vval.v_number = win_id2win(argvars); +} + /* * "winbufnr(nr)" function */ -static void f_winbufnr(typval_T *argvars, typval_T *rettv) +static void f_winbufnr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { win_T *wp; @@ -17167,7 +16816,7 @@ static void f_winbufnr(typval_T *argvars, typval_T *rettv) /* * "wincol()" function */ -static void f_wincol(typval_T *argvars, typval_T *rettv) +static void f_wincol(typval_T *argvars, typval_T *rettv, FunPtr fptr) { validate_cursor(); rettv->vval.v_number = curwin->w_wcol + 1; @@ -17176,7 +16825,7 @@ static void f_wincol(typval_T *argvars, typval_T *rettv) /* * "winheight(nr)" function */ -static void f_winheight(typval_T *argvars, typval_T *rettv) +static void f_winheight(typval_T *argvars, typval_T *rettv, FunPtr fptr) { win_T *wp; @@ -17190,7 +16839,7 @@ static void f_winheight(typval_T *argvars, typval_T *rettv) /* * "winline()" function */ -static void f_winline(typval_T *argvars, typval_T *rettv) +static void f_winline(typval_T *argvars, typval_T *rettv, FunPtr fptr) { validate_cursor(); rettv->vval.v_number = curwin->w_wrow + 1; @@ -17199,7 +16848,7 @@ static void f_winline(typval_T *argvars, typval_T *rettv) /* * "winnr()" function */ -static void f_winnr(typval_T *argvars, typval_T *rettv) +static void f_winnr(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int nr = 1; @@ -17210,7 +16859,7 @@ static void f_winnr(typval_T *argvars, typval_T *rettv) /* * "winrestcmd()" function */ -static void f_winrestcmd(typval_T *argvars, typval_T *rettv) +static void f_winrestcmd(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int winnr = 1; garray_T ga; @@ -17233,7 +16882,7 @@ static void f_winrestcmd(typval_T *argvars, typval_T *rettv) /* * "winrestview()" function */ -static void f_winrestview(typval_T *argvars, typval_T *rettv) +static void f_winrestview(typval_T *argvars, typval_T *rettv, FunPtr fptr) { dict_T *dict; @@ -17242,29 +16891,29 @@ static void f_winrestview(typval_T *argvars, typval_T *rettv) EMSG(_(e_invarg)); else { if (dict_find(dict, (char_u *)"lnum", -1) != NULL) { - curwin->w_cursor.lnum = get_dict_number(dict, (char_u *)"lnum"); + curwin->w_cursor.lnum = get_dict_number(dict, "lnum"); } if (dict_find(dict, (char_u *)"col", -1) != NULL) { - curwin->w_cursor.col = get_dict_number(dict, (char_u *)"col"); + curwin->w_cursor.col = get_dict_number(dict, "col"); } if (dict_find(dict, (char_u *)"coladd", -1) != NULL) { - curwin->w_cursor.coladd = get_dict_number(dict, (char_u *)"coladd"); + curwin->w_cursor.coladd = get_dict_number(dict, "coladd"); } if (dict_find(dict, (char_u *)"curswant", -1) != NULL) { - curwin->w_curswant = get_dict_number(dict, (char_u *)"curswant"); - curwin->w_set_curswant = FALSE; + curwin->w_curswant = get_dict_number(dict, "curswant"); + curwin->w_set_curswant = false; } if (dict_find(dict, (char_u *)"topline", -1) != NULL) { - set_topline(curwin, get_dict_number(dict, (char_u *)"topline")); + set_topline(curwin, get_dict_number(dict, "topline")); } if (dict_find(dict, (char_u *)"topfill", -1) != NULL) { - curwin->w_topfill = get_dict_number(dict, (char_u *)"topfill"); + curwin->w_topfill = get_dict_number(dict, "topfill"); } if (dict_find(dict, (char_u *)"leftcol", -1) != NULL) { - curwin->w_leftcol = get_dict_number(dict, (char_u *)"leftcol"); + curwin->w_leftcol = get_dict_number(dict, "leftcol"); } if (dict_find(dict, (char_u *)"skipcol", -1) != NULL) { - curwin->w_skipcol = get_dict_number(dict, (char_u *)"skipcol"); + curwin->w_skipcol = get_dict_number(dict, "skipcol"); } check_cursor(); @@ -17283,7 +16932,7 @@ static void f_winrestview(typval_T *argvars, typval_T *rettv) /* * "winsaveview()" function */ -static void f_winsaveview(typval_T *argvars, typval_T *rettv) +static void f_winsaveview(typval_T *argvars, typval_T *rettv, FunPtr fptr) { dict_T *dict; @@ -17387,7 +17036,7 @@ static char_u *save_tv_as_string(typval_T *tv, ssize_t *len, bool endnl) /* * "winwidth(nr)" function */ -static void f_winwidth(typval_T *argvars, typval_T *rettv) +static void f_winwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr) { win_T *wp; @@ -17399,14 +17048,14 @@ static void f_winwidth(typval_T *argvars, typval_T *rettv) } /// "wordcount()" function -static void f_wordcount(typval_T *argvars, typval_T *rettv) +static void f_wordcount(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv_dict_alloc(rettv); cursor_pos_info(rettv->vval.v_dict); } /// "writefile()" function -static void f_writefile(typval_T *argvars, typval_T *rettv) +static void f_writefile(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = 0; // Assuming success. @@ -17451,7 +17100,7 @@ static void f_writefile(typval_T *argvars, typval_T *rettv) /* * "xor(expr, expr)" function */ -static void f_xor(typval_T *argvars, typval_T *rettv) +static void f_xor(typval_T *argvars, typval_T *rettv, FunPtr fptr) { rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL) ^ get_tv_number_chk(&argvars[1], NULL); @@ -18437,7 +18086,7 @@ static void init_tv(typval_T *varp) * caller of incompatible types: it sets *denote to TRUE if "denote" * is not NULL or returns -1 otherwise. */ -static long get_tv_number(typval_T *varp) +long get_tv_number(typval_T *varp) { int error = FALSE; @@ -18533,7 +18182,7 @@ static linenr_T get_tv_lnum(typval_T *argvars) lnum = get_tv_number_chk(&argvars[0], NULL); if (lnum == 0) { /* no valid number, try using line() */ rettv.v_type = VAR_NUMBER; - f_line(argvars, &rettv); + f_line(argvars, &rettv, NULL); lnum = rettv.vval.v_number; clear_tv(&rettv); } @@ -20361,7 +20010,7 @@ void free_all_functions(void) int translated_function_exists(char_u *name) { if (builtin_function(name, -1)) { - return find_internal_func(name) >= 0; + return find_internal_func((char *)name) != NULL; } return find_func(name) != NULL; } @@ -21681,8 +21330,8 @@ void ex_oldfiles(exarg_T *eap) /* Assume "got_int" was set to truncate the listing. */ got_int = FALSE; - // File selection prompt on ":oldfiles!" - if (eap->forceit) { + // File selection prompt on ":browse oldfiles" + if (cmdmod.browse) { quit_more = false; nr = prompt_for_number(false); msg_starthere(); @@ -22060,6 +21709,7 @@ static inline TerminalJobData *common_job_init(char **argv, ufunc_T *on_exit, dict_T *self, bool pty, + bool rpc, bool detach, char *cwd) { @@ -22070,6 +21720,7 @@ static inline TerminalJobData *common_job_init(char **argv, data->on_exit = on_exit; data->self = self; data->events = queue_new_child(main_loop.events); + data->rpc = rpc; if (pty) { data->proc.pty = pty_process_init(&main_loop, data); } else { @@ -22089,7 +21740,9 @@ static inline TerminalJobData *common_job_init(char **argv, return data; } -/// Return true/false on success/failure. +/// common code for getting job callbacks for jobstart, termopen and rpcstart +/// +/// @return true/false on success/failure. static inline bool common_job_callbacks(dict_T *vopts, ufunc_T **on_stdout, ufunc_T **on_stderr, ufunc_T **on_exit) { @@ -22116,9 +21769,15 @@ static inline bool common_job_start(TerminalJobData *data, typval_T *rettv) Process *proc = (Process *)&data->proc; if (proc->type == kProcessTypePty && proc->detach) { EMSG2(_(e_invarg2), "terminal/pty job cannot be detached"); + xfree(data->proc.pty.term_name); + shell_free_argv(proc->argv); + free_term_job_data_event((void **)&data); return false; } + data->id = next_chan_id++; + pmap_put(uint64_t)(jobs, data->id, data); + data->refcount++; char *cmd = xstrdup(proc->argv[0]); if (!process_spawn(proc)) { @@ -22133,17 +21792,22 @@ static inline bool common_job_start(TerminalJobData *data, typval_T *rettv) } xfree(cmd); - data->id = current_job_id++; - wstream_init(proc->in, 0); - if (proc->out) { - rstream_init(proc->out, 0); - rstream_start(proc->out, on_job_stdout); + + if (data->rpc) { + // the rpc channel takes over the in and out streams + channel_from_process(proc, data->id); + } else { + wstream_init(proc->in, 0); + if (proc->out) { + rstream_init(proc->out, 0); + rstream_start(proc->out, on_job_stdout, data); + } } + if (proc->err) { rstream_init(proc->err, 0); - rstream_start(proc->err, on_job_stderr); + rstream_start(proc->err, on_job_stderr, data); } - pmap_put(uint64_t)(jobs, data->id, data); rettv->vval.v_number = data->id; return true; } @@ -22165,6 +21829,7 @@ static inline void free_term_job_data_event(void **argv) dict_unref(data->self); } queue_free(data->events); + pmap_del(uint64_t)(jobs, data->id); xfree(data); } @@ -22261,12 +21926,17 @@ static void on_process_exit(Process *proc, int status, void *d) snprintf(msg, sizeof msg, "\r\n[Process exited %d]", proc->status); terminal_close(data->term, msg); } + if (data->rpc) { + channel_process_exit(data->id, status); + } if (data->status_ptr) { *data->status_ptr = status; } process_job_event(data, data->on_exit, "exit", NULL, 0, status); + + term_job_data_decref(data); } static void term_write(char *buf, size_t size, void *d) @@ -22314,7 +21984,7 @@ static void term_job_data_decref(TerminalJobData *data) static void on_job_event(JobEvent *ev) { if (!ev->callback) { - goto end; + return; } typval_T argv[3]; @@ -22350,13 +22020,6 @@ static void on_job_event(JobEvent *ev) call_user_func(ev->callback, argc, argv, &rettv, curwin->w_cursor.lnum, curwin->w_cursor.lnum, ev->data->self); clear_tv(&rettv); - -end: - if (!ev->received) { - // exit event, safe to free job data now - pmap_del(uint64_t)(jobs, ev->data->id); - term_job_data_decref(ev->data); - } } static TerminalJobData *find_job(uint64_t id) diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua new file mode 100644 index 0000000000..3c371fc264 --- /dev/null +++ b/src/nvim/eval.lua @@ -0,0 +1,331 @@ +-- File containing table with all functions. +-- +-- Keys: +-- +-- args Number of arguments, list with maximum and minimum number of arguments +-- or list with a minimum number of arguments only. Defaults to zero +-- arguments. +-- func Name of the C function which implements the VimL function. Defaults to +-- `f_{funcname}`. + +local varargs = function(nr) + return {nr} +end + +return { + funcs={ + abs={args=1}, + acos={args=1, func="float_op_wrapper", data="&acos"}, -- WJMc + add={args=2}, + ['and']={args=2}, + api_info={}, + append={args=2}, + argc={}, + argidx={}, + arglistid={args={0, 2}}, + argv={args={0, 1}}, + asin={args=1, func="float_op_wrapper", data="&asin"}, -- WJMc + assert_equal={args={2, 3}}, + assert_exception={args={1, 2}}, + assert_fails={args={1, 2}}, + assert_false={args={1, 2}}, + assert_match={args={2, 3}}, + assert_notequal={args={2, 3}}, + assert_notmatch={args={2, 3}}, + assert_true={args={1, 2}}, + atan={args=1, func="float_op_wrapper", data="&atan"}, + atan2={args=2}, + browse={args=4}, + browsedir={args=2}, + bufexists={args=1}, + buffer_exists={args=1, func='f_bufexists'}, -- obsolete + buffer_name={args=1, func='f_bufname'}, -- obsolete + buffer_number={args=1, func='f_bufnr'}, -- obsolete + buflisted={args=1}, + bufloaded={args=1}, + bufname={args=1}, + bufnr={args={1, 2}}, + bufwinnr={args=1}, + byte2line={args=1}, + byteidx={args=2}, + byteidxcomp={args=2}, + call={args={2, 3}}, + ceil={args=1, func="float_op_wrapper", data="&ceil"}, + changenr={}, + char2nr={args={1, 2}}, + cindent={args=1}, + clearmatches={}, + col={args=1}, + complete={args=2}, + complete_add={args=1}, + complete_check={}, + confirm={args={1, 4}}, + copy={args=1}, + cos={args=1, func="float_op_wrapper", data="&cos"}, + cosh={args=1, func="float_op_wrapper", data="&cosh"}, + count={args={2, 4}}, + cscope_connection={args={0, 3}}, + cursor={args={1, 3}}, + deepcopy={args={1, 2}}, + delete={args={1,2}}, + dictwatcheradd={args=3}, + dictwatcherdel={args=3}, + did_filetype={}, + diff_filler={args=1}, + diff_hlID={args=2}, + empty={args=1}, + escape={args=2}, + eval={args=1}, + eventhandler={}, + executable={args=1}, + execute={args=1}, + exepath={args=1}, + exists={args=1}, + exp={args=1, func="float_op_wrapper", data="&exp"}, + expand={args={1, 3}}, + extend={args={2, 3}}, + feedkeys={args={1, 2}}, + file_readable={args=1, func='f_filereadable'}, -- obsolete + filereadable={args=1}, + filewritable={args=1}, + filter={args=2}, + finddir={args={1, 3}}, + findfile={args={1, 3}}, + float2nr={args=1}, + floor={args=1, func="float_op_wrapper", data="&floor"}, + fmod={args=2}, + fnameescape={args=1}, + fnamemodify={args=2}, + foldclosed={args=1}, + foldclosedend={args=1}, + foldlevel={args=1}, + foldtext={}, + foldtextresult={args=1}, + foreground={}, + ['function']={args=1}, + garbagecollect={args={0, 1}}, + get={args={2, 3}}, + getbufline={args={2, 3}}, + getbufvar={args={2, 3}}, + getchar={args={0, 1}}, + getcharmod={}, + getcharsearch={}, + getcmdline={}, + getcmdpos={}, + getcmdtype={}, + getcmdwintype={}, + getcompletion={args=2}, + getcurpos={}, + getcwd={args={0,2}}, + getfontname={args={0, 1}}, + getfperm={args=1}, + getfsize={args=1}, + getftime={args=1}, + getftype={args=1}, + getline={args={1, 2}}, + getloclist={args=1, func='f_getqflist'}, + getmatches={}, + getpid={}, + getpos={args=1}, + getqflist={}, + getreg={args={0, 3}}, + getregtype={args={0, 1}}, + gettabvar={args={2, 3}}, + gettabwinvar={args={3, 4}}, + getwinposx={}, + getwinposy={}, + getwinvar={args={2, 3}}, + glob={args={1, 4}}, + glob2regpat={args=1}, + globpath={args={2, 5}}, + has={args=1}, + has_key={args=2}, + haslocaldir={args={0,2}}, + hasmapto={args={1, 3}}, + highlightID={args=1, func='f_hlID'}, -- obsolete + highlight_exists={args=1, func='f_hlexists'}, -- obsolete + histadd={args=2}, + histdel={args={1, 2}}, + histget={args={1, 2}}, + histnr={args=1}, + hlID={args=1}, + hlexists={args=1}, + hostname={}, + iconv={args=3}, + indent={args=1}, + index={args={2, 4}}, + input={args={1, 3}}, + inputdialog={args={1, 3}}, + inputlist={args=1}, + inputrestore={}, + inputsave={}, + inputsecret={args={1, 2}}, + insert={args={2, 3}}, + invert={args=1}, + isdirectory={args=1}, + islocked={args=1}, + items={args=1}, + jobclose={args={1, 2}}, + jobpid={args=1}, + jobresize={args=3}, + jobsend={args=2}, + jobstart={args={1, 2}}, + jobstop={args=1}, + jobwait={args={1, 2}}, + join={args={1, 2}}, + json_decode={args=1}, + json_encode={args=1}, + keys={args=1}, + last_buffer_nr={}, -- obsolete + len={args=1}, + libcall={args=3}, + libcallnr={args=3}, + line={args=1}, + line2byte={args=1}, + lispindent={args=1}, + localtime={}, + log={args=1, func="float_op_wrapper", data="&log"}, + log10={args=1, func="float_op_wrapper", data="&log10"}, + map={args=2}, + maparg={args={1, 4}}, + mapcheck={args={1, 3}}, + match={args={2, 4}}, + matchadd={args={2, 5}}, + matchaddpos={args={2, 5}}, + matcharg={args=1}, + matchdelete={args=1}, + matchend={args={2, 4}}, + matchlist={args={2, 4}}, + matchstr={args={2, 4}}, + max={args=1}, + min={args=1}, + mkdir={args={1, 3}}, + mode={args={0, 1}}, + msgpackdump={args=1}, + msgpackparse={args=1}, + nextnonblank={args=1}, + nr2char={args={1, 2}}, + ['or']={args=2}, + pathshorten={args=1}, + pow={args=2}, + prevnonblank={args=1}, + printf={args=varargs(2)}, + pumvisible={}, + py3eval={args=1}, + pyeval={args=1}, + range={args={1, 3}}, + readfile={args={1, 3}}, + reltime={args={0, 2}}, + reltimefloat={args=1}, + reltimestr={args=1}, + remove={args={2, 3}}, + rename={args=2}, + ['repeat']={args=2}, + resolve={args=1}, + reverse={args=1}, + round={args=1, func="float_op_wrapper", data="&round"}, + rpcnotify={args=varargs(2)}, + rpcrequest={args=varargs(2)}, + rpcstart={args={1, 2}}, + rpcstop={args=1}, + screenattr={args=2}, + screenchar={args=2}, + screencol={}, + screenrow={}, + search={args={1, 4}}, + searchdecl={args={1, 3}}, + searchpair={args={3, 7}}, + searchpairpos={args={3, 7}}, + searchpos={args={1, 4}}, + serverlist={}, + serverstart={args={0, 1}}, + serverstop={args=1}, + setbufvar={args=3}, + setcharsearch={args=1}, + setcmdpos={args=1}, + setfperm={args=2}, + setline={args=2}, + setloclist={args={2, 4}}, + setmatches={args=1}, + setpos={args=2}, + setqflist={args={1, 3}}, + setreg={args={2, 3}}, + settabvar={args=3}, + settabwinvar={args=4}, + setwinvar={args=3}, + sha256={args=1}, + shellescape={args={1, 2}}, + shiftwidth={}, + simplify={args=1}, + sin={args=1, func="float_op_wrapper", data="&sin"}, + sinh={args=1, func="float_op_wrapper", data="&sinh"}, + sort={args={1, 3}}, + soundfold={args=1}, + spellbadword={args={0, 1}}, + spellsuggest={args={1, 3}}, + split={args={1, 3}}, + sqrt={args=1, func="float_op_wrapper", data="&sqrt"}, + str2float={args=1}, + str2nr={args={1, 2}}, + strchars={args={1,2}}, + strdisplaywidth={args={1, 2}}, + strftime={args={1, 2}}, + stridx={args={2, 3}}, + string={args=1}, + strlen={args=1}, + strpart={args={2, 3}}, + strridx={args={2, 3}}, + strtrans={args=1}, + strwidth={args=1}, + submatch={args={1, 2}}, + substitute={args=4}, + synID={args=3}, + synIDattr={args={2, 3}}, + synIDtrans={args=1}, + synconcealed={args=2}, + synstack={args=2}, + system={args={1, 2}}, + systemlist={args={1, 3}}, + tabpagebuflist={args={0, 1}}, + tabpagenr={args={0, 1}}, + tabpagewinnr={args={1, 2}}, + tagfiles={}, + taglist={args=1}, + tan={args=1, func="float_op_wrapper", data="&tan"}, + tanh={args=1, func="float_op_wrapper", data="&tanh"}, + tempname={}, + termopen={args={1, 2}}, + test={args=1}, + timer_start={args={2,3}}, + timer_stop={args=1}, + tolower={args=1}, + toupper={args=1}, + tr={args=3}, + trunc={args=1, func="float_op_wrapper", data="&trunc"}, + type={args=1}, + undofile={args=1}, + undotree={}, + uniq={args={1, 3}}, + values={args=1}, + virtcol={args=1}, + visualmode={args={0, 1}}, + wildmenumode={}, + win_findbuf={args=1}, + win_getid={args={0,2}}, + win_gotoid={args=1}, + win_id2tabwin={args=1}, + win_id2win={args=1}, + winbufnr={args=1}, + wincol={}, + winheight={args=1}, + winline={}, + winnr={args={0, 1}}, + winrestcmd={}, + winrestview={args=1}, + winsaveview={}, + winwidth={args=1}, + wordcount={}, + writefile={args={2, 3}}, + xor={args=2}, + }, +} diff --git a/src/nvim/event/process.c b/src/nvim/event/process.c index 317e40e43a..51f20b7eac 100644 --- a/src/nvim/event/process.c +++ b/src/nvim/event/process.c @@ -17,15 +17,14 @@ # include "event/process.c.generated.h" #endif -// {SIGNAL}_TIMEOUT is the time (in nanoseconds) that a process has to cleanly -// exit before we send SIGNAL to it +// Time (ns) for a process to exit cleanly before we send TERM/KILL. #define TERM_TIMEOUT 1000000000 #define KILL_TIMEOUT (TERM_TIMEOUT * 2) #define CLOSE_PROC_STREAM(proc, stream) \ do { \ if (proc->stream && !proc->stream->closed) { \ - stream_close(proc->stream, NULL); \ + stream_close(proc->stream, NULL, NULL); \ } \ } while (0) @@ -78,10 +77,8 @@ bool process_spawn(Process *proc) FUNC_ATTR_NONNULL_ALL return false; } - void *data = proc->data; - if (proc->in) { - stream_init(NULL, proc->in, -1, (uv_stream_t *)&proc->in->uv.pipe, data); + stream_init(NULL, proc->in, -1, (uv_stream_t *)&proc->in->uv.pipe); proc->in->events = proc->events; proc->in->internal_data = proc; proc->in->internal_close_cb = on_process_stream_close; @@ -89,7 +86,7 @@ bool process_spawn(Process *proc) FUNC_ATTR_NONNULL_ALL } if (proc->out) { - stream_init(NULL, proc->out, -1, (uv_stream_t *)&proc->out->uv.pipe, data); + stream_init(NULL, proc->out, -1, (uv_stream_t *)&proc->out->uv.pipe); proc->out->events = proc->events; proc->out->internal_data = proc; proc->out->internal_close_cb = on_process_stream_close; @@ -97,7 +94,7 @@ bool process_spawn(Process *proc) FUNC_ATTR_NONNULL_ALL } if (proc->err) { - stream_init(NULL, proc->err, -1, (uv_stream_t *)&proc->err->uv.pipe, data); + stream_init(NULL, proc->err, -1, (uv_stream_t *)&proc->err->uv.pipe); proc->err->events = proc->events; proc->err->internal_data = proc; proc->err->internal_close_cb = on_process_stream_close; @@ -373,7 +370,7 @@ static void flush_stream(Process *proc, Stream *stream) if (stream->read_cb) { // Stream callback could miss EOF handling if a child keeps the stream // open. - stream->read_cb(stream, stream->buffer, 0, stream->data, true); + stream->read_cb(stream, stream->buffer, 0, stream->cb_data, true); } break; } diff --git a/src/nvim/event/rstream.c b/src/nvim/event/rstream.c index a520143064..5126dfd84e 100644 --- a/src/nvim/event/rstream.c +++ b/src/nvim/event/rstream.c @@ -17,21 +17,19 @@ # include "event/rstream.c.generated.h" #endif -void rstream_init_fd(Loop *loop, Stream *stream, int fd, size_t bufsize, - void *data) +void rstream_init_fd(Loop *loop, Stream *stream, int fd, size_t bufsize) FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2) { - stream_init(loop, stream, fd, NULL, data); + stream_init(loop, stream, fd, NULL); rstream_init(stream, bufsize); } -void rstream_init_stream(Stream *stream, uv_stream_t *uvstream, size_t bufsize, - void *data) +void rstream_init_stream(Stream *stream, uv_stream_t *uvstream, size_t bufsize) FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2) { - stream_init(NULL, stream, -1, uvstream, data); + stream_init(NULL, stream, -1, uvstream); rstream_init(stream, bufsize); } @@ -48,10 +46,11 @@ void rstream_init(Stream *stream, size_t bufsize) /// Starts watching for events from a `Stream` instance. /// /// @param stream The `Stream` instance -void rstream_start(Stream *stream, stream_read_cb cb) +void rstream_start(Stream *stream, stream_read_cb cb, void *data) FUNC_ATTR_NONNULL_ARG(1) { stream->read_cb = cb; + stream->cb_data = data; if (stream->uvstream) { uv_read_start(stream->uvstream, alloc_cb, read_cb); } else { @@ -81,7 +80,7 @@ static void on_rbuffer_nonfull(RBuffer *buf, void *data) { Stream *stream = data; assert(stream->read_cb); - rstream_start(stream, stream->read_cb); + rstream_start(stream, stream->read_cb, stream->cb_data); } // Callbacks used by libuv @@ -179,7 +178,7 @@ static void read_event(void **argv) if (stream->read_cb) { size_t count = (uintptr_t)argv[1]; bool eof = (uintptr_t)argv[2]; - stream->read_cb(stream, stream->buffer, count, stream->data, eof); + stream->read_cb(stream, stream->buffer, count, stream->cb_data, eof); } stream->pending_reqs--; if (stream->closed && !stream->pending_reqs) { diff --git a/src/nvim/event/socket.c b/src/nvim/event/socket.c index cdaf40849b..8f9327f3d4 100644 --- a/src/nvim/event/socket.c +++ b/src/nvim/event/socket.c @@ -113,7 +113,7 @@ int socket_watcher_start(SocketWatcher *watcher, int backlog, socket_cb cb) return 0; } -int socket_watcher_accept(SocketWatcher *watcher, Stream *stream, void *data) +int socket_watcher_accept(SocketWatcher *watcher, Stream *stream) FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2) { uv_stream_t *client; @@ -133,7 +133,7 @@ int socket_watcher_accept(SocketWatcher *watcher, Stream *stream, void *data) return result; } - stream_init(NULL, stream, -1, client, data); + stream_init(NULL, stream, -1, client); return 0; } diff --git a/src/nvim/event/stream.c b/src/nvim/event/stream.c index 33404158cf..26083c20f4 100644 --- a/src/nvim/event/stream.c +++ b/src/nvim/event/stream.c @@ -30,8 +30,7 @@ int stream_set_blocking(int fd, bool blocking) return retval; } -void stream_init(Loop *loop, Stream *stream, int fd, uv_stream_t *uvstream, - void *data) +void stream_init(Loop *loop, Stream *stream, int fd, uv_stream_t *uvstream) FUNC_ATTR_NONNULL_ARG(2) { stream->uvstream = uvstream; @@ -58,7 +57,6 @@ void stream_init(Loop *loop, Stream *stream, int fd, uv_stream_t *uvstream, stream->uvstream->data = stream; } - stream->data = data; stream->internal_data = NULL; stream->fpos = 0; stream->curmem = 0; @@ -74,12 +72,13 @@ void stream_init(Loop *loop, Stream *stream, int fd, uv_stream_t *uvstream, stream->num_bytes = 0; } -void stream_close(Stream *stream, stream_close_cb on_stream_close) +void stream_close(Stream *stream, stream_close_cb on_stream_close, void *data) FUNC_ATTR_NONNULL_ARG(1) { assert(!stream->closed); stream->closed = true; stream->close_cb = on_stream_close; + stream->close_cb_data = data; if (!stream->pending_reqs) { stream_close_handle(stream); @@ -103,7 +102,7 @@ static void close_cb(uv_handle_t *handle) rbuffer_free(stream->buffer); } if (stream->close_cb) { - stream->close_cb(stream, stream->data); + stream->close_cb(stream, stream->close_cb_data); } if (stream->internal_close_cb) { stream->internal_close_cb(stream, stream->internal_data); diff --git a/src/nvim/event/stream.h b/src/nvim/event/stream.h index ad4e24775b..a176fac1c0 100644 --- a/src/nvim/event/stream.h +++ b/src/nvim/event/stream.h @@ -44,13 +44,14 @@ struct stream { uv_file fd; stream_read_cb read_cb; stream_write_cb write_cb; + void *cb_data; stream_close_cb close_cb, internal_close_cb; + void *close_cb_data, *internal_data; size_t fpos; size_t curmem; size_t maxmem; size_t pending_reqs; size_t num_bytes; - void *data, *internal_data; bool closed; Queue *events; }; diff --git a/src/nvim/event/wstream.c b/src/nvim/event/wstream.c index 8028e35e6b..fc7aad8eb9 100644 --- a/src/nvim/event/wstream.c +++ b/src/nvim/event/wstream.c @@ -22,19 +22,17 @@ typedef struct { # include "event/wstream.c.generated.h" #endif -void wstream_init_fd(Loop *loop, Stream *stream, int fd, size_t maxmem, - void *data) +void wstream_init_fd(Loop *loop, Stream *stream, int fd, size_t maxmem) FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2) { - stream_init(loop, stream, fd, NULL, data); + stream_init(loop, stream, fd, NULL); wstream_init(stream, maxmem); } -void wstream_init_stream(Stream *stream, uv_stream_t *uvstream, size_t maxmem, - void *data) +void wstream_init_stream(Stream *stream, uv_stream_t *uvstream, size_t maxmem) FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2) { - stream_init(NULL, stream, -1, uvstream, data); + stream_init(NULL, stream, -1, uvstream); wstream_init(stream, maxmem); } @@ -54,10 +52,11 @@ void wstream_init(Stream *stream, size_t maxmem) /// /// @param stream The `Stream` instance /// @param cb The callback -void wstream_set_write_cb(Stream *stream, stream_write_cb cb) - FUNC_ATTR_NONNULL_ALL +void wstream_set_write_cb(Stream *stream, stream_write_cb cb, void *data) + FUNC_ATTR_NONNULL_ARG(1, 2) { stream->write_cb = cb; + stream->cb_data = data; } /// Queues data for writing to the backing file descriptor of a `Stream` @@ -138,7 +137,7 @@ static void write_cb(uv_write_t *req, int status) wstream_release_wbuffer(data->buffer); if (data->stream->write_cb) { - data->stream->write_cb(data->stream, data->stream->data, status); + data->stream->write_cb(data->stream, data->stream->cb_data, status); } data->stream->pending_reqs--; diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 5de9ac0523..c36c3a7b0e 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -64,6 +64,24 @@ */ typedef struct sign sign_T; +/// Case matching style to use for :substitute +typedef enum { + kSubHonorOptions = 0, ///< Honor the user's 'ignorecase'/'smartcase' options + kSubIgnoreCase, ///< Ignore case of the search + kSubMatchCase, ///< Match case of the search +} SubIgnoreType; + +/// Flags kept between calls to :substitute. +typedef struct { + bool do_all; ///< do multiple substitutions per line + bool do_ask; ///< ask for confirmation + bool do_count; ///< count only + bool do_error; ///< if false, ignore errors + bool do_print; ///< print last line with subs + bool do_list; ///< list last line with subs + bool do_number; ///< list last line with line nr + SubIgnoreType do_ic; ///< ignore case flag +} subflags_T; #ifdef INCLUDE_GENERATED_DECLARATIONS # include "ex_cmds.c.generated.h" @@ -1693,11 +1711,11 @@ int do_write(exarg_T *eap) goto theend; } - /* If 'filetype' was empty try detecting it now. */ + // If 'filetype' was empty try detecting it now. if (*curbuf->b_p_ft == NUL) { - if (au_has_group((char_u *)"filetypedetect")) - (void)do_doautocmd((char_u *)"filetypedetect BufRead", - TRUE); + if (au_has_group((char_u *)"filetypedetect")) { + (void)do_doautocmd((char_u *)"filetypedetect BufRead", true, NULL); + } do_modelines(0); } @@ -2064,6 +2082,7 @@ do_ecmd ( char_u *command = NULL; int did_get_winopts = FALSE; int readfile_flags = 0; + bool did_inc_redrawing_disabled = false; if (eap != NULL) command = eap->do_ecmd_cmd; @@ -2300,6 +2319,11 @@ do_ecmd ( oldbuf = (flags & ECMD_OLDBUF); } + // Don't redraw until the cursor is in the right line, otherwise + // autocommands may cause ml_get errors. + RedrawingDisabled++; + did_inc_redrawing_disabled = true; + buf = curbuf; if ((flags & ECMD_SET_HELP) || keep_help_flag) { prepare_help_buffer(); @@ -2376,8 +2400,6 @@ do_ecmd ( /* * If we get here we are sure to start editing */ - /* don't redraw until the cursor is in the right line */ - ++RedrawingDisabled; /* Assume success now */ retval = OK; @@ -2529,7 +2551,8 @@ do_ecmd ( if (curbuf->b_kmap_state & KEYMAP_INIT) (void)keymap_init(); - --RedrawingDisabled; + RedrawingDisabled--; + did_inc_redrawing_disabled = false; if (!skip_redraw) { n = p_so; if (topline == 0 && command == NULL) @@ -2548,8 +2571,12 @@ do_ecmd ( theend: - if (did_set_swapcommand) + if (did_inc_redrawing_disabled) { + RedrawingDisabled--; + } + if (did_set_swapcommand) { set_vim_var_string(VV_SWAPCOMMAND, NULL, -1); + } xfree(free_fname); return retval; } @@ -2901,6 +2928,159 @@ void sub_set_replacement(SubReplacementString sub) old_sub = sub; } +/// Recognize ":%s/\n//" and turn it into a join command, which is much +/// more efficient. +/// +/// @param[in] eap Ex arguments +/// @param[in] pat Search pattern +/// @param[in] sub Replacement string +/// @param[in] cmd Command from :s_flags +/// +/// @returns true if :substitute can be replaced with a join command +static bool sub_joining_lines(exarg_T *eap, char_u *pat, + char_u *sub, char_u *cmd) + FUNC_ATTR_NONNULL_ARG(1, 3, 4) +{ + // TODO(vim): find a generic solution to make line-joining operations more + // efficient, avoid allocating a string that grows in size. + if (pat != NULL + && strcmp((const char *)pat, "\\n") == 0 + && *sub == NUL + && (*cmd == NUL || (cmd[1] == NUL + && (*cmd == 'g' + || *cmd == 'l' + || *cmd == 'p' + || *cmd == '#')))) { + curwin->w_cursor.lnum = eap->line1; + if (*cmd == 'l') { + eap->flags = EXFLAG_LIST; + } else if (*cmd == '#') { + eap->flags = EXFLAG_NR; + } else if (*cmd == 'p') { + eap->flags = EXFLAG_PRINT; + } + + // The number of lines joined is the number of lines in the range + linenr_T joined_lines_count = eap->line2 - eap->line1 + 1 + // plus one extra line if not at the end of file. + + (eap->line2 < curbuf->b_ml.ml_line_count ? 1 : 0); + if (joined_lines_count > 1) { + do_join(joined_lines_count, FALSE, TRUE, FALSE, true); + sub_nsubs = joined_lines_count - 1; + sub_nlines = 1; + do_sub_msg(false); + ex_may_print(eap); + } + + if (!cmdmod.keeppatterns) { + save_re_pat(RE_SUBST, pat, p_magic); + } + add_to_history(HIST_SEARCH, pat, TRUE, NUL); + + return true; + } + + return false; +} + +/// Allocate memory to store the replacement text for :substitute. +/// +/// Slightly more memory that is strictly necessary is allocated to reduce the +/// frequency of memory (re)allocation. +/// +/// @param[in,out] new_start pointer to the memory for the replacement text +/// @param[in] needed_len amount of memory needed +/// +/// @returns pointer to the end of the allocated memory +static char_u *sub_grow_buf(char_u **new_start, int needed_len) + FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_RET +{ + int new_start_len = 0; + char_u *new_end; + if (*new_start == NULL) { + // Get some space for a temporary buffer to do the + // substitution into (and some extra space to avoid + // too many calls to xmalloc()/free()). + new_start_len = needed_len + 50; + *new_start = xmalloc(new_start_len); + **new_start = NUL; + new_end = *new_start; + } else { + // Check if the temporary buffer is long enough to do the + // substitution into. If not, make it larger (with a bit + // extra to avoid too many calls to xmalloc()/free()). + size_t len = STRLEN(*new_start); + needed_len += len; + if (needed_len > new_start_len) { + new_start_len = needed_len + 50; + *new_start = xrealloc(*new_start, new_start_len); + } + new_end = *new_start + len; + } + + return new_end; +} + +/// Parse cmd string for :substitute's {flags} and update subflags accordingly +/// +/// @param[in] cmd command string +/// @param[in,out] subflags current flags defined for the :substitute command +/// @param[in,out] which_pat pattern type from which to get default search +/// +/// @returns pointer to the end of the flags, which may be the end of the string +static char_u *sub_parse_flags(char_u *cmd, subflags_T *subflags, + int *which_pat) + FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET +{ + // Find trailing options. When '&' is used, keep old options. + if (*cmd == '&') { + cmd++; + } else { + subflags->do_all = p_gd; + subflags->do_ask = false; + subflags->do_error = true; + subflags->do_print = false; + subflags->do_count = false; + subflags->do_number = false; + subflags->do_ic = kSubHonorOptions; + } + while (*cmd) { + // Note that 'g' and 'c' are always inverted. + // 'r' is never inverted. + if (*cmd == 'g') { + subflags->do_all = !subflags->do_all; + } else if (*cmd == 'c') { + subflags->do_ask = !subflags->do_ask; + } else if (*cmd == 'n') { + subflags->do_count = true; + } else if (*cmd == 'e') { + subflags->do_error = !subflags->do_error; + } else if (*cmd == 'r') { // use last used regexp + *which_pat = RE_LAST; + } else if (*cmd == 'p') { + subflags->do_print = true; + } else if (*cmd == '#') { + subflags->do_print = true; + subflags->do_number = true; + } else if (*cmd == 'l') { + subflags->do_print = true; + subflags->do_list = true; + } else if (*cmd == 'i') { // ignore case + subflags->do_ic = kSubIgnoreCase; + } else if (*cmd == 'I') { // don't ignore case + subflags->do_ic = kSubMatchCase; + } else { + break; + } + cmd++; + } + if (subflags->do_count) { + subflags->do_ask = false; + } + + return cmd; +} + /* do_sub() * * Perform a substitution from line eap->line1 to line eap->line2 using the @@ -2912,41 +3092,35 @@ void sub_set_replacement(SubReplacementString sub) */ void do_sub(exarg_T *eap) { - linenr_T lnum; long i = 0; regmmatch_T regmatch; - static int do_all = FALSE; /* do multiple substitutions per line */ - static int do_ask = FALSE; /* ask for confirmation */ - static bool do_count = false; /* count only */ - static int do_error = TRUE; /* if false, ignore errors */ - static int do_print = FALSE; /* print last line with subs. */ - static int do_list = FALSE; /* list last line with subs. */ - static int do_number = FALSE; /* list last line with line nr*/ - static int do_ic = 0; /* ignore case flag */ - int save_do_all; // remember user specified 'g' flag - int save_do_ask; // remember user specified 'c' flag - char_u *pat = NULL, *sub = NULL; /* init for GCC */ + static subflags_T subflags = { + .do_all = false, + .do_ask = false, + .do_count = false, + .do_error = true, + .do_print = false, + .do_list = false, + .do_number = false, + .do_ic = kSubHonorOptions + }; + char_u *pat = NULL, *sub = NULL; // init for GCC int delimiter; int sublen; - int got_quit = FALSE; - int got_match = FALSE; - int temp; + int got_quit = false; + int got_match = false; int which_pat; - char_u *cmd; - int save_State; - linenr_T first_line = 0; /* first changed line */ - linenr_T last_line= 0; /* below last changed line AFTER the - * change */ + char_u *cmd = eap->arg; + linenr_T first_line = 0; // first changed line + linenr_T last_line= 0; // below last changed line AFTER the + // change linenr_T old_line_count = curbuf->b_ml.ml_line_count; - linenr_T line2; - long nmatch; /* number of lines in match */ - char_u *sub_firstline; /* allocated copy of first sub line */ - int endcolumn = FALSE; /* cursor in last column when done */ + char_u *sub_firstline; // allocated copy of first sub line + bool endcolumn = false; // cursor in last column when done pos_T old_cursor = curwin->w_cursor; int start_nsubs; int save_ma = 0; - cmd = eap->arg; if (!global_busy) { sub_nsubs = 0; sub_nlines = 0; @@ -3028,104 +3202,20 @@ void do_sub(exarg_T *eap) endcolumn = (curwin->w_curswant == MAXCOL); } - // Recognize ":%s/\n//" and turn it into a join command, which is much - // more efficient. - // TODO: find a generic solution to make line-joining operations more - // efficient, avoid allocating a string that grows in size. - if (pat != NULL - && strcmp((const char *)pat, "\\n") == 0 - && *sub == NUL - && (*cmd == NUL || (cmd[1] == NUL - && (*cmd == 'g' - || *cmd == 'l' - || *cmd == 'p' - || *cmd == '#')))) { - curwin->w_cursor.lnum = eap->line1; - if (*cmd == 'l') { - eap->flags = EXFLAG_LIST; - } else if (*cmd == '#') { - eap->flags = EXFLAG_NR; - } else if (*cmd == 'p') { - eap->flags = EXFLAG_PRINT; - } - - // The number of lines joined is the number of lines in the range - linenr_T joined_lines_count = eap->line2 - eap->line1 + 1 - // plus one extra line if not at the end of file. - + (eap->line2 < curbuf->b_ml.ml_line_count ? 1 : 0); - if (joined_lines_count > 1) { - do_join(joined_lines_count, FALSE, TRUE, FALSE, true); - sub_nsubs = joined_lines_count - 1; - sub_nlines = 1; - do_sub_msg(false); - ex_may_print(eap); - } - - if (!cmdmod.keeppatterns) { - save_re_pat(RE_SUBST, pat, p_magic); - } - add_to_history(HIST_SEARCH, pat, TRUE, NUL); - + if (sub_joining_lines(eap, pat, sub, cmd)) { return; } - /* - * Find trailing options. When '&' is used, keep old options. - */ - if (*cmd == '&') { - ++cmd; - } else { - // default is global on - do_all = p_gd ? TRUE : FALSE; - - do_ask = FALSE; - do_error = TRUE; - do_print = FALSE; - do_count = false; - do_number = FALSE; - do_ic = 0; - } - while (*cmd) { - // Note that 'g' and 'c' are always inverted. - // 'r' is never inverted. - if (*cmd == 'g') - do_all = !do_all; - else if (*cmd == 'c') - do_ask = !do_ask; - else if (*cmd == 'n') - do_count = true; - else if (*cmd == 'e') - do_error = !do_error; - else if (*cmd == 'r') /* use last used regexp */ - which_pat = RE_LAST; - else if (*cmd == 'p') - do_print = TRUE; - else if (*cmd == '#') { - do_print = TRUE; - do_number = TRUE; - } else if (*cmd == 'l') { - do_print = TRUE; - do_list = TRUE; - } else if (*cmd == 'i') /* ignore case */ - do_ic = 'i'; - else if (*cmd == 'I') /* don't ignore case */ - do_ic = 'I'; - else - break; - ++cmd; - } - if (do_count) { - do_ask = FALSE; - } + cmd = sub_parse_flags(cmd, &subflags, &which_pat); - save_do_all = do_all; - save_do_ask = do_ask; + bool save_do_all = subflags.do_all; // remember user specified 'g' flag + bool save_do_ask = subflags.do_ask; // remember user specified 'c' flag // check for a trailing count cmd = skipwhite(cmd); if (ascii_isdigit(*cmd)) { i = getdigits_long(&cmd); - if (i <= 0 && !eap->skip && do_error) { + if (i <= 0 && !eap->skip && subflags.do_error) { EMSG(_(e_zerocount)); return; } @@ -3150,24 +3240,25 @@ void do_sub(exarg_T *eap) if (eap->skip) /* not executing commands, only parsing */ return; - if (!do_count && !MODIFIABLE(curbuf)) { - /* Substitution is not allowed in non-'modifiable' buffer */ + if (!subflags.do_count && !MODIFIABLE(curbuf)) { + // Substitution is not allowed in non-'modifiable' buffer EMSG(_(e_modifiable)); return; } - if (search_regcomp(pat, RE_SUBST, which_pat, SEARCH_HIS, - ®match) == FAIL) { - if (do_error) + if (search_regcomp(pat, RE_SUBST, which_pat, SEARCH_HIS, ®match) == FAIL) { + if (subflags.do_error) { EMSG(_(e_invcmd)); + } return; } - /* the 'i' or 'I' flag overrules 'ignorecase' and 'smartcase' */ - if (do_ic == 'i') - regmatch.rmm_ic = TRUE; - else if (do_ic == 'I') - regmatch.rmm_ic = FALSE; + // the 'i' or 'I' flag overrules 'ignorecase' and 'smartcase' + if (subflags.do_ic == kSubIgnoreCase) { + regmatch.rmm_ic = true; + } else if (subflags.do_ic == kSubMatchCase) { + regmatch.rmm_ic = false; + } sub_firstline = NULL; @@ -3179,29 +3270,25 @@ void do_sub(exarg_T *eap) if (!(sub[0] == '\\' && sub[1] == '=')) sub = regtilde(sub, p_magic); - /* - * Check for a match on each line. - */ - line2 = eap->line2; - for (lnum = eap->line1; lnum <= line2 && !(got_quit - || aborting() - ); ++lnum) { - nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, - (colnr_T)0, NULL); + // Check for a match on each line. + linenr_T line2 = eap->line2; + for (linenr_T lnum = eap->line1; + lnum <= line2 && !(got_quit || aborting()); + lnum++) { + long nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, + (colnr_T)0, NULL); if (nmatch) { colnr_T copycol; colnr_T matchcol; colnr_T prev_matchcol = MAXCOL; char_u *new_end, *new_start = NULL; - unsigned new_start_len = 0; char_u *p1; int did_sub = FALSE; int lastone; - int len, copy_len, needed_len; - long nmatch_tl = 0; /* nr of lines matched below lnum */ - int do_again; /* do it again after joining lines */ - int skip_match = FALSE; - linenr_T sub_firstlnum; /* nr of first sub line */ + long nmatch_tl = 0; // nr of lines matched below lnum + int do_again; // do it again after joining lines + int skip_match = false; + linenr_T sub_firstlnum; // nr of first sub line /* * The new text is build up step by step, to avoid too much @@ -3241,8 +3328,7 @@ void do_sub(exarg_T *eap) * accordingly. * * The new text is built up in new_start[]. It has some extra - * room to avoid using xmalloc()/free() too often. new_start_len is - * the length of the allocated memory at new_start. + * room to avoid using xmalloc()/free() too often. * * Make a copy of the old line, so it won't be taken away when * updating the screen or handling a multi-line match. The "old_" @@ -3261,9 +3347,9 @@ void do_sub(exarg_T *eap) /* * Loop until nothing more to replace in this line. * 1. Handle match with empty string. - * 2. If do_ask is set, ask for confirmation. + * 2. If subflags.do_ask is set, ask for confirmation. * 3. substitute the string. - * 4. if do_all is set, find next match + * 4. if subflags.do_all is set, find next match * 5. break if there isn't another match in this line */ for (;; ) { @@ -3314,15 +3400,13 @@ void do_sub(exarg_T *eap) matchcol = regmatch.endpos[0].col; prev_matchcol = matchcol; - /* - * 2. If do_count is set only increase the counter. - * If do_ask is set, ask for confirmation. - */ - if (do_count) { - /* For a multi-line match, put matchcol at the NUL at - * the end of the line and set nmatch to one, so that - * we continue looking for a match on the next line. - * Avoids that ":s/\nB\@=//gc" get stuck. */ + // 2. If subflags.do_count is set only increase the counter. + // If do_ask is set, ask for confirmation. + if (subflags.do_count) { + // For a multi-line match, put matchcol at the NUL at + // the end of the line and set nmatch to one, so that + // we continue looking for a match on the next line. + // Avoids that ":s/\nB\@=//gc" get stuck. if (nmatch > 1) { matchcol = (colnr_T)STRLEN(sub_firstline); nmatch = 1; @@ -3336,12 +3420,12 @@ void do_sub(exarg_T *eap) goto skip; } - if (do_ask) { + if (subflags.do_ask) { int typed = 0; /* change State to CONFIRM, so that the mouse works * properly */ - save_State = State; + int save_State = State; State = CONFIRM; setmouse(); /* disable mouse in xterm */ curwin->w_cursor.col = regmatch.startpos[0].col; @@ -3354,17 +3438,17 @@ void do_sub(exarg_T *eap) /* * Loop until 'y', 'n', 'q', CTRL-E or CTRL-Y typed. */ - while (do_ask) { + while (subflags.do_ask) { if (exmode_active) { char_u *resp; colnr_T sc, ec; - print_line_no_prefix(lnum, do_number, do_list); + print_line_no_prefix(lnum, subflags.do_number, subflags.do_list); getvcol(curwin, &curwin->w_cursor, &sc, NULL, NULL); curwin->w_cursor.col = regmatch.endpos[0].col - 1; getvcol(curwin, &curwin->w_cursor, NULL, NULL, &ec); - if (do_number || curwin->w_p_nu) { + if (subflags.do_number || curwin->w_p_nu) { int numw = number_width(curwin) + 1; sc += numw; ec += numw; @@ -3388,7 +3472,7 @@ void do_sub(exarg_T *eap) curwin->w_p_fen = FALSE; /* Invert the matched string. * Remove the inversion afterwards. */ - temp = RedrawingDisabled; + int temp = RedrawingDisabled; RedrawingDisabled = 0; if (new_start != NULL) { @@ -3468,13 +3552,13 @@ void do_sub(exarg_T *eap) if (typed == 'y') break; if (typed == 'l') { - /* last: replace and then stop */ - do_all = FALSE; + // last: replace and then stop + subflags.do_all = false; line2 = lnum; break; } if (typed == 'a') { - do_ask = FALSE; + subflags.do_ask = false; break; } if (typed == Ctrl_E) @@ -3510,19 +3594,26 @@ void do_sub(exarg_T *eap) /* * 3. substitute the string. */ - if (do_count) { - /* prevent accidentally changing the buffer by a function */ + if (subflags.do_count) { + // prevent accidentally changing the buffer by a function save_ma = curbuf->b_p_ma; - curbuf->b_p_ma = FALSE; + curbuf->b_p_ma = false; sandbox++; } - /* get length of substitution part */ + // Save flags for recursion. They can change for e.g. + // :s/^/\=execute("s#^##gn") + subflags_T subflags_save = subflags; + // get length of substitution part sublen = vim_regsub_multi(®match, - sub_firstlnum - regmatch.startpos[0].lnum, - sub, sub_firstline, FALSE, p_magic, TRUE); - if (do_count) { + sub_firstlnum - regmatch.startpos[0].lnum, + sub, sub_firstline, false, p_magic, true); + // Don't keep flags set by a recursive call + subflags = subflags_save; + if (subflags.do_count) { curbuf->b_p_ma = save_ma; - sandbox--; + if (sandbox > 0) { + sandbox--; + } goto skip; } @@ -3545,33 +3636,10 @@ void do_sub(exarg_T *eap) p1 = ml_get(sub_firstlnum + nmatch - 1); nmatch_tl += nmatch - 1; } - copy_len = regmatch.startpos[0].col - copycol; - needed_len = copy_len + ((unsigned)STRLEN(p1) - - regmatch.endpos[0].col) + sublen + 1; - if (new_start == NULL) { - /* - * Get some space for a temporary buffer to do the - * substitution into (and some extra space to avoid - * too many calls to xmalloc()/free()). - */ - new_start_len = needed_len + 50; - new_start = xmalloc(new_start_len); - *new_start = NUL; - new_end = new_start; - } else { - /* - * Check if the temporary buffer is long enough to do the - * substitution into. If not, make it larger (with a bit - * extra to avoid too many calls to xmalloc()/free()). - */ - len = (unsigned)STRLEN(new_start); - needed_len += len; - if (needed_len > (int)new_start_len) { - new_start_len = needed_len + 50; - new_start = xrealloc(new_start, new_start_len); - } - new_end = new_start + len; - } + size_t copy_len = regmatch.startpos[0].col - copycol; + new_end = sub_grow_buf(&new_start, + copy_len + (STRLEN(p1) - regmatch.endpos[0].col) + + sublen + 1); /* * copy the text up to the part that matched @@ -3595,11 +3663,12 @@ void do_sub(exarg_T *eap) sub_firstlnum += nmatch - 1; xfree(sub_firstline); sub_firstline = vim_strsave(ml_get(sub_firstlnum)); - /* When going beyond the last line, stop substituting. */ - if (sub_firstlnum <= line2) - do_again = TRUE; - else - do_all = FALSE; + // When going beyond the last line, stop substituting. + if (sub_firstlnum <= line2) { + do_again = true; + } else { + subflags.do_all = false; + } } /* Remember next character to be copied. */ @@ -3630,11 +3699,12 @@ void do_sub(exarg_T *eap) ml_append(lnum - 1, new_start, (colnr_T)(p1 - new_start + 1), FALSE); mark_adjust(lnum + 1, (linenr_T)MAXLNUM, 1L, 0L); - if (do_ask) + if (subflags.do_ask) { appended_lines(lnum - 1, 1L); - else { - if (first_line == 0) + } else { + if (first_line == 0) { first_line = lnum; + } last_line = lnum + 1; } /* All line numbers increase. */ @@ -3651,12 +3721,10 @@ void do_sub(exarg_T *eap) p1 += (*mb_ptr2len)(p1) - 1; } - /* - * 4. If do_all is set, find next match. - * Prevent endless loop with patterns that match empty - * strings, e.g. :s/$/pat/g or :s/[a-z]* /(&)/g. - * But ":s/\n/#/" is OK. - */ + // 4. If subflags.do_all is set, find next match. + // Prevent endless loop with patterns that match empty + // strings, e.g. :s/$/pat/g or :s/[a-z]* /(&)/g. + // But ":s/\n/#/" is OK. skip: /* We already know that we did the last subst when we are at * the end of the line, except that a pattern like @@ -3667,7 +3735,7 @@ skip: || got_int || got_quit || lnum > line2 - || !(do_all || do_again) + || !(subflags.do_all || do_again) || (sub_firstline[matchcol] == NUL && nmatch <= 1 && !re_multiline(regmatch.regprog))); nmatch = -1; @@ -3717,21 +3785,23 @@ skip: for (i = 0; i < nmatch_tl; ++i) ml_delete(lnum, (int)FALSE); mark_adjust(lnum, lnum + nmatch_tl - 1, - (long)MAXLNUM, -nmatch_tl); - if (do_ask) + (long)MAXLNUM, -nmatch_tl); + if (subflags.do_ask) { deleted_lines(lnum, nmatch_tl); - --lnum; - line2 -= nmatch_tl; /* nr of lines decreases */ + } + lnum--; + line2 -= nmatch_tl; // nr of lines decreases nmatch_tl = 0; } /* When asking, undo is saved each time, must also set * changed flag each time. */ - if (do_ask) + if (subflags.do_ask) { changed_bytes(lnum, 0); - else { - if (first_line == 0) + } else { + if (first_line == 0) { first_line = lnum; + } last_line = lnum + 1; } @@ -3784,9 +3854,10 @@ skip: xfree(sub_firstline); /* may have to free allocated copy of the line */ - /* ":s/pat//n" doesn't move the cursor */ - if (do_count) + // ":s/pat//n" doesn't move the cursor + if (subflags.do_count) { curwin->w_cursor = old_cursor; + } if (sub_nsubs > start_nsubs) { /* Set the '[ and '] marks. */ @@ -3795,28 +3866,37 @@ skip: curbuf->b_op_start.col = curbuf->b_op_end.col = 0; if (!global_busy) { - if (!do_ask) { /* when interactive leave cursor on the match */ - if (endcolumn) + // when interactive leave cursor on the match + if (!subflags.do_ask) { + if (endcolumn) { coladvance((colnr_T)MAXCOL); - else + } else { beginline(BL_WHITE | BL_FIX); + } } - if (!do_sub_msg(do_count) && do_ask) + if (!do_sub_msg(subflags.do_count) && subflags.do_ask) { MSG(""); - } else - global_need_beginline = TRUE; - if (do_print) - print_line(curwin->w_cursor.lnum, do_number, do_list); + } + } else { + global_need_beginline = true; + } + if (subflags.do_print) { + print_line(curwin->w_cursor.lnum, subflags.do_number, subflags.do_list); + } } else if (!global_busy) { - if (got_int) /* interrupted */ + if (got_int) { + // interrupted EMSG(_(e_interr)); - else if (got_match) /* did find something but nothing substituted */ + } else if (got_match) { + // did find something but nothing substituted MSG(""); - else if (do_error) /* nothing found */ + } else if (subflags.do_error) { + // nothing found EMSG2(_(e_patnotf2), get_search_pat()); + } } - if (do_ask && hasAnyFolding(curwin)) { + if (subflags.do_ask && hasAnyFolding(curwin)) { // Cursor position may require updating changed_window_setting(); } @@ -3824,9 +3904,9 @@ skip: vim_regfree(regmatch.regprog); // Restore the flag values, they can be used for ":&&". - do_all = save_do_all; - do_ask = save_do_ask; -} + subflags.do_all = save_do_all; + subflags.do_ask = save_do_ask; +} // NOLINT(readability/fn_size) /* * Give message for number of substitutions. @@ -3982,9 +4062,7 @@ void ex_global(exarg_T *eap) smsg(_("Pattern not found: %s"), pat); } } else { - start_global_changes(); global_exe(cmd); - end_global_changes(); } ml_clearmarked(); /* clear rest of the marks */ vim_regfree(regmatch.regprog); @@ -4494,12 +4572,15 @@ int find_help_tags(char_u *arg, int *num_matches, char_u ***matches, int keep_la break; } - /* - * If tag starts with ', toss everything after a second '. Fixes - * CTRL-] on 'option'. (would include the trailing '.'). - */ - if (*s == '\'' && s > arg && *arg == '\'') + // If tag starts with ', toss everything after a second '. Fixes + // CTRL-] on 'option'. (would include the trailing '.'). + if (*s == '\'' && s > arg && *arg == '\'') { break; + } + // Also '{' and '}'. Fixes CTRL-] on '{address}'. + if (*s == '}' && s > arg && *arg == '{') { + break; + } } *d = NUL; diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index 6d24ba91f2..f68663c60c 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -27,7 +27,6 @@ #include "nvim/mbyte.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/memory.h" #include "nvim/move.h" @@ -1983,8 +1982,6 @@ void ex_listdo(exarg_T *eap) save_ei = au_event_disable(",Syntax"); } - start_global_changes(); - if (eap->cmdidx == CMD_windo || eap->cmdidx == CMD_tabdo || P_HID(curbuf) @@ -2181,7 +2178,6 @@ void ex_listdo(exarg_T *eap) apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn, curbuf->b_fname, true, curbuf); } - end_global_changes(); } /// Add files[count] to the arglist of the current window after arg "after". diff --git a/src/nvim/ex_cmds_defs.h b/src/nvim/ex_cmds_defs.h index f46d1e6d47..8148eb5cee 100644 --- a/src/nvim/ex_cmds_defs.h +++ b/src/nvim/ex_cmds_defs.h @@ -126,57 +126,53 @@ struct exarg { struct condstack *cstack; ///< condition stack for ":if" etc. }; -#define FORCE_BIN 1 /* ":edit ++bin file" */ -#define FORCE_NOBIN 2 /* ":edit ++nobin file" */ - -/* Values for "flags" */ -#define EXFLAG_LIST 0x01 /* 'l': list */ -#define EXFLAG_NR 0x02 /* '#': number */ -#define EXFLAG_PRINT 0x04 /* 'p': print */ - -/* - * used for completion on the command line - */ -typedef struct expand { - int xp_context; /* type of expansion */ - char_u *xp_pattern; /* start of item to expand */ - int xp_pattern_len; /* bytes in xp_pattern before cursor */ - char_u *xp_arg; /* completion function */ - int xp_scriptID; /* SID for completion function */ - int xp_backslash; /* one of the XP_BS_ values */ +#define FORCE_BIN 1 // ":edit ++bin file" +#define FORCE_NOBIN 2 // ":edit ++nobin file" + +// Values for "flags" +#define EXFLAG_LIST 0x01 // 'l': list +#define EXFLAG_NR 0x02 // '#': number +#define EXFLAG_PRINT 0x04 // 'p': print + +// used for completion on the command line +struct expand { + int xp_context; // type of expansion + char_u *xp_pattern; // start of item to expand + int xp_pattern_len; // bytes in xp_pattern before cursor + char_u *xp_arg; // completion function + int xp_scriptID; // SID for completion function + int xp_backslash; // one of the XP_BS_ values #ifndef BACKSLASH_IN_FILENAME - int xp_shell; /* TRUE for a shell command, more - characters need to be escaped */ + int xp_shell; // TRUE for a shell command, more + // characters need to be escaped #endif - int xp_numfiles; /* number of files found by - file name completion */ - char_u **xp_files; /* list of files */ - char_u *xp_line; /* text being completed */ - int xp_col; /* cursor position in line */ -} expand_T; - -/* values for xp_backslash */ -#define XP_BS_NONE 0 /* nothing special for backslashes */ -#define XP_BS_ONE 1 /* uses one backslash before a space */ -#define XP_BS_THREE 2 /* uses three backslashes before a space */ + int xp_numfiles; // number of files found by file name completion + char_u **xp_files; // list of files + char_u *xp_line; // text being completed + int xp_col; // cursor position in line +}; -/* - * Command modifiers ":vertical", ":browse", ":confirm" and ":hide" set a flag. - * This needs to be saved for recursive commands, put them in a structure for - * easy manipulation. - */ +// values for xp_backslash +#define XP_BS_NONE 0 // nothing special for backslashes +#define XP_BS_ONE 1 // uses one backslash before a space +#define XP_BS_THREE 2 // uses three backslashes before a space + +/// Command modifiers ":vertical", ":browse", ":confirm", ":hide", etc. set a +/// flag. This needs to be saved for recursive commands, put them in a +/// structure for easy manipulation. typedef struct { - int hide; /* TRUE when ":hide" was used */ - int split; /* flags for win_split() */ - int tab; /* > 0 when ":tab" was used */ - int confirm; /* TRUE to invoke yes/no dialog */ - int keepalt; /* TRUE when ":keepalt" was used */ - int keepmarks; /* TRUE when ":keepmarks" was used */ - int keepjumps; /* TRUE when ":keepjumps" was used */ - int lockmarks; /* TRUE when ":lockmarks" was used */ - int keeppatterns; /* TRUE when ":keeppatterns" was used */ - bool noswapfile; /* true when ":noswapfile" was used */ - char_u *save_ei; /* saved value of 'eventignore' */ + int split; ///< flags for win_split() + int tab; ///< > 0 when ":tab" was used + bool browse; ///< true to invoke file dialog + bool confirm; ///< true to invoke yes/no dialog + bool hide; ///< true when ":hide" was used + bool keepalt; ///< true when ":keepalt" was used + bool keepjumps; ///< true when ":keepjumps" was used + bool keepmarks; ///< true when ":keepmarks" was used + bool keeppatterns; ///< true when ":keeppatterns" was used + bool lockmarks; ///< true when ":lockmarks" was used + bool noswapfile; ///< true when ":noswapfile" was used + char_u *save_ei; ///< saved value of 'eventignore' } cmdmod_T; #endif // NVIM_EX_CMDS_DEFS_H diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 8bae817211..45407b7f12 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -36,7 +36,6 @@ #include "nvim/menu.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/keymap.h" #include "nvim/file_search.h" #include "nvim/garray.h" @@ -345,7 +344,8 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline, msg_list = saved_msg_list; return FAIL; } - ++call_depth; + call_depth++; + start_batch_changes(); cstack.cs_idx = -1; cstack.cs_looplevel = 0; @@ -952,7 +952,8 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline, did_endif = FALSE; /* in case do_cmdline used recursively */ - --call_depth; + call_depth--; + end_batch_changes(); return retval; } @@ -1313,8 +1314,9 @@ static char_u * do_one_cmd(char_u **cmdlinep, case 'b': if (checkforcmd(&ea.cmd, "belowright", 3)) { cmdmod.split |= WSP_BELOW; continue; - } + } if (checkforcmd(&ea.cmd, "browse", 3)) { + cmdmod.browse = true; continue; } if (!checkforcmd(&ea.cmd, "botright", 2)) @@ -1324,24 +1326,24 @@ static char_u * do_one_cmd(char_u **cmdlinep, case 'c': if (!checkforcmd(&ea.cmd, "confirm", 4)) break; - cmdmod.confirm = TRUE; + cmdmod.confirm = true; continue; case 'k': if (checkforcmd(&ea.cmd, "keepmarks", 3)) { - cmdmod.keepmarks = TRUE; + cmdmod.keepmarks = true; continue; } if (checkforcmd(&ea.cmd, "keepalt", 5)) { - cmdmod.keepalt = TRUE; + cmdmod.keepalt = true; continue; } if (checkforcmd(&ea.cmd, "keeppatterns", 5)) { - cmdmod.keeppatterns = TRUE; + cmdmod.keeppatterns = true; continue; } if (!checkforcmd(&ea.cmd, "keepjumps", 5)) break; - cmdmod.keepjumps = TRUE; + cmdmod.keepjumps = true; continue; /* ":hide" and ":hide | cmd" are not modifiers */ @@ -1349,11 +1351,11 @@ static char_u * do_one_cmd(char_u **cmdlinep, || *p == NUL || ends_excmd(*p)) break; ea.cmd = p; - cmdmod.hide = TRUE; + cmdmod.hide = true; continue; case 'l': if (checkforcmd(&ea.cmd, "lockmarks", 3)) { - cmdmod.lockmarks = TRUE; + cmdmod.lockmarks = true; continue; } @@ -4361,12 +4363,15 @@ static void ex_autocmd(exarg_T *eap) */ static void ex_doautocmd(exarg_T *eap) { - char_u *arg = eap->arg; + char_u *arg = eap->arg; int call_do_modelines = check_nomodeline(&arg); + bool did_aucmd; - (void)do_doautocmd(arg, TRUE); - if (call_do_modelines) /* Only when there is no <nomodeline>. */ + (void)do_doautocmd(arg, true, &did_aucmd); + // Only when there is no <nomodeline>. + if (call_do_modelines && did_aucmd) { do_modelines(0); + } } /* @@ -5153,6 +5158,24 @@ static char_u *uc_split_args(char_u *arg, size_t *lenp) return buf; } +static size_t add_cmd_modifier(char_u *buf, char *mod_str, bool *multi_mods) +{ + size_t result = STRLEN(mod_str); + if (*multi_mods) { + result++; + } + + if (buf != NULL) { + if (*multi_mods) { + STRCAT(buf, " "); + } + STRCAT(buf, mod_str); + } + + *multi_mods = true; + return result; +} + /* * Check for a <> code in a user command. * "code" points to the '<'. "len" the length of the <> (inclusive). @@ -5177,8 +5200,8 @@ uc_check_code ( char_u *p = code + 1; size_t l = len - 2; int quote = 0; - enum { ct_ARGS, ct_BANG, ct_COUNT, ct_LINE1, ct_LINE2, ct_REGISTER, - ct_LT, ct_NONE } type = ct_NONE; + enum { ct_ARGS, ct_BANG, ct_COUNT, ct_LINE1, ct_LINE2, ct_MODS, + ct_REGISTER, ct_LT, ct_NONE } type = ct_NONE; if ((vim_strchr((char_u *)"qQfF", *p) != NULL) && p[1] == '-') { quote = (*p == 'q' || *p == 'Q') ? 1 : 2; @@ -5186,23 +5209,26 @@ uc_check_code ( l -= 2; } - ++l; - if (l <= 1) + l++; + if (l <= 1) { type = ct_NONE; - else if (STRNICMP(p, "args>", l) == 0) + } else if (STRNICMP(p, "args>", l) == 0) { type = ct_ARGS; - else if (STRNICMP(p, "bang>", l) == 0) + } else if (STRNICMP(p, "bang>", l) == 0) { type = ct_BANG; - else if (STRNICMP(p, "count>", l) == 0) + } else if (STRNICMP(p, "count>", l) == 0) { type = ct_COUNT; - else if (STRNICMP(p, "line1>", l) == 0) + } else if (STRNICMP(p, "line1>", l) == 0) { type = ct_LINE1; - else if (STRNICMP(p, "line2>", l) == 0) + } else if (STRNICMP(p, "line2>", l) == 0) { type = ct_LINE2; - else if (STRNICMP(p, "lt>", l) == 0) + } else if (STRNICMP(p, "lt>", l) == 0) { type = ct_LT; - else if (STRNICMP(p, "reg>", l) == 0 || STRNICMP(p, "register>", l) == 0) + } else if (STRNICMP(p, "reg>", l) == 0 || STRNICMP(p, "register>", l) == 0) { type = ct_REGISTER; + } else if (STRNICMP(p, "mods>", l) == 0) { + type = ct_MODS; + } switch (type) { case ct_ARGS: @@ -5310,6 +5336,87 @@ uc_check_code ( break; } + case ct_MODS: + { + result = quote ? 2 : 0; + if (buf != NULL) { + if (quote) { + *buf++ = '"'; + } + *buf = '\0'; + } + + bool multi_mods = false; + + // :aboveleft and :leftabove + if (cmdmod.split & WSP_ABOVE) { + result += add_cmd_modifier(buf, "aboveleft", &multi_mods); + } + // :belowright and :rightbelow + if (cmdmod.split & WSP_BELOW) { + result += add_cmd_modifier(buf, "belowright", &multi_mods); + } + // :botright + if (cmdmod.split & WSP_BOT) { + result += add_cmd_modifier(buf, "botright", &multi_mods); + } + + typedef struct { + bool *set; + char *name; + } mod_entry_T; + static mod_entry_T mod_entries[] = { + { &cmdmod.browse, "browse" }, + { &cmdmod.confirm, "confirm" }, + { &cmdmod.hide, "hide" }, + { &cmdmod.keepalt, "keepalt" }, + { &cmdmod.keepjumps, "keepjumps" }, + { &cmdmod.keepmarks, "keepmarks" }, + { &cmdmod.keeppatterns, "keeppatterns" }, + { &cmdmod.lockmarks, "lockmarks" }, + { &cmdmod.noswapfile, "noswapfile" } + }; + // the modifiers that are simple flags + for (size_t i = 0; i < ARRAY_SIZE(mod_entries); i++) { + if (*mod_entries[i].set) { + result += add_cmd_modifier(buf, mod_entries[i].name, &multi_mods); + } + } + + // TODO(vim): How to support :noautocmd? + // TODO(vim): How to support :sandbox? + + // :silent + if (msg_silent > 0) { + result += add_cmd_modifier(buf, emsg_silent > 0 ? "silent!" : "silent", + &multi_mods); + } + // :tab + if (cmdmod.tab > 0) { + result += add_cmd_modifier(buf, "tab", &multi_mods); + } + // :topleft + if (cmdmod.split & WSP_TOP) { + result += add_cmd_modifier(buf, "topleft", &multi_mods); + } + + // TODO(vim): How to support :unsilent? + + // :verbose + if (p_verbose > 0) { + result += add_cmd_modifier(buf, "verbose", &multi_mods); + } + // :vertical + if (cmdmod.split & WSP_VERT) { + result += add_cmd_modifier(buf, "vertical", &multi_mods); + } + if (quote && buf != NULL) { + buf += result - 2; + *buf = '"'; + } + break; + } + case ct_REGISTER: result = eap->regname ? 1 : 0; if (quote) @@ -9359,7 +9466,7 @@ static void ex_filetype(exarg_T *eap) } } if (*arg == 'd') { - (void)do_doautocmd((char_u *)"filetypedetect BufRead", TRUE); + (void)do_doautocmd((char_u *)"filetypedetect BufRead", true, NULL); do_modelines(0); } } else if (STRCMP(arg, "off") == 0) { @@ -9510,20 +9617,15 @@ static void ex_foldopen(exarg_T *eap) static void ex_folddo(exarg_T *eap) { - linenr_T lnum; - - start_global_changes(); - - /* First set the marks for all lines closed/open. */ - for (lnum = eap->line1; lnum <= eap->line2; ++lnum) - if (hasFolding(lnum, NULL, NULL) == (eap->cmdidx == CMD_folddoclosed)) + // First set the marks for all lines closed/open. + for (linenr_T lnum = eap->line1; lnum <= eap->line2; ++lnum) { + if (hasFolding(lnum, NULL, NULL) == (eap->cmdidx == CMD_folddoclosed)) { ml_setmarked(lnum); + } + } - /* Execute the command on the marked lines. */ - global_exe(eap->arg); - ml_clearmarked(); /* clear rest of the marks */ - - end_global_changes(); + global_exe(eap->arg); // Execute the command on the marked lines. + ml_clearmarked(); // clear rest of the marks } static void ex_terminal(exarg_T *eap) diff --git a/src/nvim/ex_eval.c b/src/nvim/ex_eval.c index 82d4c2b2d5..f518fa0d66 100644 --- a/src/nvim/ex_eval.c +++ b/src/nvim/ex_eval.c @@ -15,7 +15,6 @@ #include "nvim/ex_cmds2.h" #include "nvim/ex_docmd.h" #include "nvim/message.h" -#include "nvim/misc2.h" #include "nvim/memory.h" #include "nvim/regexp.h" #include "nvim/strings.h" diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index cd28554970..1a97dc3d6f 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -34,7 +34,6 @@ #include "nvim/menu.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/memory.h" #include "nvim/cursor_shape.h" #include "nvim/keymap.h" diff --git a/src/nvim/farsi.c b/src/nvim/farsi.c index 61e17128ea..eb22ad1428 100644 --- a/src/nvim/farsi.c +++ b/src/nvim/farsi.c @@ -15,7 +15,6 @@ #include "nvim/memline.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/screen.h" #include "nvim/strings.h" #include "nvim/vim.h" diff --git a/src/nvim/file_search.c b/src/nvim/file_search.c index 78b224f04c..c6cfba8142 100644 --- a/src/nvim/file_search.c +++ b/src/nvim/file_search.c @@ -1,48 +1,44 @@ -/* TODO: make some #ifdef for this */ -/*--------[ file searching ]-------------------------------------------------*/ -/* - * File searching functions for 'path', 'tags' and 'cdpath' options. - * External visible functions: - * vim_findfile_init() creates/initialises the search context - * vim_findfile_free_visited() free list of visited files/dirs of search - * context - * vim_findfile() find a file in the search context - * vim_findfile_cleanup() cleanup/free search context created by - * vim_findfile_init() - * - * All static functions and variables start with 'ff_' - * - * In general it works like this: - * First you create yourself a search context by calling vim_findfile_init(). - * It is possible to give a search context from a previous call to - * vim_findfile_init(), so it can be reused. After this you call vim_findfile() - * until you are satisfied with the result or it returns NULL. On every call it - * returns the next file which matches the conditions given to - * vim_findfile_init(). If it doesn't find a next file it returns NULL. - * - * It is possible to call vim_findfile_init() again to reinitialise your search - * with some new parameters. Don't forget to pass your old search context to - * it, so it can reuse it and especially reuse the list of already visited - * directories. If you want to delete the list of already visited directories - * simply call vim_findfile_free_visited(). - * - * When you are done call vim_findfile_cleanup() to free the search context. - * - * The function vim_findfile_init() has a long comment, which describes the - * needed parameters. - * - * - * - * ATTENTION: - * ========== - * Also we use an allocated search context here, this functions are NOT - * thread-safe!!!!! - * - * To minimize parameter passing (or because I'm to lazy), only the - * external visible functions get a search context as a parameter. This is - * then assigned to a static global, which is used throughout the local - * functions. - */ +// File searching functions for 'path', 'tags' and 'cdpath' options. +// +// External visible functions: +// vim_findfile_init() creates/initialises the search context +// vim_findfile_free_visited() free list of visited files/dirs of search +// context +// vim_findfile() find a file in the search context +// vim_findfile_cleanup() cleanup/free search context created by +// vim_findfile_init() +// +// All static functions and variables start with 'ff_' +// +// In general it works like this: +// First you create yourself a search context by calling vim_findfile_init(). +// It is possible to give a search context from a previous call to +// vim_findfile_init(), so it can be reused. After this you call vim_findfile() +// until you are satisfied with the result or it returns NULL. On every call it +// returns the next file which matches the conditions given to +// vim_findfile_init(). If it doesn't find a next file it returns NULL. +// +// It is possible to call vim_findfile_init() again to reinitialise your search +// with some new parameters. Don't forget to pass your old search context to +// it, so it can reuse it and especially reuse the list of already visited +// directories. If you want to delete the list of already visited directories +// simply call vim_findfile_free_visited(). +// +// When you are done call vim_findfile_cleanup() to free the search context. +// +// The function vim_findfile_init() has a long comment, which describes the +// needed parameters. +// +// +// +// ATTENTION: +// ========== +// We use an allocated search context, these functions are NOT thread-safe!!!!! +// +// To minimize parameter passing (or because I'm too lazy), only the +// external visible functions get a search context as a parameter. This is +// then assigned to a static global, which is used throughout the local +// functions. #include <assert.h> #include <string.h> @@ -59,7 +55,7 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" +#include "nvim/option.h" #include "nvim/os_unix.h" #include "nvim/path.h" #include "nvim/strings.h" @@ -1526,3 +1522,28 @@ theend: return file_name; } +/// Change to a file's directory. +/// Caller must call shorten_fnames()! +/// @return OK or FAIL +int vim_chdirfile(char_u *fname) +{ + char_u dir[MAXPATHL]; + + STRLCPY(dir, fname, MAXPATHL); + *path_tail_with_sep(dir) = NUL; + return os_chdir((char *)dir) == 0 ? OK : FAIL; +} + +/// Change directory to "new_dir". Search 'cdpath' for relative directory names. +int vim_chdir(char_u *new_dir) +{ + char_u *dir_name = find_directory_in_path(new_dir, STRLEN(new_dir), + FNAME_MESS, curbuf->b_ffname); + if (dir_name == NULL) { + return -1; + } + int r = os_chdir((char *)dir_name); + xfree(dir_name); + return r; +} + diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 154558b332..c0d4a71b35 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -32,7 +32,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/move.h" #include "nvim/normal.h" @@ -44,6 +43,7 @@ #include "nvim/screen.h" #include "nvim/search.h" #include "nvim/sha256.h" +#include "nvim/state.h" #include "nvim/strings.h" #include "nvim/ui.h" #include "nvim/types.h" @@ -282,11 +282,9 @@ readfile ( int error = FALSE; /* errors encountered */ int ff_error = EOL_UNKNOWN; /* file format with errors */ long linerest = 0; /* remaining chars in line */ -#ifdef UNIX int perm = 0; +#ifdef UNIX int swap_mode = -1; /* protection bits for swap file */ -#else - int perm; #endif int fileformat = 0; /* end-of-line format */ int keep_fileformat = FALSE; @@ -418,23 +416,21 @@ readfile ( } } - if (!read_stdin && !read_buffer) { -#ifdef UNIX - /* - * On Unix it is possible to read a directory, so we have to - * check for it before os_open(). - */ + if (!read_buffer && !read_stdin) { perm = os_getperm(fname); - if (perm >= 0 && !S_ISREG(perm) /* not a regular file ... */ +#ifdef UNIX + // On Unix it is possible to read a directory, so we have to + // check for it before os_open(). + if (perm >= 0 && !S_ISREG(perm) // not a regular file ... # ifdef S_ISFIFO - && !S_ISFIFO(perm) /* ... or fifo */ + && !S_ISFIFO(perm) // ... or fifo # endif # ifdef S_ISSOCK - && !S_ISSOCK(perm) /* ... or socket */ + && !S_ISSOCK(perm) // ... or socket # endif # ifdef OPEN_CHR_FILES && !(S_ISCHR(perm) && is_dev_fd_file(fname)) - /* ... or a character special file named /dev/fd/<n> */ + // ... or a character special file named /dev/fd/<n> # endif ) { if (S_ISDIR(perm)) @@ -493,44 +489,31 @@ readfile ( curbuf->b_flags &= ~(BF_NEW | BF_NEW_W); } - /* - * Check readonly by trying to open the file for writing. - * If this fails, we know that the file is readonly. - */ - file_readonly = FALSE; + // Check readonly. + file_readonly = false; if (!read_buffer && !read_stdin) { - if (!newfile || readonlymode) { - file_readonly = TRUE; - } else if ((fd = os_open((char *)fname, O_RDWR, 0)) < 0) { - // opening in readwrite mode failed => file is readonly - file_readonly = TRUE; - } - if (file_readonly == TRUE) { - // try to open readonly - fd = os_open((char *)fname, O_RDONLY, 0); + if (!newfile || readonlymode || !(perm & 0222) + || !os_file_is_writable((char *)fname)) { + file_readonly = true; } + fd = os_open((char *)fname, O_RDONLY, 0); } - if (fd < 0) { /* cannot open at all */ + if (fd < 0) { // cannot open at all msg_scroll = msg_save; #ifndef UNIX - /* - * On non-unix systems we can't open a directory, check here. - */ - perm = os_getperm(fname); /* check if the file exists */ + // On non-unix systems we can't open a directory, check here. if (os_isdir(fname)) { filemess(curbuf, sfname, (char_u *)_("is a directory"), 0); - curbuf->b_p_ro = TRUE; /* must use "w!" now */ - } else + curbuf->b_p_ro = true; // must use "w!" now + } else { #endif if (!newfile) { return FAIL; } - if (perm == UV_ENOENT) { - /* - * Set the 'new-file' flag, so that when the file has - * been created by someone else, a ":w" will complain. - */ + if (perm == UV_ENOENT) { // check if the file exists + // Set the 'new-file' flag, so that when the file has + // been created by someone else, a ":w" will complain. curbuf->b_flags |= BF_NEW; /* Create a swap file now, so that other Vims are warned @@ -581,6 +564,9 @@ readfile ( return FAIL; } +#ifndef UNIX + } +#endif /* * Only set the 'ro' flag for readonly files the first time they are @@ -3787,8 +3773,9 @@ static int set_rw_fname(char_u *fname, char_u *sfname) /* Do filetype detection now if 'filetype' is empty. */ if (*curbuf->b_p_ft == NUL) { - if (au_has_group((char_u *)"filetypedetect")) - (void)do_doautocmd((char_u *)"filetypedetect BufRead", FALSE); + if (au_has_group((char_u *)"filetypedetect")) { + (void)do_doautocmd((char_u *)"filetypedetect BufRead", false, NULL); + } do_modelines(0); } @@ -4460,11 +4447,95 @@ bool vim_fgets(char_u *buf, int size, FILE *fp) FUNC_ATTR_NONNULL_ALL return eof == NULL; } -/* - * os_rename() only works if both files are on the same file system, this - * function will (attempts to?) copy the file across if rename fails -- webb - * Return -1 for failure, 0 for success. - */ +/// Read 2 bytes from "fd" and turn them into an int, MSB first. +int get2c(FILE *fd) +{ + int n; + + n = getc(fd); + n = (n << 8) + getc(fd); + return n; +} + +/// Read 3 bytes from "fd" and turn them into an int, MSB first. +int get3c(FILE *fd) +{ + int n; + + n = getc(fd); + n = (n << 8) + getc(fd); + n = (n << 8) + getc(fd); + return n; +} + +/// Read 4 bytes from "fd" and turn them into an int, MSB first. +int get4c(FILE *fd) +{ + // Use unsigned rather than int otherwise result is undefined + // when left-shift sets the MSB. + unsigned n; + + n = (unsigned)getc(fd); + n = (n << 8) + (unsigned)getc(fd); + n = (n << 8) + (unsigned)getc(fd); + n = (n << 8) + (unsigned)getc(fd); + return (int)n; +} + +/// Read 8 bytes from `fd` and turn them into a time_t, MSB first. +time_t get8ctime(FILE *fd) +{ + time_t n = 0; + int i; + + for (i = 0; i < 8; i++) { + n = (n << 8) + getc(fd); + } + return n; +} + +/// Reads a string of length "cnt" from "fd" into allocated memory. +/// @return pointer to the string or NULL when unable to read that many bytes. +char *read_string(FILE *fd, size_t cnt) +{ + char *str = xmallocz(cnt); + for (size_t i = 0; i < cnt; i++) { + int c = getc(fd); + if (c == EOF) { + xfree(str); + return NULL; + } + str[i] = (char)c; + } + return str; +} + +/// Writes a number to file "fd", most significant bit first, in "len" bytes. +/// @returns false in case of an error. +bool put_bytes(FILE *fd, uintmax_t number, size_t len) +{ + assert(len > 0); + for (size_t i = len - 1; i < len; i--) { + if (putc((int)(number >> (i * 8)), fd) == EOF) { + return false; + } + } + return true; +} + +/// Writes time_t to file "fd" in 8 bytes. +/// @returns FAIL when the write failed. +int put_time(FILE *fd, time_t time_) +{ + uint8_t buf[8]; + time_to_bytes(time_, buf); + return fwrite(buf, sizeof(uint8_t), ARRAY_SIZE(buf), fd) == 1 ? OK : FAIL; +} + +/// os_rename() only works if both files are on the same file system, this +/// function will (attempts to?) copy the file across if rename fails -- webb +// +/// @return -1 for failure, 0 for success int vim_rename(char_u *from, char_u *to) { int fd_in; @@ -6072,13 +6143,18 @@ static int do_autocmd_event(event_T event, char_u *pat, int nested, char_u *cmd, int do_doautocmd ( char_u *arg, - int do_msg /* give message for no matching autocmds? */ + int do_msg, // give message for no matching autocmds? + bool *did_something ) { char_u *fname; int nothing_done = TRUE; int group; + if (did_something != NULL) { + *did_something = false; + } + /* * Check for a legal group name. If not, use AUGROUP_ALL. */ @@ -6107,8 +6183,12 @@ do_doautocmd ( fname, NULL, TRUE, group, curbuf, NULL)) nothing_done = FALSE; - if (nothing_done && do_msg) + if (nothing_done && do_msg) { MSG(_("No matching autocommands")); + } + if (did_something != NULL) { + *did_something = !nothing_done; + } return aborting() ? FAIL : OK; } @@ -6137,13 +6217,14 @@ void ex_doautoall(exarg_T *eap) /* find a window for this buffer and save some values */ aucmd_prepbuf(&aco, buf); - /* execute the autocommands for this buffer */ - retval = do_doautocmd(arg, FALSE); + bool did_aucmd; + // execute the autocommands for this buffer + retval = do_doautocmd(arg, false, &did_aucmd); - if (call_do_modelines) { - /* Execute the modeline settings, but don't set window-local - * options if we are using the current window for another - * buffer. */ + if (call_do_modelines && did_aucmd) { + // Execute the modeline settings, but don't set window-local + // options if we are using the current window for another + // buffer. do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0); } diff --git a/src/nvim/fileio.h b/src/nvim/fileio.h index d93f3f3eb3..ceb101167d 100644 --- a/src/nvim/fileio.h +++ b/src/nvim/fileio.h @@ -12,6 +12,8 @@ #define READ_DUMMY 0x10 /* reading into a dummy buffer */ #define READ_KEEP_UNDO 0x20 /* keep undo info*/ +#define READ_STRING(x, y) (char_u *)read_string((x), (size_t)(y)) + /* * Struct to save values in before executing autocommands for a buffer that is * not the current buffer. diff --git a/src/nvim/fold.c b/src/nvim/fold.c index ac3cf959c8..70030b8525 100644 --- a/src/nvim/fold.c +++ b/src/nvim/fold.c @@ -22,7 +22,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/move.h" #include "nvim/option.h" @@ -762,16 +761,12 @@ void clearFolding(win_T *win) */ void foldUpdate(win_T *wp, linenr_T top, linenr_T bot) { - if (compl_busy) { - return; - } - - fold_T *fp; - if (wp->w_buffer->terminal) { + if (compl_busy || State & INSERT) { return; } // Mark all folds from top to bot as maybe-small. + fold_T *fp; (void)foldFind(&wp->w_folds, top, &fp); while (fp < (fold_T *)wp->w_folds.ga_data + wp->w_folds.ga_len && fp->fd_top < bot) { diff --git a/src/nvim/func_attr.h b/src/nvim/func_attr.h index ea017ab0c8..d98fe5b22b 100644 --- a/src/nvim/func_attr.h +++ b/src/nvim/func_attr.h @@ -185,6 +185,7 @@ #ifdef DEFINE_FUNC_ATTRIBUTES # define FUNC_API_ASYNC # define FUNC_API_NOEXPORT +# define FUNC_API_NOEVAL # define FUNC_ATTR_MALLOC REAL_FATTR_MALLOC # define FUNC_ATTR_ALLOC_SIZE(x) REAL_FATTR_ALLOC_SIZE(x) # define FUNC_ATTR_ALLOC_SIZE_PROD(x, y) REAL_FATTR_ALLOC_SIZE_PROD(x, y) diff --git a/src/nvim/garray.c b/src/nvim/garray.c index 98cec69b54..9ed3b901ef 100644 --- a/src/nvim/garray.c +++ b/src/nvim/garray.c @@ -8,7 +8,6 @@ #include "nvim/vim.h" #include "nvim/ascii.h" #include "nvim/log.h" -#include "nvim/misc2.h" #include "nvim/memory.h" #include "nvim/path.h" #include "nvim/garray.h" diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index ae1857f318..dad0ac33cd 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -29,7 +29,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/keymap.h" #include "nvim/garray.h" #include "nvim/move.h" @@ -38,6 +37,7 @@ #include "nvim/option.h" #include "nvim/regexp.h" #include "nvim/screen.h" +#include "nvim/state.h" #include "nvim/strings.h" #include "nvim/ui.h" #include "nvim/undo.h" diff --git a/src/nvim/globals.h b/src/nvim/globals.h index 950ceb4c74..57d12d396e 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -442,59 +442,60 @@ EXTERN int no_check_timestamps INIT(= 0); /* Don't check timestamps */ typedef enum { HLF_8 = 0 /* Meta & special keys listed with ":map", text that is displayed different from what it is */ - , HLF_EOB //< after the last line in the buffer - , HLF_TERM //< terminal cursor focused - , HLF_TERMNC //< terminal cursor unfocused - , HLF_AT /* @ characters at end of screen, characters that - don't really exist in the text */ - , HLF_D /* directories in CTRL-D listing */ - , HLF_E /* error messages */ - , HLF_I /* incremental search */ - , HLF_L /* last search string */ - , HLF_M /* "--More--" message */ - , HLF_CM /* Mode (e.g., "-- INSERT --") */ - , HLF_N /* line number for ":number" and ":#" commands */ - , HLF_CLN /* current line number */ - , HLF_R /* return to continue message and yes/no questions */ - , HLF_S /* status lines */ - , HLF_SNC /* status lines of not-current windows */ - , HLF_C /* column to separate vertically split windows */ - , HLF_T /* Titles for output from ":set all", ":autocmd" etc. */ - , HLF_V /* Visual mode */ - , HLF_VNC /* Visual mode, autoselecting and not clipboard owner */ - , HLF_W /* warning messages */ - , HLF_WM /* Wildmenu highlight */ - , HLF_FL /* Folded line */ - , HLF_FC /* Fold column */ - , HLF_ADD /* Added diff line */ - , HLF_CHD /* Changed diff line */ - , HLF_DED /* Deleted diff line */ - , HLF_TXD /* Text Changed in diff line */ - , HLF_CONCEAL /* Concealed text */ - , HLF_SC /* Sign column */ - , HLF_SPB /* SpellBad */ - , HLF_SPC /* SpellCap */ - , HLF_SPR /* SpellRare */ - , HLF_SPL /* SpellLocal */ - , HLF_PNI /* popup menu normal item */ - , HLF_PSI /* popup menu selected item */ - , HLF_PSB /* popup menu scrollbar */ - , HLF_PST /* popup menu scrollbar thumb */ - , HLF_TP /* tabpage line */ - , HLF_TPS /* tabpage line selected */ - , HLF_TPF /* tabpage line filler */ - , HLF_CUC /* 'cursurcolumn' */ - , HLF_CUL /* 'cursurline' */ - , HLF_MC /* 'colorcolumn' */ - , HLF_COUNT /* MUST be the last one */ + , HLF_EOB // after the last line in the buffer + , HLF_TERM // terminal cursor focused + , HLF_TERMNC // terminal cursor unfocused + , HLF_AT // @ characters at end of screen, characters that + // don't really exist in the text + , HLF_D // directories in CTRL-D listing + , HLF_E // error messages + , HLF_I // incremental search + , HLF_L // last search string + , HLF_M // "--More--" message + , HLF_CM // Mode (e.g., "-- INSERT --") + , HLF_N // line number for ":number" and ":#" commands + , HLF_CLN // current line number + , HLF_R // return to continue message and yes/no questions + , HLF_S // status lines + , HLF_SNC // status lines of not-current windows + , HLF_C // column to separate vertically split windows + , HLF_T // Titles for output from ":set all", ":autocmd" etc. + , HLF_V // Visual mode + , HLF_VNC // Visual mode, autoselecting and not clipboard owner + , HLF_W // warning messages + , HLF_WM // Wildmenu highlight + , HLF_FL // Folded line + , HLF_FC // Fold column + , HLF_ADD // Added diff line + , HLF_CHD // Changed diff line + , HLF_DED // Deleted diff line + , HLF_TXD // Text Changed in diff line + , HLF_CONCEAL // Concealed text + , HLF_SC // Sign column + , HLF_SPB // SpellBad + , HLF_SPC // SpellCap + , HLF_SPR // SpellRare + , HLF_SPL // SpellLocal + , HLF_PNI // popup menu normal item + , HLF_PSI // popup menu selected item + , HLF_PSB // popup menu scrollbar + , HLF_PST // popup menu scrollbar thumb + , HLF_TP // tabpage line + , HLF_TPS // tabpage line selected + , HLF_TPF // tabpage line filler + , HLF_CUC // 'cursurcolumn' + , HLF_CUL // 'cursurline' + , HLF_MC // 'colorcolumn' + , HLF_QFL // selected quickfix line + , HLF_COUNT // MUST be the last one } hlf_T; /* The HL_FLAGS must be in the same order as the HLF_ enums! * When changing this also adjust the default for 'highlight'. */ -#define HL_FLAGS {'8', '~', 'z', 'Z', '@', 'd', 'e', 'i', 'l', 'm', 'M', 'n', \ - 'N', 'r', 's', 'S', 'c', 't', 'v', 'V', 'w', 'W', 'f', 'F', \ - 'A', 'C', 'D', 'T', '-', '>', 'B', 'P', 'R', 'L', '+', '=', \ - 'x', 'X', '*', '#', '_', '!', '.', 'o'} +#define HL_FLAGS { '8', '~', 'z', 'Z', '@', 'd', 'e', 'i', 'l', 'm', 'M', 'n', \ + 'N', 'r', 's', 'S', 'c', 't', 'v', 'V', 'w', 'W', 'f', 'F', \ + 'A', 'C', 'D', 'T', '-', '>', 'B', 'P', 'R', 'L', '+', '=', \ + 'x', 'X', '*', '#', '_', '!', '.', 'o', 'q' } EXTERN int highlight_attr[HLF_COUNT]; /* Highl. attr for each context. */ EXTERN int highlight_user[9]; /* User[1-9] attributes */ @@ -1244,6 +1245,9 @@ EXTERN char *ignoredp; // If a msgpack-rpc channel should be started over stdin/stdout EXTERN bool embedded_mode INIT(= false); +/// next free id for a job or rpc channel +EXTERN uint64_t next_chan_id INIT(= 1); + /// Used to track the status of external functions. /// Currently only used for iconv(). typedef enum { diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c index 1c9b8e18ef..7d4bfd0290 100644 --- a/src/nvim/hardcopy.c +++ b/src/nvim/hardcopy.c @@ -23,7 +23,6 @@ #include "nvim/memline.h" #include "nvim/memory.h" #include "nvim/message.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/option.h" #include "nvim/path.h" diff --git a/src/nvim/hashtab.c b/src/nvim/hashtab.c index 2da937633e..7d4ae61fc4 100644 --- a/src/nvim/hashtab.c +++ b/src/nvim/hashtab.c @@ -28,7 +28,6 @@ #include "nvim/hashtab.h" #include "nvim/message.h" #include "nvim/memory.h" -#include "nvim/misc2.h" // Magic value for algorithm that walks through the array. #define PERTURB_SHIFT 5 diff --git a/src/nvim/iconv.h b/src/nvim/iconv.h index 4ac0d3fdd4..bf29b15247 100644 --- a/src/nvim/iconv.h +++ b/src/nvim/iconv.h @@ -24,10 +24,10 @@ // defined, we provide a type shim (pull in errno.h and define iconv_t). // This enables us to still load and use iconv dynamically at runtime. #ifdef USE_ICONV +# include <errno.h> # ifdef HAVE_ICONV_H # include <iconv.h> # else -# include <errno.h> typedef void *iconv_t; # endif #endif diff --git a/src/nvim/if_cscope.c b/src/nvim/if_cscope.c index f2432dd71d..3ed85677fc 100644 --- a/src/nvim/if_cscope.c +++ b/src/nvim/if_cscope.c @@ -20,7 +20,6 @@ #include "nvim/eval.h" #include "nvim/fileio.h" #include "nvim/message.h" -#include "nvim/misc2.h" #include "nvim/memory.h" #include "nvim/os/time.h" #include "nvim/path.h" @@ -52,7 +51,7 @@ static cscmd_T cs_cmds[] = { "add", cs_add, N_("Add a new database"), "add file|dir [pre-path] [flags]", 0 }, { "find", cs_find, - N_("Query for a pattern"), "find c|d|e|f|g|i|s|t name", 1 }, + N_("Query for a pattern"), "find a|c|d|e|f|g|i|s|t name", 1 }, { "help", cs_help, N_("Show this message"), "help", 0 }, { "kill", cs_kill, @@ -105,13 +104,13 @@ char_u *get_cscope_name(expand_T *xp, int idx) { const char *query_type[] = { - "c", "d", "e", "f", "g", "i", "s", "t", NULL + "a", "c", "d", "e", "f", "g", "i", "s", "t", NULL }; - /* Complete with query type of ":cscope find {query_type}". - * {query_type} can be letters (c, d, ... t) or numbers (0, 1, - * ..., 8) but only complete with letters, since numbers are - * redundant. */ + // Complete with query type of ":cscope find {query_type}". + // {query_type} can be letters (c, d, ... a) or numbers (0, 1, + // ..., 9) but only complete with letters, since numbers are + // redundant. return (char_u *)query_type[idx]; } case EXP_CSCOPE_KILL: @@ -674,6 +673,9 @@ static char *cs_create_cmd(char *csoption, char *pattern) case '8': case 'i': search = 8; break; + case '9': case 'a': + search = 9; + break; default: (void)EMSG(_("E561: unknown cscope search type")); cs_usage_msg(Find); @@ -970,6 +972,9 @@ static int cs_find_common(char *opt, char *pat, int forceit, int verbose, case '8': cmdletter = 'i'; break; + case '9': + cmdletter = 'a'; + break; default: cmdletter = opt[0]; } @@ -1126,14 +1131,15 @@ static int cs_help(exarg_T *eap) cmdp->usage); if (strcmp(cmdp->name, "find") == 0) MSG_PUTS(_("\n" - " c: Find functions calling this function\n" - " d: Find functions called by this function\n" - " e: Find this egrep pattern\n" - " f: Find this file\n" - " g: Find this definition\n" - " i: Find files #including this file\n" - " s: Find this C symbol\n" - " t: Find this text string\n")); + " a: Find assignments to this symbol\n" + " c: Find functions calling this function\n" + " d: Find functions called by this function\n" + " e: Find this egrep pattern\n" + " f: Find this file\n" + " g: Find this definition\n" + " i: Find files #including this file\n" + " s: Find this C symbol\n" + " t: Find this text string\n")); cmdp++; } diff --git a/src/nvim/if_cscope_defs.h b/src/nvim/if_cscope_defs.h index 8cd74c74e6..f9d06eaea3 100644 --- a/src/nvim/if_cscope_defs.h +++ b/src/nvim/if_cscope_defs.h @@ -25,18 +25,7 @@ #define CSCOPE_DBFILE "cscope.out" #define CSCOPE_PROMPT ">> " -/* - * s 0name Find this C symbol - * g 1name Find this definition - * d 2name Find functions called by this function - * c 3name Find functions calling this function - * t 4string find text string (cscope 12.9) - * t 4name Find assignments to (cscope 13.3) - * 5pattern change pattern -- NOT USED - * e 6pattern Find this egrep pattern - * f 7name Find this file - * i 8name Find files #including this file - */ +// See ":help cscope-find" for the possible queries. typedef struct { char * name; diff --git a/src/nvim/indent.c b/src/nvim/indent.c index f197669a97..7f31bb8c5c 100644 --- a/src/nvim/indent.c +++ b/src/nvim/indent.c @@ -10,7 +10,6 @@ #include "nvim/memline.h" #include "nvim/memory.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/move.h" #include "nvim/option.h" #include "nvim/regexp.h" diff --git a/src/nvim/indent_c.c b/src/nvim/indent_c.c index efe8e73a3c..6f03cf6037 100644 --- a/src/nvim/indent_c.c +++ b/src/nvim/indent_c.c @@ -12,7 +12,6 @@ #include "nvim/indent_c.h" #include "nvim/memline.h" #include "nvim/memory.h" -#include "nvim/misc2.h" #include "nvim/option.h" #include "nvim/search.h" #include "nvim/strings.h" diff --git a/src/nvim/main.c b/src/nvim/main.c index e052d0d315..a153931d8a 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -30,7 +30,6 @@ #include "nvim/memline.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/log.h" #include "nvim/memory.h" @@ -58,13 +57,13 @@ #include "nvim/event/loop.h" #include "nvim/os/signal.h" #include "nvim/event/process.h" -#include "nvim/msgpack_rpc/defs.h" #include "nvim/msgpack_rpc/helpers.h" #include "nvim/msgpack_rpc/server.h" #include "nvim/msgpack_rpc/channel.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" /* Maximum number of commands from + or -c arguments. */ #define MAX_ARG_CMDS 10 @@ -251,8 +250,9 @@ int main(int argc, char **argv) */ command_line_scan(¶ms); - if (GARGCOUNT > 0) - fname = get_fname(¶ms); + if (GARGCOUNT > 0) { + fname = get_fname(¶ms, cwd); + } TIME_MSG("expanding arguments"); @@ -1196,7 +1196,7 @@ static void check_and_set_isatty(mparm_T *paramp) /* * Get filename from command line, given that there is one. */ -static char_u *get_fname(mparm_T *parmp) +static char_u *get_fname(mparm_T *parmp, char_u *cwd) { #if !defined(UNIX) /* diff --git a/src/nvim/map.c b/src/nvim/map.c index 398e74268f..73af487f90 100644 --- a/src/nvim/map.c +++ b/src/nvim/map.c @@ -6,7 +6,7 @@ #include "nvim/map_defs.h" #include "nvim/vim.h" #include "nvim/memory.h" -#include "nvim/msgpack_rpc/defs.h" +#include "nvim/api/private/dispatch.h" #include "nvim/lib/khash.h" @@ -20,6 +20,8 @@ #define int_eq kh_int_hash_equal #define linenr_T_hash kh_int_hash_func #define linenr_T_eq kh_int_hash_equal +#define handle_T_hash kh_int_hash_func +#define handle_T_eq kh_int_hash_equal #if defined(ARCH_64) @@ -141,7 +143,8 @@ MAP_IMPL(cstr_t, uint64_t, DEFAULT_INITIALIZER) MAP_IMPL(cstr_t, ptr_t, DEFAULT_INITIALIZER) MAP_IMPL(ptr_t, ptr_t, DEFAULT_INITIALIZER) MAP_IMPL(uint64_t, ptr_t, DEFAULT_INITIALIZER) -#define MSGPACK_HANDLER_INITIALIZER {.fn = NULL, .async = false} +MAP_IMPL(handle_T, ptr_t, DEFAULT_INITIALIZER) +#define MSGPACK_HANDLER_INITIALIZER { .fn = NULL, .async = false } MAP_IMPL(String, MsgpackRpcRequestHandler, MSGPACK_HANDLER_INITIALIZER) #define KVEC_INITIALIZER { .size = 0, .capacity = 0, .items = NULL } MAP_IMPL(linenr_T, bufhl_vec_T, KVEC_INITIALIZER) diff --git a/src/nvim/map.h b/src/nvim/map.h index c7d9894bd1..ba3e84cb31 100644 --- a/src/nvim/map.h +++ b/src/nvim/map.h @@ -5,7 +5,7 @@ #include "nvim/map_defs.h" #include "nvim/api/private/defs.h" -#include "nvim/msgpack_rpc/defs.h" +#include "nvim/api/private/dispatch.h" #include "nvim/bufhl_defs.h" #define MAP_DECLS(T, U) \ @@ -29,6 +29,7 @@ MAP_DECLS(cstr_t, uint64_t) MAP_DECLS(cstr_t, ptr_t) MAP_DECLS(ptr_t, ptr_t) MAP_DECLS(uint64_t, ptr_t) +MAP_DECLS(handle_T, ptr_t) MAP_DECLS(String, MsgpackRpcRequestHandler) MAP_DECLS(linenr_T, bufhl_vec_T) diff --git a/src/nvim/mark.c b/src/nvim/mark.c index fe802e48ba..2a65cf396b 100644 --- a/src/nvim/mark.c +++ b/src/nvim/mark.c @@ -21,7 +21,6 @@ #include "nvim/memline.h" #include "nvim/memory.h" #include "nvim/message.h" -#include "nvim/misc2.h" #include "nvim/normal.h" #include "nvim/option.h" #include "nvim/path.h" diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c index 26d94aa6fa..f577fd847e 100644 --- a/src/nvim/mbyte.c +++ b/src/nvim/mbyte.c @@ -84,7 +84,6 @@ #include "nvim/memline.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/memory.h" #include "nvim/option.h" #include "nvim/screen.h" diff --git a/src/nvim/memfile.c b/src/nvim/memfile.c index 9fb03c4ac7..43412e3916 100644 --- a/src/nvim/memfile.c +++ b/src/nvim/memfile.c @@ -48,7 +48,6 @@ #include "nvim/fileio.h" #include "nvim/memline.h" #include "nvim/message.h" -#include "nvim/misc2.h" #include "nvim/memory.h" #include "nvim/os_unix.h" #include "nvim/path.h" diff --git a/src/nvim/memline.c b/src/nvim/memline.c index 08e82071d7..5505335769 100644 --- a/src/nvim/memline.c +++ b/src/nvim/memline.c @@ -55,7 +55,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/option.h" #include "nvim/os_unix.h" #include "nvim/path.h" @@ -3964,20 +3963,19 @@ long ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp) return size; } -/* - * Goto byte in buffer with offset 'cnt'. - */ +/// Goto byte in buffer with offset 'cnt'. void goto_byte(long cnt) { long boff = cnt; linenr_T lnum; - ml_flush_line(curbuf); /* cached line may be dirty */ + ml_flush_line(curbuf); // cached line may be dirty setpcmark(); - if (boff) - --boff; + if (boff) { + boff--; + } lnum = ml_find_line_or_offset(curbuf, (linenr_T)0, &boff); - if (lnum < 1) { /* past the end */ + if (lnum < 1) { // past the end curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count; curwin->w_curswant = MAXCOL; coladvance((colnr_T)MAXCOL); @@ -3989,7 +3987,84 @@ void goto_byte(long cnt) } check_cursor(); - /* Make sure the cursor is on the first byte of a multi-byte char. */ - if (has_mbyte) + // Make sure the cursor is on the first byte of a multi-byte char. + if (has_mbyte) { mb_adjust_cursor(); + } +} + +/// Increment the line pointer "lp" crossing line boundaries as necessary. +/// Return 1 when going to the next line. +/// Return 2 when moving forward onto a NUL at the end of the line). +/// Return -1 when at the end of file. +/// Return 0 otherwise. +int inc(pos_T *lp) +{ + char_u *p = ml_get_pos(lp); + + if (*p != NUL) { // still within line, move to next char (may be NUL) + if (has_mbyte) { + int l = (*mb_ptr2len)(p); + + lp->col += l; + return (p[l] != NUL) ? 0 : 2; + } + lp->col++; + lp->coladd = 0; + return (p[1] != NUL) ? 0 : 2; + } + if (lp->lnum != curbuf->b_ml.ml_line_count) { // there is a next line + lp->col = 0; + lp->lnum++; + lp->coladd = 0; + return 1; + } + return -1; +} + +/// Same as inc(), but skip NUL at the end of non-empty lines. +int incl(pos_T *lp) +{ + int r; + + if ((r = inc(lp)) >= 1 && lp->col) { + r = inc(lp); + } + return r; +} + +int dec(pos_T *lp) +{ + char_u *p; + + lp->coladd = 0; + if (lp->col > 0) { // still within line + lp->col--; + if (has_mbyte) { + p = ml_get(lp->lnum); + lp->col -= (*mb_head_off)(p, p + lp->col); + } + return 0; + } + if (lp->lnum > 1) { // there is a prior line + lp->lnum--; + p = ml_get(lp->lnum); + lp->col = (colnr_T)STRLEN(p); + if (has_mbyte) { + lp->col -= (*mb_head_off)(p, p + lp->col); + } + return 1; + } + return -1; // at start of file +} + +/// Same as dec(), but skip NUL at the end of non-empty lines. +int decl(pos_T *lp) +{ + int r; + + if ((r = dec(lp)) == 1 && lp->col) { + r = dec(lp); + } + return r; } diff --git a/src/nvim/memory.c b/src/nvim/memory.c index 8db47b79c1..3e041be4d3 100644 --- a/src/nvim/memory.c +++ b/src/nvim/memory.c @@ -440,6 +440,16 @@ void do_outofmem_msg(size_t size) } } +/// Writes time_t to "buf[8]". +void time_to_bytes(time_t time_, uint8_t buf[8]) +{ + // time_t can be up to 8 bytes in size, more than uintmax_t in 32 bits + // systems, thus we can't use put_bytes() here. + for (size_t i = 7, bufi = 0; bufi < 8; i--, bufi++) { + buf[bufi] = (uint8_t)((uint64_t)time_ >> (i * 8)); + } +} + #if defined(EXITFREE) #include "nvim/file_search.h" diff --git a/src/nvim/memory.h b/src/nvim/memory.h index 7b477da2f5..62cc78360c 100644 --- a/src/nvim/memory.h +++ b/src/nvim/memory.h @@ -3,6 +3,7 @@ #include <stdint.h> // for uint8_t #include <stddef.h> // for size_t +#include <time.h> // for time_t #ifdef INCLUDE_GENERATED_DECLARATIONS # include "memory.h.generated.h" diff --git a/src/nvim/menu.c b/src/nvim/menu.c index 3c2394d579..7c0eee64dd 100644 --- a/src/nvim/menu.c +++ b/src/nvim/menu.c @@ -18,9 +18,9 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/keymap.h" #include "nvim/garray.h" +#include "nvim/state.h" #include "nvim/strings.h" #include "nvim/ui.h" diff --git a/src/nvim/message.c b/src/nvim/message.c index 3c310ed309..1de2347b12 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -22,7 +22,6 @@ #include "nvim/mbyte.h" #include "nvim/memory.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/keymap.h" #include "nvim/garray.h" #include "nvim/ops.h" @@ -702,16 +701,9 @@ int delete_first_msg(void) void ex_messages(exarg_T *eap) { struct msg_hist *p; - const char *s; msg_hist_off = TRUE; - s = os_getenv("LANG"); - if (s) - msg_attr((char_u *) - _("Messages maintainer: Bram Moolenaar <Bram@vim.org>"), - hl_attr(HLF_T)); - for (p = first_msg_hist; p != NULL && !got_int; p = p->next) if (p->msg != NULL) msg_attr(p->msg, p->attr); diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c index d72d8e8513..4ab059c923 100644 --- a/src/nvim/misc1.c +++ b/src/nvim/misc1.c @@ -31,7 +31,6 @@ #include "nvim/memline.h" #include "nvim/memory.h" #include "nvim/message.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/move.h" #include "nvim/mouse.h" @@ -41,6 +40,7 @@ #include "nvim/regexp.h" #include "nvim/screen.h" #include "nvim/search.h" +#include "nvim/state.h" #include "nvim/strings.h" #include "nvim/tag.h" #include "nvim/ui.h" @@ -742,10 +742,14 @@ open_line ( if (ml_append(curwin->w_cursor.lnum, p_extra, (colnr_T)0, FALSE) == FAIL) goto theend; - /* Postpone calling changed_lines(), because it would mess up folding - * with markers. */ - mark_adjust(curwin->w_cursor.lnum + 1, (linenr_T)MAXLNUM, 1L, 0L); - did_append = TRUE; + // Postpone calling changed_lines(), because it would mess up folding + // with markers. + // Skip mark_adjust when adding a line after the last one, there can't + // be marks there. + if (curwin->w_cursor.lnum + 1 < curbuf->b_ml.ml_line_count) { + mark_adjust(curwin->w_cursor.lnum + 1, (linenr_T)MAXLNUM, 1L, 0L); + } + did_append = true; } else { /* * In VREPLACE mode we are starting to replace the next line. @@ -1742,18 +1746,6 @@ int gchar_pos(pos_T *pos) } /* - * Skip to next part of an option argument: Skip space and comma. - */ -char_u *skip_to_option_part(char_u *p) -{ - if (*p == ',') - ++p; - while (*p == ' ') - ++p; - return p; -} - -/* * Call this function when something in the current buffer is changed. * * Most often called through changed_bytes() and changed_lines(), which also @@ -1871,7 +1863,11 @@ void appended_lines(linenr_T lnum, long count) */ void appended_lines_mark(linenr_T lnum, long count) { - mark_adjust(lnum + 1, (linenr_T)MAXLNUM, count, 0L); + // Skip mark_adjust when adding a line after the last one, there can't + // be marks there. + if (lnum + count < curbuf->b_ml.ml_line_count) { + mark_adjust(lnum + 1, (linenr_T)MAXLNUM, count, 0L); + } changed_lines(lnum + 1, 0, lnum + 1, count); } @@ -2683,6 +2679,42 @@ void fast_breakcheck(void) } } +// Call shell. Calls os_call_shell, with 'shellxquote' added. +int call_shell(char_u *cmd, ShellOpts opts, char_u *extra_shell_arg) +{ + int retval; + proftime_T wait_time; + + if (p_verbose > 3) { + verbose_enter(); + smsg(_("Calling shell to execute: \"%s\""), + cmd == NULL ? p_sh : cmd); + ui_putc('\n'); + verbose_leave(); + } + + if (do_profiling == PROF_YES) { + prof_child_enter(&wait_time); + } + + if (*p_sh == NUL) { + EMSG(_(e_shellempty)); + retval = -1; + } else { + // The external command may update a tags file, clear cached tags. + tag_freematch(); + + retval = os_call_shell(cmd, opts, extra_shell_arg); + } + + set_vim_var_nr(VV_SHELL_ERROR, (varnumber_T)retval); + if (do_profiling == PROF_YES) { + prof_child_exit(&wait_time); + } + + return retval; +} + /// Get the stdout of an external command. /// If "ret_len" is NULL replace NUL characters with NL. When "ret_len" is not /// NULL store the length there. diff --git a/src/nvim/misc2.c b/src/nvim/misc2.c deleted file mode 100644 index 368f83cfb5..0000000000 --- a/src/nvim/misc2.c +++ /dev/null @@ -1,486 +0,0 @@ -/* - * misc2.c: Various functions. - */ -#include <assert.h> -#include <inttypes.h> -#include <string.h> - -#include "nvim/vim.h" -#include "nvim/ascii.h" -#include "nvim/misc2.h" -#include "nvim/file_search.h" -#include "nvim/buffer.h" -#include "nvim/charset.h" -#include "nvim/cursor.h" -#include "nvim/diff.h" -#include "nvim/edit.h" -#include "nvim/eval.h" -#include "nvim/ex_cmds.h" -#include "nvim/ex_docmd.h" -#include "nvim/ex_getln.h" -#include "nvim/fileio.h" -#include "nvim/fold.h" -#include "nvim/getchar.h" -#include "nvim/macros.h" -#include "nvim/mark.h" -#include "nvim/mbyte.h" -#include "nvim/memfile.h" -#include "nvim/memline.h" -#include "nvim/memory.h" -#include "nvim/message.h" -#include "nvim/misc1.h" -#include "nvim/move.h" -#include "nvim/option.h" -#include "nvim/ops.h" -#include "nvim/os_unix.h" -#include "nvim/path.h" -#include "nvim/quickfix.h" -#include "nvim/regexp.h" -#include "nvim/screen.h" -#include "nvim/search.h" -#include "nvim/spell.h" -#include "nvim/strings.h" -#include "nvim/syntax.h" -#include "nvim/tag.h" -#include "nvim/ui.h" -#include "nvim/window.h" -#include "nvim/os/os.h" -#include "nvim/os/shell.h" - - -#ifdef INCLUDE_GENERATED_DECLARATIONS -# include "misc2.c.generated.h" -#endif -/* - * Return TRUE if in the current mode we need to use virtual. - */ -int virtual_active(void) -{ - /* While an operator is being executed we return "virtual_op", because - * VIsual_active has already been reset, thus we can't check for "block" - * being used. */ - if (virtual_op != MAYBE) - return virtual_op; - return ve_flags == VE_ALL - || ((ve_flags & VE_BLOCK) && VIsual_active && VIsual_mode == Ctrl_V) - || ((ve_flags & VE_INSERT) && (State & INSERT)); -} - -/* - * Increment the line pointer "lp" crossing line boundaries as necessary. - * Return 1 when going to the next line. - * Return 2 when moving forward onto a NUL at the end of the line). - * Return -1 when at the end of file. - * Return 0 otherwise. - */ -int inc(pos_T *lp) -{ - char_u *p = ml_get_pos(lp); - - if (*p != NUL) { /* still within line, move to next char (may be NUL) */ - if (has_mbyte) { - int l = (*mb_ptr2len)(p); - - lp->col += l; - return (p[l] != NUL) ? 0 : 2; - } - lp->col++; - lp->coladd = 0; - return (p[1] != NUL) ? 0 : 2; - } - if (lp->lnum != curbuf->b_ml.ml_line_count) { /* there is a next line */ - lp->col = 0; - lp->lnum++; - lp->coladd = 0; - return 1; - } - return -1; -} - -/* - * incl(lp): same as inc(), but skip the NUL at the end of non-empty lines - */ -int incl(pos_T *lp) -{ - int r; - - if ((r = inc(lp)) >= 1 && lp->col) - r = inc(lp); - return r; -} - -int dec(pos_T *lp) -{ - char_u *p; - - lp->coladd = 0; - if (lp->col > 0) { /* still within line */ - lp->col--; - if (has_mbyte) { - p = ml_get(lp->lnum); - lp->col -= (*mb_head_off)(p, p + lp->col); - } - return 0; - } - if (lp->lnum > 1) { /* there is a prior line */ - lp->lnum--; - p = ml_get(lp->lnum); - lp->col = (colnr_T)STRLEN(p); - if (has_mbyte) - lp->col -= (*mb_head_off)(p, p + lp->col); - return 1; - } - return -1; /* at start of file */ -} - -/* - * decl(lp): same as dec(), but skip the NUL at the end of non-empty lines - */ -int decl(pos_T *lp) -{ - int r; - - if ((r = dec(lp)) == 1 && lp->col) - r = dec(lp); - return r; -} - -/* - * Return TRUE when 'shell' has "csh" in the tail. - */ -int csh_like_shell(void) -{ - return strstr((char *)path_tail(p_sh), "csh") != NULL; -} - -/* - * Isolate one part of a string option where parts are separated with - * "sep_chars". - * The part is copied into "buf[maxlen]". - * "*option" is advanced to the next part. - * The length is returned. - */ -size_t copy_option_part(char_u **option, char_u *buf, size_t maxlen, char *sep_chars) -{ - size_t len = 0; - char_u *p = *option; - - /* skip '.' at start of option part, for 'suffixes' */ - if (*p == '.') - buf[len++] = *p++; - while (*p != NUL && vim_strchr((char_u *)sep_chars, *p) == NULL) { - /* - * Skip backslash before a separator character and space. - */ - if (p[0] == '\\' && vim_strchr((char_u *)sep_chars, p[1]) != NULL) - ++p; - if (len < maxlen - 1) - buf[len++] = *p; - ++p; - } - buf[len] = NUL; - - if (*p != NUL && *p != ',') /* skip non-standard separator */ - ++p; - p = skip_to_option_part(p); /* p points to next file name */ - - *option = p; - return len; -} - -/* - * Return the current end-of-line type: EOL_DOS, EOL_UNIX or EOL_MAC. - */ -int get_fileformat(buf_T *buf) -{ - int c = *buf->b_p_ff; - - if (buf->b_p_bin || c == 'u') - return EOL_UNIX; - if (c == 'm') - return EOL_MAC; - return EOL_DOS; -} - -/* - * Like get_fileformat(), but override 'fileformat' with "p" for "++opt=val" - * argument. - */ -int -get_fileformat_force ( - buf_T *buf, - exarg_T *eap /* can be NULL! */ -) -{ - int c; - - if (eap != NULL && eap->force_ff != 0) - c = eap->cmd[eap->force_ff]; - else { - if ((eap != NULL && eap->force_bin != 0) - ? (eap->force_bin == FORCE_BIN) : buf->b_p_bin) - return EOL_UNIX; - c = *buf->b_p_ff; - } - if (c == 'u') - return EOL_UNIX; - if (c == 'm') - return EOL_MAC; - return EOL_DOS; -} - -/// Set the current end-of-line type to EOL_UNIX, EOL_MAC, or EOL_DOS. -/// -/// Sets 'fileformat'. -/// -/// @param eol_style End-of-line style. -/// @param opt_flags OPT_LOCAL and/or OPT_GLOBAL -void set_fileformat(int eol_style, int opt_flags) -{ - char *p = NULL; - - switch (eol_style) { - case EOL_UNIX: - p = FF_UNIX; - break; - case EOL_MAC: - p = FF_MAC; - break; - case EOL_DOS: - p = FF_DOS; - break; - } - - // p is NULL if "eol_style" is EOL_UNKNOWN. - if (p != NULL) { - set_string_option_direct((char_u *)"ff", - -1, - (char_u *)p, - OPT_FREE | opt_flags, - 0); - } - - // This may cause the buffer to become (un)modified. - check_status(curbuf); - redraw_tabline = TRUE; - need_maketitle = TRUE; // Set window title later. -} - -/* - * Return the default fileformat from 'fileformats'. - */ -int default_fileformat(void) -{ - switch (*p_ffs) { - case 'm': return EOL_MAC; - case 'd': return EOL_DOS; - } - return EOL_UNIX; -} - -// Call shell. Calls os_call_shell, with 'shellxquote' added. -int call_shell(char_u *cmd, ShellOpts opts, char_u *extra_shell_arg) -{ - char_u *ncmd; - int retval; - proftime_T wait_time; - - if (p_verbose > 3) { - verbose_enter(); - smsg(_("Calling shell to execute: \"%s\""), - cmd == NULL ? p_sh : cmd); - ui_putc('\n'); - verbose_leave(); - } - - if (do_profiling == PROF_YES) - prof_child_enter(&wait_time); - - if (*p_sh == NUL) { - EMSG(_(e_shellempty)); - retval = -1; - } else { - /* The external command may update a tags file, clear cached tags. */ - tag_freematch(); - - if (cmd == NULL || *p_sxq == NUL) - retval = os_call_shell(cmd, opts, extra_shell_arg); - else { - char_u *ecmd = cmd; - - if (*p_sxe != NUL && STRCMP(p_sxq, "(") == 0) { - ecmd = vim_strsave_escaped_ext(cmd, p_sxe, '^', FALSE); - } - ncmd = xmalloc(STRLEN(ecmd) + STRLEN(p_sxq) * 2 + 1); - STRCPY(ncmd, p_sxq); - STRCAT(ncmd, ecmd); - /* When 'shellxquote' is ( append ). - * When 'shellxquote' is "( append )". */ - STRCAT(ncmd, STRCMP(p_sxq, "(") == 0 ? (char_u *)")" - : STRCMP(p_sxq, "\"(") == 0 ? (char_u *)")\"" - : p_sxq); - retval = os_call_shell(ncmd, opts, extra_shell_arg); - xfree(ncmd); - - if (ecmd != cmd) - xfree(ecmd); - } - } - - set_vim_var_nr(VV_SHELL_ERROR, (varnumber_T) retval); - if (do_profiling == PROF_YES) { - prof_child_exit(&wait_time); - } - - return retval; -} - -/* - * VISUAL, SELECTMODE and OP_PENDING State are never set, they are equal to - * NORMAL State with a condition. This function returns the real State. - */ -int get_real_state(void) -{ - if (State & NORMAL) { - if (VIsual_active) { - if (VIsual_select) - return SELECTMODE; - return VISUAL; - } else if (finish_op) - return OP_PENDING; - } - return State; -} - -/* - * Change to a file's directory. - * Caller must call shorten_fnames()! - * Return OK or FAIL. - */ -int vim_chdirfile(char_u *fname) -{ - char_u dir[MAXPATHL]; - - STRLCPY(dir, fname, MAXPATHL); - *path_tail_with_sep(dir) = NUL; - return os_chdir((char *)dir) == 0 ? OK : FAIL; -} - -/* - * Change directory to "new_dir". Search 'cdpath' for relative directory names. - */ -int vim_chdir(char_u *new_dir) -{ - char_u *dir_name; - int r; - - dir_name = find_directory_in_path(new_dir, STRLEN(new_dir), - FNAME_MESS, curbuf->b_ffname); - if (dir_name == NULL) - return -1; - r = os_chdir((char *)dir_name); - xfree(dir_name); - return r; -} - -/* - * Read 2 bytes from "fd" and turn them into an int, MSB first. - */ -int get2c(FILE *fd) -{ - int n; - - n = getc(fd); - n = (n << 8) + getc(fd); - return n; -} - -/* - * Read 3 bytes from "fd" and turn them into an int, MSB first. - */ -int get3c(FILE *fd) -{ - int n; - - n = getc(fd); - n = (n << 8) + getc(fd); - n = (n << 8) + getc(fd); - return n; -} - -/* - * Read 4 bytes from "fd" and turn them into an int, MSB first. - */ -int get4c(FILE *fd) -{ - /* Use unsigned rather than int otherwise result is undefined - * when left-shift sets the MSB. */ - unsigned n; - - n = (unsigned)getc(fd); - n = (n << 8) + (unsigned)getc(fd); - n = (n << 8) + (unsigned)getc(fd); - n = (n << 8) + (unsigned)getc(fd); - return (int)n; -} - -/* - * Read 8 bytes from "fd" and turn them into a time_t, MSB first. - */ -time_t get8ctime(FILE *fd) -{ - time_t n = 0; - int i; - - for (i = 0; i < 8; ++i) - n = (n << 8) + getc(fd); - return n; -} - -/// Reads a string of length "cnt" from "fd" into allocated memory. -/// @return pointer to the string or NULL when unable to read that many bytes. -char *read_string(FILE *fd, size_t cnt) -{ - uint8_t *str = xmallocz(cnt); - for (size_t i = 0; i < cnt; i++) { - int c = getc(fd); - if (c == EOF) { - xfree(str); - return NULL; - } - str[i] = (uint8_t)c; - } - return (char *)str; -} - -/// Writes a number to file "fd", most significant bit first, in "len" bytes. -/// @returns false in case of an error. -bool put_bytes(FILE *fd, uintmax_t number, size_t len) -{ - assert(len > 0); - for (size_t i = len - 1; i < len; i--) { - if (putc((int)(number >> (i * 8)), fd) == EOF) { - return false; - } - } - return true; -} - -/// Writes time_t to file "fd" in 8 bytes. -/// @returns FAIL when the write failed. -int put_time(FILE *fd, time_t time_) -{ - uint8_t buf[8]; - time_to_bytes(time_, buf); - return fwrite(buf, sizeof(uint8_t), ARRAY_SIZE(buf), fd) == 1 ? OK : FAIL; -} - -/// Writes time_t to "buf[8]". -void time_to_bytes(time_t time_, uint8_t buf[8]) -{ - // time_t can be up to 8 bytes in size, more than uintmax_t in 32 bits - // systems, thus we can't use put_bytes() here. - for (size_t i = 7, bufi = 0; bufi < 8; i--, bufi++) { - buf[bufi] = (uint8_t)((uint64_t)time_ >> (i * 8)); - } -} diff --git a/src/nvim/misc2.h b/src/nvim/misc2.h deleted file mode 100644 index 28b5b775d2..0000000000 --- a/src/nvim/misc2.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef NVIM_MISC2_H -#define NVIM_MISC2_H - -#include "nvim/os/shell.h" - -#define READ_STRING(x, y) (char_u *)read_string((x), (size_t)(y)) - -#ifdef INCLUDE_GENERATED_DECLARATIONS -# include "misc2.h.generated.h" -#endif - -#endif // NVIM_MISC2_H diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c index 5efac2623c..2ebe199f47 100644 --- a/src/nvim/mouse.c +++ b/src/nvim/mouse.c @@ -4,6 +4,7 @@ #include "nvim/vim.h" #include "nvim/ascii.h" #include "nvim/window.h" +#include "nvim/state.h" #include "nvim/strings.h" #include "nvim/screen.h" #include "nvim/syntax.h" diff --git a/src/nvim/move.c b/src/nvim/move.c index b129c5cb7a..4c814f3ae0 100644 --- a/src/nvim/move.c +++ b/src/nvim/move.c @@ -24,7 +24,6 @@ #include "nvim/mbyte.h" #include "nvim/memline.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/popupmnu.h" #include "nvim/screen.h" #include "nvim/strings.h" diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c index 5b249ee1c7..cd12f258b6 100644 --- a/src/nvim/msgpack_rpc/channel.c +++ b/src/nvim/msgpack_rpc/channel.c @@ -19,6 +19,7 @@ #include "nvim/main.h" #include "nvim/ascii.h" #include "nvim/memory.h" +#include "nvim/eval.h" #include "nvim/os_unix.h" #include "nvim/message.h" #include "nvim/map.h" @@ -55,12 +56,7 @@ typedef struct { msgpack_unpacker *unpacker; union { Stream stream; - struct { - LibuvProcess uvproc; - Stream in; - Stream out; - Stream err; - } process; + Process *proc; struct { Stream in; Stream out; @@ -79,7 +75,6 @@ typedef struct { uint64_t request_id; } RequestEvent; -static uint64_t next_id = 1; static PMap(uint64_t) *channels = NULL; static PMap(cstr_t) *event_strings = NULL; static msgpack_sbuffer out_buffer; @@ -112,33 +107,20 @@ void channel_teardown(void) } /// Creates an API channel by starting a process and connecting to its -/// stdin/stdout. stderr is forwarded to the editor error stream. +/// stdin/stdout. stderr is handled by the job infrastructure. /// /// @param argv The argument vector for the process. [consumed] /// @return The channel id (> 0), on success. /// 0, on error. -uint64_t channel_from_process(char **argv) -{ - Channel *channel = register_channel(kChannelTypeProc); - channel->data.process.uvproc = libuv_process_init(&main_loop, channel); - Process *proc = &channel->data.process.uvproc.process; - proc->argv = argv; - proc->in = &channel->data.process.in; - proc->out = &channel->data.process.out; - proc->err = &channel->data.process.err; - proc->cb = process_exit; - if (!process_spawn(proc)) { - loop_poll_events(&main_loop, 0); - decref(channel); - return 0; - } - +uint64_t channel_from_process(Process *proc, uint64_t id) +{ + Channel *channel = register_channel(kChannelTypeProc, id, proc->events); incref(channel); // process channels are only closed by the exit_cb + channel->data.proc = proc; + wstream_init(proc->in, 0); rstream_init(proc->out, 0); - rstream_start(proc->out, parse_msgpack); - rstream_init(proc->err, 0); - rstream_start(proc->err, forward_stderr); + rstream_start(proc->out, parse_msgpack, channel); return channel->id; } @@ -148,14 +130,14 @@ uint64_t channel_from_process(char **argv) /// @param watcher The SocketWatcher ready to accept the connection void channel_from_connection(SocketWatcher *watcher) { - Channel *channel = register_channel(kChannelTypeSocket); - socket_watcher_accept(watcher, &channel->data.stream, channel); + Channel *channel = register_channel(kChannelTypeSocket, 0, NULL); + socket_watcher_accept(watcher, &channel->data.stream); incref(channel); // close channel only after the stream is closed channel->data.stream.internal_close_cb = close_cb; channel->data.stream.internal_data = channel; wstream_init(&channel->data.stream, 0); rstream_init(&channel->data.stream, CHANNEL_BUFFER_SIZE); - rstream_start(&channel->data.stream, parse_msgpack); + rstream_start(&channel->data.stream, parse_msgpack, channel); } /// Sends event/arguments to channel @@ -314,30 +296,21 @@ bool channel_close(uint64_t id) /// Neovim void channel_from_stdio(void) { - Channel *channel = register_channel(kChannelTypeStdio); + Channel *channel = register_channel(kChannelTypeStdio, 0, NULL); incref(channel); // stdio channels are only closed on exit // read stream - rstream_init_fd(&main_loop, &channel->data.std.in, 0, CHANNEL_BUFFER_SIZE, - channel); - rstream_start(&channel->data.std.in, parse_msgpack); + rstream_init_fd(&main_loop, &channel->data.std.in, 0, CHANNEL_BUFFER_SIZE); + rstream_start(&channel->data.std.in, parse_msgpack, channel); // write stream - wstream_init_fd(&main_loop, &channel->data.std.out, 1, 0, NULL); + wstream_init_fd(&main_loop, &channel->data.std.out, 1, 0); } -static void forward_stderr(Stream *stream, RBuffer *rbuf, size_t count, - void *data, bool eof) +void channel_process_exit(uint64_t id, int status) { - while (rbuffer_size(rbuf)) { - char buf[256]; - size_t read = rbuffer_read(rbuf, buf, sizeof(buf) - 1); - buf[read] = NUL; - ELOG("Channel %" PRIu64 " stderr: %s", ((Channel *)data)->id, buf); - } -} + Channel *channel = pmap_get(uint64_t)(channels, id); -static void process_exit(Process *proc, int status, void *data) -{ - decref(data); + channel->closed = true; + decref(channel); } static void parse_msgpack(Stream *stream, RBuffer *rbuf, size_t c, void *data, @@ -492,8 +465,7 @@ static void on_request_event(void **argv) } else { api_free_object(result); } - // All arguments were freed already, but we still need to free the array - xfree(args.items); + api_free_array(args); decref(channel); xfree(e); } @@ -512,7 +484,7 @@ static bool channel_write(Channel *channel, WBuffer *buffer) success = wstream_write(&channel->data.stream, buffer); break; case kChannelTypeProc: - success = wstream_write(&channel->data.process.in, buffer); + success = wstream_write(channel->data.proc->in, buffer); break; case kChannelTypeStdio: success = wstream_write(&channel->data.std.out, buffer); @@ -637,16 +609,17 @@ static void close_channel(Channel *channel) switch (channel->type) { case kChannelTypeSocket: - stream_close(&channel->data.stream, NULL); + stream_close(&channel->data.stream, NULL, NULL); break; case kChannelTypeProc: - if (!channel->data.process.uvproc.process.closed) { - process_stop(&channel->data.process.uvproc.process); - } + // Only close the rpc channel part, + // there could be an error message on the stderr stream + process_close_in(channel->data.proc); + process_close_out(channel->data.proc); break; case kChannelTypeStdio: - stream_close(&channel->data.std.in, NULL); - stream_close(&channel->data.std.out, NULL); + stream_close(&channel->data.std.in, NULL, NULL); + stream_close(&channel->data.std.out, NULL, NULL); queue_put(main_loop.fast_events, exit_event, 1, channel); return; default: @@ -680,7 +653,9 @@ static void free_channel(Channel *channel) pmap_free(cstr_t)(channel->subscribed_events); kv_destroy(channel->call_stack); kv_destroy(channel->delayed_notifications); - queue_free(channel->events); + if (channel->type != kChannelTypeProc) { + queue_free(channel->events); + } xfree(channel); } @@ -689,15 +664,15 @@ static void close_cb(Stream *stream, void *data) decref(data); } -static Channel *register_channel(ChannelType type) +static Channel *register_channel(ChannelType type, uint64_t id, Queue *events) { Channel *rv = xmalloc(sizeof(Channel)); - rv->events = queue_new_child(main_loop.events); + rv->events = events ? events : queue_new_child(main_loop.events); rv->type = type; rv->refcount = 1; rv->closed = false; rv->unpacker = msgpack_unpacker_new(MSGPACK_UNPACKER_INIT_BUFFER_SIZE); - rv->id = next_id++; + rv->id = id > 0 ? id : next_chan_id++; rv->pending_requests = 0; rv->subscribed_events = pmap_new(cstr_t)(); rv->next_request_id = 1; diff --git a/src/nvim/msgpack_rpc/channel.h b/src/nvim/msgpack_rpc/channel.h index 104547a7b8..0d92976d02 100644 --- a/src/nvim/msgpack_rpc/channel.h +++ b/src/nvim/msgpack_rpc/channel.h @@ -6,6 +6,7 @@ #include "nvim/api/private/defs.h" #include "nvim/event/socket.h" +#include "nvim/event/process.h" #include "nvim/vim.h" #define METHOD_MAXLEN 512 diff --git a/src/nvim/msgpack_rpc/defs.h b/src/nvim/msgpack_rpc/defs.h deleted file mode 100644 index 5611636d4f..0000000000 --- a/src/nvim/msgpack_rpc/defs.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef NVIM_MSGPACK_RPC_DEFS_H -#define NVIM_MSGPACK_RPC_DEFS_H - - -/// The rpc_method_handlers table, used in msgpack_rpc_dispatch(), stores -/// functions of this type. -typedef struct { - Object (*fn)(uint64_t channel_id, - uint64_t request_id, - Array args, - Error *error); - bool async; // function is always safe to run immediately instead of being - // put in a request queue for handling when nvim waits for input. -} MsgpackRpcRequestHandler; - -/// Initializes the msgpack-rpc method table -void msgpack_rpc_init_method_table(void); - -// Add a handler to the method table -void msgpack_rpc_add_method_handler(String method, - MsgpackRpcRequestHandler handler); - -void msgpack_rpc_init_function_metadata(Dictionary *metadata); - -MsgpackRpcRequestHandler msgpack_rpc_get_handler_for(const char *name, - size_t name_len) - FUNC_ATTR_NONNULL_ARG(1); -#endif // NVIM_MSGPACK_RPC_DEFS_H diff --git a/src/nvim/msgpack_rpc/helpers.c b/src/nvim/msgpack_rpc/helpers.c index 9195b10614..33e9bb1c07 100644 --- a/src/nvim/msgpack_rpc/helpers.c +++ b/src/nvim/msgpack_rpc/helpers.c @@ -4,9 +4,9 @@ #include <msgpack.h> +#include "nvim/api/private/dispatch.h" #include "nvim/api/private/helpers.h" #include "nvim/msgpack_rpc/helpers.h" -#include "nvim/msgpack_rpc/defs.h" #include "nvim/lib/kvec.h" #include "nvim/vim.h" #include "nvim/log.h" @@ -40,7 +40,7 @@ static msgpack_sbuffer sbuffer; return false; \ } \ \ - *arg = data.via.u64; \ + *arg = (handle_T)data.via.i64; \ return true; \ } \ \ @@ -49,7 +49,7 @@ static msgpack_sbuffer sbuffer; { \ msgpack_packer pac; \ msgpack_packer_init(&pac, &sbuffer, msgpack_sbuffer_write); \ - msgpack_pack_uint64(&pac, o); \ + msgpack_pack_int64(&pac, o); \ msgpack_pack_ext(res, sbuffer.size, kObjectType##t); \ msgpack_pack_ext_body(res, sbuffer.data, sbuffer.size); \ msgpack_sbuffer_clear(&sbuffer); \ diff --git a/src/nvim/normal.c b/src/nvim/normal.c index c95e5e1a15..d0a9d3aca7 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -36,7 +36,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/keymap.h" #include "nvim/move.h" #include "nvim/mouse.h" @@ -2110,6 +2109,20 @@ static void op_function(oparg_T *oap) } } +// Move the current tab to tab in same column as mouse or to end of the +// tabline if there is no tab there. +static void move_tab_to_mouse(void) +{ + int tabnr = tab_page_click_defs[mouse_col].tabnr; + if (tabnr <= 0) { + tabpage_move(9999); + } else if (tabnr < tabpage_index(curtab)) { + tabpage_move(tabnr - 1); + } else { + tabpage_move(tabnr); + } +} + /* * Do the appropriate action for the current mouse click in the current mode. * Not used for Command-line mode. @@ -2346,12 +2359,7 @@ do_mouse ( if (mouse_row == 0 && firstwin->w_winrow > 0) { if (is_drag) { if (in_tab_line) { - if (tab_page_click_defs[mouse_col].type == kStlClickTabClose) { - tabpage_move(9999); - } else { - int tabnr = tab_page_click_defs[mouse_col].tabnr; - tabpage_move(tabnr < tabpage_index(curtab) ? tabnr - 1 : tabnr); - } + move_tab_to_mouse(); } return false; } @@ -2466,10 +2474,7 @@ do_mouse ( } return true; } else if (is_drag && in_tab_line) { - tabpage_move(tab_page_click_defs[mouse_col].type == kStlClickTabClose - ? 9999 - : tab_page_click_defs[mouse_col].tabnr - 1); - in_tab_line = false; + move_tab_to_mouse(); return false; } @@ -5919,6 +5924,9 @@ static void nv_replace(cmdarg_T *cap) curwin->w_set_curswant = true; set_last_insert(cap->nchar); } + + foldUpdateAll(curwin); + foldOpenCursor(); } /* diff --git a/src/nvim/ops.c b/src/nvim/ops.c index e8a79fa820..388a72adce 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -30,13 +30,13 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/move.h" #include "nvim/normal.h" #include "nvim/option.h" #include "nvim/path.h" #include "nvim/screen.h" #include "nvim/search.h" +#include "nvim/state.h" #include "nvim/strings.h" #include "nvim/terminal.h" #include "nvim/ui.h" @@ -51,10 +51,10 @@ static yankreg_T *y_previous = NULL; /* ptr to last written yankreg */ static bool clipboard_didwarn_unnamed = false; -// for behavior between start_global_changes() and end_global_changes()) +// for behavior between start_batch_changes() and end_batch_changes()) static bool clipboard_delay_update = false; // delay clipboard update -static int global_change_count = 0; // if set, inside global changes -static bool clipboard_needs_update = false; // the clipboard was updated +static int batch_change_count = 0; // inside a script +static bool clipboard_needs_update = false; // clipboard was updated /* * structure used by block_prep, op_delete and op_yank for blockwise operators @@ -3110,8 +3110,13 @@ error: if (dir == FORWARD) curbuf->b_op_start.lnum++; } - mark_adjust(curbuf->b_op_start.lnum + (y_type == kMTCharWise), - (linenr_T)MAXLNUM, nr_lines, 0L); + // Skip mark_adjust when adding lines after the last one, there + // can't be marks there. + if (curbuf->b_op_start.lnum + (y_type == kMTCharWise) - 1 + nr_lines + < curbuf->b_ml.ml_line_count) { + mark_adjust(curbuf->b_op_start.lnum + (y_type == kMTCharWise), + (linenr_T)MAXLNUM, nr_lines, 0L); + } // note changed text for displaying and folding if (y_type == kMTCharWise) { @@ -5630,20 +5635,20 @@ static void set_clipboard(int name, yankreg_T *reg) (void)eval_call_provider("clipboard", "set", args); } -/// Avoid clipboard (slow) during batch operations (:global). -void start_global_changes(void) +/// Avoid clipboard (slow) during batch operations (i.e., a script). +void start_batch_changes(void) { - if (++global_change_count > 1) { + if (++batch_change_count > 1) { return; } clipboard_delay_update = true; clipboard_needs_update = false; } -/// Update the clipboard after :global changes finished. -void end_global_changes(void) +/// Update the clipboard after batch changes finished. +void end_batch_changes(void) { - if (--global_change_count > 0) { + if (--batch_change_count > 0) { // recursive return; } diff --git a/src/nvim/option.c b/src/nvim/option.c index de53b0b1f4..d8908cca90 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -236,6 +236,7 @@ typedef struct vimoption { #define P_NO_ML 0x2000000U ///< not allowed in modeline #define P_CURSWANT 0x4000000U ///< update curswant required; not needed ///< when there is a redraw flag +#define P_NO_DEF_EXP 0x8000000U ///< Do not expand default value. #define HIGHLIGHT_INIT \ "8:SpecialKey,~:EndOfBuffer,z:TermCursor,Z:TermCursorNC,@:NonText," \ @@ -245,7 +246,7 @@ typedef struct vimoption { "A:DiffAdd,C:DiffChange,D:DiffDelete,T:DiffText,>:SignColumn,-:Conceal," \ "B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel," \ "x:PmenuSbar,X:PmenuThumb,*:TabLine,#:TabLineSel,_:TabLineFill," \ - "!:CursorColumn,.:CursorLine,o:ColorColumn" + "!:CursorColumn,.:CursorLine,o:ColorColumn,q:QuickFixLine" /* * options[] is initialized here. @@ -520,6 +521,8 @@ static void set_runtimepath_default(void) #undef SITE_SIZE #undef AFTER_SIZE set_string_default("runtimepath", rtp, true); + // Make a copy of 'rtp' for 'packpath' + set_string_default("packpath", rtp, false); xfree(data_dirs); xfree(config_dirs); xfree(data_home); @@ -676,15 +679,18 @@ void set_init_1(void) #endif false); - char *backupdir = stdpaths_user_data_subpath("backup", 0); + char *backupdir = stdpaths_user_data_subpath("backup", 0, true); const size_t backupdir_len = strlen(backupdir); backupdir = xrealloc(backupdir, backupdir_len + 3); memmove(backupdir + 2, backupdir, backupdir_len + 1); memmove(backupdir, ".,", 2); - set_string_default("viewdir", stdpaths_user_data_subpath("view", 0), true); + set_string_default("viewdir", stdpaths_user_data_subpath("view", 0, true), + true); set_string_default("backupdir", backupdir, true); - set_string_default("directory", stdpaths_user_data_subpath("swap", 2), true); - set_string_default("undodir", stdpaths_user_data_subpath("undo", 0), true); + set_string_default("directory", stdpaths_user_data_subpath("swap", 2, true), + true); + set_string_default("undodir", stdpaths_user_data_subpath("undo", 0, true), + true); // Set default for &runtimepath. All necessary expansions are performed in // this function. set_runtimepath_default(); @@ -726,6 +732,9 @@ void set_init_1(void) * default. */ for (opt_idx = 0; options[opt_idx].fullname; opt_idx++) { + if (options[opt_idx].flags & P_NO_DEF_EXP) { + continue; + } char *p; if ((options[opt_idx].flags & P_GETTEXT) && options[opt_idx].var != NULL) { @@ -1473,16 +1482,19 @@ do_set ( * default value was already expanded, only * required when an environment variable was set * later */ - if (newval == NULL) + new_value_alloced = true; + if (newval == NULL) { newval = empty_option; - else { + } else if (!(options[opt_idx].flags | P_NO_DEF_EXP)) { s = option_expand(opt_idx, newval); - if (s == NULL) + if (s == NULL) { s = newval; + } newval = vim_strsave(s); + } else { + newval = (char_u *)xstrdup((char *)newval); } - new_value_alloced = TRUE; - } else if (nextchar == '<') { /* set to global val */ + } else if (nextchar == '<') { // set to global val newval = vim_strsave(*(char_u **)get_varp_scope( &(options[opt_idx]), OPT_GLOBAL)); new_value_alloced = TRUE; @@ -2020,13 +2032,15 @@ static char_u *option_expand(int opt_idx, char_u *val) if (!(options[opt_idx].flags & P_EXPAND) || options[opt_idx].var == NULL) return NULL; - /* If val is longer than MAXPATHL no meaningful expansion can be done, - * expand_env() would truncate the string. */ - if (val != NULL && STRLEN(val) > MAXPATHL) - return NULL; - - if (val == NULL) + if (val == NULL) { val = *(char_u **)options[opt_idx].var; + } + + // If val is longer than MAXPATHL no meaningful expansion can be done, + // expand_env() would truncate the string. + if (val == NULL || STRLEN(val) > MAXPATHL) { + return NULL; + } /* * Expanding this with NameBuff, expand_env() must not be passed IObuff. @@ -6571,10 +6585,8 @@ int get_sw_value(buf_T *buf) return (int)result; } -/* - * Return the effective softtabstop value for the current buffer, using the - * 'tabstop' value when 'softtabstop' is negative. - */ +// Return the effective softtabstop value for the current buffer, +// using the effective shiftwidth value when 'softtabstop' is negative. int get_sts_value(void) { long result = curbuf->b_p_sts < 0 ? get_sw_value(curbuf) : curbuf->b_p_sts; @@ -6700,3 +6712,148 @@ unsigned int get_bkc_value(buf_T *buf) { return buf->b_bkc_flags ? buf->b_bkc_flags : bkc_flags; } + +/// Return the current end-of-line type: EOL_DOS, EOL_UNIX or EOL_MAC. +int get_fileformat(buf_T *buf) +{ + int c = *buf->b_p_ff; + + if (buf->b_p_bin || c == 'u') { + return EOL_UNIX; + } + if (c == 'm') { + return EOL_MAC; + } + return EOL_DOS; +} + +/// Like get_fileformat(), but override 'fileformat' with "p" for "++opt=val" +/// argument. +/// +/// @param eap can be NULL! +int get_fileformat_force(buf_T *buf, exarg_T *eap) +{ + int c; + + if (eap != NULL && eap->force_ff != 0) { + c = eap->cmd[eap->force_ff]; + } else { + if ((eap != NULL && eap->force_bin != 0) + ? (eap->force_bin == FORCE_BIN) : buf->b_p_bin) { + return EOL_UNIX; + } + c = *buf->b_p_ff; + } + if (c == 'u') { + return EOL_UNIX; + } + if (c == 'm') { + return EOL_MAC; + } + return EOL_DOS; +} + +/// Return the default fileformat from 'fileformats'. +int default_fileformat(void) +{ + switch (*p_ffs) { + case 'm': return EOL_MAC; + case 'd': return EOL_DOS; + } + return EOL_UNIX; +} + +/// Set the current end-of-line type to EOL_UNIX, EOL_MAC, or EOL_DOS. +/// +/// Sets 'fileformat'. +/// +/// @param eol_style End-of-line style. +/// @param opt_flags OPT_LOCAL and/or OPT_GLOBAL +void set_fileformat(int eol_style, int opt_flags) +{ + char *p = NULL; + + switch (eol_style) { + case EOL_UNIX: + p = FF_UNIX; + break; + case EOL_MAC: + p = FF_MAC; + break; + case EOL_DOS: + p = FF_DOS; + break; + } + + // p is NULL if "eol_style" is EOL_UNKNOWN. + if (p != NULL) { + set_string_option_direct((char_u *)"ff", + -1, + (char_u *)p, + OPT_FREE | opt_flags, + 0); + } + + // This may cause the buffer to become (un)modified. + check_status(curbuf); + redraw_tabline = true; + need_maketitle = true; // Set window title later. +} + +/// Skip to next part of an option argument: Skip space and comma. +char_u *skip_to_option_part(char_u *p) +{ + if (*p == ',') { + p++; + } + while (*p == ' ') { + p++; + } + return p; +} + +/// Isolate one part of a string option separated by `sep_chars`. +/// +/// @param[in,out] option advanced to the next part +/// @param[in,out] buf copy of the isolated part +/// @param[in] maxlen length of `buf` +/// @param[in] sep_chars chars that separate the option parts +/// +/// @return length of `*option` +size_t copy_option_part(char_u **option, char_u *buf, size_t maxlen, + char *sep_chars) +{ + size_t len = 0; + char_u *p = *option; + + // skip '.' at start of option part, for 'suffixes' + if (*p == '.') { + buf[len++] = *p++; + } + while (*p != NUL && vim_strchr((char_u *)sep_chars, *p) == NULL) { + // Skip backslash before a separator character and space. + if (p[0] == '\\' && vim_strchr((char_u *)sep_chars, p[1]) != NULL) { + p++; + } + if (len < maxlen - 1) { + buf[len++] = *p; + } + p++; + } + buf[len] = NUL; + + if (*p != NUL && *p != ',') { // skip non-standard separator + p++; + } + p = skip_to_option_part(p); // p points to next file name + + *option = p; + return len; +} + +/// Return TRUE when 'shell' has "csh" in the tail. +int csh_like_shell(void) +{ + return strstr((char *)path_tail(p_sh), "csh") != NULL; +} + diff --git a/src/nvim/option.h b/src/nvim/option.h index 5c2b2662b5..cf167cdd2c 100644 --- a/src/nvim/option.h +++ b/src/nvim/option.h @@ -1,22 +1,25 @@ #ifndef NVIM_OPTION_H #define NVIM_OPTION_H +#include "nvim/ex_cmds_defs.h" // for exarg_T + /* flags for buf_copy_options() */ #define BCO_ENTER 1 /* going to enter the buffer */ #define BCO_ALWAYS 2 /* always copy the options */ #define BCO_NOHELP 4 /* don't touch the help related options */ -/* - * "flags" values for option-setting functions. - * When OPT_GLOBAL and OPT_LOCAL are both missing, set both local and global - * values, get local value. - */ -#define OPT_FREE 1 /* free old value if it was allocated */ -#define OPT_GLOBAL 2 /* use global value */ -#define OPT_LOCAL 4 /* use local value */ -#define OPT_MODELINE 8 /* option in modeline */ -#define OPT_WINONLY 16 /* only set window-local options */ -#define OPT_NOWIN 32 /* don't set window-local options */ +/// Flags for option-setting functions +/// +/// When OPT_GLOBAL and OPT_LOCAL are both missing, set both local and global +/// values, get local value. +typedef enum { + OPT_FREE = 1, ///< Free old value if it was allocated. + OPT_GLOBAL = 2, ///< Use global value. + OPT_LOCAL = 4, ///< Use local value. + OPT_MODELINE = 8, ///< Option in modeline. + OPT_WINONLY = 16, ///< Only set window-local options. + OPT_NOWIN = 32, ///< Don’t set window-local options. +} OptionFlags; #ifdef INCLUDE_GENERATED_DECLARATIONS # include "option.h.generated.h" diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h index 8d6f42e088..e36cceaaf4 100644 --- a/src/nvim/option_defs.h +++ b/src/nvim/option_defs.h @@ -370,17 +370,17 @@ static char *(p_cb_values[]) = {"unnamed", "unnamedplus", NULL}; # define CB_UNNAMED 0x001 # define CB_UNNAMEDPLUS 0x002 # define CB_UNNAMEDMASK (CB_UNNAMED | CB_UNNAMEDPLUS) -EXTERN long p_cwh; /* 'cmdwinheight' */ -EXTERN long p_ch; /* 'cmdheight' */ -EXTERN int p_confirm; /* 'confirm' */ -EXTERN int p_cp; /* 'compatible' */ -EXTERN char_u *p_cot; /* 'completeopt' */ -EXTERN long p_ph; /* 'pumheight' */ -EXTERN char_u *p_cpo; /* 'cpoptions' */ -EXTERN char_u *p_csprg; /* 'cscopeprg' */ -EXTERN int p_csre; /* 'cscoperelative' */ -EXTERN char_u *p_csqf; /* 'cscopequickfix' */ -# define CSQF_CMDS "sgdctefi" +EXTERN long p_cwh; // 'cmdwinheight' +EXTERN long p_ch; // 'cmdheight' +EXTERN int p_confirm; // 'confirm' +EXTERN int p_cp; // 'compatible' +EXTERN char_u *p_cot; // 'completeopt' +EXTERN long p_ph; // 'pumheight' +EXTERN char_u *p_cpo; // 'cpoptions' +EXTERN char_u *p_csprg; // 'cscopeprg' +EXTERN int p_csre; // 'cscoperelative' +EXTERN char_u *p_csqf; // 'cscopequickfix' +# define CSQF_CMDS "sgdctefia" # define CSQF_FLAGS "+-0" EXTERN int p_cst; /* 'cscopetag' */ EXTERN long p_csto; /* 'cscopetagorder' */ diff --git a/src/nvim/options.lua b/src/nvim/options.lua index d19af4f73f..060ec8c1e1 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -165,7 +165,7 @@ return { deny_duplicates=true, secure=true, vi_def=true, - expand=true, + expand='nodefault', varname='p_bdir', defaults={if_true={vi=''}} }, @@ -616,7 +616,7 @@ return { deny_duplicates=true, secure=true, vi_def=true, - expand=true, + expand='nodefault', varname='p_dir', defaults={if_true={vi=''}} }, @@ -1891,7 +1891,7 @@ return { deny_duplicates=true, secure=true, vi_def=true, - expand=true, + expand='nodefault', varname='p_rtp', defaults={if_true={vi=''}} }, @@ -2507,7 +2507,7 @@ return { deny_duplicates=true, secure=true, vi_def=true, - expand=true, + expand='nodefault', varname='p_udir', defaults={if_true={vi=''}} }, @@ -2568,7 +2568,7 @@ return { type='string', scope={'global'}, secure=true, vi_def=true, - expand=true, + expand='nodefault', varname='p_vdir', defaults={if_true={vi=''}} }, diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index edc430410c..83a0262545 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -12,7 +12,6 @@ #include "nvim/os/os.h" #include "nvim/memory.h" #include "nvim/message.h" -#include "nvim/misc2.h" #include "nvim/path.h" #include "nvim/strings.h" #include "nvim/eval.h" diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c index cd943c4843..008952fa97 100644 --- a/src/nvim/os/fs.c +++ b/src/nvim/os/fs.c @@ -21,7 +21,6 @@ #include "nvim/message.h" #include "nvim/assert.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/path.h" #include "nvim/strings.h" @@ -399,14 +398,7 @@ ptrdiff_t os_read(const int fd, bool *ret_eof, char *const ret_buf, assert(read_bytes <= size); } if (cur_read_bytes < 0) { -#ifdef HAVE_UV_TRANSLATE_SYS_ERROR - const int error = uv_translate_sys_error(errno); -#else - const int error = -errno; - STATIC_ASSERT(-EINTR == UV_EINTR, "Need to translate error codes"); - STATIC_ASSERT(-EAGAIN == UV_EAGAIN, "Need to translate error codes"); - STATIC_ASSERT(-ENOMEM == UV_ENOMEM, "Need to translate error codes"); -#endif + const int error = os_translate_sys_error(errno); errno = 0; if (error == UV_EINTR || error == UV_EAGAIN) { continue; @@ -469,14 +461,7 @@ ptrdiff_t os_readv(int fd, bool *ret_eof, struct iovec *iov, size_t iov_size) } } } else if (cur_read_bytes < 0) { -#ifdef HAVE_UV_TRANSLATE_SYS_ERROR - const int error = uv_translate_sys_error(errno); -#else - const int error = -errno; - STATIC_ASSERT(-EINTR == UV_EINTR, "Need to translate error codes"); - STATIC_ASSERT(-EAGAIN == UV_EAGAIN, "Need to translate error codes"); - STATIC_ASSERT(-ENOMEM == UV_ENOMEM, "Need to translate error codes"); -#endif + const int error = os_translate_sys_error(errno); errno = 0; if (error == UV_EINTR || error == UV_EAGAIN) { continue; @@ -515,15 +500,7 @@ ptrdiff_t os_write(const int fd, const char *const buf, const size_t size) written_bytes += (size_t)cur_written_bytes; } if (cur_written_bytes < 0) { -#ifdef HAVE_UV_TRANSLATE_SYS_ERROR - const int error = uv_translate_sys_error(errno); -#else - const int error = -errno; - STATIC_ASSERT(-EINTR == UV_EINTR, "Need to translate error codes"); - STATIC_ASSERT(-EAGAIN == UV_EAGAIN, "Need to translate error codes"); - // According to the man page open() may fail with ENOMEM, but write() - // can’t. -#endif + const int error = os_translate_sys_error(errno); errno = 0; if (error == UV_EINTR || error == UV_EAGAIN) { continue; @@ -1023,3 +1000,126 @@ shortcut_end: } #endif + +int os_translate_sys_error(int sys_errno) { +#ifdef HAVE_UV_TRANSLATE_SYS_ERROR + return uv_translate_sys_error(sys_errno); +#elif WIN32 + // TODO(equalsraf): libuv does not yet expose uv_translate_sys_error() + // in its public API, include a version here until it can be used. + // See https://github.com/libuv/libuv/issues/79 +# ifndef ERROR_SYMLINK_NOT_SUPPORTED +# define ERROR_SYMLINK_NOT_SUPPORTED 1464 +# endif + + if (sys_errno <= 0) { + return sys_errno; // If < 0 then it's already a libuv error + } + + switch (sys_errno) { + case ERROR_NOACCESS: return UV_EACCES; + case WSAEACCES: return UV_EACCES; + case ERROR_ADDRESS_ALREADY_ASSOCIATED: return UV_EADDRINUSE; + case WSAEADDRINUSE: return UV_EADDRINUSE; + case WSAEADDRNOTAVAIL: return UV_EADDRNOTAVAIL; + case WSAEAFNOSUPPORT: return UV_EAFNOSUPPORT; + case WSAEWOULDBLOCK: return UV_EAGAIN; + case WSAEALREADY: return UV_EALREADY; + case ERROR_INVALID_FLAGS: return UV_EBADF; + case ERROR_INVALID_HANDLE: return UV_EBADF; + case ERROR_LOCK_VIOLATION: return UV_EBUSY; + case ERROR_PIPE_BUSY: return UV_EBUSY; + case ERROR_SHARING_VIOLATION: return UV_EBUSY; + case ERROR_OPERATION_ABORTED: return UV_ECANCELED; + case WSAEINTR: return UV_ECANCELED; + case ERROR_NO_UNICODE_TRANSLATION: return UV_ECHARSET; + case ERROR_CONNECTION_ABORTED: return UV_ECONNABORTED; + case WSAECONNABORTED: return UV_ECONNABORTED; + case ERROR_CONNECTION_REFUSED: return UV_ECONNREFUSED; + case WSAECONNREFUSED: return UV_ECONNREFUSED; + case ERROR_NETNAME_DELETED: return UV_ECONNRESET; + case WSAECONNRESET: return UV_ECONNRESET; + case ERROR_ALREADY_EXISTS: return UV_EEXIST; + case ERROR_FILE_EXISTS: return UV_EEXIST; + case ERROR_BUFFER_OVERFLOW: return UV_EFAULT; + case WSAEFAULT: return UV_EFAULT; + case ERROR_HOST_UNREACHABLE: return UV_EHOSTUNREACH; + case WSAEHOSTUNREACH: return UV_EHOSTUNREACH; + case ERROR_INSUFFICIENT_BUFFER: return UV_EINVAL; + case ERROR_INVALID_DATA: return UV_EINVAL; + case ERROR_INVALID_PARAMETER: return UV_EINVAL; + case ERROR_SYMLINK_NOT_SUPPORTED: return UV_EINVAL; + case WSAEINVAL: return UV_EINVAL; + case WSAEPFNOSUPPORT: return UV_EINVAL; + case WSAESOCKTNOSUPPORT: return UV_EINVAL; + case ERROR_BEGINNING_OF_MEDIA: return UV_EIO; + case ERROR_BUS_RESET: return UV_EIO; + case ERROR_CRC: return UV_EIO; + case ERROR_DEVICE_DOOR_OPEN: return UV_EIO; + case ERROR_DEVICE_REQUIRES_CLEANING: return UV_EIO; + case ERROR_DISK_CORRUPT: return UV_EIO; + case ERROR_EOM_OVERFLOW: return UV_EIO; + case ERROR_FILEMARK_DETECTED: return UV_EIO; + case ERROR_GEN_FAILURE: return UV_EIO; + case ERROR_INVALID_BLOCK_LENGTH: return UV_EIO; + case ERROR_IO_DEVICE: return UV_EIO; + case ERROR_NO_DATA_DETECTED: return UV_EIO; + case ERROR_NO_SIGNAL_SENT: return UV_EIO; + case ERROR_OPEN_FAILED: return UV_EIO; + case ERROR_SETMARK_DETECTED: return UV_EIO; + case ERROR_SIGNAL_REFUSED: return UV_EIO; + case WSAEISCONN: return UV_EISCONN; + case ERROR_CANT_RESOLVE_FILENAME: return UV_ELOOP; + case ERROR_TOO_MANY_OPEN_FILES: return UV_EMFILE; + case WSAEMFILE: return UV_EMFILE; + case WSAEMSGSIZE: return UV_EMSGSIZE; + case ERROR_FILENAME_EXCED_RANGE: return UV_ENAMETOOLONG; + case ERROR_NETWORK_UNREACHABLE: return UV_ENETUNREACH; + case WSAENETUNREACH: return UV_ENETUNREACH; + case WSAENOBUFS: return UV_ENOBUFS; + case ERROR_BAD_PATHNAME: return UV_ENOENT; + case ERROR_DIRECTORY: return UV_ENOENT; + case ERROR_FILE_NOT_FOUND: return UV_ENOENT; + case ERROR_INVALID_NAME: return UV_ENOENT; + case ERROR_INVALID_DRIVE: return UV_ENOENT; + case ERROR_INVALID_REPARSE_DATA: return UV_ENOENT; + case ERROR_MOD_NOT_FOUND: return UV_ENOENT; + case ERROR_PATH_NOT_FOUND: return UV_ENOENT; + case WSAHOST_NOT_FOUND: return UV_ENOENT; + case WSANO_DATA: return UV_ENOENT; + case ERROR_NOT_ENOUGH_MEMORY: return UV_ENOMEM; + case ERROR_OUTOFMEMORY: return UV_ENOMEM; + case ERROR_CANNOT_MAKE: return UV_ENOSPC; + case ERROR_DISK_FULL: return UV_ENOSPC; + case ERROR_EA_TABLE_FULL: return UV_ENOSPC; + case ERROR_END_OF_MEDIA: return UV_ENOSPC; + case ERROR_HANDLE_DISK_FULL: return UV_ENOSPC; + case ERROR_NOT_CONNECTED: return UV_ENOTCONN; + case WSAENOTCONN: return UV_ENOTCONN; + case ERROR_DIR_NOT_EMPTY: return UV_ENOTEMPTY; + case WSAENOTSOCK: return UV_ENOTSOCK; + case ERROR_NOT_SUPPORTED: return UV_ENOTSUP; + case ERROR_BROKEN_PIPE: return UV_EOF; + case ERROR_ACCESS_DENIED: return UV_EPERM; + case ERROR_PRIVILEGE_NOT_HELD: return UV_EPERM; + case ERROR_BAD_PIPE: return UV_EPIPE; + case ERROR_NO_DATA: return UV_EPIPE; + case ERROR_PIPE_NOT_CONNECTED: return UV_EPIPE; + case WSAESHUTDOWN: return UV_EPIPE; + case WSAEPROTONOSUPPORT: return UV_EPROTONOSUPPORT; + case ERROR_WRITE_PROTECT: return UV_EROFS; + case ERROR_SEM_TIMEOUT: return UV_ETIMEDOUT; + case WSAETIMEDOUT: return UV_ETIMEDOUT; + case ERROR_NOT_SAME_DEVICE: return UV_EXDEV; + case ERROR_INVALID_FUNCTION: return UV_EISDIR; + case ERROR_META_EXPANSION_TOO_LONG: return UV_E2BIG; + default: return UV_UNKNOWN; + } +#else + const int error = -errno; + STATIC_ASSERT(-EINTR == UV_EINTR, "Need to translate error codes"); + STATIC_ASSERT(-EAGAIN == UV_EAGAIN, "Need to translate error codes"); + STATIC_ASSERT(-ENOMEM == UV_ENOMEM, "Need to translate error codes"); + return error; +#endif +} diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c index 0c46dc96ee..6873e32f34 100644 --- a/src/nvim/os/input.c +++ b/src/nvim/os/input.c @@ -19,7 +19,7 @@ #include "nvim/getchar.h" #include "nvim/main.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" +#include "nvim/state.h" #define READ_BUFFER_SIZE 0xfff #define INPUT_BUFFER_SIZE (READ_BUFFER_SIZE * 4) @@ -60,8 +60,8 @@ void input_start(int fd) } global_fd = fd; - rstream_init_fd(&main_loop, &read_stream, fd, READ_BUFFER_SIZE, NULL); - rstream_start(&read_stream, read_cb); + rstream_init_fd(&main_loop, &read_stream, fd, READ_BUFFER_SIZE); + rstream_start(&read_stream, read_cb, NULL); } void input_stop(void) @@ -71,7 +71,7 @@ void input_stop(void) } rstream_stop(&read_stream); - stream_close(&read_stream, NULL); + stream_close(&read_stream, NULL, NULL); } static void cursorhold_event(void **argv) @@ -266,29 +266,32 @@ static unsigned int handle_mouse_event(char **ptr, uint8_t *buf, } static int orig_num_clicks = 0; - static int orig_mouse_code = 0; - static int orig_mouse_col = 0; - static int orig_mouse_row = 0; - static uint64_t orig_mouse_time = 0; // time of previous mouse click - uint64_t mouse_time = os_hrtime(); // time of current mouse click - - // compute the time elapsed since the previous mouse click and - // convert p_mouse from ms to ns - uint64_t timediff = mouse_time - orig_mouse_time; - uint64_t mouset = (uint64_t)p_mouset * 1000000; - if (mouse_code == orig_mouse_code - && timediff < mouset - && orig_num_clicks != 4 - && orig_mouse_col == mouse_col - && orig_mouse_row == mouse_row) { - orig_num_clicks++; - } else { - orig_num_clicks = 1; + if (mouse_code != KE_LEFTRELEASE && mouse_code != KE_RIGHTRELEASE + && mouse_code != KE_MIDDLERELEASE) { + static int orig_mouse_code = 0; + static int orig_mouse_col = 0; + static int orig_mouse_row = 0; + static uint64_t orig_mouse_time = 0; // time of previous mouse click + uint64_t mouse_time = os_hrtime(); // time of current mouse click (ns) + + // compute the time elapsed since the previous mouse click and + // convert p_mouse from ms to ns + uint64_t timediff = mouse_time - orig_mouse_time; + uint64_t mouset = (uint64_t)p_mouset * 1000000; + if (mouse_code == orig_mouse_code + && timediff < mouset + && orig_num_clicks != 4 + && orig_mouse_col == mouse_col + && orig_mouse_row == mouse_row) { + orig_num_clicks++; + } else { + orig_num_clicks = 1; + } + orig_mouse_code = mouse_code; + orig_mouse_col = mouse_col; + orig_mouse_row = mouse_row; + orig_mouse_time = mouse_time; } - orig_mouse_code = mouse_code; - orig_mouse_col = mouse_col; - orig_mouse_row = mouse_row; - orig_mouse_time = mouse_time; uint8_t modifiers = 0; if (orig_num_clicks == 2) { diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c index 64c673930a..661b12accc 100644 --- a/src/nvim/os/shell.c +++ b/src/nvim/os/shell.c @@ -19,7 +19,6 @@ #include "nvim/message.h" #include "nvim/memory.h" #include "nvim/ui.h" -#include "nvim/misc2.h" #include "nvim/screen.h" #include "nvim/memline.h" #include "nvim/option_defs.h" @@ -54,12 +53,12 @@ char **shell_build_argv(const char *cmd, const char *extra_args) size_t i = tokenize(p_sh, rv); if (extra_args) { - rv[i++] = xstrdup(extra_args); // Push a copy of `extra_args` + rv[i++] = xstrdup(extra_args); // Push a copy of `extra_args` } if (cmd) { - i += tokenize(p_shcf, rv + i); // Split 'shellcmdflag' - rv[i++] = xstrdup(cmd); // Push a copy of the command. + i += tokenize(p_shcf, rv + i); // Split 'shellcmdflag' + rv[i++] = shell_xescape_xquote(cmd); // Copy (and escape) `cmd`. } rv[i] = NULL; @@ -236,10 +235,10 @@ static int do_os_system(char **argv, } proc->out->events = NULL; rstream_init(proc->out, 0); - rstream_start(proc->out, data_cb); + rstream_start(proc->out, data_cb, &buf); proc->err->events = NULL; rstream_init(proc->err, 0); - rstream_start(proc->err, data_cb); + rstream_start(proc->err, data_cb, &buf); // write the input, if any if (input) { @@ -251,7 +250,7 @@ static int do_os_system(char **argv, return -1; } // close the input stream after everything is written - wstream_set_write_cb(&in, shell_write_cb); + wstream_set_write_cb(&in, shell_write_cb, NULL); } // invoke busy_start here so event_poll_until wont change the busy state for @@ -546,5 +545,41 @@ static size_t write_output(char *output, size_t remaining, bool to_buffer, static void shell_write_cb(Stream *stream, void *data, int status) { - stream_close(stream, NULL); + stream_close(stream, NULL, NULL); } + +/// Applies 'shellxescape' (p_sxe) and 'shellxquote' (p_sxq) to a command. +/// +/// @param cmd Command string +/// @return Escaped/quoted command string (allocated). +static char *shell_xescape_xquote(const char *cmd) + FUNC_ATTR_NONNULL_ALL FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT +{ + if (*p_sxq == NUL) { + return xstrdup(cmd); + } + + const char *ecmd = cmd; + if (*p_sxe != NUL && STRCMP(p_sxq, "(") == 0) { + ecmd = (char *)vim_strsave_escaped_ext((char_u *)cmd, p_sxe, '^', false); + } + size_t ncmd_size = strlen(ecmd) + STRLEN(p_sxq) * 2 + 1; + char *ncmd = xmalloc(ncmd_size); + + // When 'shellxquote' is ( append ). + // When 'shellxquote' is "( append )". + if (STRCMP(p_sxq, "(") == 0) { + vim_snprintf(ncmd, ncmd_size, "(%s)", ecmd); + } else if (STRCMP(p_sxq, "\"(") == 0) { + vim_snprintf(ncmd, ncmd_size, "\"(%s)\"", ecmd); + } else { + vim_snprintf(ncmd, ncmd_size, "%s%s%s", p_sxq, ecmd, p_sxq); + } + + if (ecmd != cmd) { + xfree((void *)ecmd); + } + + return ncmd; +} + diff --git a/src/nvim/os/signal.c b/src/nvim/os/signal.c index 4abc9cfc36..1ac6d3f5e1 100644 --- a/src/nvim/os/signal.c +++ b/src/nvim/os/signal.c @@ -2,6 +2,9 @@ #include <stdbool.h> #include <uv.h> +#ifndef WIN32 +# include <signal.h> // for sigset_t +#endif #include "nvim/ascii.h" #include "nvim/vim.h" @@ -11,7 +14,6 @@ #include "nvim/main.h" #include "nvim/memory.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/event/signal.h" #include "nvim/os/signal.h" #include "nvim/event/loop.h" @@ -29,6 +31,16 @@ static bool rejecting_deadly; void signal_init(void) { +#ifndef WIN32 + // Ensure a clean slate by unblocking all signals. For example, if SIGCHLD is + // blocked, libuv may hang after spawning a subprocess on Linux. #5230 + sigset_t mask; + sigemptyset(&mask); + if (pthread_sigmask(SIG_SETMASK, &mask, NULL) != 0) { + ELOG("Could not unblock signals, nvim might behave strangely."); + } +#endif + signal_watcher_init(&main_loop, &spipe, NULL); signal_watcher_init(&main_loop, &shup, NULL); signal_watcher_init(&main_loop, &squit, NULL); diff --git a/src/nvim/os/stdpaths.c b/src/nvim/os/stdpaths.c index 81ceb919c4..10b3f4c091 100644 --- a/src/nvim/os/stdpaths.c +++ b/src/nvim/os/stdpaths.c @@ -100,18 +100,30 @@ char *stdpaths_user_conf_subpath(const char *fname) /// /// @param[in] fname New component of the path. /// @param[in] trailing_pathseps Amount of trailing path separators to add. +/// @param[in] escape_commas If true, all commas will be escaped. /// -/// @return [allocated] `$XDG_DATA_HOME/nvim/{fname}` +/// @return [allocated] `$XDG_DATA_HOME/nvim/{fname}`. char *stdpaths_user_data_subpath(const char *fname, - const size_t trailing_pathseps) + const size_t trailing_pathseps, + const bool escape_commas) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET { char *ret = concat_fnames_realloc(get_xdg_home(kXDGDataHome), fname, true); - if (trailing_pathseps) { - const size_t len = strlen(ret); - ret = xrealloc(ret, len + trailing_pathseps + 1); - memset(ret + len, PATHSEP, trailing_pathseps); - ret[len + trailing_pathseps] = NUL; + const size_t len = strlen(ret); + const size_t numcommas = (escape_commas ? memcnt(ret, ',', len) : 0); + if (numcommas || trailing_pathseps) { + ret = xrealloc(ret, len + trailing_pathseps + numcommas + 1); + for (size_t i = 0 ; i < len + numcommas ; i++) { + if (ret[i] == ',') { + memmove(ret + i + 1, ret + i, len - i + numcommas); + ret[i] = '\\'; + i++; + } + } + if (trailing_pathseps) { + memset(ret + len + numcommas, PATHSEP, trailing_pathseps); + } + ret[len + trailing_pathseps + numcommas] = NUL; } return ret; } diff --git a/src/nvim/os/users.c b/src/nvim/os/users.c index 8ebb7562ef..1c94ef0067 100644 --- a/src/nvim/os/users.c +++ b/src/nvim/os/users.c @@ -6,7 +6,6 @@ #include "nvim/os/os.h" #include "nvim/garray.h" #include "nvim/memory.h" -#include "nvim/misc2.h" #include "nvim/strings.h" #ifdef HAVE_PWD_H # include <pwd.h> diff --git a/src/nvim/os_unix.c b/src/nvim/os_unix.c index def7e3b0e5..08294fa6a0 100644 --- a/src/nvim/os_unix.c +++ b/src/nvim/os_unix.c @@ -27,7 +27,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/mouse.h" #include "nvim/garray.h" #include "nvim/path.h" diff --git a/src/nvim/path.c b/src/nvim/path.c index 57499429ec..a79b7139f1 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -18,7 +18,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/option.h" #include "nvim/os/os.h" #include "nvim/os/shell.h" @@ -172,19 +171,23 @@ char_u *path_next_component(char_u *fname) return fname; } -/* - * Get a pointer to one character past the head of a path name. - * Unix: after "/"; DOS: after "c:\"; Mac: no head. - * If there is no head, path is returned. - */ +/// Get a pointer to one character past the head of a path name. +/// Unix: after "/"; Win: after "c:\" +/// If there is no head, path is returned. char_u *get_past_head(char_u *path) { - char_u *retval; + char_u *retval = path; - retval = path; +#ifdef WIN32 + // May skip "c:" + if (isalpha(path[0]) && path[1] == ':') { + retval = path + 2; + } +#endif - while (vim_ispathsep(*retval)) + while (vim_ispathsep(*retval)) { ++retval; + } return retval; } @@ -562,11 +565,12 @@ static size_t do_path_expand(garray_T *gap, const char_u *path, while (*path_end != NUL) { /* May ignore a wildcard that has a backslash before it; it will * be removed by rem_backslash() or file_pat_to_reg_pat() below. */ - if (path_end >= path + wildoff && rem_backslash(path_end)) + if (path_end >= path + wildoff && rem_backslash(path_end)) { *p++ = *path_end++; - else if (*path_end == '/') { - if (e != NULL) + } else if (vim_ispathsep_nocolon(*path_end)) { + if (e != NULL) { break; + } s = p + 1; } else if (path_end >= path + wildoff && (vim_strchr((char_u *)"*?[{~$", *path_end) != NULL @@ -2099,7 +2103,6 @@ int path_full_dir_name(char *directory, char *buffer, size_t len) } // Append to_append to path with a slash in between. -// Append to_append to path with a slash in between. int append_path(char *path, const char *to_append, size_t max_len) { size_t current_length = strlen(path); @@ -2116,7 +2119,7 @@ int append_path(char *path, const char *to_append, size_t max_len) } // Glue both paths with a slash. - if (current_length > 0 && path[current_length-1] != '/') { + if (current_length > 0 && !vim_ispathsep_nocolon(path[current_length-1])) { current_length += 1; // Count the trailing slash. // +1 for the NUL at the end. @@ -2124,7 +2127,7 @@ int append_path(char *path, const char *to_append, size_t max_len) return FAIL; } - STRCAT(path, "/"); + STRCAT(path, PATHSEPSTR); } // +1 for the NUL at the end. @@ -2182,9 +2185,16 @@ static int path_get_absolute_path(const char_u *fname, char_u *buf, /// Check if the given file is absolute. /// -/// This just checks if the file name starts with '/' or '~'. /// @return `TRUE` if "fname" is absolute. int path_is_absolute_path(const char_u *fname) { +#ifdef WIN32 + // A name like "d:/foo" and "//server/share" is absolute + return ((isalpha(fname[0]) && fname[1] == ':' + && vim_ispathsep_nocolon(fname[2])) + || (vim_ispathsep_nocolon(fname[0]) && fname[0] == fname[1])); +#else + // UNIX: This just checks if the file name starts with '/' or '~'. return *fname == '/' || *fname == '~'; +#endif } diff --git a/src/nvim/po/af.po b/src/nvim/po/af.po index 6bb93b9e02..8f06ed178c 100644 --- a/src/nvim/po/af.po +++ b/src/nvim/po/af.po @@ -4305,10 +4305,6 @@ msgstr "rel %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Ongeldige registernaam: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Boodskappe onderhouers: Danie Roux en Jean Jordaan <droux@tuks.co.za>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Onderbreek: " diff --git a/src/nvim/po/ca.po b/src/nvim/po/ca.po index 79434cfdcd..2b0d7611d0 100644 --- a/src/nvim/po/ca.po +++ b/src/nvim/po/ca.po @@ -4293,10 +4293,6 @@ msgstr "lnia %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: El nom de registre no s vlid: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Traducci dels missatges: Ernest Adrogu <eadrogue@gmx.net>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Interrupci: " diff --git a/src/nvim/po/cs.cp1250.po b/src/nvim/po/cs.cp1250.po index 1e62034317..339dfe6ae5 100644 --- a/src/nvim/po/cs.cp1250.po +++ b/src/nvim/po/cs.cp1250.po @@ -4378,10 +4378,6 @@ msgstr "dek %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: '%s' nen ppustn jmno registru" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Sprvce zprv: Bram Moolenaar <Bram@vim.org>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Peruen: " diff --git a/src/nvim/po/cs.po b/src/nvim/po/cs.po index dd7016fedb..5c19eecf32 100644 --- a/src/nvim/po/cs.po +++ b/src/nvim/po/cs.po @@ -4378,10 +4378,6 @@ msgstr "dek %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: '%s' nen ppustn jmno registru" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Sprvce zprv: Bram Moolenaar <Bram@vim.org>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Peruen: " diff --git a/src/nvim/po/en_GB.po b/src/nvim/po/en_GB.po index b4b38e11e3..41e4cd895d 100644 --- a/src/nvim/po/en_GB.po +++ b/src/nvim/po/en_GB.po @@ -4128,10 +4128,6 @@ msgstr "" msgid "E354: Invalid register name: '%s'" msgstr "" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Messages maintainer: Mike Williams <mrw@eandem.co.uk>" - #: ../message.c:986 msgid "Interrupt: " msgstr "" diff --git a/src/nvim/po/eo.po b/src/nvim/po/eo.po index 6bc76506ae..153eacc7b8 100644 --- a/src/nvim/po/eo.po +++ b/src/nvim/po/eo.po @@ -4295,10 +4295,6 @@ msgstr "linio %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Nevalida nomo de reĝistro: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Flegado de mesaĝoj: Dominique PELLÉ <dominique.pelle@gmail.com>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Interrompo: " diff --git a/src/nvim/po/es.po b/src/nvim/po/es.po index 8a9c86e88d..9a3bfa6894 100644 --- a/src/nvim/po/es.po +++ b/src/nvim/po/es.po @@ -4377,12 +4377,6 @@ msgstr "línea %4ld" msgid "E354: Invalid register name: '%s'" msgstr "E354: Nombre de registro no válido: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "" -"Traducción: Proyecto vim-doc-es <http://www.assembla.com/wiki/show/vim-doc-" -"es>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Interrupción: " diff --git a/src/nvim/po/fi.po b/src/nvim/po/fi.po index d4082135aa..6dfaa78a77 100644 --- a/src/nvim/po/fi.po +++ b/src/nvim/po/fi.po @@ -4275,10 +4275,6 @@ msgstr "rivi %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Virheellinen rekisterin nimi: %s" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Knnksen yllpitj: Flammie Pirinen <flammie@iki.fi>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Keskeytys: " diff --git a/src/nvim/po/fr.po b/src/nvim/po/fr.po index 41efd5c5e3..a16a939117 100644 --- a/src/nvim/po/fr.po +++ b/src/nvim/po/fr.po @@ -4479,10 +4479,6 @@ msgid "E354: Invalid register name: '%s'" msgstr "E354: Nom de registre invalide : '%s'" # DB - todo : mettre jour ? -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Maintenance des messages : Dominique Pell <dominique.pelle@gmail.com>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Interruption : " diff --git a/src/nvim/po/ga.po b/src/nvim/po/ga.po index f7117c6e86..d94b788449 100644 --- a/src/nvim/po/ga.po +++ b/src/nvim/po/ga.po @@ -4286,11 +4286,6 @@ msgstr "lne %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Ainm neamhbhail tabhaill: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "" -"Cothaitheoir na dteachtaireachta: Kevin P. Scannell <scannell@slu.edu>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Idirbhriseadh: " diff --git a/src/nvim/po/it.po b/src/nvim/po/it.po index 084102da60..119a8f02ff 100644 --- a/src/nvim/po/it.po +++ b/src/nvim/po/it.po @@ -4294,10 +4294,6 @@ msgstr "riga %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Nome registro non valido: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Manutentore messaggi: Vlad Sandrini <marco@sandrini.biz>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Interruzione: " diff --git a/src/nvim/po/ja.euc-jp.po b/src/nvim/po/ja.euc-jp.po index 85042e3506..e8d60d4438 100644 --- a/src/nvim/po/ja.euc-jp.po +++ b/src/nvim/po/ja.euc-jp.po @@ -4258,10 +4258,6 @@ msgstr " %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: ̵ʥ쥸̾: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "ܸå/ƽ: ¼ Ϻ <koron.kaoriya@gmail.com>" - #: ../message.c:986 msgid "Interrupt: " msgstr ": " diff --git a/src/nvim/po/ja.po b/src/nvim/po/ja.po index 0326f33bb5..fd3690f9bf 100644 --- a/src/nvim/po/ja.po +++ b/src/nvim/po/ja.po @@ -4257,10 +4257,6 @@ msgstr "行 %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: 無効なレジスタ名: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "日本語メッセージ翻訳/監修: 村岡 太郎 <koron.kaoriya@gmail.com>" - #: ../message.c:986 msgid "Interrupt: " msgstr "割込み: " diff --git a/src/nvim/po/ja.sjis.po b/src/nvim/po/ja.sjis.po index 16a5d2ce36..c9fd35292c 100644 --- a/src/nvim/po/ja.sjis.po +++ b/src/nvim/po/ja.sjis.po @@ -4261,10 +4261,6 @@ msgstr "s %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: ȃWX^: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "{ꃁbZ[W|/ďC: Y <koron.kaoriya@gmail.com>" - #: ../message.c:986 msgid "Interrupt: " msgstr ": " diff --git a/src/nvim/po/ko.UTF-8.po b/src/nvim/po/ko.UTF-8.po index 149286eda8..3ed659208b 100644 --- a/src/nvim/po/ko.UTF-8.po +++ b/src/nvim/po/ko.UTF-8.po @@ -4224,10 +4224,6 @@ msgstr "%4ld 줄:" msgid "E354: Invalid register name: '%s'" msgstr "E354: 잘못된 레지스터 이름: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "메시지 관리자: Bram Moolenaar <Bram@vim.org>" - #: ../message.c:986 msgid "Interrupt: " msgstr "중단: " diff --git a/src/nvim/po/ko.po b/src/nvim/po/ko.po index b6aaf37bbb..e97e90642c 100644 --- a/src/nvim/po/ko.po +++ b/src/nvim/po/ko.po @@ -4224,10 +4224,6 @@ msgstr "%4ld :" msgid "E354: Invalid register name: '%s'" msgstr "E354: ߸ ̸: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr " : Bram Moolenaar <Bram@vim.org>" - #: ../message.c:986 msgid "Interrupt: " msgstr "ߴ: " diff --git a/src/nvim/po/nb.po b/src/nvim/po/nb.po index ce635e098c..76e42ddcd6 100644 --- a/src/nvim/po/nb.po +++ b/src/nvim/po/nb.po @@ -4275,11 +4275,6 @@ msgstr "linje %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Ugyldig registernavn: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "" -"Vedlikeholder for norsk oversettelse: yvind A. Holm <sunny@sunbase.org>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Avbryt: " diff --git a/src/nvim/po/nl.po b/src/nvim/po/nl.po index ea609c0f69..6013b847cb 100644 --- a/src/nvim/po/nl.po +++ b/src/nvim/po/nl.po @@ -4282,10 +4282,6 @@ msgstr "regel %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Vertaald door: Erwin Poeze <erwin.poeze@gmail.com>" - #: ../message.c:986 msgid "Interrupt: " msgstr "" diff --git a/src/nvim/po/no.po b/src/nvim/po/no.po index ce635e098c..76e42ddcd6 100644 --- a/src/nvim/po/no.po +++ b/src/nvim/po/no.po @@ -4275,11 +4275,6 @@ msgstr "linje %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Ugyldig registernavn: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "" -"Vedlikeholder for norsk oversettelse: yvind A. Holm <sunny@sunbase.org>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Avbryt: " diff --git a/src/nvim/po/pl.UTF-8.po b/src/nvim/po/pl.UTF-8.po index 68cb9e72d5..2536efb422 100644 --- a/src/nvim/po/pl.UTF-8.po +++ b/src/nvim/po/pl.UTF-8.po @@ -4243,10 +4243,6 @@ msgstr "wiersz %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Niewłaściwa nazwa rejestru: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Opiekun komunikatów: Mikołaj Machowski <mikmach@wp.pl>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Przerwanie: " diff --git a/src/nvim/po/pl.cp1250.po b/src/nvim/po/pl.cp1250.po index 3fcdbfb87d..30835637d0 100644 --- a/src/nvim/po/pl.cp1250.po +++ b/src/nvim/po/pl.cp1250.po @@ -4243,10 +4243,6 @@ msgstr "wiersz %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Niewaciwa nazwa rejestru: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Opiekun komunikatw: Mikoaj Machowski <mikmach@wp.pl>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Przerwanie: " diff --git a/src/nvim/po/pl.po b/src/nvim/po/pl.po index 2a2d12daac..c5734f0c49 100644 --- a/src/nvim/po/pl.po +++ b/src/nvim/po/pl.po @@ -4243,10 +4243,6 @@ msgstr "wiersz %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Niewaciwa nazwa rejestru: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Opiekun komunikatw: Mikoaj Machowski <mikmach@wp.pl>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Przerwanie: " diff --git a/src/nvim/po/ru.cp1251.po b/src/nvim/po/ru.cp1251.po index 29e8c83ee6..b1005bd0e6 100644 --- a/src/nvim/po/ru.cp1251.po +++ b/src/nvim/po/ru.cp1251.po @@ -4283,12 +4283,6 @@ msgstr " %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: : '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "" -" : <vrr@users.sourceforge." -"net>, <alyoshin.s@gmail.com>" - #: ../message.c:986 msgid "Interrupt: " msgstr ": " diff --git a/src/nvim/po/ru.po b/src/nvim/po/ru.po index c8146e8c47..2511ef2c46 100644 --- a/src/nvim/po/ru.po +++ b/src/nvim/po/ru.po @@ -4281,12 +4281,6 @@ msgstr "строка %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Недопустимое имя регистра: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "" -"Перевод сообщений на русский язык: Василий Рагозин <vrr@users.sourceforge." -"net>, Сергей Алёшин <alyoshin.s@gmail.com>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Прерывание: " diff --git a/src/nvim/po/sk.cp1250.po b/src/nvim/po/sk.cp1250.po index e3b7508cdc..b1b0bb6ade 100644 --- a/src/nvim/po/sk.cp1250.po +++ b/src/nvim/po/sk.cp1250.po @@ -4273,10 +4273,6 @@ msgstr "riadok %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: '%s' nie je prstupn meno registru" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Sprvca prekladu: Lubomir Host <rajo@platon.sk>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Preruenie: " diff --git a/src/nvim/po/sk.po b/src/nvim/po/sk.po index 53f8a7b911..206e3e3ef6 100644 --- a/src/nvim/po/sk.po +++ b/src/nvim/po/sk.po @@ -4273,10 +4273,6 @@ msgstr "riadok %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: '%s' nie je prstupn meno registru" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Sprvca prekladu: Lubomir Host <rajo@platon.sk>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Preruenie: " diff --git a/src/nvim/po/uk.cp1251.po b/src/nvim/po/uk.cp1251.po index 2c6f3423ae..99d1763262 100644 --- a/src/nvim/po/uk.cp1251.po +++ b/src/nvim/po/uk.cp1251.po @@ -21,204 +21,157 @@ msgstr "" "Content-Type: text/plain; charset=cp1251\n" "Content-Transfer-Encoding: 8bit\n" -#: ../api/private/helpers.c:201 -#, fuzzy msgid "Unable to get option value" -msgstr " " +msgstr " " -#: ../api/private/helpers.c:204 msgid "internal error: unknown option type" msgstr " : " -#: ../buffer.c:92 msgid "[Location List]" msgstr "[ ]" -#: ../buffer.c:93 msgid "[Quickfix List]" msgstr "[ ]" -#: ../buffer.c:94 msgid "E855: Autocommands caused command to abort" msgstr "E855: " -#: ../buffer.c:135 msgid "E82: Cannot allocate any buffer, exiting..." msgstr "E82: , ..." -#: ../buffer.c:138 msgid "E83: Cannot allocate buffer, using other one..." msgstr "E83: , ..." -#: ../buffer.c:763 msgid "E515: No buffers were unloaded" msgstr "E515: " -#: ../buffer.c:765 msgid "E516: No buffers were deleted" msgstr "E516: " -#: ../buffer.c:767 msgid "E517: No buffers were wiped out" msgstr "E517: " -#: ../buffer.c:772 msgid "1 buffer unloaded" msgstr " " -#: ../buffer.c:774 #, c-format msgid "%d buffers unloaded" msgstr " %d ()" -#: ../buffer.c:777 msgid "1 buffer deleted" msgstr " " -#: ../buffer.c:779 #, c-format msgid "%d buffers deleted" msgstr " %d ()" -#: ../buffer.c:782 msgid "1 buffer wiped out" msgstr " " -#: ../buffer.c:784 #, c-format msgid "%d buffers wiped out" msgstr " %d ()" -#: ../buffer.c:806 msgid "E90: Cannot unload last buffer" msgstr "E90: " -#: ../buffer.c:874 msgid "E84: No modified buffer found" msgstr "E84: " #. back where we started, didn't find anything. -#: ../buffer.c:903 msgid "E85: There is no listed buffer" msgstr "E85: " -#: ../buffer.c:913 #, c-format msgid "E86: Buffer %<PRId64> does not exist" msgstr "E86: %<PRId64> " -#: ../buffer.c:915 msgid "E87: Cannot go beyond last buffer" msgstr "E87: " -#: ../buffer.c:917 msgid "E88: Cannot go before first buffer" msgstr "E88: " -#: ../buffer.c:945 #, c-format msgid "" "E89: No write since last change for buffer %<PRId64> (add ! to override)" msgstr "E89: %<PRId64> (! )" #. wrap around (may cause duplicates) -#: ../buffer.c:1423 msgid "W14: Warning: List of file names overflow" msgstr "W14: : " -#: ../buffer.c:1555 ../quickfix.c:3361 #, c-format msgid "E92: Buffer %<PRId64> not found" msgstr "E92: %<PRId64> " -#: ../buffer.c:1798 #, c-format msgid "E93: More than one match for %s" msgstr "E93: %s" -#: ../buffer.c:1800 #, c-format msgid "E94: No matching buffer for %s" msgstr "E94: , %s" -#: ../buffer.c:2161 #, c-format msgid "line %<PRId64>" msgstr " %<PRId64>" -#: ../buffer.c:2233 msgid "E95: Buffer with this name already exists" msgstr "E95: " -#: ../buffer.c:2498 msgid " [Modified]" msgstr " []" -#: ../buffer.c:2501 msgid "[Not edited]" msgstr "[ ]" -#: ../buffer.c:2504 msgid "[New file]" msgstr "[ ]" -#: ../buffer.c:2505 msgid "[Read errors]" msgstr "[ ]" -#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895 msgid "[RO]" msgstr "[RO]" -#: ../buffer.c:2507 ../fileio.c:1807 msgid "[readonly]" msgstr "[ ]" -#: ../buffer.c:2524 #, c-format msgid "1 line --%d%%--" msgstr " --%d%%--" -#: ../buffer.c:2526 #, c-format msgid "%<PRId64> lines --%d%%--" msgstr "%<PRId64> () --%d%%--" -#: ../buffer.c:2530 #, c-format msgid "line %<PRId64> of %<PRId64> --%d%%-- col " msgstr " %<PRId64> %<PRId64> --%d%%-- " -#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554 msgid "[No Name]" msgstr "[ ]" #. must be a help buffer -#: ../buffer.c:2667 msgid "help" msgstr "" -#: ../buffer.c:3225 ../screen.c:4883 msgid "[Help]" msgstr "[]" -#: ../buffer.c:3254 ../screen.c:4887 msgid "[Preview]" msgstr "[]" -#: ../buffer.c:3528 msgid "All" msgstr "" -#: ../buffer.c:3528 msgid "Bot" msgstr "" -#: ../buffer.c:3531 msgid "Top" msgstr "" -#: ../buffer.c:4244 msgid "" "\n" "# Buffer list:\n" @@ -226,11 +179,9 @@ msgstr "" "\n" "# :\n" -#: ../buffer.c:4289 msgid "[Scratch]" msgstr "[ ]" -#: ../buffer.c:4529 msgid "" "\n" "--- Signs ---" @@ -238,202 +189,155 @@ msgstr "" "\n" "--- ---" -#: ../buffer.c:4538 #, c-format msgid "Signs for %s:" msgstr " %s:" -#: ../buffer.c:4543 #, c-format msgid " line=%<PRId64> id=%d name=%s" msgstr " =%<PRId64> id=%d =%s" -#: ../cursor_shape.c:68 msgid "E545: Missing colon" msgstr "E545: " -#: ../cursor_shape.c:70 ../cursor_shape.c:94 msgid "E546: Illegal mode" msgstr "E546: " -#: ../cursor_shape.c:134 msgid "E548: digit expected" msgstr "E548: " -#: ../cursor_shape.c:138 msgid "E549: Illegal percentage" msgstr "E549: " -#: ../diff.c:146 #, c-format msgid "E96: Can not diff more than %<PRId64> buffers" msgstr "E96: %<PRId64> ()" -#: ../diff.c:753 msgid "E810: Cannot read or write temp files" msgstr "E810: " -#: ../diff.c:755 msgid "E97: Cannot create diffs" msgstr "E97: " -#: ../diff.c:966 msgid "E816: Cannot read patch output" msgstr "E816: patch" -#: ../diff.c:1220 msgid "E98: Cannot read diff output" msgstr "E98: diff" -#: ../diff.c:2081 msgid "E99: Current buffer is not in diff mode" msgstr "E99: " -#: ../diff.c:2100 msgid "E793: No other buffer in diff mode is modifiable" msgstr "E793: " -#: ../diff.c:2102 msgid "E100: No other buffer in diff mode" msgstr "E100: " -#: ../diff.c:2112 msgid "E101: More than two buffers in diff mode, don't know which one to use" msgstr "" "E101: , , " "" -#: ../diff.c:2141 #, c-format msgid "E102: Can't find buffer \"%s\"" msgstr "E102: %s" -#: ../diff.c:2152 #, c-format msgid "E103: Buffer \"%s\" is not in diff mode" msgstr "E103: %s " -#: ../diff.c:2193 msgid "E787: Buffer changed unexpectedly" msgstr "E787: " -#: ../digraph.c:1598 msgid "E104: Escape not allowed in digraph" msgstr "E104: escape" -#: ../digraph.c:1760 msgid "E544: Keymap file not found" msgstr "E544: " -#: ../digraph.c:1785 msgid "E105: Using :loadkeymap not in a sourced file" msgstr "E105: :loadkeymap " -#: ../digraph.c:1821 msgid "E791: Empty keymap entry" msgstr "E791: " -#: ../edit.c:82 msgid " Keyword completion (^N^P)" msgstr " (^N^P)" #. ctrl_x_mode == 0, ^P/^N compl. -#: ../edit.c:83 msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)" msgstr " ^X (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)" -#: ../edit.c:85 msgid " Whole line completion (^L^N^P)" msgstr " (^L^N^P)" -#: ../edit.c:86 msgid " File name completion (^F^N^P)" msgstr " (^F^N^P)" -#: ../edit.c:87 msgid " Tag completion (^]^N^P)" msgstr " 崳 (^]^N^P)" -#: ../edit.c:88 msgid " Path pattern completion (^N^P)" msgstr " (^N^P)" -#: ../edit.c:89 msgid " Definition completion (^D^N^P)" msgstr " (^D^N^P)" -#: ../edit.c:91 msgid " Dictionary completion (^K^N^P)" msgstr " (^K^N^P)" -#: ../edit.c:92 msgid " Thesaurus completion (^T^N^P)" msgstr " (^T^N^P)" -#: ../edit.c:93 msgid " Command-line completion (^V^N^P)" msgstr " (^V^N^P)" -#: ../edit.c:94 msgid " User defined completion (^U^N^P)" msgstr " (^U^N^P)" -#: ../edit.c:95 msgid " Omni completion (^O^N^P)" msgstr " (^O^N^P)" -#: ../edit.c:96 msgid " Spelling suggestion (s^N^P)" msgstr " (s^N^P)" -#: ../edit.c:97 msgid " Keyword Local completion (^N^P)" msgstr " (^N^P)" -#: ../edit.c:100 msgid "Hit end of paragraph" msgstr " " # msgstr "E443: " -#: ../edit.c:101 msgid "E839: Completion function changed window" msgstr "E839: " -#: ../edit.c:102 msgid "E840: Completion function deleted text" msgstr "E840: " -#: ../edit.c:1847 msgid "'dictionary' option is empty" msgstr " 'dictionary' " -#: ../edit.c:1848 msgid "'thesaurus' option is empty" msgstr " 'thesaurus' " -#: ../edit.c:2655 #, c-format msgid "Scanning dictionary: %s" msgstr " : %s" -#: ../edit.c:3079 msgid " (insert) Scroll (^E/^Y)" msgstr " () (^E/^Y)" -#: ../edit.c:3081 msgid " (replace) Scroll (^E/^Y)" msgstr " () (^E/^Y)" -#: ../edit.c:3587 #, c-format msgid "Scanning: %s" msgstr " : %s" -#: ../edit.c:3614 msgid "Scanning tags." msgstr " 崳." -#: ../edit.c:4519 msgid " Adding" msgstr " " @@ -441,598 +345,468 @@ msgstr " " #. * be called before line = ml_get(), or when this address is no #. * longer needed. -- Acevedo. #. -#: ../edit.c:4562 msgid "-- Searching..." msgstr "-- ..." -#: ../edit.c:4618 msgid "Back at original" msgstr " " -#: ../edit.c:4621 msgid "Word from other line" msgstr " " -#: ../edit.c:4624 msgid "The only match" msgstr " " -#: ../edit.c:4680 #, c-format msgid "match %d of %d" msgstr " %d %d" -#: ../edit.c:4684 #, c-format msgid "match %d" msgstr " %d" # msgstr "E17: " -#: ../eval.c:137 msgid "E18: Unexpected characters in :let" msgstr "E18: :let" -#: ../eval.c:138 #, c-format msgid "E684: list index out of range: %<PRId64>" msgstr "E684: : %<PRId64>" -#: ../eval.c:139 #, c-format msgid "E121: Undefined variable: %s" msgstr "E121: : %s" -#: ../eval.c:140 msgid "E111: Missing ']'" msgstr "E111: ']'" -#: ../eval.c:141 #, c-format msgid "E686: Argument of %s must be a List" msgstr "E686: %s " -#: ../eval.c:143 #, c-format msgid "E712: Argument of %s must be a List or Dictionary" msgstr "E712: %s " -#: ../eval.c:144 msgid "E713: Cannot use empty key for Dictionary" msgstr "E713: " # msgstr "E396: " -#: ../eval.c:145 msgid "E714: List required" msgstr "E714: " -#: ../eval.c:146 msgid "E715: Dictionary required" msgstr "E715: " -#: ../eval.c:147 #, c-format msgid "E118: Too many arguments for function: %s" msgstr "E118: : %s" -#: ../eval.c:148 #, c-format msgid "E716: Key not present in Dictionary: %s" msgstr "E716: : %s" -#: ../eval.c:150 #, c-format msgid "E122: Function %s already exists, add ! to replace it" msgstr "E122: %s , ! " -#: ../eval.c:151 msgid "E717: Dictionary entry already exists" msgstr "E717: " -#: ../eval.c:152 msgid "E718: Funcref required" msgstr "E718: " -#: ../eval.c:153 msgid "E719: Cannot use [:] with a Dictionary" msgstr "E719: [:] " -#: ../eval.c:154 #, c-format msgid "E734: Wrong variable type for %s=" msgstr "E734: %s=" -#: ../eval.c:155 #, c-format msgid "E130: Unknown function: %s" msgstr "E130: : %s" -#: ../eval.c:156 #, c-format msgid "E461: Illegal variable name: %s" msgstr "E461: : %s" # msgstr "E373: " -#: ../eval.c:157 msgid "E806: using Float as a String" msgstr "E806: Float String" -#: ../eval.c:1830 msgid "E687: Less targets than List items" msgstr "E687: ֳ , " -#: ../eval.c:1834 msgid "E688: More targets than List items" msgstr "E688: ֳ , " -#: ../eval.c:1906 msgid "Double ; in list of variables" msgstr " ; " # msgstr "E235: " -#: ../eval.c:2078 #, c-format msgid "E738: Can't list variables for %s" msgstr "E738: %s" -#: ../eval.c:2391 msgid "E689: Can only index a List or Dictionary" msgstr "E689: " -#: ../eval.c:2396 msgid "E708: [:] must come last" msgstr "E708: [:] " -#: ../eval.c:2439 msgid "E709: [:] requires a List value" msgstr "E709: [:] " -#: ../eval.c:2674 msgid "E710: List value has more items than target" msgstr "E710: , " -#: ../eval.c:2678 msgid "E711: List value has not enough items" msgstr "E711: " -#: ../eval.c:2867 msgid "E690: Missing \"in\" after :for" msgstr "E690: in :for" -#: ../eval.c:3063 #, c-format msgid "E107: Missing parentheses: %s" msgstr "E107: : %s" -#: ../eval.c:3263 #, c-format msgid "E108: No such variable: \"%s\"" msgstr "E108: : %s" -#: ../eval.c:3333 msgid "E743: variable nested too deep for (un)lock" msgstr "E743: -/." -#: ../eval.c:3630 msgid "E109: Missing ':' after '?'" msgstr "E109: ':' '?'" -#: ../eval.c:3893 msgid "E691: Can only compare List with List" msgstr "E691: " -#: ../eval.c:3895 msgid "E692: Invalid operation for Lists" msgstr "E692: " -#: ../eval.c:3915 msgid "E735: Can only compare Dictionary with Dictionary" msgstr "E735: " -#: ../eval.c:3917 msgid "E736: Invalid operation for Dictionary" msgstr "E736: " -#: ../eval.c:3932 msgid "E693: Can only compare Funcref with Funcref" msgstr "E693: " -#: ../eval.c:3934 msgid "E694: Invalid operation for Funcrefs" msgstr "E694: " -#: ../eval.c:4277 msgid "E804: Cannot use '%' with Float" msgstr "E804: '%' Float" -#: ../eval.c:4478 msgid "E110: Missing ')'" msgstr "E110: ')'" -#: ../eval.c:4609 msgid "E695: Cannot index a Funcref" msgstr "E695: " -#: ../eval.c:4839 #, c-format msgid "E112: Option name missing: %s" msgstr "E112: : %s" -#: ../eval.c:4855 #, c-format msgid "E113: Unknown option: %s" msgstr "E113: : %s" -#: ../eval.c:4904 #, c-format msgid "E114: Missing quote: %s" msgstr "E114: : %s" -#: ../eval.c:5020 #, c-format msgid "E115: Missing quote: %s" msgstr "E115: : %s" # msgstr "E404: " -#: ../eval.c:5084 #, c-format msgid "E696: Missing comma in List: %s" msgstr "E696: : %s" -#: ../eval.c:5091 #, c-format msgid "E697: Missing end of List ']': %s" msgstr "E697: ']': %s" # msgstr "E235: " -#: ../eval.c:6475 #, c-format msgid "E720: Missing colon in Dictionary: %s" msgstr "E720: : %s" -#: ../eval.c:6499 #, c-format msgid "E721: Duplicate key in Dictionary: \"%s\"" msgstr "E721: : %s" # msgstr "E235: " -#: ../eval.c:6517 #, c-format msgid "E722: Missing comma in Dictionary: %s" msgstr "E722: : %s" -#: ../eval.c:6524 #, c-format msgid "E723: Missing end of Dictionary '}': %s" msgstr "E723: '}': %s" # msgstr "E21: " -#: ../eval.c:6555 msgid "E724: variable nested too deep for displaying" msgstr "E724: " -#: ../eval.c:7188 #, c-format msgid "E740: Too many arguments for function %s" msgstr "E740: %s" -#: ../eval.c:7190 #, c-format msgid "E116: Invalid arguments for function %s" msgstr "E116: %s" -#: ../eval.c:7377 #, c-format msgid "E117: Unknown function: %s" msgstr "E117: : %s" -#: ../eval.c:7383 #, c-format msgid "E119: Not enough arguments for function: %s" msgstr "E119: %s" -#: ../eval.c:7387 #, c-format msgid "E120: Using <SID> not in a script context: %s" msgstr "E120: <SID> : %s" -#: ../eval.c:7391 #, c-format msgid "E725: Calling dict function without Dictionary: %s" msgstr "E725: dict- : %s" -#: ../eval.c:7453 msgid "E808: Number or Float required" msgstr "E808: Number Float" # msgstr "E14: " -#: ../eval.c:7503 msgid "add() argument" msgstr " add()" -#: ../eval.c:7907 msgid "E699: Too many arguments" msgstr "E699: " # msgstr "E327: " -#: ../eval.c:8073 msgid "E785: complete() can only be used in Insert mode" msgstr "E785: complete() " -#: ../eval.c:8156 msgid "&Ok" msgstr "&O:" # msgstr "E226: " -#: ../eval.c:8676 #, c-format msgid "E737: Key already exists: %s" msgstr "E737: : %s" # msgstr "E14: " -#: ../eval.c:8692 msgid "extend() argument" msgstr " extend()" # msgstr "E14: " -#: ../eval.c:8915 msgid "map() argument" msgstr " map()" # msgstr "E14: " -#: ../eval.c:8916 msgid "filter() argument" msgstr " filter()" -#: ../eval.c:9229 #, c-format msgid "+-%s%3ld lines: " msgstr "+-%s%3ld : " -#: ../eval.c:9291 #, c-format msgid "E700: Unknown function: %s" msgstr "E700: : %s" -#: ../eval.c:10729 msgid "called inputrestore() more often than inputsave()" msgstr " inputrestore() , inputsave()" # msgstr "E14: " -#: ../eval.c:10771 msgid "insert() argument" msgstr " insert()" # msgstr "E406: " -#: ../eval.c:10841 msgid "E786: Range not allowed" msgstr "E786: " # msgstr "E177: " -#: ../eval.c:11140 msgid "E701: Invalid type for len()" msgstr "E701: len()" -#: ../eval.c:11980 msgid "E726: Stride is zero" msgstr "E726: " -#: ../eval.c:11982 msgid "E727: Start past end" msgstr "E727: " -#: ../eval.c:12024 ../eval.c:15297 msgid "<empty>" msgstr "<>" # msgstr "E14: " -#: ../eval.c:12282 msgid "remove() argument" msgstr " remove()" -#: ../eval.c:12466 msgid "E655: Too many symbolic links (cycle?)" msgstr "E655: (?)" # msgstr "E14: " -#: ../eval.c:12593 msgid "reverse() argument" msgstr " reverse()" # msgstr "E14: " -#: ../eval.c:13721 msgid "sort() argument" msgstr " sort()" # msgstr "E14: " -#: ../eval.c:13721 -#, fuzzy msgid "uniq() argument" -msgstr " add()" +msgstr " uniq()" # msgstr "E364: " -#: ../eval.c:13776 msgid "E702: Sort compare function failed" msgstr "E702: " # msgstr "E364: " -#: ../eval.c:13806 -#, fuzzy msgid "E882: Uniq compare function failed" -msgstr "E702: " +msgstr "E882: uniq" -#: ../eval.c:14085 msgid "(Invalid)" msgstr "()" -#: ../eval.c:14590 msgid "E677: Error writing temp file" msgstr "E677: " -#: ../eval.c:16159 msgid "E805: Using a Float as a Number" msgstr "E805: Float Number" -#: ../eval.c:16162 msgid "E703: Using a Funcref as a Number" msgstr "E703: Funcref Number" -#: ../eval.c:16170 msgid "E745: Using a List as a Number" msgstr "E745: List Number" -#: ../eval.c:16173 msgid "E728: Using a Dictionary as a Number" msgstr "E728: Dictionary Number" -#: ../eval.c:16259 msgid "E729: using Funcref as a String" msgstr "E729: Funcref String" # msgstr "E373: " -#: ../eval.c:16262 msgid "E730: using List as a String" msgstr "E730: List String" -#: ../eval.c:16265 msgid "E731: using Dictionary as a String" msgstr "E731: Dictionary String" -#: ../eval.c:16619 #, c-format msgid "E706: Variable type mismatch for: %s" msgstr "E706: : %s" -#: ../eval.c:16705 #, c-format msgid "E795: Cannot delete variable %s" msgstr "E795: %s" -#: ../eval.c:16724 #, c-format msgid "E704: Funcref variable name must start with a capital: %s" msgstr "E704: Funcref : %s" -#: ../eval.c:16732 #, c-format msgid "E705: Variable name conflicts with existing function: %s" msgstr "E705: : %s" -#: ../eval.c:16763 #, c-format msgid "E741: Value is locked: %s" msgstr "E741: : %s" -#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839 msgid "Unknown" msgstr "" -#: ../eval.c:16768 #, c-format msgid "E742: Cannot change value of %s" msgstr "E742: %s" -#: ../eval.c:16838 msgid "E698: variable nested too deep for making a copy" msgstr "E698: " -#: ../eval.c:17249 #, c-format msgid "E123: Undefined function: %s" msgstr "E123: : %s" -#: ../eval.c:17260 #, c-format msgid "E124: Missing '(': %s" msgstr "E124: '(': %s" -#: ../eval.c:17293 msgid "E862: Cannot use g: here" msgstr "E862: g:" -#: ../eval.c:17312 #, c-format msgid "E125: Illegal argument: %s" msgstr "E125: : %s" -#: ../eval.c:17323 #, c-format msgid "E853: Duplicate argument name: %s" msgstr "E853: : %s" -#: ../eval.c:17416 msgid "E126: Missing :endfunction" msgstr "E126: :endfunction" -#: ../eval.c:17537 #, c-format msgid "E707: Function name conflicts with variable: %s" msgstr "E707: : %s" -#: ../eval.c:17549 #, c-format msgid "E127: Cannot redefine function %s: It is in use" msgstr "E127: %s: " -#: ../eval.c:17604 #, c-format msgid "E746: Function name does not match script file name: %s" msgstr "E746: : %s" -#: ../eval.c:17716 msgid "E129: Function name required" msgstr "E129: " -#: ../eval.c:17824 -#, fuzzy, c-format +#, c-format msgid "E128: Function name must start with a capital or \"s:\": %s" msgstr "" -"E128: : %s" +"E128: \"s:\": %s" -#: ../eval.c:17833 -#, fuzzy, c-format +#, c-format msgid "E884: Function name cannot contain a colon: %s" msgstr "" -"E128: : %s" +"E884: : %s" -#: ../eval.c:18336 #, c-format msgid "E131: Cannot delete function %s: It is in use" msgstr "E131: %s: " -#: ../eval.c:18441 msgid "E132: Function call depth is higher than 'maxfuncdepth'" msgstr "E132: 'maxfuncdepth'" -#: ../eval.c:18568 #, c-format msgid "calling %s" msgstr " %s" -#: ../eval.c:18651 #, c-format msgid "%s aborted" msgstr "%s " -#: ../eval.c:18653 #, c-format msgid "%s returning #%<PRId64>" msgstr "%s #%<PRId64>" -#: ../eval.c:18670 #, c-format msgid "%s returning %s" msgstr "%s %s" -#: ../eval.c:18691 ../ex_cmds2.c:2695 #, c-format msgid "continuing in %s" msgstr " %s" -#: ../eval.c:18795 msgid "E133: :return not inside a function" msgstr "E133: :return " -#: ../eval.c:19159 msgid "" "\n" "# global variables:\n" @@ -1040,7 +814,6 @@ msgstr "" "\n" "# :\n" -#: ../eval.c:19254 msgid "" "\n" "\tLast set from " @@ -1048,104 +821,82 @@ msgstr "" "\n" "\t " -#: ../eval.c:19272 msgid "No old files" msgstr " " -#: ../ex_cmds.c:122 #, c-format msgid "<%s>%s%s %d, Hex %02x, Octal %03o" msgstr "<%s>%s%s %d, %02x, %03o" -#: ../ex_cmds.c:145 #, c-format msgid "> %d, Hex %04x, Octal %o" msgstr "> %d, %04x, %o" -#: ../ex_cmds.c:146 #, c-format msgid "> %d, Hex %08x, Octal %o" msgstr "> %d, %08x, %o" -#: ../ex_cmds.c:684 msgid "E134: Move lines into themselves" msgstr "E134: " -#: ../ex_cmds.c:747 msgid "1 line moved" msgstr " " -#: ../ex_cmds.c:749 #, c-format msgid "%<PRId64> lines moved" msgstr " %<PRId64> ()" -#: ../ex_cmds.c:1175 #, c-format msgid "%<PRId64> lines filtered" msgstr "³ %<PRId64> ()" -#: ../ex_cmds.c:1194 msgid "E135: *Filter* Autocommands must not change current buffer" msgstr "E135: *Filter* " -#: ../ex_cmds.c:1244 msgid "[No write since last change]\n" msgstr "[ ]\n" -#: ../ex_cmds.c:1424 #, c-format msgid "%sviminfo: %s in line: " msgstr "%sviminfo: %s : " -#: ../ex_cmds.c:1431 msgid "E136: viminfo: Too many errors, skipping rest of file" msgstr "E136: viminfo: , " -#: ../ex_cmds.c:1458 #, c-format msgid "Reading viminfo file \"%s\"%s%s%s" msgstr " viminfo: %s%s%s%s" -#: ../ex_cmds.c:1460 msgid " info" msgstr " " -#: ../ex_cmds.c:1461 msgid " marks" msgstr " " -#: ../ex_cmds.c:1462 msgid " oldfiles" msgstr " " -#: ../ex_cmds.c:1463 msgid " FAILED" msgstr " " #. avoid a wait_return for this message, it's annoying -#: ../ex_cmds.c:1541 #, c-format msgid "E137: Viminfo file is not writable: %s" msgstr "E137: viminfo: %s" -#: ../ex_cmds.c:1626 #, c-format msgid "E138: Can't write viminfo file %s!" msgstr "E138: viminfo %s!" -#: ../ex_cmds.c:1635 #, c-format msgid "Writing viminfo file \"%s\"" msgstr " viminfo %s" #. Write the info: -#: ../ex_cmds.c:1720 #, c-format msgid "# This viminfo file was generated by Vim %s.\n" msgstr "# Vim %s.\n" -#: ../ex_cmds.c:1722 msgid "" "# You may edit it if you're careful!\n" "\n" @@ -1153,47 +904,37 @@ msgstr "" "# , !\n" "\n" -#: ../ex_cmds.c:1723 msgid "# Value of 'encoding' when this file was written\n" msgstr "# 'encoding' \n" -#: ../ex_cmds.c:1800 msgid "Illegal starting char" msgstr " " -#: ../ex_cmds.c:2162 msgid "Write partial file?" msgstr " ?" -#: ../ex_cmds.c:2166 msgid "E140: Use ! to write partial buffer" msgstr "E140: ! " -#: ../ex_cmds.c:2281 #, c-format msgid "Overwrite existing file \"%s\"?" msgstr " %s?" -#: ../ex_cmds.c:2317 #, c-format msgid "Swap file \"%s\" exists, overwrite anyway?" msgstr " %s , ?" -#: ../ex_cmds.c:2326 #, c-format msgid "E768: Swap file exists: %s (:silent! overrides)" msgstr "E768: : %s (:silent! )" -#: ../ex_cmds.c:2381 #, c-format msgid "E141: No file name for buffer %<PRId64>" msgstr "E141: %<PRId64>" -#: ../ex_cmds.c:2412 msgid "E142: File not written: Writing is disabled by 'write' option" msgstr "E142: : 'write'" -#: ../ex_cmds.c:2434 #, c-format msgid "" "'readonly' option is set for \"%s\".\n" @@ -1202,7 +943,6 @@ msgstr "" " %s 'readonly'.\n" " ?" -#: ../ex_cmds.c:2439 #, c-format msgid "" "File permissions of \"%s\" are read-only.\n" @@ -1213,84 +953,66 @@ msgstr "" ", , .\n" " ?" -#: ../ex_cmds.c:2451 #, c-format msgid "E505: \"%s\" is read-only (add ! to override)" msgstr "E505: %s (! )" -#: ../ex_cmds.c:3120 #, c-format msgid "E143: Autocommands unexpectedly deleted new buffer %s" msgstr "E143: %s" -#: ../ex_cmds.c:3313 msgid "E144: non-numeric argument to :z" msgstr "E144: :z" -#: ../ex_cmds.c:3404 msgid "E145: Shell commands not allowed in rvim" msgstr "E145: rvim " -#: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: " -#: ../ex_cmds.c:3964 #, c-format msgid "replace with %s (y/n/a/q/l/^E/^Y)?" msgstr " %s (y/n/a/q/l/^E/^Y)?" -#: ../ex_cmds.c:4379 msgid "(Interrupted) " msgstr "() " # msgstr "E31: " -#: ../ex_cmds.c:4384 msgid "1 match" msgstr " " -#: ../ex_cmds.c:4384 msgid "1 substitution" msgstr " " -#: ../ex_cmds.c:4387 #, c-format msgid "%<PRId64> matches" msgstr "%<PRId64> ()" -#: ../ex_cmds.c:4388 #, c-format msgid "%<PRId64> substitutions" msgstr "%<PRId64> ()" -#: ../ex_cmds.c:4392 msgid " on 1 line" msgstr " " -#: ../ex_cmds.c:4395 #, c-format msgid " on %<PRId64> lines" msgstr " %<PRId64> " -#: ../ex_cmds.c:4438 msgid "E147: Cannot do :global recursive" msgstr "E147: :global " -#: ../ex_cmds.c:4467 msgid "E148: Regular expression missing from global" msgstr "E148: global " -#: ../ex_cmds.c:4508 #, c-format msgid "Pattern found in every line: %s" msgstr " : %s" -#: ../ex_cmds.c:4510 #, c-format msgid "Pattern not found: %s" msgstr " : %s" -#: ../ex_cmds.c:4587 msgid "" "\n" "# Last Substitute String:\n" @@ -1300,338 +1022,265 @@ msgstr "" "# :\n" "$" -#: ../ex_cmds.c:4679 msgid "E478: Don't panic!" msgstr "E478: !" -#: ../ex_cmds.c:4717 #, c-format msgid "E661: Sorry, no '%s' help for %s" msgstr "E661: , '%s' %s" -#: ../ex_cmds.c:4719 #, c-format msgid "E149: Sorry, no help for %s" msgstr "E149: , %s" -#: ../ex_cmds.c:4751 #, c-format msgid "Sorry, help file \"%s\" not found" msgstr ", %s " -#: ../ex_cmds.c:5323 #, c-format msgid "E150: Not a directory: %s" msgstr "E150: : %s" -#: ../ex_cmds.c:5446 #, c-format msgid "E152: Cannot open %s for writing" msgstr "E152: %s " -#: ../ex_cmds.c:5471 #, c-format msgid "E153: Unable to open %s for reading" msgstr "E153: %s " -#: ../ex_cmds.c:5500 #, c-format msgid "E670: Mix of help file encodings within a language: %s" msgstr "E670: ̳ %s" -#: ../ex_cmds.c:5565 #, c-format msgid "E154: Duplicate tag \"%s\" in file %s/%s" msgstr "E154: %s %s/%s" -#: ../ex_cmds.c:5687 #, c-format msgid "E160: Unknown sign command: %s" msgstr "E160: : %s" -#: ../ex_cmds.c:5704 msgid "E156: Missing sign name" msgstr "E156: " -#: ../ex_cmds.c:5746 msgid "E612: Too many signs defined" msgstr "E612: " -#: ../ex_cmds.c:5813 #, c-format msgid "E239: Invalid sign text: %s" msgstr "E239: : %s" -#: ../ex_cmds.c:5844 ../ex_cmds.c:6035 #, c-format msgid "E155: Unknown sign: %s" msgstr "E155: : %s" -#: ../ex_cmds.c:5877 msgid "E159: Missing sign number" msgstr "E159: " -#: ../ex_cmds.c:5971 #, c-format msgid "E158: Invalid buffer name: %s" msgstr "E158: : %s" -#: ../ex_cmds.c:6008 #, c-format msgid "E157: Invalid sign ID: %<PRId64>" msgstr "E157: ID : %<PRId64>" -#: ../ex_cmds.c:6066 msgid " (not supported)" msgstr " ( )" -#: ../ex_cmds.c:6169 msgid "[Deleted]" msgstr "[]" -#: ../ex_cmds2.c:139 msgid "Entering Debug mode. Type \"cont\" to continue." msgstr " . cont." -#: ../ex_cmds2.c:143 ../ex_docmd.c:759 #, c-format msgid "line %<PRId64>: %s" msgstr " %<PRId64>: %s" -#: ../ex_cmds2.c:145 #, c-format msgid "cmd: %s" msgstr ": %s" -#: ../ex_cmds2.c:322 #, c-format msgid "Breakpoint in \"%s%s\" line %<PRId64>" msgstr " %s%s %<PRId64>" -#: ../ex_cmds2.c:581 #, c-format msgid "E161: Breakpoint not found: %s" msgstr "E161: : %s" -#: ../ex_cmds2.c:611 msgid "No breakpoints defined" msgstr " " -#: ../ex_cmds2.c:617 #, c-format msgid "%3d %s %s line %<PRId64>" msgstr "%3d %s %s %<PRId64>" -#: ../ex_cmds2.c:942 msgid "E750: First use \":profile start {fname}\"" msgstr "E750: :profile start {}" -#: ../ex_cmds2.c:1269 #, c-format msgid "Save changes to \"%s\"?" msgstr " %s?" -#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851 msgid "Untitled" msgstr "" -#: ../ex_cmds2.c:1421 #, c-format msgid "E162: No write since last change for buffer \"%s\"" msgstr "E162: %s " -#: ../ex_cmds2.c:1480 msgid "Warning: Entered other buffer unexpectedly (check autocommands)" msgstr "" ": ( )" -#: ../ex_cmds2.c:1826 msgid "E163: There is only one file to edit" msgstr "E163: " -#: ../ex_cmds2.c:1828 msgid "E164: Cannot go before first file" msgstr "E164: " -#: ../ex_cmds2.c:1830 msgid "E165: Cannot go beyond last file" msgstr "E165: " -#: ../ex_cmds2.c:2175 #, c-format msgid "E666: compiler not supported: %s" msgstr "E666: : %s" # msgstr "E195: " -#: ../ex_cmds2.c:2257 #, c-format msgid "Searching for \"%s\" in \"%s\"" msgstr " %s %s" -#: ../ex_cmds2.c:2284 #, c-format msgid "Searching for \"%s\"" msgstr " %s" -#: ../ex_cmds2.c:2307 #, c-format msgid "not found in 'runtimepath': \"%s\"" msgstr " 'runtimepath' %s" -#: ../ex_cmds2.c:2472 #, c-format msgid "Cannot source a directory: \"%s\"" msgstr " : %s" -#: ../ex_cmds2.c:2518 #, c-format msgid "could not source \"%s\"" msgstr " %s" -#: ../ex_cmds2.c:2520 #, c-format msgid "line %<PRId64>: could not source \"%s\"" msgstr " %<PRId64>: %s" -#: ../ex_cmds2.c:2535 #, c-format msgid "sourcing \"%s\"" msgstr " %s" -#: ../ex_cmds2.c:2537 #, c-format msgid "line %<PRId64>: sourcing \"%s\"" msgstr " %<PRId64>: %s" -#: ../ex_cmds2.c:2693 #, c-format msgid "finished sourcing %s" msgstr " %s" -#: ../ex_cmds2.c:2765 msgid "modeline" msgstr "modeline" # msgstr "E14: " -#: ../ex_cmds2.c:2767 msgid "--cmd argument" msgstr "--cmd " # msgstr "E14: " -#: ../ex_cmds2.c:2769 msgid "-c argument" msgstr "-c " -#: ../ex_cmds2.c:2771 msgid "environment variable" msgstr " " -#: ../ex_cmds2.c:2773 msgid "error handler" msgstr " " -#: ../ex_cmds2.c:3020 msgid "W15: Warning: Wrong line separator, ^M may be missing" msgstr "W15: : , , ^M" -#: ../ex_cmds2.c:3139 msgid "E167: :scriptencoding used outside of a sourced file" msgstr "E167: :scriptencoding " -#: ../ex_cmds2.c:3166 msgid "E168: :finish used outside of a sourced file" msgstr "E168: :finish " -#: ../ex_cmds2.c:3389 #, c-format msgid "Current %slanguage: \"%s\"" msgstr " (%s): %s" -#: ../ex_cmds2.c:3404 #, c-format msgid "E197: Cannot set language to \"%s\"" msgstr "E197: %s" #. don't redisplay the window #. don't wait for return -#: ../ex_docmd.c:387 msgid "Entering Ex mode. Type \"visual\" to go to Normal mode." msgstr " Ex. visual" -#: ../ex_docmd.c:428 msgid "E501: At end-of-file" msgstr "E501: ʳ " -#: ../ex_docmd.c:513 msgid "E169: Command too recursive" msgstr "E169: " -#: ../ex_docmd.c:1006 #, c-format msgid "E605: Exception not caught: %s" msgstr "E605: : %s" -#: ../ex_docmd.c:1085 msgid "End of sourced file" msgstr "ʳ " -#: ../ex_docmd.c:1086 msgid "End of function" msgstr "ʳ " -#: ../ex_docmd.c:1628 msgid "E464: Ambiguous use of user-defined command" msgstr "E464: " -#: ../ex_docmd.c:1638 msgid "E492: Not an editor command" msgstr "E492: " -#: ../ex_docmd.c:1729 msgid "E493: Backwards range given" msgstr "E493: " -#: ../ex_docmd.c:1733 msgid "Backwards range given, OK to swap" msgstr " , " #. append #. typed wrong -#: ../ex_docmd.c:1787 msgid "E494: Use w or w>>" msgstr "E494: w w>>" -#: ../ex_docmd.c:3454 msgid "E319: The command is not available in this version" msgstr "E319: , " -#: ../ex_docmd.c:3752 msgid "E172: Only one file name allowed" msgstr "E172: " -#: ../ex_docmd.c:4238 msgid "1 more file to edit. Quit anyway?" msgstr " . ?" -#: ../ex_docmd.c:4242 #, c-format msgid "%d more files to edit. Quit anyway?" msgstr " %d . ?" -#: ../ex_docmd.c:4248 msgid "E173: 1 more file to edit" msgstr "E173: " -#: ../ex_docmd.c:4250 #, c-format msgid "E173: %<PRId64> more files to edit" msgstr "E173: %<PRId64> " -#: ../ex_docmd.c:4320 msgid "E174: Command already exists: add ! to replace it" msgstr "E174: , ! " -#: ../ex_docmd.c:4432 msgid "" "\n" " Name Args Range Complete Definition" @@ -1639,353 +1288,276 @@ msgstr "" "\n" " . " -#: ../ex_docmd.c:4516 msgid "No user-defined commands found" msgstr " " -#: ../ex_docmd.c:4538 msgid "E175: No attribute specified" msgstr "E175: " -#: ../ex_docmd.c:4583 msgid "E176: Invalid number of arguments" msgstr "E176: " -#: ../ex_docmd.c:4594 msgid "E177: Count cannot be specified twice" msgstr "E177: ˳ " # msgstr "E177: " -#: ../ex_docmd.c:4603 msgid "E178: Invalid default value for count" msgstr "E178: " # msgstr "E178: " -#: ../ex_docmd.c:4625 msgid "E179: argument required for -complete" msgstr "E179: -complete " # msgstr "E180: " -#: ../ex_docmd.c:4635 #, c-format msgid "E181: Invalid attribute: %s" msgstr "E181: : %s" # msgstr "E181: " -#: ../ex_docmd.c:4678 msgid "E182: Invalid command name" msgstr "E182: " # msgstr "E182: " -#: ../ex_docmd.c:4691 msgid "E183: User defined commands must start with an uppercase letter" msgstr "E183: " -#: ../ex_docmd.c:4696 msgid "E841: Reserved name, cannot be used for user defined command" msgstr "" "E841: , " # msgstr "E183: " -#: ../ex_docmd.c:4751 #, c-format msgid "E184: No such user-defined command: %s" msgstr "E184: : %s" # msgstr "E179: " -#: ../ex_docmd.c:5219 #, c-format msgid "E180: Invalid complete value: %s" msgstr "E180: : %s" -#: ../ex_docmd.c:5225 msgid "E468: Completion argument only allowed for custom completion" msgstr "E468: " -#: ../ex_docmd.c:5231 msgid "E467: Custom completion requires a function argument" msgstr "E467: -" # msgstr "E184: " -#: ../ex_docmd.c:5257 #, c-format msgid "E185: Cannot find color scheme '%s'" msgstr "E185: %s" -#: ../ex_docmd.c:5263 msgid "Greetings, Vim user!" msgstr "³, Vim!" # msgstr "E443: " -#: ../ex_docmd.c:5431 msgid "E784: Cannot close last tab page" msgstr "E784: " # msgstr "E444: " -#: ../ex_docmd.c:5462 msgid "Already only one tab page" msgstr " " -#: ../ex_docmd.c:6004 #, c-format msgid "Tab page %d" msgstr " %d" -#: ../ex_docmd.c:6295 msgid "No swap file" msgstr " " -#: ../ex_docmd.c:6478 msgid "E747: Cannot change directory, buffer is modified (add ! to override)" msgstr "E747: , (! )" -#: ../ex_docmd.c:6485 msgid "E186: No previous directory" msgstr "E186: " # msgstr "E186: " -#: ../ex_docmd.c:6530 msgid "E187: Unknown" msgstr "E187: " -#: ../ex_docmd.c:6610 msgid "E465: :winsize requires two number arguments" msgstr "E465: :winsize " -#: ../ex_docmd.c:6655 msgid "E188: Obtaining window position not implemented for this platform" msgstr "E188: " -#: ../ex_docmd.c:6662 msgid "E466: :winpos requires two number arguments" msgstr "E466: :winpos " -#: ../ex_docmd.c:7241 #, c-format msgid "E739: Cannot create directory: %s" msgstr "E739: : %s" -#: ../ex_docmd.c:7268 #, c-format msgid "E189: \"%s\" exists (add ! to override)" msgstr "E189: %s (! )" # msgstr "E189: " -#: ../ex_docmd.c:7273 #, c-format msgid "E190: Cannot open \"%s\" for writing" msgstr "E190: %s " # msgstr "E190: " #. set mark -#: ../ex_docmd.c:7294 msgid "E191: Argument must be a letter or forward/backward quote" msgstr "E191: , ` '" # msgstr "E191: " -#: ../ex_docmd.c:7333 msgid "E192: Recursive use of :normal too deep" msgstr "E192: :normal" # msgstr "E193: " -#: ../ex_docmd.c:7807 msgid "E194: No alternate file name to substitute for '#'" msgstr "E194: '#'" -#: ../ex_docmd.c:7841 msgid "E495: no autocommand file name to substitute for \"<afile>\"" msgstr "E495: <afile>" -#: ../ex_docmd.c:7850 msgid "E496: no autocommand buffer number to substitute for \"<abuf>\"" msgstr "E496: <abuf>" -#: ../ex_docmd.c:7861 msgid "E497: no autocommand match name to substitute for \"<amatch>\"" msgstr "E497: <amatch>" -#: ../ex_docmd.c:7870 msgid "E498: no :source file name to substitute for \"<sfile>\"" msgstr "E498: :source <sfile>" -#: ../ex_docmd.c:7876 msgid "E842: no line number to use for \"<slnum>\"" msgstr "E842: , <sfile>" -#: ../ex_docmd.c:7903 -#, fuzzy, c-format +#, c-format msgid "E499: Empty file name for '%' or '#', only works with \":p:h\"" msgstr "E499: '%' '#' , :p:h" -#: ../ex_docmd.c:7905 msgid "E500: Evaluates to an empty string" msgstr "E500: " -#: ../ex_docmd.c:8838 msgid "E195: Cannot open viminfo file for reading" msgstr "E195: viminfo" -#: ../ex_eval.c:464 msgid "E608: Cannot :throw exceptions with 'Vim' prefix" msgstr "E608: (:throw) 'Vim'" #. always scroll up, don't overwrite -#: ../ex_eval.c:496 #, c-format msgid "Exception thrown: %s" msgstr " : %s" -#: ../ex_eval.c:545 #, c-format msgid "Exception finished: %s" msgstr " : %s" -#: ../ex_eval.c:546 #, c-format msgid "Exception discarded: %s" msgstr " : %s" -#: ../ex_eval.c:588 ../ex_eval.c:634 #, c-format msgid "%s, line %<PRId64>" msgstr "%s, %<PRId64>" #. always scroll up, don't overwrite -#: ../ex_eval.c:608 #, c-format msgid "Exception caught: %s" msgstr " : %s" -#: ../ex_eval.c:676 #, c-format msgid "%s made pending" msgstr " %s" -#: ../ex_eval.c:679 #, c-format msgid "%s resumed" msgstr "³ %s" -#: ../ex_eval.c:683 #, c-format msgid "%s discarded" msgstr " %s" -#: ../ex_eval.c:708 msgid "Exception" msgstr "" -#: ../ex_eval.c:713 msgid "Error and interrupt" msgstr ", " # msgstr "E231: " -#: ../ex_eval.c:715 msgid "Error" msgstr "" #. if (pending & CSTP_INTERRUPT) -#: ../ex_eval.c:717 msgid "Interrupt" msgstr "" -#: ../ex_eval.c:795 msgid "E579: :if nesting too deep" msgstr "E579: :if" -#: ../ex_eval.c:830 msgid "E580: :endif without :if" msgstr "E580: :endif :if" -#: ../ex_eval.c:873 msgid "E581: :else without :if" msgstr "E581: :else :if" -#: ../ex_eval.c:876 msgid "E582: :elseif without :if" msgstr "E582: :elseif :if" -#: ../ex_eval.c:880 msgid "E583: multiple :else" msgstr "E583: :else" -#: ../ex_eval.c:883 msgid "E584: :elseif after :else" msgstr "E584: :elseif :else" -#: ../ex_eval.c:941 msgid "E585: :while/:for nesting too deep" msgstr "E585: :while/:for" -#: ../ex_eval.c:1028 msgid "E586: :continue without :while or :for" msgstr "E586: :continue :while :for" -#: ../ex_eval.c:1061 msgid "E587: :break without :while or :for" msgstr "E587: :break :while :for" -#: ../ex_eval.c:1102 msgid "E732: Using :endfor with :while" msgstr "E732: :endfor :while" -#: ../ex_eval.c:1104 msgid "E733: Using :endwhile with :for" msgstr "E733: :endwhile :for" -#: ../ex_eval.c:1247 msgid "E601: :try nesting too deep" msgstr "E601: :try" -#: ../ex_eval.c:1317 msgid "E603: :catch without :try" msgstr "E603: :catch :try" #. Give up for a ":catch" after ":finally" and ignore it. #. * Just parse. -#: ../ex_eval.c:1332 msgid "E604: :catch after :finally" msgstr "E604: :catch :finally" -#: ../ex_eval.c:1451 msgid "E606: :finally without :try" msgstr "E606: :finally :try" #. Give up for a multiple ":finally" and ignore it. -#: ../ex_eval.c:1467 msgid "E607: multiple :finally" msgstr "E607: :finally" -#: ../ex_eval.c:1571 msgid "E602: :endtry without :try" msgstr "E602: :entry :try" -#: ../ex_eval.c:2026 msgid "E193: :endfunction not inside a function" msgstr "E193: :endfunction " -#: ../ex_getln.c:1643 msgid "E788: Not allowed to edit another buffer now" msgstr "E788: " -#: ../ex_getln.c:1656 msgid "E811: Not allowed to change buffer information now" msgstr "E811: " # msgstr "E197: " -#: ../ex_getln.c:3178 msgid "tagname" msgstr " " -#: ../ex_getln.c:3181 msgid " kind file\n" msgstr " \n" -#: ../ex_getln.c:4799 msgid "'history' option is zero" msgstr " 'history' " -#: ../ex_getln.c:5046 #, c-format msgid "" "\n" @@ -1994,35 +1566,27 @@ msgstr "" "\n" "# %s ( ):\n" -#: ../ex_getln.c:5047 msgid "Command Line" msgstr "" -#: ../ex_getln.c:5048 msgid "Search String" msgstr " " -#: ../ex_getln.c:5049 msgid "Expression" msgstr "" -#: ../ex_getln.c:5050 msgid "Input Line" msgstr " " -#: ../ex_getln.c:5117 msgid "E198: cmd_pchar beyond the command length" msgstr "E198: cmd_pchar " -#: ../ex_getln.c:5279 msgid "E199: Active window or buffer deleted" msgstr "E199: " -#: ../file_search.c:203 msgid "E854: path too long for completion" msgstr "E854: " -#: ../file_search.c:446 #, c-format msgid "" "E343: Invalid path: '**[number]' must be at the end of the path or be " @@ -2032,217 +1596,169 @@ msgstr "" "'%s'." # msgstr "E343: " -#: ../file_search.c:1505 #, c-format msgid "E344: Can't find directory \"%s\" in cdpath" msgstr "E344: %s cdpath" # msgstr "E344: " -#: ../file_search.c:1508 #, c-format msgid "E345: Can't find file \"%s\" in path" msgstr "E345: %s path" # msgstr "E345: " -#: ../file_search.c:1512 #, c-format msgid "E346: No more directory \"%s\" found in cdpath" msgstr "E346: cdpath %s" # msgstr "E346: " -#: ../file_search.c:1515 #, c-format msgid "E347: No more file \"%s\" found in path" msgstr "E347: %s" -#: ../fileio.c:137 msgid "E812: Autocommands changed buffer or buffer name" msgstr "E812: " # msgstr "E199: " -#: ../fileio.c:368 msgid "Illegal file name" msgstr " " -#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578 msgid "is a directory" msgstr "" -#: ../fileio.c:397 msgid "is not a file" msgstr " " -#: ../fileio.c:508 ../fileio.c:3522 msgid "[New File]" msgstr "[ ]" -#: ../fileio.c:511 msgid "[New DIRECTORY]" msgstr "[ ]" -#: ../fileio.c:529 ../fileio.c:532 msgid "[File too big]" msgstr "[ ]" -#: ../fileio.c:534 msgid "[Permission Denied]" msgstr "[³]" -#: ../fileio.c:653 msgid "E200: *ReadPre autocommands made the file unreadable" msgstr "E200: *ReadPre " # msgstr "E200: " -#: ../fileio.c:655 msgid "E201: *ReadPre autocommands must not change current buffer" msgstr "E201: *ReadPre " # msgstr "E201: " -#: ../fileio.c:672 msgid "Nvim: Reading from stdin...\n" msgstr "Vim: stdin...\n" #. Re-opening the original file failed! -#: ../fileio.c:909 msgid "E202: Conversion made file unreadable!" msgstr "E202: !" # msgstr "E202: " #. fifo or socket -#: ../fileio.c:1782 msgid "[fifo/socket]" msgstr "[/]" #. fifo -#: ../fileio.c:1788 msgid "[fifo]" msgstr "[]" #. or socket -#: ../fileio.c:1794 msgid "[socket]" msgstr "[]" #. or character special -#: ../fileio.c:1801 msgid "[character special]" msgstr "[. ]" -#: ../fileio.c:1815 msgid "[CR missing]" msgstr "[ CR]" -#: ../fileio.c:1819 msgid "[long lines split]" msgstr "[ ]" -#: ../fileio.c:1823 ../fileio.c:3512 msgid "[NOT converted]" msgstr "[ ]" -#: ../fileio.c:1826 ../fileio.c:3515 msgid "[converted]" msgstr "[]" -#: ../fileio.c:1831 #, c-format msgid "[CONVERSION ERROR in line %<PRId64>]" msgstr "[ ֲ %<PRId64>]" -#: ../fileio.c:1835 #, c-format msgid "[ILLEGAL BYTE in line %<PRId64>]" msgstr "[ %<PRId64>]" -#: ../fileio.c:1838 msgid "[READ ERRORS]" msgstr "[ ]" -#: ../fileio.c:2104 msgid "Can't find temp file for conversion" msgstr " " -#: ../fileio.c:2110 msgid "Conversion with 'charconvert' failed" msgstr " 'charconvert' " -#: ../fileio.c:2113 msgid "can't read output of 'charconvert'" msgstr " 'charconvert'" # msgstr "E217: " -#: ../fileio.c:2437 msgid "E676: No matching autocommands for acwrite buffer" msgstr "E676: " -#: ../fileio.c:2466 msgid "E203: Autocommands deleted or unloaded buffer to be written" msgstr "E203: , " -#: ../fileio.c:2486 msgid "E204: Autocommand changed number of lines in unexpected way" msgstr "E204: " -#: ../fileio.c:2548 ../fileio.c:2565 msgid "is not a file or writable device" msgstr " " -#: ../fileio.c:2601 msgid "is read-only (add ! to override)" msgstr " (! )" -#: ../fileio.c:2886 msgid "E506: Can't write to backup file (add ! to override)" msgstr "E506: (! )" -#: ../fileio.c:2898 msgid "E507: Close error for backup file (add ! to override)" msgstr "E507: (! )" -#: ../fileio.c:2901 msgid "E508: Can't read file for backup (add ! to override)" msgstr "" "E508: (! " ")" -#: ../fileio.c:2923 msgid "E509: Cannot create backup file (add ! to override)" msgstr "E509: (! )" -#: ../fileio.c:3008 msgid "E510: Can't make backup file (add ! to override)" msgstr "E510: (! )" #. Can't write without a tempfile! -#: ../fileio.c:3121 msgid "E214: Can't find temp file for writing" msgstr "E214: " -#: ../fileio.c:3134 msgid "E213: Cannot convert (add ! to write without conversion)" msgstr "E213: (! )" -#: ../fileio.c:3169 msgid "E166: Can't open linked file for writing" msgstr "E166: ' " -#: ../fileio.c:3173 msgid "E212: Can't open file for writing" msgstr "E212: " -#: ../fileio.c:3363 msgid "E667: Fsync failed" msgstr "E667: fsync" -#: ../fileio.c:3398 msgid "E512: Close failed" msgstr "E512: " -#: ../fileio.c:3436 msgid "E513: write error, conversion failed (make 'fenc' empty to override)" msgstr "E513: , ( 'fenc')" -#: ../fileio.c:3441 #, c-format msgid "" "E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to " @@ -2251,56 +1767,43 @@ msgstr "" "E513: , %<PRId64> ( " "'fenc')" -#: ../fileio.c:3448 msgid "E514: write error (file system full?)" msgstr "E514: ( ?)" -#: ../fileio.c:3506 msgid " CONVERSION ERROR" msgstr " ֲ" -#: ../fileio.c:3509 #, c-format msgid " in line %<PRId64>;" msgstr " %<PRId64>;" -#: ../fileio.c:3519 msgid "[Device]" msgstr "[]" -#: ../fileio.c:3522 msgid "[New]" msgstr "[]" -#: ../fileio.c:3535 msgid " [a]" msgstr "[]" -#: ../fileio.c:3535 msgid " appended" msgstr " " -#: ../fileio.c:3537 msgid " [w]" msgstr "[]" -#: ../fileio.c:3537 msgid " written" msgstr " " -#: ../fileio.c:3579 msgid "E205: Patchmode: can't save original file" msgstr "E205: : " -#: ../fileio.c:3602 msgid "E206: patchmode: can't touch empty original file" msgstr "E206: : " -#: ../fileio.c:3616 msgid "E207: Can't delete backup file" msgstr "E207: " -#: ../fileio.c:3672 msgid "" "\n" "WARNING: Original file may be lost or damaged\n" @@ -2308,134 +1811,105 @@ msgstr "" "\n" ": , , \n" -#: ../fileio.c:3675 msgid "don't quit the editor until the file is successfully written!" msgstr " , !" -#: ../fileio.c:3795 msgid "[dos]" msgstr "[dos]" -#: ../fileio.c:3795 msgid "[dos format]" msgstr "[ dos]" -#: ../fileio.c:3801 msgid "[mac]" msgstr "[mac]" -#: ../fileio.c:3801 msgid "[mac format]" msgstr "[ mac]" -#: ../fileio.c:3807 msgid "[unix]" msgstr "[unix]" -#: ../fileio.c:3807 msgid "[unix format]" msgstr "[ unix]" -#: ../fileio.c:3831 msgid "1 line, " msgstr " , " -#: ../fileio.c:3833 #, c-format msgid "%<PRId64> lines, " msgstr "%<PRId64> , " -#: ../fileio.c:3836 msgid "1 character" msgstr " " -#: ../fileio.c:3838 #, c-format msgid "%<PRId64> characters" msgstr "%<PRId64> " -#: ../fileio.c:3849 msgid "[noeol]" msgstr "[noeol]" -#: ../fileio.c:3849 msgid "[Incomplete last line]" msgstr "[ ]" #. don't overwrite messages here #. must give this prompt #. don't use emsg() here, don't want to flush the buffers -#: ../fileio.c:3865 msgid "WARNING: The file has been changed since reading it!!!" msgstr ": !!!" -#: ../fileio.c:3867 msgid "Do you really want to write to it" msgstr " ??" -#: ../fileio.c:4648 #, c-format msgid "E208: Error writing to \"%s\"" msgstr "E208: %s" -#: ../fileio.c:4655 #, c-format msgid "E209: Error closing \"%s\"" msgstr "E209: %s" -#: ../fileio.c:4657 #, c-format msgid "E210: Error reading \"%s\"" msgstr "E210: %s" -#: ../fileio.c:4883 msgid "E246: FileChangedShell autocommand deleted buffer" msgstr "E246: FileChangedShell " -#: ../fileio.c:4894 #, c-format msgid "E211: File \"%s\" no longer available" msgstr "E211: %s " -#: ../fileio.c:4906 #, c-format msgid "" "W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as " "well" msgstr "W12: : %s , Vim " -#: ../fileio.c:4907 msgid "See \":help W12\" for more info." msgstr ". :help W12 ." -#: ../fileio.c:4910 #, c-format msgid "W11: Warning: File \"%s\" has changed since editing started" msgstr "W11: : %s " -#: ../fileio.c:4911 msgid "See \":help W11\" for more info." msgstr ". :help W11 ." -#: ../fileio.c:4914 #, c-format msgid "W16: Warning: Mode of file \"%s\" has changed since editing started" msgstr "W16: : %s " -#: ../fileio.c:4915 msgid "See \":help W16\" for more info." msgstr ". :help W16 ." -#: ../fileio.c:4927 #, c-format msgid "W13: Warning: File \"%s\" has been created after editing started" msgstr "W13: : %s " -#: ../fileio.c:4947 msgid "Warning" msgstr "" -#: ../fileio.c:4948 msgid "" "&OK\n" "&Load File" @@ -2443,51 +1917,42 @@ msgstr "" "&O:\n" "&L:" -#: ../fileio.c:5065 #, c-format msgid "E462: Could not prepare for reloading \"%s\"" msgstr "E462: %s, " -#: ../fileio.c:5078 #, c-format msgid "E321: Could not reload \"%s\"" msgstr "E321: %s" -#: ../fileio.c:5601 msgid "--Deleted--" msgstr "----" -#: ../fileio.c:5732 #, c-format msgid "auto-removing autocommand: %s <buffer=%d>" msgstr " : %s <=%d>" #. the group doesn't exist -#: ../fileio.c:5772 #, c-format msgid "E367: No such group: \"%s\"" msgstr "E367: : %s" -#: ../fileio.c:5897 #, c-format msgid "E215: Illegal character after *: %s" msgstr "E215: *: %s" # msgstr "E215: " -#: ../fileio.c:5905 #, c-format msgid "E216: No such event: %s" msgstr "E216: 䳿: %s" # msgstr "E215: " -#: ../fileio.c:5907 #, c-format msgid "E216: No such group or event: %s" msgstr "E216: 䳿: %s" # msgstr "E216: " #. Highlight title -#: ../fileio.c:6090 msgid "" "\n" "--- Auto-Commands ---" @@ -2495,111 +1960,89 @@ msgstr "" "\n" "--- ---" -#: ../fileio.c:6293 #, c-format msgid "E680: <buffer=%d>: invalid buffer number " msgstr "E680: <=%d>: " -#: ../fileio.c:6370 msgid "E217: Can't execute autocommands for ALL events" msgstr "E217: Ѳ " # msgstr "E217: " -#: ../fileio.c:6393 msgid "No matching autocommands" msgstr " " -#: ../fileio.c:6831 msgid "E218: autocommand nesting too deep" msgstr "E218: " # msgstr "E218: " -#: ../fileio.c:7143 #, c-format msgid "%s Auto commands for \"%s\"" msgstr " %s %s" -#: ../fileio.c:7149 #, c-format msgid "Executing %s" msgstr " %s" -#: ../fileio.c:7211 #, c-format msgid "autocommand %s" msgstr " %s" -#: ../fileio.c:7795 msgid "E219: Missing {." msgstr "E219: {." # msgstr "E219: " -#: ../fileio.c:7797 msgid "E220: Missing }." msgstr "E220: }." # msgstr "E220: " -#: ../fold.c:93 msgid "E490: No fold found" msgstr "E490: " # msgstr "E349: " -#: ../fold.c:544 msgid "E350: Cannot create fold with current 'foldmethod'" msgstr "E350: 'foldmethod'" -#: ../fold.c:546 msgid "E351: Cannot delete fold with current 'foldmethod'" msgstr "E351: 'foldmethod'" -#: ../fold.c:1784 #, c-format msgid "+--%3ld lines folded " msgstr "+-- %3ld " #. buffer has already been read -#: ../getchar.c:273 msgid "E222: Add to read buffer" msgstr "E222: " -#: ../getchar.c:2040 msgid "E223: recursive mapping" msgstr "E223: " # msgstr "E223: " -#: ../getchar.c:2849 #, c-format msgid "E224: global abbreviation already exists for %s" msgstr "E224: %s " # msgstr "E224: " -#: ../getchar.c:2852 #, c-format msgid "E225: global mapping already exists for %s" msgstr "E225: %s " # msgstr "E225: " -#: ../getchar.c:2952 #, c-format msgid "E226: abbreviation already exists for %s" msgstr "E226: %s" # msgstr "E226: " -#: ../getchar.c:2955 #, c-format msgid "E227: mapping already exists for %s" msgstr "E227: %s" # msgstr "E227: " -#: ../getchar.c:3008 msgid "No abbreviation found" msgstr " " -#: ../getchar.c:3010 msgid "No mapping found" msgstr " " -#: ../getchar.c:3974 msgid "E228: makemap: Illegal mode" msgstr "E228: makemap: " @@ -2607,7 +2050,6 @@ msgstr "E228: makemap: " #. key value of 'cedit' option #. type of cmdline window or 0 #. result of cmdline window or 0 -#: ../globals.h:924 msgid "--No lines in buffer--" msgstr "-- --" @@ -2615,680 +2057,526 @@ msgstr "-- --" #. * The error messages that can be shared are included here. #. * Excluded are errors that are only used once and debugging messages. #. -#: ../globals.h:996 msgid "E470: Command aborted" msgstr "E470: " -#: ../globals.h:997 msgid "E471: Argument required" msgstr "E471: " -#: ../globals.h:998 msgid "E10: \\ should be followed by /, ? or &" msgstr "E10: \\ /, ? &" # msgstr "E10: " -#: ../globals.h:1000 msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits" msgstr "E11: , <CR> , CTRL-C " -#: ../globals.h:1002 msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search" msgstr "" "E12: exrc/vimrc " -#: ../globals.h:1003 msgid "E171: Missing :endif" msgstr "E171: :endif" -#: ../globals.h:1004 msgid "E600: Missing :endtry" msgstr "E600: :endtry" -#: ../globals.h:1005 msgid "E170: Missing :endwhile" msgstr "E170: :endwhile" -#: ../globals.h:1006 msgid "E170: Missing :endfor" msgstr "E170: :endfor" -#: ../globals.h:1007 msgid "E588: :endwhile without :while" msgstr "E588: :endwhile :while" -#: ../globals.h:1008 msgid "E588: :endfor without :for" msgstr "E588: :endfor :for" -#: ../globals.h:1009 msgid "E13: File exists (add ! to override)" msgstr "E13: (! )" -#: ../globals.h:1010 msgid "E472: Command failed" msgstr "E472: " -#: ../globals.h:1011 msgid "E473: Internal error" msgstr "E473: " -#: ../globals.h:1012 msgid "Interrupted" msgstr "" -#: ../globals.h:1013 msgid "E14: Invalid address" msgstr "E14: " # msgstr "E14: " -#: ../globals.h:1014 msgid "E474: Invalid argument" msgstr "E474: " -#: ../globals.h:1015 #, c-format msgid "E475: Invalid argument: %s" msgstr "E475: : %s" -#: ../globals.h:1016 #, c-format msgid "E15: Invalid expression: %s" msgstr "E15: : %s" # msgstr "E15: " -#: ../globals.h:1017 msgid "E16: Invalid range" msgstr "E16: " # msgstr "E16: " -#: ../globals.h:1018 msgid "E476: Invalid command" msgstr "E476: " -#: ../globals.h:1019 #, c-format msgid "E17: \"%s\" is a directory" msgstr "E17: %s " -#: ../globals.h:1020 -#, fuzzy msgid "E900: Invalid job id" -msgstr "E49: " +msgstr "E900: . " -#: ../globals.h:1021 msgid "E901: Job table is full" -msgstr "" +msgstr "E901: " -#: ../globals.h:1022 #, c-format msgid "E902: \"%s\" is not an executable" -msgstr "" +msgstr "E902: \"%s\" " -#: ../globals.h:1024 #, c-format msgid "E364: Library call failed for \"%s()\"" msgstr "E364: %s() " # msgstr "E18: " -#: ../globals.h:1026 msgid "E19: Mark has invalid line number" msgstr "E19: " # msgstr "E19: " -#: ../globals.h:1027 msgid "E20: Mark not set" msgstr "E20: " # msgstr "E20: " -#: ../globals.h:1029 msgid "E21: Cannot make changes, 'modifiable' is off" msgstr "E21: : 'modifiable'" # msgstr "E21: " -#: ../globals.h:1030 msgid "E22: Scripts nested too deep" msgstr "E22: " # msgstr "E22: " -#: ../globals.h:1031 msgid "E23: No alternate file" msgstr "E23: " # msgstr "E23: " -#: ../globals.h:1032 msgid "E24: No such abbreviation" msgstr "E24: " # msgstr "E24: " -#: ../globals.h:1033 msgid "E477: No ! allowed" msgstr "E477: ! " -#: ../globals.h:1035 msgid "E25: Nvim does not have a built-in GUI" msgstr "E25: GUI: " # msgstr "E25: " -#: ../globals.h:1036 #, c-format msgid "E28: No such highlight group name: %s" msgstr "E28: : %s" # msgstr "E28: " -#: ../globals.h:1037 msgid "E29: No inserted text yet" msgstr "E29: " # msgstr "E29: " -#: ../globals.h:1038 msgid "E30: No previous command line" msgstr "E30: " # msgstr "E30: " -#: ../globals.h:1039 msgid "E31: No such mapping" msgstr "E31: " # msgstr "E31: " -#: ../globals.h:1040 msgid "E479: No match" msgstr "E479: " -#: ../globals.h:1041 #, c-format msgid "E480: No match: %s" msgstr "E480: : %s" -#: ../globals.h:1042 msgid "E32: No file name" msgstr "E32: " # msgstr "E32: " -#: ../globals.h:1044 msgid "E33: No previous substitute regular expression" msgstr "E33: " # msgstr "E33: " -#: ../globals.h:1045 msgid "E34: No previous command" msgstr "E34: " # msgstr "E34: " -#: ../globals.h:1046 msgid "E35: No previous regular expression" msgstr "E35: " # msgstr "E35: " -#: ../globals.h:1047 msgid "E481: No range allowed" msgstr "E481: " -#: ../globals.h:1048 msgid "E36: Not enough room" msgstr "E36: ̳ " # msgstr "E36: " -#: ../globals.h:1049 #, c-format msgid "E482: Can't create file %s" msgstr "E482: %s" -#: ../globals.h:1050 msgid "E483: Can't get temp file name" msgstr "E483: " -#: ../globals.h:1051 #, c-format msgid "E484: Can't open file %s" msgstr "E484: %s" -#: ../globals.h:1052 #, c-format msgid "E485: Can't read file %s" msgstr "E485: %s" -#: ../globals.h:1054 msgid "E37: No write since last change (add ! to override)" msgstr "E37: (! )" -#: ../globals.h:1055 -#, fuzzy msgid "E37: No write since last change" -msgstr "[ ]\n" +msgstr "E37: " -#: ../globals.h:1056 msgid "E38: Null argument" msgstr "E38: ³ " -#: ../globals.h:1057 msgid "E39: Number expected" msgstr "E39: " -#: ../globals.h:1058 #, c-format msgid "E40: Can't open errorfile %s" msgstr "E40: %s" -#: ../globals.h:1059 msgid "E41: Out of memory!" msgstr "E41: '!" -#: ../globals.h:1060 msgid "Pattern not found" msgstr " " -#: ../globals.h:1061 #, c-format msgid "E486: Pattern not found: %s" msgstr "E486: : %s" -#: ../globals.h:1062 msgid "E487: Argument must be positive" msgstr "E487: " -#: ../globals.h:1064 msgid "E459: Cannot go back to previous directory" msgstr "E459: " -#: ../globals.h:1066 msgid "E42: No Errors" msgstr "E42: " -#: ../globals.h:1067 msgid "E776: No location list" msgstr "E776: " -#: ../globals.h:1068 msgid "E43: Damaged match string" msgstr "E43: " -#: ../globals.h:1069 msgid "E44: Corrupted regexp program" msgstr "E44: dz " -#: ../globals.h:1071 msgid "E45: 'readonly' option is set (add ! to override)" msgstr "E45: 'readonly' (! )" -#: ../globals.h:1073 #, c-format msgid "E46: Cannot change read-only variable \"%s\"" msgstr "E46: : %s" -#: ../globals.h:1075 #, c-format msgid "E794: Cannot set variable in the sandbox: \"%s\"" msgstr "E794: : %s" -#: ../globals.h:1076 msgid "E47: Error while reading errorfile" msgstr "E47: " -#: ../globals.h:1078 msgid "E48: Not allowed in sandbox" msgstr "E48: " -#: ../globals.h:1080 msgid "E523: Not allowed here" msgstr "E523: " -#: ../globals.h:1082 msgid "E359: Screen mode setting not supported" msgstr "E359: " -#: ../globals.h:1083 msgid "E49: Invalid scroll size" msgstr "E49: " -#: ../globals.h:1084 msgid "E91: 'shell' option is empty" msgstr "E91: 'shell' " # msgstr "E254: " -#: ../globals.h:1085 msgid "E255: Couldn't read in sign data!" msgstr "E255: !" -#: ../globals.h:1086 msgid "E72: Close error on swap file" msgstr "E72: " -#: ../globals.h:1087 msgid "E73: tag stack empty" msgstr "E73: 崳 " -#: ../globals.h:1088 msgid "E74: Command too complex" msgstr "E74: " -#: ../globals.h:1089 msgid "E75: Name too long" msgstr "E75: '" -#: ../globals.h:1090 msgid "E76: Too many [" msgstr "E76: '['" -#: ../globals.h:1091 msgid "E77: Too many file names" msgstr "E77: " -#: ../globals.h:1092 msgid "E488: Trailing characters" msgstr "E488: " -#: ../globals.h:1093 msgid "E78: Unknown mark" msgstr "E78: " -#: ../globals.h:1094 msgid "E79: Cannot expand wildcards" msgstr "E79: " -#: ../globals.h:1096 msgid "E591: 'winheight' cannot be smaller than 'winminheight'" msgstr "E591: 'winheight' 'winminheight'" -#: ../globals.h:1098 msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'" msgstr "E592: 'winwidth' 'winminwidth'" # msgstr "E79: " -#: ../globals.h:1099 msgid "E80: Error while writing" msgstr "E80: " -#: ../globals.h:1100 msgid "Zero count" msgstr " " -#: ../globals.h:1101 msgid "E81: Using <SID> not in a script context" msgstr "E81: <SID> " -#: ../globals.h:1102 #, c-format msgid "E685: Internal error: %s" msgstr "E685: : %s" -#: ../globals.h:1104 msgid "E363: pattern uses more memory than 'maxmempattern'" msgstr "E363: , 'maxmempattern', '" -#: ../globals.h:1105 msgid "E749: empty buffer" msgstr "E749: " -#: ../globals.h:1108 msgid "E682: Invalid search pattern or delimiter" msgstr "E682: " -#: ../globals.h:1109 msgid "E139: File is loaded in another buffer" msgstr "E139: " # msgstr "E235: " -#: ../globals.h:1110 #, c-format msgid "E764: Option '%s' is not set" msgstr "E764: '%s' " -#: ../globals.h:1111 msgid "E850: Invalid register name" msgstr "E850: " -#: ../globals.h:1114 msgid "search hit TOP, continuing at BOTTOM" msgstr " , ʲ" -#: ../globals.h:1115 msgid "search hit BOTTOM, continuing at TOP" msgstr " ʲ, " -#: ../hardcopy.c:240 msgid "E550: Missing colon" msgstr "E550: " # msgstr "E347: " -#: ../hardcopy.c:252 msgid "E551: Illegal component" msgstr "E551: " -#: ../hardcopy.c:259 msgid "E552: digit expected" msgstr "E552: " -#: ../hardcopy.c:473 #, c-format msgid "Page %d" msgstr " %d" -#: ../hardcopy.c:597 msgid "No text to be printed" msgstr "ͳ " -#: ../hardcopy.c:668 #, c-format msgid "Printing page %d (%d%%)" msgstr " %d (%d%%)" -#: ../hardcopy.c:680 #, c-format msgid " Copy %d of %d" msgstr " %d %d" -#: ../hardcopy.c:733 #, c-format msgid "Printed: %s" msgstr ": %s" -#: ../hardcopy.c:740 msgid "Printing aborted" msgstr " " -#: ../hardcopy.c:1365 msgid "E455: Error writing to PostScript output file" msgstr "E455: PostScript" -#: ../hardcopy.c:1747 #, c-format msgid "E624: Can't open file \"%s\"" msgstr "E624: %s" -#: ../hardcopy.c:1756 ../hardcopy.c:2470 #, c-format msgid "E457: Can't read PostScript resource file \"%s\"" msgstr "E457: PostScript %s" -#: ../hardcopy.c:1772 #, c-format msgid "E618: file \"%s\" is not a PostScript resource file" msgstr "E618: %s PostScript" -#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844 #, c-format msgid "E619: file \"%s\" is not a supported PostScript resource file" msgstr "E619: %s PostScript" -#: ../hardcopy.c:1856 #, c-format msgid "E621: \"%s\" resource file has wrong version" msgstr "E621: %s" -#: ../hardcopy.c:2225 msgid "E673: Incompatible multi-byte encoding and character set." msgstr "E673: ." -#: ../hardcopy.c:2238 msgid "E674: printmbcharset cannot be empty with multi-byte encoding." msgstr "" "E674: printmbcharset ." -#: ../hardcopy.c:2254 msgid "E675: No default font specified for multi-byte printing." msgstr "E675: ." -#: ../hardcopy.c:2426 msgid "E324: Can't open PostScript output file" msgstr "E324: PostScript " -#: ../hardcopy.c:2458 #, c-format msgid "E456: Can't open file \"%s\"" msgstr "E456: %s" -#: ../hardcopy.c:2583 msgid "E456: Can't find PostScript resource file \"prolog.ps\"" msgstr "E456: PostScript prolog.ps" -#: ../hardcopy.c:2593 msgid "E456: Can't find PostScript resource file \"cidfont.ps\"" msgstr "E456: PostScript cidfont.ps" -#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665 #, c-format msgid "E456: Can't find PostScript resource file \"%s.ps\"" msgstr "E456: PostScript %s.ps" -#: ../hardcopy.c:2654 #, c-format msgid "E620: Unable to convert to print encoding \"%s\"" msgstr "E620: %s" -#: ../hardcopy.c:2877 msgid "Sending to printer..." msgstr "³ ..." -#: ../hardcopy.c:2881 msgid "E365: Failed to print PostScript file" msgstr "E365: PostScript" -#: ../hardcopy.c:2883 msgid "Print job sent." msgstr " ." # msgstr "E255: " -#: ../if_cscope.c:85 msgid "Add a new database" msgstr " " -#: ../if_cscope.c:87 msgid "Query for a pattern" msgstr " " -#: ../if_cscope.c:89 msgid "Show this message" msgstr " " -#: ../if_cscope.c:91 msgid "Kill a connection" msgstr " '" -#: ../if_cscope.c:93 msgid "Reinit all connections" msgstr " '" -#: ../if_cscope.c:95 msgid "Show connections" msgstr " '" -#: ../if_cscope.c:101 #, c-format msgid "E560: Usage: cs[cope] %s" msgstr "E560: : cs[cope] %s" -#: ../if_cscope.c:225 msgid "This cscope command does not support splitting the window.\n" msgstr " cscope 쳺 .\n" -#: ../if_cscope.c:266 msgid "E562: Usage: cstag <ident>" msgstr "E562: : cstag <->" -#: ../if_cscope.c:313 msgid "E257: cstag: tag not found" msgstr "E257: cstag: " # msgstr "E257: " -#: ../if_cscope.c:461 #, c-format msgid "E563: stat(%s) error: %d" msgstr "E563: stat(%s) : %d" -#: ../if_cscope.c:551 #, c-format msgid "E564: %s is not a directory or a valid cscope database" msgstr "E564: %s , cscope" -#: ../if_cscope.c:566 #, c-format msgid "Added cscope database %s" msgstr " cscope %s" -#: ../if_cscope.c:616 #, c-format msgid "E262: error reading cscope connection %<PRId64>" msgstr "E262: ' cscope %<PRId64>" -#: ../if_cscope.c:711 msgid "E561: unknown cscope search type" msgstr "E561: cscope" -#: ../if_cscope.c:752 ../if_cscope.c:789 msgid "E566: Could not create cscope pipes" msgstr "E566: cscope" -#: ../if_cscope.c:767 msgid "E622: Could not fork for cscope" msgstr "E622: cscope" -#: ../if_cscope.c:849 msgid "cs_create_connection setpgid failed" msgstr "cs_create_connection: setpgid" -#: ../if_cscope.c:853 ../if_cscope.c:889 msgid "cs_create_connection exec failed" msgstr "cs_create_connection: " -#: ../if_cscope.c:863 ../if_cscope.c:902 msgid "cs_create_connection: fdopen for to_fp failed" msgstr "cs_create_connection: fdopen to_fp " -#: ../if_cscope.c:865 ../if_cscope.c:906 msgid "cs_create_connection: fdopen for fr_fp failed" msgstr "cs_create_connection: fdopen fr_fp " -#: ../if_cscope.c:890 msgid "E623: Could not spawn cscope process" msgstr "E623: cscope" -#: ../if_cscope.c:932 msgid "E567: no cscope connections" msgstr "E567: ' cscope" -#: ../if_cscope.c:1009 #, c-format msgid "E469: invalid cscopequickfix flag %c for %c" msgstr "E469: cscopequickfix %c %c" # msgstr "E258: " -#: ../if_cscope.c:1058 #, c-format msgid "E259: no matches found for cscope query %s of %s" msgstr "E259: cscope %s %s " # msgstr "E259: " -#: ../if_cscope.c:1142 msgid "cscope commands:\n" msgstr " cscope:\n" -#: ../if_cscope.c:1150 #, c-format msgid "%-5s: %s%*s (Usage: %s)" msgstr "%-5s: %s%*s (: %s)" -#: ../if_cscope.c:1155 msgid "" "\n" " c: Find functions calling this function\n" @@ -3310,32 +2598,26 @@ msgstr "" " s: C\n" " t: \n" -#: ../if_cscope.c:1226 msgid "E568: duplicate cscope database not added" msgstr "E568: cscope " # msgstr "E260: " -#: ../if_cscope.c:1335 #, c-format msgid "E261: cscope connection %s not found" msgstr "E261: ' cscope %s " -#: ../if_cscope.c:1364 #, c-format msgid "cscope connection %s closed" msgstr "' cscope %s " #. should not reach here -#: ../if_cscope.c:1486 msgid "E570: fatal error in cs_manage_matches" msgstr "E570: cs_manage_matches" -#: ../if_cscope.c:1693 #, c-format msgid "Cscope tag: %s" msgstr " cscope: %s" -#: ../if_cscope.c:1711 msgid "" "\n" " # line" @@ -3343,89 +2625,69 @@ msgstr "" "\n" " # " -#: ../if_cscope.c:1713 msgid "filename / context / line\n" msgstr " / / \n" -#: ../if_cscope.c:1809 #, c-format msgid "E609: Cscope error: %s" msgstr "E609: cscope: %s" -#: ../if_cscope.c:2053 msgid "All cscope databases reset" msgstr " cscope " -#: ../if_cscope.c:2123 msgid "no cscope connections\n" msgstr " ' cscope\n" -#: ../if_cscope.c:2126 msgid " # pid database name prepend path\n" msgstr " # pid \n" -#: ../main.c:144 msgid "Unknown option argument" msgstr " " -#: ../main.c:146 msgid "Too many edit arguments" msgstr " " -#: ../main.c:148 msgid "Argument missing after" msgstr " " -#: ../main.c:150 msgid "Garbage after option argument" msgstr " " -#: ../main.c:152 msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments" msgstr " +, -c --cmd " # msgstr "E14: " -#: ../main.c:154 msgid "Invalid argument for" msgstr " " -#: ../main.c:294 #, c-format msgid "%d files to edit\n" msgstr "%d ()\n" -#: ../main.c:1342 msgid "Attempt to open script file again: \"" msgstr " : \"" -#: ../main.c:1350 msgid "Cannot open for reading: \"" msgstr " : \"" -#: ../main.c:1393 msgid "Cannot open for script output: \"" msgstr " : \"" -#: ../main.c:1622 msgid "Vim: Warning: Output is not to a terminal\n" msgstr "Vim: : \n" -#: ../main.c:1624 msgid "Vim: Warning: Input is not from a terminal\n" msgstr "Vim: : \n" #. just in case.. -#: ../main.c:1891 msgid "pre-vimrc command line" msgstr " vimrc" -#: ../main.c:1964 #, c-format msgid "E282: Cannot read from \"%s\"" msgstr "E282: %s" # msgstr "E282: " -#: ../main.c:2149 msgid "" "\n" "More info with: \"vim -h\"\n" @@ -3433,23 +2695,18 @@ msgstr "" "\n" "ij : vim -h\n" -#: ../main.c:2178 msgid "[file ..] edit specified file(s)" msgstr "[ ..] " -#: ../main.c:2179 msgid "- read text from stdin" msgstr "- stdin" -#: ../main.c:2180 msgid "-t tag edit file where tag is defined" msgstr "-t " -#: ../main.c:2181 msgid "-q [errorfile] edit file with first error" msgstr "-q [] " -#: ../main.c:2187 msgid "" "\n" "\n" @@ -3459,11 +2716,9 @@ msgstr "" "\n" ":" -#: ../main.c:2189 msgid " vim [arguments] " msgstr " vim [] " -#: ../main.c:2193 msgid "" "\n" " or:" @@ -3471,7 +2726,6 @@ msgstr "" "\n" " :" -#: ../main.c:2196 msgid "" "\n" "\n" @@ -3481,192 +2735,146 @@ msgstr "" "\n" ":\n" -#: ../main.c:2197 msgid "--\t\t\tOnly file names after this" msgstr "--\t\t\t " -#: ../main.c:2199 msgid "--literal\t\tDon't expand wildcards" msgstr "--literal\t\t " -#: ../main.c:2201 msgid "-v\t\t\tVi mode (like \"vi\")" msgstr "-v\t\t\t Vi ( vi)" -#: ../main.c:2202 msgid "-e\t\t\tEx mode (like \"ex\")" msgstr "-e\t\t\t Ex ( ex)" -#: ../main.c:2203 msgid "-E\t\t\tImproved Ex mode" msgstr "-E\t\t\t Ex" -#: ../main.c:2204 msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")" msgstr "-s\t\t\t () ( ex)" -#: ../main.c:2205 msgid "-d\t\t\tDiff mode (like \"vimdiff\")" msgstr "-d\t\t\t ( vimdiff)" -#: ../main.c:2206 msgid "-y\t\t\tEasy mode (like \"evim\", modeless)" msgstr "-y\t\t\t ( evim, )" -#: ../main.c:2207 msgid "-R\t\t\tReadonly mode (like \"view\")" msgstr "-R\t\t\t ( view)" -#: ../main.c:2208 msgid "-Z\t\t\tRestricted mode (like \"rvim\")" msgstr "-Z\t\t\t ( rvim)" -#: ../main.c:2209 msgid "-m\t\t\tModifications (writing files) not allowed" msgstr "-m\t\t\t ( ) " -#: ../main.c:2210 msgid "-M\t\t\tModifications in text not allowed" msgstr "-M\t\t\t " -#: ../main.c:2211 msgid "-b\t\t\tBinary mode" msgstr "-b\t\t\t " -#: ../main.c:2212 msgid "-l\t\t\tLisp mode" msgstr "-l\t\t\t lisp" -#: ../main.c:2213 msgid "-C\t\t\tCompatible with Vi: 'compatible'" msgstr "-C\t\t\t Vi : 'compatible'" -#: ../main.c:2214 msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'" msgstr "-N\t\t\t Vi : 'nocompatible'" -#: ../main.c:2215 msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]" msgstr "-V[N][]\t\t [ N] [ . ]" -#: ../main.c:2216 msgid "-D\t\t\tDebugging mode" msgstr "-D\t\t\t " -#: ../main.c:2217 msgid "-n\t\t\tNo swap file, use memory only" msgstr "-n\t\t\t , '" -#: ../main.c:2218 msgid "-r\t\t\tList swap files and exit" msgstr "-r\t\t\t " -#: ../main.c:2219 msgid "-r (with file name)\tRecover crashed session" msgstr "-r ( )\t³ " -#: ../main.c:2220 msgid "-L\t\t\tSame as -r" msgstr "-L\t\t\t , -r" -#: ../main.c:2221 msgid "-A\t\t\tstart in Arabic mode" msgstr "-A\t\t\t " -#: ../main.c:2222 msgid "-H\t\t\tStart in Hebrew mode" msgstr "-H\t\t\t " -#: ../main.c:2223 msgid "-F\t\t\tStart in Farsi mode" msgstr "-F\t\t\t " -#: ../main.c:2224 msgid "-T <terminal>\tSet terminal type to <terminal>" msgstr "-T <>\t <>" -#: ../main.c:2225 msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc" msgstr "-u <vimrc>\t\t .vimrc" -#: ../main.c:2226 msgid "--noplugin\t\tDon't load plugin scripts" msgstr "--noplugin\t\t " -#: ../main.c:2227 msgid "-p[N]\t\tOpen N tab pages (default: one for each file)" msgstr "-p[N]\t\t³ N ( )" -#: ../main.c:2228 msgid "-o[N]\t\tOpen N windows (default: one for each file)" msgstr "-o[N]\t\t³ N ( )" -#: ../main.c:2229 msgid "-O[N]\t\tLike -o but split vertically" msgstr "-O[N]\t\tͳ -o, " -#: ../main.c:2230 msgid "+\t\t\tStart at end of file" msgstr "+\t\t\t " -#: ../main.c:2231 msgid "+<lnum>\t\tStart at line <lnum>" msgstr "+<>\t\t <>" -#: ../main.c:2232 msgid "--cmd <command>\tExecute <command> before loading any vimrc file" msgstr "--cmd <>\t <> vimrc" -#: ../main.c:2233 msgid "-c <command>\t\tExecute <command> after loading the first file" msgstr "-c <>\t\t <> " -#: ../main.c:2235 msgid "-S <session>\t\tSource file <session> after loading the first file" msgstr "-S <>\t\t " -#: ../main.c:2236 msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>" msgstr "-s <>\t\t <>" -#: ../main.c:2237 msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>" msgstr "-w <>\t\t <>" -#: ../main.c:2238 msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>" msgstr "-w <>\t\t <>" -#: ../main.c:2240 msgid "--startuptime <file>\tWrite startup timing messages to <file>" msgstr "" "--startuptime <>\t " " <>" -#: ../main.c:2242 msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo" msgstr "-i <viminfo>\t\t <viminfo> .viminfo" -#: ../main.c:2243 msgid "-h or --help\tPrint Help (this message) and exit" msgstr "-h --help\t " -#: ../main.c:2244 msgid "--version\t\tPrint version information and exit" msgstr "--version\t\t " -#: ../mark.c:676 msgid "No marks set" msgstr " " -#: ../mark.c:678 #, c-format msgid "E283: No marks matching \"%s\"" msgstr "E283: %s " # msgstr "E283: " #. Highlight title -#: ../mark.c:687 msgid "" "\n" "mark line col file/text" @@ -3675,7 +2883,6 @@ msgstr "" ". . . /" #. Highlight title -#: ../mark.c:789 msgid "" "\n" " jump line col file/text" @@ -3685,7 +2892,6 @@ msgstr "" # msgstr "E283: " #. Highlight title -#: ../mark.c:831 msgid "" "\n" "change line col text" @@ -3694,7 +2900,6 @@ msgstr "" " . . " # TODO -#: ../mark.c:1238 msgid "" "\n" "# File marks:\n" @@ -3703,7 +2908,6 @@ msgstr "" "# :\n" #. Write the jumplist with -' -#: ../mark.c:1271 msgid "" "\n" "# Jumplist (newest first):\n" @@ -3712,7 +2916,6 @@ msgstr "" "# ( ):\n" # TODO -#: ../mark.c:1352 msgid "" "\n" "# History of marks within files (newest to oldest):\n" @@ -3720,90 +2923,71 @@ msgstr "" "\n" "# ( ):\n" -#: ../mark.c:1431 msgid "Missing '>'" msgstr " '>'" # msgstr "E292: " -#: ../memfile.c:426 msgid "E293: block was not locked" msgstr "E293: " # msgstr "E293: " -#: ../memfile.c:799 msgid "E294: Seek error in swap file read" msgstr "E294: " -#: ../memfile.c:803 msgid "E295: Read error in swap file" msgstr "E295: " -#: ../memfile.c:849 msgid "E296: Seek error in swap file write" msgstr "E296: " -#: ../memfile.c:865 msgid "E297: Write error in swap file" msgstr "E297: " -#: ../memfile.c:1036 msgid "E300: Swap file already exists (symlink attack?)" msgstr "E300: ( ?)" -#: ../memline.c:318 msgid "E298: Didn't get block nr 0?" msgstr "E298: 0?" -#: ../memline.c:361 msgid "E298: Didn't get block nr 1?" msgstr "E298: 1?" # msgstr "E298: " -#: ../memline.c:377 msgid "E298: Didn't get block nr 2?" msgstr "E298: 2?" #. could not (re)open the swap file, what can we do???? -#: ../memline.c:465 msgid "E301: Oops, lost the swap file!!!" msgstr "E301: , !!!" # msgstr "E301: " -#: ../memline.c:477 msgid "E302: Could not rename swap file" msgstr "E302: " # msgstr "E302: " -#: ../memline.c:554 #, c-format msgid "E303: Unable to open swap file for \"%s\", recovery impossible" msgstr "E303: %s, " -#: ../memline.c:666 msgid "E304: ml_upd_block0(): Didn't get block 0??" msgstr "E304: ml_upd_block0(): 0??" #. no swap files found -#: ../memline.c:830 #, c-format msgid "E305: No swap file found for %s" msgstr "E305: %s" # msgstr "E305: " -#: ../memline.c:839 msgid "Enter number of swap file to use (0 to quit): " msgstr " , , (0 ):" -#: ../memline.c:879 #, c-format msgid "E306: Cannot open %s" msgstr "E306: %s" -#: ../memline.c:897 msgid "Unable to read block 0 from " msgstr " 0 " -#: ../memline.c:900 msgid "" "\n" "Maybe no changes were made or Vim did not update the swap file." @@ -3811,28 +2995,22 @@ msgstr "" "\n" ", , Vim ." -#: ../memline.c:909 msgid " cannot be used with this version of Vim.\n" msgstr " Vim.\n" -#: ../memline.c:911 msgid "Use Vim version 3.0.\n" msgstr " Vim 3.0\n" -#: ../memline.c:916 #, c-format msgid "E307: %s does not look like a Vim swap file" msgstr "E307: %s Vim" -#: ../memline.c:922 msgid " cannot be used on this computer.\n" msgstr " '.\n" -#: ../memline.c:924 msgid "The file was created on " msgstr " " -#: ../memline.c:928 msgid "" ",\n" "or the file has been damaged." @@ -3840,89 +3018,70 @@ msgstr "" ",\n" " ." -#: ../memline.c:945 msgid " has been damaged (page size is smaller than minimum value).\n" msgstr " ( ).\n" -#: ../memline.c:974 #, c-format msgid "Using swap file \"%s\"" msgstr " %s" -#: ../memline.c:980 #, c-format msgid "Original file \"%s\"" msgstr " %s" -#: ../memline.c:995 msgid "E308: Warning: Original file may have been changed" msgstr "E308: : , " # msgstr "E308: " -#: ../memline.c:1061 #, c-format msgid "E309: Unable to read block 1 from %s" msgstr "E309: 1 %s" # msgstr "E309: " -#: ../memline.c:1065 msgid "???MANY LINES MISSING" msgstr "??? Ӫ ʲ" -#: ../memline.c:1076 msgid "???LINE COUNT WRONG" msgstr "??? ʲʲ ʲ" -#: ../memline.c:1082 msgid "???EMPTY BLOCK" msgstr "??? Ͳ " -#: ../memline.c:1103 msgid "???LINES MISSING" msgstr "??? Ͳ " -#: ../memline.c:1128 #, c-format msgid "E310: Block 1 ID wrong (%s not a .swp file?)" msgstr "E310: 1 (%s ?)" # msgstr "E310: " -#: ../memline.c:1133 msgid "???BLOCK MISSING" msgstr "??? " -#: ../memline.c:1147 msgid "??? from here until ???END lines may be messed up" msgstr "??? `??? ʲ' , , " -#: ../memline.c:1164 msgid "??? from here until ???END lines may have been inserted/deleted" msgstr "??? `??? ʲ' , , /" -#: ../memline.c:1181 msgid "???END" msgstr "??? ʲ" -#: ../memline.c:1238 msgid "E311: Recovery Interrupted" msgstr "E311: ³ " -#: ../memline.c:1243 msgid "" "E312: Errors detected while recovering; look for lines starting with ???" msgstr "" "E312: ϳ . , " " ???" -#: ../memline.c:1245 msgid "See \":help E312\" for more information." msgstr ". :help E312 ." -#: ../memline.c:1249 msgid "Recovery completed. You should check if everything is OK." msgstr "³ , ." -#: ../memline.c:1251 msgid "" "\n" "(You might want to write out this file under another name\n" @@ -3930,15 +3089,12 @@ msgstr "" "\n" "(, \n" -#: ../memline.c:1252 msgid "and run diff with the original file to check for changes)" msgstr " diff )" -#: ../memline.c:1254 msgid "Recovery completed. Buffer contents equals file contents." msgstr "³ . ." -#: ../memline.c:1255 msgid "" "\n" "You may want to delete the .swp file now.\n" @@ -3949,51 +3105,39 @@ msgstr "" "\n" #. use msg() to start the scrolling properly -#: ../memline.c:1327 msgid "Swap files found:" msgstr " :" -#: ../memline.c:1446 msgid " In current directory:\n" msgstr " :\n" -#: ../memline.c:1448 msgid " Using specified name:\n" msgstr " :\n" -#: ../memline.c:1450 msgid " In directory " msgstr " " -#: ../memline.c:1465 msgid " -- none --\n" msgstr " -- --\n" -#: ../memline.c:1527 msgid " owned by: " msgstr " : " -#: ../memline.c:1529 msgid " dated: " msgstr " : " -#: ../memline.c:1532 ../memline.c:3231 msgid " dated: " msgstr " : " -#: ../memline.c:1548 msgid " [from Vim version 3.0]" msgstr " [ Vim 3.0]" -#: ../memline.c:1550 msgid " [does not look like a Vim swap file]" msgstr " [ ]" -#: ../memline.c:1552 msgid " file name: " msgstr " : " -#: ../memline.c:1558 msgid "" "\n" " modified: " @@ -4001,15 +3145,12 @@ msgstr "" "\n" " : " -#: ../memline.c:1559 msgid "YES" msgstr "" -#: ../memline.c:1559 msgid "no" msgstr "" -#: ../memline.c:1562 msgid "" "\n" " user name: " @@ -4017,11 +3158,9 @@ msgstr "" "\n" " : " -#: ../memline.c:1568 msgid " host name: " msgstr " : " -#: ../memline.c:1570 msgid "" "\n" " host name: " @@ -4029,7 +3168,6 @@ msgstr "" "\n" " : " -#: ../memline.c:1575 msgid "" "\n" " process ID: " @@ -4037,11 +3175,9 @@ msgstr "" "\n" " ID : " -#: ../memline.c:1579 msgid " (still running)" msgstr " ()" -#: ../memline.c:1586 msgid "" "\n" " [not usable on this computer]" @@ -4049,106 +3185,84 @@ msgstr "" "\n" " [ ']" -#: ../memline.c:1590 msgid " [cannot be read]" msgstr " [ ]" -#: ../memline.c:1593 msgid " [cannot be opened]" msgstr " [ ]" -#: ../memline.c:1698 msgid "E313: Cannot preserve, there is no swap file" msgstr "E313: , " # msgstr "E313: " -#: ../memline.c:1747 msgid "File preserved" msgstr " " -#: ../memline.c:1749 msgid "E314: Preserve failed" msgstr "E314: " # msgstr "E314: " -#: ../memline.c:1819 #, c-format msgid "E315: ml_get: invalid lnum: %<PRId64>" msgstr "E315: ml_get: lnum: %<PRId64>" # msgstr "E315: " -#: ../memline.c:1851 #, c-format msgid "E316: ml_get: cannot find line %<PRId64>" msgstr "E316: ml_get: %<PRId64>" # msgstr "E316: " -#: ../memline.c:2236 msgid "E317: pointer block id wrong 3" msgstr "E317: 3" # msgstr "E317: " -#: ../memline.c:2311 msgid "stack_idx should be 0" msgstr "stack_idx 0" -#: ../memline.c:2369 msgid "E318: Updated too many blocks?" msgstr "E318: ?" -#: ../memline.c:2511 msgid "E317: pointer block id wrong 4" msgstr "E317: 4" -#: ../memline.c:2536 msgid "deleted block 1?" msgstr " 1 ?" -#: ../memline.c:2707 #, c-format msgid "E320: Cannot find line %<PRId64>" msgstr "E320: %<PRId64>" -#: ../memline.c:2916 msgid "E317: pointer block id wrong" msgstr "E317: " # msgstr "E317: " -#: ../memline.c:2930 msgid "pe_line_count is zero" msgstr "pe_line_count 0" -#: ../memline.c:2955 #, c-format msgid "E322: line number out of range: %<PRId64> past the end" msgstr "E322: : %<PRId64> " # msgstr "E322: " -#: ../memline.c:2959 #, c-format msgid "E323: line count wrong in block %<PRId64>" msgstr "E323: ʳ %<PRId64>" # msgstr "E323: " -#: ../memline.c:2999 msgid "Stack size increases" msgstr " " -#: ../memline.c:3038 msgid "E317: pointer block id wrong 2" msgstr "E317: 2" -#: ../memline.c:3070 #, c-format msgid "E773: Symlink loop for \"%s\"" msgstr "E773: %s" # msgstr "E317: " -#: ../memline.c:3221 msgid "E325: ATTENTION" msgstr "E325: " -#: ../memline.c:3222 msgid "" "\n" "Found a swap file by the name \"" @@ -4156,15 +3270,12 @@ msgstr "" "\n" " \"" -#: ../memline.c:3226 msgid "While opening file \"" msgstr " \"" -#: ../memline.c:3239 msgid " NEWER than swap file!\n" msgstr " ² !\n" -#: ../memline.c:3244 msgid "" "\n" "(1) Another program may be editing the same file. If this is the case,\n" @@ -4176,19 +3287,15 @@ msgstr "" " , \n" " ." -#: ../memline.c:3245 msgid " Quit, or continue with caution.\n" msgstr " .\n" -#: ../memline.c:3246 msgid "(2) An edit session for this file crashed.\n" msgstr "(2) .\n" -#: ../memline.c:3247 msgid " If this is the case, use \":recover\" or \"vim -r " msgstr " , :recover vim -r " -#: ../memline.c:3249 msgid "" "\"\n" " to recover the changes (see \":help recovery\").\n" @@ -4196,11 +3303,9 @@ msgstr "" "\n" " (. :help recovery).\n" -#: ../memline.c:3250 msgid " If you did this already, delete the swap file \"" msgstr " , " -#: ../memline.c:3252 msgid "" "\"\n" " to avoid this message.\n" @@ -4209,23 +3314,18 @@ msgstr "" " .\n" "\n" -#: ../memline.c:3450 ../memline.c:3452 msgid "Swap file \"" msgstr " " -#: ../memline.c:3451 ../memline.c:3455 msgid "\" already exists!" msgstr " !" -#: ../memline.c:3457 msgid "VIM - ATTENTION" msgstr "VIM " -#: ../memline.c:3459 msgid "Swap file already exists!" msgstr " !" -#: ../memline.c:3464 msgid "" "&Open Read-Only\n" "&Edit anyway\n" @@ -4239,7 +3339,6 @@ msgstr "" "&Q:\n" "&A:" -#: ../memline.c:3467 msgid "" "&Open Read-Only\n" "&Edit anyway\n" @@ -4263,56 +3362,46 @@ msgstr "" #. #. ".s?a" #. ".saa": tried enough, give up -#: ../memline.c:3528 msgid "E326: Too many swap files found" msgstr "E326: " # msgstr "E341: " -#: ../memory.c:227 #, c-format msgid "E342: Out of memory! (allocating %<PRIu64> bytes)" msgstr "E342: '! ( %<PRIu64> )" # msgstr "E326: " -#: ../menu.c:62 msgid "E327: Part of menu-item path is not sub-menu" msgstr "E327: " # msgstr "E327: " -#: ../menu.c:63 msgid "E328: Menu only exists in another mode" msgstr "E328: " # msgstr "E328: " -#: ../menu.c:64 #, c-format msgid "E329: No menu \"%s\"" msgstr "E329: %s" #. Only a mnemonic or accelerator is not valid. -#: ../menu.c:329 msgid "E792: Empty menu name" msgstr "E792: " # msgstr "E329: " -#: ../menu.c:340 msgid "E330: Menu path must not lead to a sub-menu" msgstr "E330: " # msgstr "E330: " -#: ../menu.c:365 msgid "E331: Must not add menu items directly to menu bar" msgstr "E331: " # msgstr "E331: " -#: ../menu.c:370 msgid "E332: Separator cannot be part of a menu path" msgstr "E332: " # msgstr "E332: " #. Now we have found the matching menu, and we list the mappings #. Highlight title -#: ../menu.c:762 msgid "" "\n" "--- Menus ---" @@ -4320,78 +3409,59 @@ msgstr "" "\n" "--- ---" -#: ../menu.c:1313 msgid "E333: Menu path must lead to a menu item" msgstr "E333: " # msgstr "E333: " -#: ../menu.c:1330 #, c-format msgid "E334: Menu not found: %s" msgstr "E334: : %s" # msgstr "E334: " -#: ../menu.c:1396 #, c-format msgid "E335: Menu not defined for %s mode" msgstr "E335: %s " # msgstr "E335: " -#: ../menu.c:1426 msgid "E336: Menu path must lead to a sub-menu" msgstr "E336: " # msgstr "E336: " -#: ../menu.c:1447 msgid "E337: Menu not found - check menu names" msgstr "E337: " # msgstr "E337: " -#: ../message.c:423 #, c-format msgid "Error detected while processing %s:" msgstr " %s:" -#: ../message.c:445 #, c-format msgid "line %4ld:" msgstr " %4ld:" -#: ../message.c:617 #, c-format msgid "E354: Invalid register name: '%s'" msgstr "E354: : '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr ": <sakhnik@gmail.com>" - -#: ../message.c:986 msgid "Interrupt: " msgstr ": " -#: ../message.c:988 msgid "Press ENTER or type command to continue" msgstr " ENTER " -#: ../message.c:1843 #, c-format msgid "%s line %<PRId64>" msgstr "%s %<PRId64>" -#: ../message.c:2392 msgid "-- More --" msgstr "-- --" -#: ../message.c:2398 msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit " msgstr " /d/j: //, b/u/k: , q: " -#: ../message.c:3021 ../message.c:3031 msgid "Question" msgstr "" -#: ../message.c:3023 msgid "" "&Yes\n" "&No" @@ -4399,7 +3469,6 @@ msgstr "" "&Y:\n" "&N:ͳ" -#: ../message.c:3033 msgid "" "&Yes\n" "&No\n" @@ -4409,7 +3478,6 @@ msgstr "" "&N:ͳ\n" "&C:" -#: ../message.c:3045 msgid "" "&Yes\n" "&No\n" @@ -4423,178 +3491,139 @@ msgstr "" "&D:\n" "&C:" -#: ../message.c:3058 msgid "E766: Insufficient arguments for printf()" msgstr "E766: printf()" -#: ../message.c:3119 msgid "E807: Expected Float argument for printf()" msgstr "E807: Float printf()" -#: ../message.c:3873 msgid "E767: Too many arguments to printf()" msgstr "E767: printf()" # msgstr "E338: " -#: ../misc1.c:2256 msgid "W10: Warning: Changing a readonly file" msgstr "W10: : " -#: ../misc1.c:2537 msgid "Type number and <Enter> or click with mouse (empty cancels): " msgstr " <Enter> ( ): " -#: ../misc1.c:2539 msgid "Type number and <Enter> (empty cancels): " msgstr " <Enter> ( ): " -#: ../misc1.c:2585 msgid "1 more line" msgstr " " -#: ../misc1.c:2588 msgid "1 line less" msgstr " " -#: ../misc1.c:2593 #, c-format msgid "%<PRId64> more lines" msgstr " : %<PRId64>" -#: ../misc1.c:2596 #, c-format msgid "%<PRId64> fewer lines" msgstr " : %<PRId64>" -#: ../misc1.c:2599 msgid " (Interrupted)" msgstr " ()" -#: ../misc1.c:2635 msgid "Beep!" msgstr "!" # msgstr "E342: " -#: ../misc2.c:738 #, c-format msgid "Calling shell to execute: \"%s\"" msgstr " : %s" # msgstr "E348: " -#: ../normal.c:183 msgid "E349: No identifier under cursor" msgstr "E349: " -#: ../normal.c:1866 msgid "E774: 'operatorfunc' is empty" msgstr "E774: 'operatorfunc' " -#: ../normal.c:2637 msgid "Warning: terminal cannot highlight" msgstr ": " -#: ../normal.c:2807 msgid "E348: No string under cursor" msgstr "E348: " -#: ../normal.c:3937 msgid "E352: Cannot erase folds with current 'foldmethod'" msgstr "E352: 'foldmethod'" -#: ../normal.c:5897 msgid "E664: changelist is empty" msgstr "E664: " -#: ../normal.c:5899 msgid "E662: At start of changelist" msgstr "E662: " -#: ../normal.c:5901 msgid "E663: At end of changelist" msgstr "E663: ʳ " -#: ../normal.c:7053 msgid "Type :quit<Enter> to exit Nvim" msgstr " :quit<Enter> Vim" -#: ../ops.c:248 #, c-format msgid "1 line %sed 1 time" msgstr " %s-" -#: ../ops.c:250 #, c-format msgid "1 line %sed %d times" msgstr " %s- %d " -#: ../ops.c:253 #, c-format msgid "%<PRId64> lines %sed 1 time" msgstr "%<PRId64> %s-" -#: ../ops.c:256 #, c-format msgid "%<PRId64> lines %sed %d times" msgstr "%<PRId64> %s- %d " -#: ../ops.c:592 #, c-format msgid "%<PRId64> lines to indent... " msgstr " %<PRId64> ..." -#: ../ops.c:634 msgid "1 line indented " msgstr " " -#: ../ops.c:636 #, c-format msgid "%<PRId64> lines indented " msgstr " : %<PRId64>" -#: ../ops.c:938 msgid "E748: No previously used register" msgstr "E748: " #. must display the prompt -#: ../ops.c:1433 msgid "cannot yank; delete anyway" msgstr " '; ?" -#: ../ops.c:1929 msgid "1 line changed" msgstr " " -#: ../ops.c:1931 #, c-format msgid "%<PRId64> lines changed" msgstr " : %<PRId64>" -#: ../ops.c:2521 msgid "block of 1 line yanked" msgstr "' " -#: ../ops.c:2523 msgid "1 line yanked" msgstr "' " -#: ../ops.c:2525 #, c-format msgid "block of %<PRId64> lines yanked" msgstr "' %<PRId64> " -#: ../ops.c:2528 #, c-format msgid "%<PRId64> lines yanked" msgstr "' : %<PRId64>" -#: ../ops.c:2710 #, c-format msgid "E353: Nothing in register %s" msgstr "E353: %s " # msgstr "E353: " #. Highlight title -#: ../ops.c:3185 msgid "" "\n" "--- Registers ---" @@ -4602,11 +3631,9 @@ msgstr "" "\n" "--- ---" -#: ../ops.c:4455 msgid "Illegal register name" msgstr " " -#: ../ops.c:4533 msgid "" "\n" "# Registers:\n" @@ -4614,17 +3641,14 @@ msgstr "" "\n" "# :\n" -#: ../ops.c:4575 #, c-format msgid "E574: Unknown register type %d" msgstr "E574: %d" -#: ../ops.c:5089 #, c-format msgid "%<PRId64> Cols; " msgstr ".: %<PRId64>; " -#: ../ops.c:5097 #, c-format msgid "" "Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; " @@ -4633,7 +3657,6 @@ msgstr "" " %s%<PRId64> %<PRId64> ; %<PRId64> %<PRId64> ; " "%<PRId64> %<PRId64> " -#: ../ops.c:5105 #, c-format msgid "" "Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; " @@ -4642,7 +3665,6 @@ msgstr "" " %s%<PRId64> %<PRId64> ; %<PRId64> %<PRId64> ; " "%<PRId64> of %<PRId64> ; %<PRId64> %<PRId64> " -#: ../ops.c:5123 #, c-format msgid "" "Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte " @@ -4651,7 +3673,6 @@ msgstr "" " %s %s; %<PRId64> %<PRId64>; %<PRId64> %<PRId64>; " " %<PRId64> %<PRId64>" -#: ../ops.c:5133 #, c-format msgid "" "Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char " @@ -4660,136 +3681,105 @@ msgstr "" " %s %s; %<PRId64> %<PRId64>; %<PRId64> %<PRId64>; " " %<PRId64> of %<PRId64>; %<PRId64> %<PRId64>" -#: ../ops.c:5146 #, c-format msgid "(+%<PRId64> for BOM)" msgstr "(+%<PRId64> BOM)" -#: ../option.c:1238 msgid "%<%f%h%m%=Page %N" msgstr "%<%f%h%m%=. %N" -#: ../option.c:1574 msgid "Thanks for flying Vim" msgstr " Vim" #. found a mismatch: skip -#: ../option.c:2698 msgid "E518: Unknown option" msgstr "E518: " -#: ../option.c:2709 msgid "E519: Option not supported" msgstr "E519: " -#: ../option.c:2740 msgid "E520: Not allowed in a modeline" msgstr "E520: modeline" -#: ../option.c:2815 msgid "E846: Key code not set" msgstr "E846: " -#: ../option.c:2924 msgid "E521: Number required after =" msgstr "E521: ϳ = " -#: ../option.c:3226 ../option.c:3864 msgid "E522: Not found in termcap" msgstr "E522: " -#: ../option.c:3335 #, c-format msgid "E539: Illegal character <%s>" msgstr "E539: <%s>" -#: ../option.c:3862 msgid "E529: Cannot set 'term' to empty string" msgstr "E529: 'term'" -#: ../option.c:3885 msgid "E589: 'backupext' and 'patchmode' are equal" msgstr "E589: 'backupext' 'patchmode' " -#: ../option.c:3964 msgid "E834: Conflicts with value of 'listchars'" msgstr "E834: 'listchars'" -#: ../option.c:3966 msgid "E835: Conflicts with value of 'fillchars'" msgstr "E835: 'fillchars'" -#: ../option.c:4163 msgid "E524: Missing colon" msgstr "E524: " -#: ../option.c:4165 msgid "E525: Zero length string" msgstr "E525: " -#: ../option.c:4220 #, c-format msgid "E526: Missing number after <%s>" msgstr "E526: ϳ <%s> " -#: ../option.c:4232 msgid "E527: Missing comma" msgstr "E527: " -#: ../option.c:4239 msgid "E528: Must specify a ' value" msgstr "E528: '" -#: ../option.c:4271 msgid "E595: contains unprintable or wide character" msgstr "E595: ̳ " -#: ../option.c:4469 #, c-format msgid "E535: Illegal character after <%c>" msgstr "E535: <%c>" -#: ../option.c:4534 msgid "E536: comma required" msgstr "E536: " -#: ../option.c:4543 #, c-format msgid "E537: 'commentstring' must be empty or contain %s" msgstr "E537: 'commentstring' %s" -#: ../option.c:4928 msgid "E540: Unclosed expression sequence" msgstr "E540: " -#: ../option.c:4932 msgid "E541: too many items" msgstr "E541: " -#: ../option.c:4934 msgid "E542: unbalanced groups" msgstr "E542: " -#: ../option.c:5148 msgid "E590: A preview window already exists" msgstr "E590: ³ " -#: ../option.c:5311 msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" msgstr "" "W17: UTF-8, ':set encoding=utf-8'" -#: ../option.c:5623 #, c-format msgid "E593: Need at least %d lines" msgstr "E593: %d " -#: ../option.c:5631 #, c-format msgid "E594: Need at least %d columns" msgstr "E594: %d " -#: ../option.c:6011 #, c-format msgid "E355: Unknown option: %s" msgstr "E355: : %s" @@ -4797,13 +3787,11 @@ msgstr "E355: : %s" #. There's another character after zeros or the string #. * is empty. In both cases, we are trying to set a #. * num option using a string. -#: ../option.c:6037 #, c-format msgid "E521: Number required: &%s = '%s'" msgstr "E521: Number: &%s = '%s'" # msgstr "E355: " -#: ../option.c:6149 msgid "" "\n" "--- Terminal codes ---" @@ -4811,7 +3799,6 @@ msgstr "" "\n" "--- ---" -#: ../option.c:6151 msgid "" "\n" "--- Global option values ---" @@ -4819,7 +3806,6 @@ msgstr "" "\n" "--- ---" -#: ../option.c:6153 msgid "" "\n" "--- Local option values ---" @@ -4827,7 +3813,6 @@ msgstr "" "\n" "--- ---" -#: ../option.c:6155 msgid "" "\n" "--- Options ---" @@ -4835,23 +3820,19 @@ msgstr "" "\n" "--- ---" -#: ../option.c:6816 msgid "E356: get_varp ERROR" msgstr "E356: get_varp" # msgstr "E356: " -#: ../option.c:7696 #, c-format msgid "E357: 'langmap': Matching character missing for %s" msgstr "E357: 'langmap': %s " # msgstr "E357: " -#: ../option.c:7715 #, c-format msgid "E358: 'langmap': Extra characters after semicolon: %s" msgstr "E358: 'langmap': `;': %s" -#: ../os/shell.c:194 msgid "" "\n" "Cannot execute shell " @@ -4860,7 +3841,6 @@ msgstr "" " " # msgstr "E362: " -#: ../os/shell.c:439 msgid "" "\n" "shell returned " @@ -4868,7 +3848,6 @@ msgstr "" "\n" " : " -#: ../os_unix.c:465 ../os_unix.c:471 msgid "" "\n" "Could not get security context for " @@ -4876,7 +3855,6 @@ msgstr "" "\n" " " -#: ../os_unix.c:479 msgid "" "\n" "Could not set security context for " @@ -4884,234 +3862,187 @@ msgstr "" "\n" " " -#: ../os_unix.c:1558 ../os_unix.c:1647 #, c-format msgid "dlerror = \"%s\"" msgstr "dlerror = %s" # msgstr "E446: " -#: ../path.c:1449 #, c-format msgid "E447: Can't find file \"%s\" in path" msgstr "E447: %s " # msgstr "E371: " -#: ../quickfix.c:359 #, c-format msgid "E372: Too many %%%c in format string" msgstr "E372: %%%c " # msgstr "E372: " -#: ../quickfix.c:371 #, c-format msgid "E373: Unexpected %%%c in format string" msgstr "E373: `%%%c' " # msgstr "E373: " -#: ../quickfix.c:420 msgid "E374: Missing ] in format string" msgstr "E374: ] " # msgstr "E374: " -#: ../quickfix.c:431 #, c-format msgid "E375: Unsupported %%%c in format string" msgstr "E375: %%%c " # msgstr "E375: " -#: ../quickfix.c:448 #, c-format msgid "E376: Invalid %%%c in format string prefix" msgstr "E376: `%%%c' " # msgstr "E376: " -#: ../quickfix.c:454 #, c-format msgid "E377: Invalid %%%c in format string" msgstr "E377: `%%%c' " # msgstr "E377: " #. nothing found -#: ../quickfix.c:477 msgid "E378: 'errorformat' contains no pattern" msgstr "E378: 'errorformat' " # msgstr "E378: " -#: ../quickfix.c:695 msgid "E379: Missing or empty directory name" msgstr "E379: " -#: ../quickfix.c:1305 msgid "E553: No more items" msgstr "E553: " -#: ../quickfix.c:1674 #, c-format msgid "(%d of %d)%s%s: " msgstr "(%d %d)%s%s: " -#: ../quickfix.c:1676 msgid " (line deleted)" msgstr " ( )" -#: ../quickfix.c:1863 msgid "E380: At bottom of quickfix stack" msgstr "E380: " -#: ../quickfix.c:1869 msgid "E381: At top of quickfix stack" msgstr "E381: " -#: ../quickfix.c:1880 #, c-format msgid "error list %d of %d; %d errors" msgstr " %d %d; %d " -#: ../quickfix.c:2427 msgid "E382: Cannot write, 'buftype' option is set" msgstr "E382: , 'buftype'" -#: ../quickfix.c:2812 msgid "E683: File name missing or invalid pattern" msgstr "E683: " -#: ../quickfix.c:2911 #, c-format msgid "Cannot open file \"%s\"" msgstr " %s" -#: ../quickfix.c:3429 msgid "E681: Buffer is not loaded" msgstr "E681: " -#: ../quickfix.c:3487 msgid "E777: String or List expected" msgstr "E777: String List" -#: ../regexp.c:359 #, c-format msgid "E369: invalid item in %s%%[]" msgstr "E369: %s%%[]" -#: ../regexp.c:374 #, c-format msgid "E769: Missing ] after %s[" msgstr "E769: ] %s[" -#: ../regexp.c:375 #, c-format msgid "E53: Unmatched %s%%(" msgstr "E53: %s%%(" -#: ../regexp.c:376 #, c-format msgid "E54: Unmatched %s(" msgstr "E54: %s(" -#: ../regexp.c:377 #, c-format msgid "E55: Unmatched %s)" msgstr "E55: %s)" # msgstr "E406: " -#: ../regexp.c:378 msgid "E66: \\z( not allowed here" msgstr "E66: \\z( " # msgstr "E406: " -#: ../regexp.c:379 msgid "E67: \\z1 et al. not allowed here" msgstr "E67: \\z1 . " -#: ../regexp.c:380 #, c-format msgid "E69: Missing ] after %s%%[" msgstr "E69: ] %s%%[" -#: ../regexp.c:381 #, c-format msgid "E70: Empty %s%%[]" msgstr "E70: %s%%[] " # msgstr "E382: " -#: ../regexp.c:1209 ../regexp.c:1224 msgid "E339: Pattern too long" msgstr "E339: " -#: ../regexp.c:1371 msgid "E50: Too many \\z(" msgstr "E50: \\z(" -#: ../regexp.c:1378 #, c-format msgid "E51: Too many %s(" msgstr "E51: %s(" -#: ../regexp.c:1427 msgid "E52: Unmatched \\z(" msgstr "E52: \\z(" -#: ../regexp.c:1637 #, c-format msgid "E59: invalid character after %s@" msgstr "E59: %s@" -#: ../regexp.c:1672 #, c-format msgid "E60: Too many complex %s{...}s" msgstr "E60: %s{...}" # msgstr "E339: " -#: ../regexp.c:1687 #, c-format msgid "E61: Nested %s*" msgstr "E61: %s*" # msgstr "E61: " -#: ../regexp.c:1690 #, c-format msgid "E62: Nested %s%c" msgstr "E62: %s%c" -#: ../regexp.c:1800 msgid "E63: invalid use of \\_" msgstr "E63: \\_" # msgstr "E62: " -#: ../regexp.c:1850 #, c-format msgid "E64: %s%c follows nothing" msgstr "E64: ϳ %s%c " -#: ../regexp.c:1902 msgid "E65: Illegal back reference" msgstr "E65: " -#: ../regexp.c:1943 msgid "E68: Invalid character after \\z" msgstr "E68: \\z" -#: ../regexp.c:2049 ../regexp_nfa.c:1296 #, c-format msgid "E678: Invalid character after %s%%[dxouU]" msgstr "E678: %s%%[dxouU]" -#: ../regexp.c:2107 #, c-format msgid "E71: Invalid character after %s%%" msgstr "E71: %s%%" # msgstr "E64: " -#: ../regexp.c:3017 #, c-format msgid "E554: Syntax error in %s{...}" msgstr "E554: %s{...}" -#: ../regexp.c:3805 msgid "External submatches:\n" msgstr " -:\n" -#: ../regexp.c:7022 msgid "" "E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " "used " @@ -5119,62 +4050,49 @@ msgstr "" "E864: \\%#= 0, 1, or 2. " " " -#: ../regexp_nfa.c:239 msgid "E865: (NFA) Regexp end encountered prematurely" msgstr "E865: (NFA) " -#: ../regexp_nfa.c:240 #, c-format msgid "E866: (NFA regexp) Misplaced %c" msgstr "E866: (NFA regexp) %c" -#: ../regexp_nfa.c:242 #, c-format msgid "E877: (NFA regexp) Invalid character class: %<PRId64>" -msgstr "" +msgstr "E877: (NFA regexp) : %<PRId64>" -#: ../regexp_nfa.c:1261 #, c-format msgid "E867: (NFA) Unknown operator '\\z%c'" msgstr "E867: (NFA) '\\z%c'" -#: ../regexp_nfa.c:1387 #, c-format msgid "E867: (NFA) Unknown operator '\\%%%c'" msgstr "E867: (NFA) '\\%%%c'" -#: ../regexp_nfa.c:1802 #, c-format msgid "E869: (NFA) Unknown operator '\\@%c'" msgstr "E869: (NFA) '\\@%c'" -#: ../regexp_nfa.c:1831 msgid "E870: (NFA regexp) Error reading repetition limits" msgstr "E870: (NFA regexp) " #. Can't have a multi follow a multi. -#: ../regexp_nfa.c:1895 msgid "E871: (NFA regexp) Can't have a multi follow a multi !" msgstr "E871: (NFA regexp) !" #. Too many `(' -#: ../regexp_nfa.c:2037 msgid "E872: (NFA regexp) Too many '('" msgstr "E872: (NFA regexp) '('" -#: ../regexp_nfa.c:2042 msgid "E879: (NFA regexp) Too many \\z(" msgstr "E879: (NFA regexp) \\z(" -#: ../regexp_nfa.c:2066 msgid "E873: (NFA regexp) proper termination error" msgstr "E873: (NFA regexp) " -#: ../regexp_nfa.c:2599 msgid "E874: (NFA) Could not pop the stack !" msgstr "E874: (NFA) !" -#: ../regexp_nfa.c:3298 msgid "" "E875: (NFA regexp) (While converting from postfix to NFA), too many states " "left on stack" @@ -5182,178 +4100,137 @@ msgstr "" "E875: (NFA regexp) (ϳ NFA) " " " -#: ../regexp_nfa.c:3302 msgid "E876: (NFA regexp) Not enough space to store the whole NFA " msgstr "E876: (NFA regexp) , NFA " -#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869 msgid "" "Could not open temporary log file for writing, displaying on stderr ... " msgstr "" " , " "stderr ... " -#: ../regexp_nfa.c:4840 #, c-format msgid "(NFA) COULD NOT OPEN %s !" msgstr "(NFA) ² %s!" -#: ../regexp_nfa.c:6049 msgid "Could not open temporary log file for writing " msgstr " " -#: ../screen.c:7435 msgid " VREPLACE" msgstr " ² ̲" -#: ../screen.c:7437 msgid " REPLACE" msgstr " ̲" -#: ../screen.c:7440 msgid " REVERSE" msgstr " в" -#: ../screen.c:7441 msgid " INSERT" msgstr " " -#: ../screen.c:7443 msgid " (insert)" msgstr " ()" -#: ../screen.c:7445 msgid " (replace)" msgstr " ()" -#: ../screen.c:7447 msgid " (vreplace)" msgstr " ( )" -#: ../screen.c:7449 msgid " Hebrew" msgstr " " -#: ../screen.c:7454 msgid " Arabic" msgstr " " -#: ../screen.c:7456 msgid " (lang)" msgstr " ()" -#: ../screen.c:7459 msgid " (paste)" msgstr " ()" -#: ../screen.c:7469 msgid " VISUAL" msgstr " " -#: ../screen.c:7470 msgid " VISUAL LINE" msgstr " ʲ" -#: ../screen.c:7471 msgid " VISUAL BLOCK" msgstr " " -#: ../screen.c:7472 msgid " SELECT" msgstr " IJ" -#: ../screen.c:7473 msgid " SELECT LINE" msgstr " IJ ʲ" -#: ../screen.c:7474 msgid " SELECT BLOCK" msgstr " IJ " -#: ../screen.c:7486 ../screen.c:7541 msgid "recording" msgstr " " -#: ../search.c:487 #, c-format msgid "E383: Invalid search string: %s" msgstr "E383: : %s" -#: ../search.c:832 #, c-format msgid "E384: search hit TOP without match for: %s" msgstr "E384: %s" -#: ../search.c:835 #, c-format msgid "E385: search hit BOTTOM without match for: %s" msgstr "E385: ʲ %s" -#: ../search.c:1200 msgid "E386: Expected '?' or '/' after ';'" msgstr "E386: ϳ `;' `?' `/'" # msgstr "E386: " -#: ../search.c:4085 msgid " (includes previously listed match)" msgstr " ( )" #. cursor at status line -#: ../search.c:4104 msgid "--- Included files " msgstr "--- " -#: ../search.c:4106 msgid "not found " msgstr " " -#: ../search.c:4107 msgid "in path ---\n" msgstr " ---\n" -#: ../search.c:4168 msgid " (Already listed)" msgstr " ( )" -#: ../search.c:4170 msgid " NOT FOUND" msgstr " " -#: ../search.c:4211 #, c-format msgid "Scanning included file: %s" msgstr " : %s" -#: ../search.c:4216 #, c-format msgid "Searching included file %s" msgstr " %s" -#: ../search.c:4405 msgid "E387: Match is on current line" msgstr "E387: " -#: ../search.c:4517 msgid "All included files were found" msgstr " " -#: ../search.c:4519 msgid "No included files" msgstr " " -#: ../search.c:4527 msgid "E388: Couldn't find definition" msgstr "E388: " -#: ../search.c:4529 msgid "E389: Couldn't find pattern" msgstr "E389: " -#: ../search.c:4668 msgid "Substitute " msgstr " " -#: ../search.c:4681 #, c-format msgid "" "\n" @@ -5364,100 +4241,79 @@ msgstr "" "# . %s :\n" "~" -#: ../spell.c:951 msgid "E759: Format error in spell file" msgstr "E759: " # msgstr "E364: " -#: ../spell.c:952 msgid "E758: Truncated spell file" msgstr "E758: " -#: ../spell.c:953 #, c-format msgid "Trailing text in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:954 #, c-format msgid "Affix name too long in %s line %d: %s" msgstr " %s %d: %s" # msgstr "E430: " -#: ../spell.c:955 msgid "E761: Format error in affix file FOL, LOW or UPP" msgstr "E761: FOL, LOW UPP" -#: ../spell.c:957 msgid "E762: Character in FOL, LOW or UPP is out of range" msgstr "E762: FOL, LOW UPP " -#: ../spell.c:958 msgid "Compressing word tree..." msgstr " ..." -#: ../spell.c:1951 msgid "E756: Spell checking is not enabled" msgstr "E756: " -#: ../spell.c:2249 #, c-format msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\"" msgstr "" ": %s.%s.spl %s.ascii.spl" -#: ../spell.c:2473 #, c-format msgid "Reading spell file \"%s\"" msgstr " %s" -#: ../spell.c:2496 msgid "E757: This does not look like a spell file" msgstr "E757: " -#: ../spell.c:2501 msgid "E771: Old spell file, needs to be updated" msgstr "E771: , " -#: ../spell.c:2504 msgid "E772: Spell file is for newer version of Vim" msgstr "E772: Vim" -#: ../spell.c:2602 msgid "E770: Unsupported section in spell file" msgstr "E770: " -#: ../spell.c:3762 #, c-format msgid "Warning: region %s not supported" msgstr ": %s " -#: ../spell.c:4550 #, c-format msgid "Reading affix file %s ..." msgstr " %s ..." -#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140 #, c-format msgid "Conversion failure for word in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:4630 ../spell.c:6170 #, c-format msgid "Conversion in %s not supported: from %s to %s" msgstr " %s : %s %s" -#: ../spell.c:4642 #, c-format msgid "Invalid value for FLAG in %s line %d: %s" msgstr " FLAG %s %d: %s" -#: ../spell.c:4655 #, c-format msgid "FLAG after using flags in %s line %d: %s" msgstr "FLAG %s %d: %s" -#: ../spell.c:4723 #, c-format msgid "" "Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line " @@ -5466,7 +4322,6 @@ msgstr "" " COMPOUNDFORBIDFLAG PFX " " %s %d" -#: ../spell.c:4731 #, c-format msgid "" "Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line " @@ -5475,43 +4330,35 @@ msgstr "" " COMPOUNDPERMITFLAG PFX " " %s %d" -#: ../spell.c:4747 #, c-format msgid "Wrong COMPOUNDRULES value in %s line %d: %s" msgstr " COMPOUNDRULES %s %d: %s" -#: ../spell.c:4771 #, c-format msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s" msgstr " COMPOUNDWORDMAX %s %d: %s" -#: ../spell.c:4777 #, c-format msgid "Wrong COMPOUNDMIN value in %s line %d: %s" msgstr " COMPOUNDMIN %s %d: %s" -#: ../spell.c:4783 #, c-format msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s" msgstr " COMPOUNDSYLMAX %s %d: %s" -#: ../spell.c:4795 #, c-format msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s" msgstr " CHECKCOMPOUNDPATTERN %s %d: %s" -#: ../spell.c:4847 #, c-format msgid "Different combining flag in continued affix block in %s line %d: %s" msgstr "" " %s %d: %s" -#: ../spell.c:4850 #, c-format msgid "Duplicate affix in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:4871 #, c-format msgid "" "Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s " @@ -5520,337 +4367,268 @@ msgstr "" " BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/" "NOSUGGEST %s %d: %s" -#: ../spell.c:4893 #, c-format msgid "Expected Y or N in %s line %d: %s" msgstr " Y N %s %d: %s" -#: ../spell.c:4968 #, c-format msgid "Broken condition in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:5091 #, c-format msgid "Expected REP(SAL) count in %s line %d" msgstr " REP(SAL) %s %d" -#: ../spell.c:5120 #, c-format msgid "Expected MAP count in %s line %d" msgstr " MAP %s %d" -#: ../spell.c:5132 #, c-format msgid "Duplicate character in MAP in %s line %d" msgstr " MAP %s %d" -#: ../spell.c:5176 #, c-format msgid "Unrecognized or duplicate item in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:5197 #, c-format msgid "Missing FOL/LOW/UPP line in %s" msgstr " FOL/LOW/UPP %s" -#: ../spell.c:5220 msgid "COMPOUNDSYLMAX used without SYLLABLE" msgstr " COMPOUNDSYLMAX SYLLABLE" -#: ../spell.c:5236 msgid "Too many postponed prefixes" msgstr " " -#: ../spell.c:5238 msgid "Too many compound flags" msgstr " " -#: ../spell.c:5240 msgid "Too many postponed prefixes and/or compound flags" msgstr " / " -#: ../spell.c:5250 #, c-format msgid "Missing SOFO%s line in %s" msgstr " SOFO%s %s" -#: ../spell.c:5253 #, c-format msgid "Both SAL and SOFO lines in %s" msgstr " SAL SOFO %s" -#: ../spell.c:5331 #, c-format msgid "Flag is not a number in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:5334 #, c-format msgid "Illegal flag in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:5493 ../spell.c:5501 #, c-format msgid "%s value differs from what is used in another .aff file" msgstr " %s , .aff" -#: ../spell.c:5602 #, c-format msgid "Reading dictionary file %s ..." msgstr " %s ..." -#: ../spell.c:5611 #, c-format msgid "E760: No word count in %s" msgstr "E760: %s" -#: ../spell.c:5669 #, c-format msgid "line %6d, word %6d - %s" msgstr " %6d, %6d - %s" -#: ../spell.c:5691 #, c-format msgid "Duplicate word in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:5694 #, c-format msgid "First duplicate word in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:5746 #, c-format msgid "%d duplicate word(s) in %s" msgstr "%d %s" -#: ../spell.c:5748 #, c-format msgid "Ignored %d word(s) with non-ASCII characters in %s" msgstr " %d (~) -ASCII %s" -#: ../spell.c:6115 #, c-format msgid "Reading word file %s ..." msgstr " %s ..." -#: ../spell.c:6155 #, c-format msgid "Duplicate /encoding= line ignored in %s line %d: %s" msgstr " /encoding= %s %d: %s" -#: ../spell.c:6159 #, c-format msgid "/encoding= line after word ignored in %s line %d: %s" msgstr " /encoding= %s %d: %s" -#: ../spell.c:6180 #, c-format msgid "Duplicate /regions= line ignored in %s line %d: %s" msgstr " /regions= %s %d: %s" -#: ../spell.c:6185 #, c-format msgid "Too many regions in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:6198 #, c-format msgid "/ line ignored in %s line %d: %s" msgstr " / %s %d: %s" -#: ../spell.c:6224 #, c-format msgid "Invalid region nr in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:6230 #, c-format msgid "Unrecognized flags in %s line %d: %s" msgstr " %s %d: %s" -#: ../spell.c:6257 #, c-format msgid "Ignored %d words with non-ASCII characters" msgstr " %d -ASCII " -#: ../spell.c:6656 #, c-format msgid "Compressed %d of %d nodes; %d (%d%%) remaining" msgstr " %d %d ; %d (%d%%)" -#: ../spell.c:7340 msgid "Reading back spell file..." msgstr " ..." #. Go through the trie of good words, soundfold each word and add it to #. the soundfold trie. -#: ../spell.c:7357 msgid "Performing soundfolding..." msgstr " ..." -#: ../spell.c:7368 #, c-format msgid "Number of words after soundfolding: %<PRId64>" msgstr "ʳ : %<PRId64>" -#: ../spell.c:7476 #, c-format msgid "Total number of words: %d" msgstr " : %d" -#: ../spell.c:7655 #, c-format msgid "Writing suggestion file %s ..." msgstr " %s ..." -#: ../spell.c:7707 ../spell.c:7927 #, c-format msgid "Estimated runtime memory use: %d bytes" msgstr " ': %d " -#: ../spell.c:7820 msgid "E751: Output file name must not have region name" msgstr "E751: " -#: ../spell.c:7822 msgid "E754: Only up to 8 regions supported" msgstr "E754: ϳ " -#: ../spell.c:7846 #, c-format msgid "E755: Invalid region in %s" msgstr "E755: %s" -#: ../spell.c:7907 msgid "Warning: both compounding and NOBREAK specified" msgstr ": ` ' NOBREAK" -#: ../spell.c:7920 #, c-format msgid "Writing spell file %s ..." msgstr " %s ..." -#: ../spell.c:7925 msgid "Done!" msgstr "!" -#: ../spell.c:8034 #, c-format msgid "E765: 'spellfile' does not have %<PRId64> entries" msgstr "E765: 'spellfile' %<PRId64> " -#: ../spell.c:8074 #, c-format msgid "Word '%.*s' removed from %s" msgstr " '%.*s' %s" -#: ../spell.c:8117 #, c-format msgid "Word '%.*s' added to %s" msgstr " '%.*s' %s" -#: ../spell.c:8381 msgid "E763: Word characters differ between spell files" msgstr "E763: " -#: ../spell.c:8684 msgid "Sorry, no suggestions" msgstr ", " -#: ../spell.c:8687 #, c-format msgid "Sorry, only %<PRId64> suggestions" msgstr ", %<PRId64> " #. for when 'cmdheight' > 1 #. avoid more prompt -#: ../spell.c:8704 #, c-format msgid "Change \"%.*s\" to:" msgstr " %.*s :" -#: ../spell.c:8737 #, c-format msgid " < \"%.*s\"" msgstr " < %.*s" # msgstr "E34: " -#: ../spell.c:8882 msgid "E752: No previous spell replacement" msgstr "E752: " # msgstr "E333: " -#: ../spell.c:8925 #, c-format msgid "E753: Not found: %s" msgstr "E753: : %s" -#: ../spell.c:9276 #, c-format msgid "E778: This does not look like a .sug file: %s" msgstr "E778: .sug: %s" -#: ../spell.c:9282 #, c-format msgid "E779: Old .sug file, needs to be updated: %s" msgstr "E779: .sug, : %s" -#: ../spell.c:9286 #, c-format msgid "E780: .sug file is for newer version of Vim: %s" msgstr "E780: .sug Vim: %s" -#: ../spell.c:9295 #, c-format msgid "E781: .sug file doesn't match .spl file: %s" msgstr "E781: .sug .spl: %s" -#: ../spell.c:9305 #, c-format msgid "E782: error while reading .sug file: %s" msgstr "E782: .sug: %s" #. This should have been checked when generating the .spl #. file. -#: ../spell.c:11575 msgid "E783: duplicate char in MAP entry" msgstr "E783: MAP" # msgstr "E391: " -#: ../syntax.c:266 msgid "No Syntax items defined for this buffer" msgstr " " -#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127 #, c-format msgid "E390: Illegal argument: %s" msgstr "E390: : %s" -#: ../syntax.c:3299 #, c-format msgid "E391: No such syntax cluster: %s" msgstr "E391: : %s" -#: ../syntax.c:3433 msgid "syncing on C-style comments" msgstr " " -#: ../syntax.c:3439 msgid "no syncing" msgstr " " -#: ../syntax.c:3441 msgid "syncing starts " msgstr " " -#: ../syntax.c:3443 ../syntax.c:3506 msgid " lines before top line" msgstr " " -#: ../syntax.c:3448 msgid "" "\n" "--- Syntax sync items ---" @@ -5858,7 +4636,6 @@ msgstr "" "\n" "--- ---" -#: ../syntax.c:3452 msgid "" "\n" "syncing on items" @@ -5866,7 +4643,6 @@ msgstr "" "\n" " " -#: ../syntax.c:3457 msgid "" "\n" "--- Syntax items ---" @@ -5874,300 +4650,241 @@ msgstr "" "\n" "--- ---" -#: ../syntax.c:3475 #, c-format msgid "E392: No such syntax cluster: %s" msgstr "E392: : %s" -#: ../syntax.c:3497 msgid "minimal " msgstr " " -#: ../syntax.c:3503 msgid "maximal " msgstr " " -#: ../syntax.c:3513 msgid "; match " msgstr "; " -#: ../syntax.c:3515 msgid " line breaks" msgstr " " -#: ../syntax.c:4076 msgid "E395: contains argument not accepted here" msgstr "E395: ̳ " # msgstr "E14: " -#: ../syntax.c:4096 msgid "E844: invalid cchar value" msgstr "E844: cchar" -#: ../syntax.c:4107 msgid "E393: group[t]here not accepted here" msgstr "E393: group[t]hete " -#: ../syntax.c:4126 #, c-format msgid "E394: Didn't find region item for %s" msgstr "E394: %s" # msgstr "E396: " -#: ../syntax.c:4188 msgid "E397: Filename required" msgstr "E397: " -#: ../syntax.c:4221 msgid "E847: Too many syntax includes" msgstr "E847: " -#: ../syntax.c:4303 #, c-format msgid "E789: Missing ']': %s" msgstr "E789: ']': %s" -#: ../syntax.c:4531 #, c-format msgid "E398: Missing '=': %s" msgstr "E398: `=': %s" # --------------------------------------- -#: ../syntax.c:4666 #, c-format msgid "E399: Not enough arguments: syntax region %s" msgstr "E399: : %s" -#: ../syntax.c:4870 msgid "E848: Too many syntax clusters" msgstr "E848: " -#: ../syntax.c:4954 msgid "E400: No cluster specified" msgstr "E400: " #. end delimiter not found -#: ../syntax.c:4986 #, c-format msgid "E401: Pattern delimiter not found: %s" msgstr "E401: ʳ : %s" -#: ../syntax.c:5049 #, c-format msgid "E402: Garbage after pattern: %s" msgstr "E402: : %s" # msgstr "E402: " -#: ../syntax.c:5120 msgid "E403: syntax sync: line continuations pattern specified twice" msgstr "" "E403: : " -#: ../syntax.c:5169 #, c-format msgid "E404: Illegal arguments: %s" msgstr "E404: : %s" # msgstr "E404: " -#: ../syntax.c:5217 #, c-format msgid "E405: Missing equal sign: %s" msgstr "E405: : %s" # msgstr "E405: " -#: ../syntax.c:5222 #, c-format msgid "E406: Empty argument: %s" msgstr "E406: : %s" # msgstr "E406: " -#: ../syntax.c:5240 #, c-format msgid "E407: %s not allowed here" msgstr "E407: %s " -#: ../syntax.c:5246 #, c-format msgid "E408: %s must be first in contains list" msgstr "E408: %s contains" -#: ../syntax.c:5304 #, c-format msgid "E409: Unknown group name: %s" msgstr "E409: : %s" # msgstr "E409: " -#: ../syntax.c:5512 #, c-format msgid "E410: Invalid :syntax subcommand: %s" msgstr "E410: :syntax: %s" -#: ../syntax.c:5854 msgid "" " TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN" msgstr "" " - ϲ. ². . " -#: ../syntax.c:6146 msgid "E679: recursive loop loading syncolor.vim" msgstr "E679: syncolor.vim" # msgstr "E410: " -#: ../syntax.c:6256 #, c-format msgid "E411: highlight group not found: %s" msgstr "E411: : %s" # msgstr "E411: " -#: ../syntax.c:6278 #, c-format msgid "E412: Not enough arguments: \":highlight link %s\"" msgstr "E412: : :highlight link %s" # msgstr "E412: " -#: ../syntax.c:6284 #, c-format msgid "E413: Too many arguments: \":highlight link %s\"" msgstr "E413: : :highlight link %s" # msgstr "E413: " -#: ../syntax.c:6302 msgid "E414: group has settings, highlight link ignored" msgstr "E414: settings, highlight link " # msgstr "E414: " -#: ../syntax.c:6367 #, c-format msgid "E415: unexpected equal sign: %s" msgstr "E415: : %s" # msgstr "E415: " -#: ../syntax.c:6395 #, c-format msgid "E416: missing equal sign: %s" msgstr "E416: : %s" -#: ../syntax.c:6418 #, c-format msgid "E417: missing argument: %s" msgstr "E417: : %s" -#: ../syntax.c:6446 #, c-format msgid "E418: Illegal value: %s" msgstr "E418: : %s" # msgstr "E418: " -#: ../syntax.c:6496 msgid "E419: FG color unknown" msgstr "E419: " # msgstr "E419: " -#: ../syntax.c:6504 msgid "E420: BG color unknown" msgstr "E420: " # msgstr "E420: " -#: ../syntax.c:6564 #, c-format msgid "E421: Color name or number not recognized: %s" msgstr "E421: : %s" # msgstr "E421: " -#: ../syntax.c:6714 #, c-format msgid "E422: terminal code too long: %s" msgstr "E422: : %s" # msgstr "E422: " -#: ../syntax.c:6753 #, c-format msgid "E423: Illegal argument: %s" msgstr "E423: : %s" # msgstr "E423: " -#: ../syntax.c:6925 msgid "E424: Too many different highlighting attributes in use" msgstr "E424: " -#: ../syntax.c:7427 msgid "E669: Unprintable character in group name" msgstr "E669: " # msgstr "E181: " -#: ../syntax.c:7434 msgid "W18: Invalid character in group name" msgstr "W18: " -#: ../syntax.c:7448 msgid "E849: Too many highlight and syntax groups" msgstr "E849: " # msgstr "E424: " -#: ../tag.c:104 msgid "E555: at bottom of tag stack" msgstr "E555: ʳ 崳" -#: ../tag.c:105 msgid "E556: at top of tag stack" msgstr "E556: 崳" -#: ../tag.c:380 msgid "E425: Cannot go before first matching tag" msgstr "E425: " # msgstr "E425: " -#: ../tag.c:504 #, c-format msgid "E426: tag not found: %s" msgstr "E426: : %s" # msgstr "E426: " -#: ../tag.c:528 msgid " # pri kind tag" msgstr " # " -#: ../tag.c:531 msgid "file\n" msgstr "\n" -#: ../tag.c:829 msgid "E427: There is only one matching tag" msgstr "E427: " # msgstr "E427: " -#: ../tag.c:831 msgid "E428: Cannot go beyond last matching tag" msgstr "E428: " # msgstr "E428: " -#: ../tag.c:850 #, c-format msgid "File \"%s\" does not exist" msgstr " %s " #. Give an indication of the number of matching tags -#: ../tag.c:859 #, c-format msgid "tag %d of %d%s" msgstr " %d %d%s" -#: ../tag.c:862 msgid " or more" msgstr " " -#: ../tag.c:864 msgid " Using tag with different case!" msgstr " , " -#: ../tag.c:909 #, c-format msgid "E429: File \"%s\" does not exist" msgstr "E429: %s " # msgstr "E429: " #. Highlight title -#: ../tag.c:960 msgid "" "\n" " # TO tag FROM line in file/text" @@ -6175,85 +4892,68 @@ msgstr "" "\n" " # /" -#: ../tag.c:1303 #, c-format msgid "Searching tags file %s" msgstr " 崳 %s" -#: ../tag.c:1545 msgid "Ignoring long line in tags file" msgstr " " # msgstr "E430: " -#: ../tag.c:1915 #, c-format msgid "E431: Format error in tags file \"%s\"" msgstr "E431: 崳 %s" # msgstr "E431: " -#: ../tag.c:1917 #, c-format msgid "Before byte %<PRId64>" msgstr " %<PRId64>" -#: ../tag.c:1929 #, c-format msgid "E432: Tags file not sorted: %s" msgstr "E432: 崳 : %s" # msgstr "E432: " #. never opened any tags file -#: ../tag.c:1960 msgid "E433: No tags file" msgstr "E433: 崳" # msgstr "E433: " -#: ../tag.c:2536 msgid "E434: Can't find tag pattern" msgstr "E434: " # msgstr "E434: " -#: ../tag.c:2544 msgid "E435: Couldn't find tag, just guessing!" msgstr "E435: , !" -#: ../tag.c:2797 #, c-format msgid "Duplicate field name: %s" msgstr " : %s" # msgstr "E435: " -#: ../term.c:1442 msgid "' not known. Available builtin terminals are:" msgstr "' . :" -#: ../term.c:1463 msgid "defaulting to '" msgstr " '" -#: ../term.c:1731 msgid "E557: Cannot open termcap file" msgstr "E557: " -#: ../term.c:1735 msgid "E558: Terminal entry not found in terminfo" msgstr "E558: " -#: ../term.c:1737 msgid "E559: Terminal entry not found in termcap" msgstr "E559: " -#: ../term.c:1878 #, c-format msgid "E436: No \"%s\" entry in termcap" msgstr "E436: %s " -#: ../term.c:2249 msgid "E437: terminal capability \"cm\" required" msgstr "E437: cm" #. Highlight title -#: ../term.c:4376 msgid "" "\n" "--- Terminal keys ---" @@ -6261,174 +4961,136 @@ msgstr "" "\n" "--- ---" -#: ../ui.c:481 msgid "Vim: Error reading input, exiting...\n" msgstr "Vim: , ...\n" #. This happens when the FileChangedRO autocommand changes the #. * file in a way it becomes shorter. -#: ../undo.c:379 -#, fuzzy msgid "E881: Line count changed unexpectedly" -msgstr "E834: ʳ " +msgstr "E881: ʳ " -#: ../undo.c:627 #, c-format msgid "E828: Cannot open undo file for writing: %s" msgstr "E828: : %s" -#: ../undo.c:717 #, c-format msgid "E825: Corrupted undo file (%s): %s" msgstr "E825: (%s): %s" -#: ../undo.c:1039 msgid "Cannot write undo file in any directory in 'undodir'" msgstr " 'undodir'" -#: ../undo.c:1074 #, c-format msgid "Will not overwrite with undo file, cannot read: %s" msgstr "Will not overwrite with undo file, cannot read: %s" -#: ../undo.c:1092 #, c-format msgid "Will not overwrite, this is not an undo file: %s" msgstr " , : %s" -#: ../undo.c:1108 msgid "Skipping undo file write, nothing to undo" msgstr " , " -#: ../undo.c:1121 #, c-format msgid "Writing undo file: %s" msgstr " : %s" -#: ../undo.c:1213 #, c-format msgid "E829: write error in undo file: %s" msgstr "E829: : %s" -#: ../undo.c:1280 #, c-format msgid "Not reading undo file, owner differs: %s" msgstr " , : %s" -#: ../undo.c:1292 #, c-format msgid "Reading undo file: %s" msgstr " : %s" -#: ../undo.c:1299 #, c-format msgid "E822: Cannot open undo file for reading: %s" msgstr "E822: : %s" # msgstr "E333: " -#: ../undo.c:1308 #, c-format msgid "E823: Not an undo file: %s" msgstr "E823: : %s" -#: ../undo.c:1313 #, c-format msgid "E824: Incompatible undo file: %s" msgstr "E824: : %s" -#: ../undo.c:1328 msgid "File contents changed, cannot use undo info" msgstr " , " -#: ../undo.c:1497 #, c-format msgid "Finished reading undo file %s" msgstr " %s" -#: ../undo.c:1586 ../undo.c:1812 msgid "Already at oldest change" msgstr " " -#: ../undo.c:1597 ../undo.c:1814 msgid "Already at newest change" msgstr " " -#: ../undo.c:1806 #, c-format msgid "E830: Undo number %<PRId64> not found" msgstr "E830: %<PRId64> " -#: ../undo.c:1979 msgid "E438: u_undo: line numbers wrong" msgstr "E438: u_undo: " -#: ../undo.c:2183 msgid "more line" msgstr " " -#: ../undo.c:2185 msgid "more lines" msgstr " " -#: ../undo.c:2187 msgid "line less" msgstr " " -#: ../undo.c:2189 msgid "fewer lines" msgstr " " # msgstr "E438: " -#: ../undo.c:2193 msgid "change" msgstr "" # msgstr "E438: " -#: ../undo.c:2195 msgid "changes" msgstr "" -#: ../undo.c:2225 #, c-format msgid "%<PRId64> %s; %s #%<PRId64> %s" msgstr "%<PRId64> %s; %s #%<PRId64> %s" -#: ../undo.c:2228 msgid "before" msgstr "" -#: ../undo.c:2228 msgid "after" msgstr "" -#: ../undo.c:2325 msgid "Nothing to undo" msgstr " " -#: ../undo.c:2330 msgid "number changes when saved" msgstr " " -#: ../undo.c:2360 #, c-format msgid "%<PRId64> seconds ago" msgstr "%<PRId64> " # msgstr "E406: " -#: ../undo.c:2372 msgid "E790: undojoin is not allowed after undo" msgstr "E790: undojoin undo" -#: ../undo.c:2466 msgid "E439: undo list corrupt" msgstr "E439: " # msgstr "E439: " -#: ../undo.c:2495 msgid "E440: undo line missing" msgstr "E440: ³ " -#: ../version.c:600 msgid "" "\n" "Included patches: " @@ -6436,7 +5098,6 @@ msgstr "" "\n" " : " -#: ../version.c:627 msgid "" "\n" "Extra patches: " @@ -6444,11 +5105,9 @@ msgstr "" "\n" " : " -#: ../version.c:639 ../version.c:864 msgid "Modified by " msgstr " " -#: ../version.c:646 msgid "" "\n" "Compiled " @@ -6456,11 +5115,9 @@ msgstr "" "\n" " " -#: ../version.c:649 msgid "by " msgstr " " -#: ../version.c:660 msgid "" "\n" "Huge version " @@ -6468,1921 +5125,126 @@ msgstr "" "\n" "ó " -#: ../version.c:661 msgid "without GUI." msgstr " GUI." -#: ../version.c:662 msgid " Features included (+) or not (-):\n" msgstr " (+) (-) :\n" -#: ../version.c:667 msgid " system vimrc file: \"" msgstr " vimrc: \"" -#: ../version.c:672 msgid " user vimrc file: \"" msgstr " vimrc : \"" -#: ../version.c:677 msgid " 2nd user vimrc file: \"" msgstr " vimrc : \"" -#: ../version.c:682 msgid " 3rd user vimrc file: \"" msgstr " vimrc : \"" -#: ../version.c:687 msgid " user exrc file: \"" msgstr " exrc : \"" -#: ../version.c:692 msgid " 2nd user exrc file: \"" msgstr " exrc : \"" -#: ../version.c:699 msgid " fall-back for $VIM: \"" msgstr " $VIM: \"" -#: ../version.c:705 msgid " f-b for $VIMRUNTIME: \"" msgstr " $VIMRUNTIME: \"" -#: ../version.c:709 msgid "Compilation: " msgstr ": " -#: ../version.c:712 msgid "Linking: " msgstr ": " -#: ../version.c:717 msgid " DEBUG BUILD" msgstr " Ѳ " -#: ../version.c:767 msgid "VIM - Vi IMproved" msgstr "VIM - Vi" -#: ../version.c:769 msgid "version " msgstr " " -#: ../version.c:770 msgid "by Bram Moolenaar et al." msgstr ": Bram Moolenaar ." -#: ../version.c:774 msgid "Vim is open source and freely distributable" msgstr "Vim " -#: ../version.c:776 msgid "Help poor children in Uganda!" msgstr " !" -#: ../version.c:777 msgid "type :help iccf<Enter> for information " msgstr ":help iccf<Enter> " -#: ../version.c:779 msgid "type :q<Enter> to exit " msgstr ":q<Enter> Vim " -#: ../version.c:780 msgid "type :help<Enter> or <F1> for on-line help" msgstr ":help<Enter> <F1> " -#: ../version.c:781 msgid "type :help version7<Enter> for version info" msgstr ":help version7<Enter> " -#: ../version.c:784 msgid "Running in Vi compatible mode" msgstr " Vi" -#: ../version.c:785 msgid "type :set nocp<Enter> for Vim defaults" msgstr ":set nocp<Enter> Vi " -#: ../version.c:786 msgid "type :help cp-default<Enter> for info on this" msgstr ":help cp-default<Enter> " -#: ../version.c:827 msgid "Sponsor Vim development!" msgstr "ϳ Vim!" -#: ../version.c:828 msgid "Become a registered Vim user!" msgstr " Vim!" -#: ../version.c:831 msgid "type :help sponsor<Enter> for information " msgstr ":help sponsor<Enter> " -#: ../version.c:832 msgid "type :help register<Enter> for information " msgstr ":help register<Enter> " -#: ../version.c:834 msgid "menu Help->Sponsor/Register for information " msgstr " ->/ " # msgstr "E444: " -#: ../window.c:119 msgid "Already only one window" msgstr " " -#: ../window.c:224 msgid "E441: There is no preview window" msgstr "E441: " # msgstr "E441: " -#: ../window.c:559 msgid "E442: Can't split topleft and botright at the same time" msgstr "E442: topleft botright" # msgstr "E442: " -#: ../window.c:1228 msgid "E443: Cannot rotate when another window is split" msgstr "E443: , " # msgstr "E443: " -#: ../window.c:1803 msgid "E444: Cannot close last window" msgstr "E444: " # msgstr "E443: " -#: ../window.c:1810 msgid "E813: Cannot close autocmd window" msgstr "E813: autocmd" # msgstr "E443: " -#: ../window.c:1814 msgid "E814: Cannot close window, only autocmd window would remain" msgstr "E814: , autocmd" -#: ../window.c:2717 msgid "E445: Other window contains changes" msgstr "E445: " # msgstr "E445: " -#: ../window.c:4805 msgid "E446: No file name under cursor" msgstr "E446: " - -#~ msgid "E831: bf_key_init() called with empty password" -#~ msgstr "E831: bf_key_init() " - -#~ msgid "E820: sizeof(uint32_t) != 4" -#~ msgstr "E820: sizeof(uint32_t) != 4" - -#~ msgid "E817: Blowfish big/little endian use wrong" -#~ msgstr "E817: Blowfish (BE/LE)" - -#~ msgid "E818: sha256 test failed" -#~ msgstr "E818: sha256" - -#~ msgid "E819: Blowfish test failed" -#~ msgstr "E819: Blowfish" - -#~ msgid "Patch file" -#~ msgstr "" - -#~ msgid "" -#~ "&OK\n" -#~ "&Cancel" -#~ msgstr "" -#~ "&O:\n" -#~ "&C:" - -#~ msgid "E240: No connection to Vim server" -#~ msgstr "E240: ' Vim" - -#~ msgid "E241: Unable to send to %s" -#~ msgstr "E241: %s" - -#~ msgid "E277: Unable to read a server reply" -#~ msgstr "E277: " - -#~ msgid "E258: Unable to send to client" -#~ msgstr "E258: 볺" - -#~ msgid "Save As" -#~ msgstr " " - -#~ msgid "Source Vim script" -#~ msgstr " Vim" - -#~ msgid "Edit File" -#~ msgstr " " - -#~ msgid " (NOT FOUND)" -#~ msgstr " ( )" - -#~ msgid "unknown" -#~ msgstr "" - -# msgstr "E185: " -#~ msgid "Edit File in new window" -#~ msgstr " " - -#~ msgid "Append File" -#~ msgstr " " - -# msgstr "E187: " -#~ msgid "Window position: X %d, Y %d" -#~ msgstr " : X %d, Y %d" - -# msgstr "E188: " -#~ msgid "Save Redirection" -#~ msgstr " " - -#~ msgid "Save View" -#~ msgstr " " - -#~ msgid "Save Session" -#~ msgstr " " - -#~ msgid "Save Setup" -#~ msgstr " " - -#~ msgid "E809: #< is not available without the +eval feature" -#~ msgstr "E809: #< +eval" - -#~ msgid "E196: No digraphs in this version" -#~ msgstr "E196: " - -#~ msgid "is a device (disabled with 'opendevice' option)" -#~ msgstr " ( 'opendevice')" - -#~ msgid "Reading from stdin..." -#~ msgstr " stdin..." - -#~ msgid "[blowfish]" -#~ msgstr "[blowfish]" - -#~ msgid "[crypted]" -#~ msgstr "[]" - -#~ msgid "E821: File is encrypted with unknown method" -#~ msgstr "E821: " - -#~ msgid "NetBeans disallows writes of unmodified buffers" -#~ msgstr "NetBeans " - -# msgstr "E391: " -#~ msgid "Partial writes disallowed for NetBeans buffers" -#~ msgstr " NetBeans" - -#~ msgid "writing to device disabled with 'opendevice' option" -#~ msgstr " 'opendevice'" - -#~ msgid "E460: The resource fork would be lost (add ! to override)" -#~ msgstr "E460: ó (! )" - -#~ msgid "<cannot open> " -#~ msgstr "< > " - -#~ msgid "E616: vim_SelFile: can't get font %s" -#~ msgstr "E616: vim_SelFile: %s" - -#~ msgid "E614: vim_SelFile: can't return to current directory" -#~ msgstr "E614: vim_SelFile: " - -#~ msgid "Pathname:" -#~ msgstr ":" - -#~ msgid "E615: vim_SelFile: can't get current directory" -#~ msgstr "E615: vim_SelFile: " - -#~ msgid "OK" -#~ msgstr "" - -#~ msgid "Cancel" -#~ msgstr "" - -#~ msgid "Vim dialog" -#~ msgstr "ij Vim" - -#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap." -#~ msgstr "Scrollbar Widget: ." - -#~ msgid "E232: Cannot create BalloonEval with both message and callback" -#~ msgstr "E232: BalloonEval " - -#~ msgid "E851: Failed to create a new process for the GUI" -#~ msgstr "E851: GUI" - -#~ msgid "E852: The child process failed to start the GUI" -#~ msgstr "E852: GUI" - -# msgstr "E228: " -#~ msgid "E229: Cannot start the GUI" -#~ msgstr "E229: GUI" - -# msgstr "E229: " -#~ msgid "E230: Cannot read from \"%s\"" -#~ msgstr "E230: %s" - -#~ msgid "E665: Cannot start GUI, no valid font found" -#~ msgstr "E665: GUI, " - -# msgstr "E230: " -#~ msgid "E231: 'guifontwide' invalid" -#~ msgstr "E231: 'guifontwide'" - -#~ msgid "E599: Value of 'imactivatekey' is invalid" -#~ msgstr "E599: 'imactivatekey' " - -#~ msgid "E254: Cannot allocate color %s" -#~ msgstr "E254: %s" - -#~ msgid "No match at cursor, finding next" -#~ msgstr " , " - -#~ msgid "Input _Methods" -#~ msgstr " " - -#~ msgid "VIM - Search and Replace..." -#~ msgstr "VIM - ..." - -#~ msgid "VIM - Search..." -#~ msgstr "VIM - ..." - -#~ msgid "Find what:" -#~ msgstr ":" - -#~ msgid "Replace with:" -#~ msgstr " :" - -#~ msgid "Match whole word only" -#~ msgstr " " - -#~ msgid "Match case" -#~ msgstr " " - -#~ msgid "Direction" -#~ msgstr "" - -#~ msgid "Up" -#~ msgstr "" - -#~ msgid "Down" -#~ msgstr "" - -#~ msgid "Find Next" -#~ msgstr "" - -#~ msgid "Replace" -#~ msgstr "" - -#~ msgid "Replace All" -#~ msgstr " " - -#~ msgid "Vim: Received \"die\" request from session manager\n" -#~ msgstr "Vim: die \n" - -#~ msgid "Close" -#~ msgstr "" - -#~ msgid "New tab" -#~ msgstr " " - -#~ msgid "Open Tab..." -#~ msgstr "³ ..." - -#~ msgid "Vim: Main window unexpectedly destroyed\n" -#~ msgstr "Vim: \n" - -#~ msgid "&Filter" -#~ msgstr "&F:Գ" - -#~ msgid "&Cancel" -#~ msgstr "&C:" - -#~ msgid "Directories" -#~ msgstr "" - -#~ msgid "Filter" -#~ msgstr "Գ" - -#~ msgid "&Help" -#~ msgstr "&H:" - -#~ msgid "Files" -#~ msgstr "" - -#~ msgid "&OK" -#~ msgstr "&O:" - -#~ msgid "Selection" -#~ msgstr "" - -#~ msgid "Find &Next" -#~ msgstr "&N: " - -#~ msgid "&Replace" -#~ msgstr "&R:" - -#~ msgid "Replace &All" -#~ msgstr "&A: " - -#~ msgid "&Undo" -#~ msgstr "&U:" - -#~ msgid "E671: Cannot find window title \"%s\"" -#~ msgstr "E671: %s" - -#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version." -#~ msgstr "E243: : -%s; OLE." - -#~ msgid "E672: Unable to open window inside MDI application" -#~ msgstr "E672: MDI" - -#~ msgid "Close tab" -#~ msgstr " " - -#~ msgid "Open tab..." -#~ msgstr "³ ..." - -# msgstr "E245: " -#~ msgid "Find string (use '\\\\' to find a '\\')" -#~ msgstr " ('\\\\' '\\')" - -#~ msgid "Find & Replace (use '\\\\' to find a '\\')" -#~ msgstr " ('\\\\' '\\')" - -#~ msgid "Not Used" -#~ msgstr "" - -#~ msgid "Directory\t*.nothing\n" -#~ msgstr "\t*.\n" - -#~ msgid "" -#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect" -#~ msgstr "" -#~ "Vim E458: , " -#~ "" - -#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:" -#~ msgstr "E250: %s:" - -# msgstr "E250: " -#~ msgid "E252: Fontset name: %s" -#~ msgstr "E252: : %s" - -# msgstr "E252: " -#~ msgid "Font '%s' is not fixed-width" -#~ msgstr " '%s' " - -#~ msgid "E253: Fontset name: %s" -#~ msgstr "E253: : %s" - -#~ msgid "Font0: %s" -#~ msgstr "0: %s" - -#~ msgid "Font1: %s" -#~ msgstr "1: %s" - -#~ msgid "Font%<PRId64> width is not twice that of font0" -#~ msgstr " %<PRId64> 0" - -#~ msgid "Font0 width: %<PRId64>" -#~ msgstr " 0: %<PRId64>" - -#~ msgid "Font1 width: %<PRId64>" -#~ msgstr " 1: %<PRId64>" - -#~ msgid "Invalid font specification" -#~ msgstr " " - -#~ msgid "&Dismiss" -#~ msgstr "&D:" - -#~ msgid "no specific match" -#~ msgstr " " - -# msgstr "E234: " -#~ msgid "Vim - Font Selector" -#~ msgstr "Vim - " - -#~ msgid "Name:" -#~ msgstr ":" - -#~ msgid "Show size in Points" -#~ msgstr " " - -#~ msgid "Encoding:" -#~ msgstr ":" - -#~ msgid "Font:" -#~ msgstr ":" - -#~ msgid "Style:" -#~ msgstr ":" - -#~ msgid "Size:" -#~ msgstr ":" - -#~ msgid "E256: Hangul automata ERROR" -#~ msgstr "E256: Hangul" - -#~ msgid "E563: stat error" -#~ msgstr "E563: stat" - -#~ msgid "E625: cannot open cscope database: %s" -#~ msgstr "E625: cscope: %s" - -#~ msgid "E626: cannot get cscope database information" -#~ msgstr "E626: cscope" - -#~ msgid "Lua library cannot be loaded." -#~ msgstr " Lua" - -#~ msgid "cannot save undo information" -#~ msgstr " " - -#~ msgid "" -#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not " -#~ "be loaded." -#~ msgstr "" -#~ "E815: , , MzScheme " -#~ "." - -#~ msgid "invalid expression" -#~ msgstr " " - -#~ msgid "expressions disabled at compile time" -#~ msgstr " " - -#~ msgid "hidden option" -#~ msgstr " " - -#~ msgid "unknown option" -#~ msgstr " " - -#~ msgid "window index is out of range" -#~ msgstr " " - -#~ msgid "couldn't open buffer" -#~ msgstr " " - -#~ msgid "cannot delete line" -#~ msgstr " " - -#~ msgid "cannot replace line" -#~ msgstr " " - -#~ msgid "cannot insert line" -#~ msgstr " " - -#~ msgid "string cannot contain newlines" -#~ msgstr " " - -#~ msgid "error converting Scheme values to Vim" -#~ msgstr " Scheme Vim" - -#~ msgid "Vim error: ~a" -#~ msgstr " Vim: ~a" - -#~ msgid "Vim error" -#~ msgstr " Vim" - -#~ msgid "buffer is invalid" -#~ msgstr " " - -#~ msgid "window is invalid" -#~ msgstr " " - -#~ msgid "linenr out of range" -#~ msgstr " " - -#~ msgid "not allowed in the Vim sandbox" -#~ msgstr " Vim" - -#~ msgid "E837: This Vim cannot execute :py3 after using :python" -#~ msgstr "E837: Python: :py :py3 " - -#~ msgid "" -#~ "E263: Sorry, this command is disabled, the Python library could not be " -#~ "loaded." -#~ msgstr "" -#~ "E263: , , Python " -#~ "." - -#~ msgid "E836: This Vim cannot execute :python after using :py3" -#~ msgstr "E836: Python: :py :py3 " - -#~ msgid "E659: Cannot invoke Python recursively" -#~ msgstr "E659: Python" - -#~ msgid "E265: $_ must be an instance of String" -#~ msgstr "E265: $_ String" - -#~ msgid "" -#~ "E266: Sorry, this command is disabled, the Ruby library could not be " -#~ "loaded." -#~ msgstr "" -#~ "E266: , , Ruby " -#~ "." - -# msgstr "E414: " -#~ msgid "E267: unexpected return" -#~ msgstr "E267: return" - -#~ msgid "E268: unexpected next" -#~ msgstr "E268: next" - -#~ msgid "E269: unexpected break" -#~ msgstr "E269: break" - -#~ msgid "E270: unexpected redo" -#~ msgstr "E270: redo" - -#~ msgid "E271: retry outside of rescue clause" -#~ msgstr "E271: retry rescue" - -#~ msgid "E272: unhandled exception" -#~ msgstr "E272: " - -# msgstr "E233: " -#~ msgid "E273: unknown longjmp status %d" -#~ msgstr "E273: longjmp: %d" - -#~ msgid "Toggle implementation/definition" -#~ msgstr " /" - -#~ msgid "Show base class of" -#~ msgstr " " - -#~ msgid "Show overridden member function" -#~ msgstr " -" - -#~ msgid "Retrieve from file" -#~ msgstr " " - -#~ msgid "Retrieve from project" -#~ msgstr " " - -#~ msgid "Retrieve from all projects" -#~ msgstr " " - -#~ msgid "Retrieve" -#~ msgstr "" - -#~ msgid "Show source of" -#~ msgstr "" - -#~ msgid "Find symbol" -#~ msgstr " " - -#~ msgid "Browse class" -#~ msgstr " " - -#~ msgid "Show class in hierarchy" -#~ msgstr " " - -#~ msgid "Show class in restricted hierarchy" -#~ msgstr " " - -#~ msgid "Xref refers to" -#~ msgstr "Xref " - -#~ msgid "Xref referred by" -#~ msgstr " Xref " - -#~ msgid "Xref has a" -#~ msgstr "Xref " - -#~ msgid "Xref used by" -#~ msgstr "Xref " - -#~ msgid "Show docu of" -#~ msgstr " docu" - -#~ msgid "Generate docu for" -#~ msgstr " docu " - -#~ msgid "" -#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in " -#~ "$PATH).\n" -#~ msgstr "" -#~ " ' SNiFF+. (sniffemacs " -#~ " $PATH).\n" - -#~ msgid "E274: Sniff: Error during read. Disconnected" -#~ msgstr "E274: Sniff: . ³'" - -#~ msgid "SNiFF+ is currently " -#~ msgstr "SNiFF+ " - -#~ msgid "not " -#~ msgstr " " - -#~ msgid "connected" -#~ msgstr "'" - -#~ msgid "E275: Unknown SNiFF+ request: %s" -#~ msgstr "E275: SNiFF+: %s" - -#~ msgid "E276: Error connecting to SNiFF+" -#~ msgstr "E276: ' SNiFF+" - -#~ msgid "E278: SNiFF+ not connected" -#~ msgstr "E278: SNiFF+ '" - -#~ msgid "E279: Not a SNiFF+ buffer" -#~ msgstr "E279: SNiFF+" - -#~ msgid "Sniff: Error during write. Disconnected" -#~ msgstr "Sniff: . ³'" - -#~ msgid "invalid buffer number" -#~ msgstr " " - -#~ msgid "not implemented yet" -#~ msgstr " " - -#~ msgid "cannot set line(s)" -#~ msgstr " " - -#~ msgid "invalid mark name" -#~ msgstr " " - -# msgstr "E19: " -#~ msgid "mark not set" -#~ msgstr " " - -#~ msgid "row %d column %d" -#~ msgstr " %d %d" - -#~ msgid "cannot insert/append line" -#~ msgstr " / " - -#~ msgid "line number out of range" -#~ msgstr " " - -#~ msgid "unknown flag: " -#~ msgstr " : " - -#~ msgid "unknown vimOption" -#~ msgstr " vimOption" - -#~ msgid "keyboard interrupt" -#~ msgstr " " - -#~ msgid "vim error" -#~ msgstr " Vim" - -#~ msgid "cannot create buffer/window command: object is being deleted" -#~ msgstr " /: ' " - -#~ msgid "" -#~ "cannot register callback command: buffer/window is already being deleted" -#~ msgstr " : / " - -#~ msgid "" -#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-" -#~ "dev@vim.org" -#~ msgstr "" -#~ "E280: TCL: !? " -#~ ", vim-dev@vim.org" - -#~ msgid "cannot register callback command: buffer/window reference not found" -#~ msgstr "" -#~ " 䳿: / " -#~ "" - -#~ msgid "" -#~ "E571: Sorry, this command is disabled: the Tcl library could not be " -#~ "loaded." -#~ msgstr "" -#~ "E571: , , Tcl " -#~ "." - -#~ msgid "E572: exit code %d" -#~ msgstr "E572: %d" - -#~ msgid "cannot get line" -#~ msgstr " " - -#~ msgid "Unable to register a command server name" -#~ msgstr " " - -#~ msgid "E248: Failed to send command to the destination program" -#~ msgstr "E248: -" - -#~ msgid "E573: Invalid server id used: %s" -#~ msgstr "E573: : %s" - -#~ msgid "E251: VIM instance registry property is badly formed. Deleted!" -#~ msgstr "" -#~ "E251: VIM . !" - -#~ msgid "netbeans is not supported with this GUI\n" -#~ msgstr "netbeans GUI\n" - -#~ msgid "This Vim was not compiled with the diff feature." -#~ msgstr " Vim ." - -#~ msgid "'-nb' cannot be used: not enabled at compile time\n" -#~ msgstr " '-nb': \n" - -#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n" -#~ msgstr "Vim: : gvim NetBeans\n" - -#~ msgid "" -#~ "\n" -#~ "Where case is ignored prepend / to make flag upper case" -#~ msgstr "" -#~ "\n" -#~ " , / " -#~ "." - -#~ msgid "-register\t\tRegister this gvim for OLE" -#~ msgstr "-register\t\t gvim OLE" - -#~ msgid "-unregister\t\tUnregister gvim for OLE" -#~ msgstr "-unregister\t\t gvim OLE" - -#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")" -#~ msgstr "-g\t\t\t GUI ( gvim)" - -#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI" -#~ msgstr "-f --nofork\t : GUI" - -#~ msgid "-f\t\t\tDon't use newcli to open window" -#~ msgstr "-f\t\t\t newcli " - -#~ msgid "-dev <device>\t\tUse <device> for I/O" -#~ msgstr "-dev <>\t\t\t <> /" - -#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc" -#~ msgstr "-u <gvimrc>\t\t .gvimrc" - -#~ msgid "-x\t\t\tEdit encrypted files" -#~ msgstr "-x\t\t\t " - -#~ msgid "-display <display>\tConnect vim to this particular X-server" -#~ msgstr "-display <>\tϳ' vim X" - -#~ msgid "-X\t\t\tDo not connect to X server" -#~ msgstr "-X\t\t\t ' X " - -#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible" -#~ msgstr "" -#~ "--remote <>\t <> Vim, " - -#~ msgid "--remote-silent <files> Same, don't complain if there is no server" -#~ msgstr "" -#~ "--remote-silent <> , " -#~ "" - -#~ msgid "" -#~ "--remote-wait <files> As --remote but wait for files to have been edited" -#~ msgstr "" -#~ "--remote-wait <> ..., " -#~ "" - -#~ msgid "" -#~ "--remote-wait-silent <files> Same, don't complain if there is no server" -#~ msgstr "" -#~ "--remote-wait-silent <> , , " -#~ "" - -#~ msgid "" -#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per " -#~ "file" -#~ msgstr "" -#~ "--remote-tab[-wait][-silent] <> , --remote, " -#~ " " - -#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit" -#~ msgstr "" -#~ "--remote-send <> ³ <> " - -#~ msgid "" -#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result" -#~ msgstr "" -#~ "--remote-expr <> <> Vim " -#~ "" - -#~ msgid "--serverlist\t\tList available Vim server names and exit" -#~ msgstr "" -#~ "--serverlist\t\t Vim " - -#~ msgid "--servername <name>\tSend to/become the Vim server <name>" -#~ msgstr "--servername <>\t / Vim <>" - -#~ msgid "" -#~ "\n" -#~ "Arguments recognised by gvim (Motif version):\n" -#~ msgstr "" -#~ "\n" -#~ " gvim ( Motif)\n" - -#~ msgid "" -#~ "\n" -#~ "Arguments recognised by gvim (neXtaw version):\n" -#~ msgstr "" -#~ "\n" -#~ " gvim ( neXtaw):\n" - -#~ msgid "" -#~ "\n" -#~ "Arguments recognised by gvim (Athena version):\n" -#~ msgstr "" -#~ "\n" -#~ " gvim ( Athena)\n" - -#~ msgid "-display <display>\tRun vim on <display>" -#~ msgstr "-display <>\t vim <>" - -#~ msgid "-iconic\t\tStart vim iconified" -#~ msgstr "-iconic\t\t Vim " - -#~ msgid "-background <color>\tUse <color> for the background (also: -bg)" -#~ msgstr "-background <>\t <> (: -bg)" - -#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)" -#~ msgstr "" -#~ "-foreground <>\t <> (: -" -#~ "fg)" - -#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)" -#~ msgstr "" -#~ "-font <>\t <> (: -fn)" - -#~ msgid "-boldfont <font>\tUse <font> for bold text" -#~ msgstr "-boldfont <>\t <> " - -#~ msgid "-italicfont <font>\tUse <font> for italic text" -#~ msgstr "-italicfont <>\t <> " - -#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)" -#~ msgstr "-geometry <>\t (: -geom)" - -#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)" -#~ msgstr "-borderwidth <>\t <> (: -bw)" - -#~ msgid "" -#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)" -#~ msgstr "" -#~ "-scrollbarwidth <> (: -sw)" - -#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)" -#~ msgstr "-menuheight <>\t <> (: -mh)" - -#~ msgid "-reverse\t\tUse reverse video (also: -rv)" -#~ msgstr "-reverse\t\t (: -rv)" - -#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)" -#~ msgstr "+reverse\t\t (: +rv)" - -#~ msgid "-xrm <resource>\tSet the specified resource" -#~ msgstr "-xrm <>\t\t " - -#~ msgid "" -#~ "\n" -#~ "Arguments recognised by gvim (GTK+ version):\n" -#~ msgstr "" -#~ "\n" -#~ " gvim ( GTK+)\n" - -#~ msgid "-display <display>\tRun vim on <display> (also: --display)" -#~ msgstr "-display <>\t vim <> (: --display)" - -#~ msgid "--role <role>\tSet a unique role to identify the main window" -#~ msgstr "" -#~ "--role <>\t " - -#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget" -#~ msgstr "--socketid <xid>\t³ Vim GTK" - -#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout" -#~ msgstr "--echo-wid\t\t gvim stdout" - -#~ msgid "-P <parent title>\tOpen Vim inside parent application" -#~ msgstr "-P < >\t³ Vim " - -#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget" -#~ msgstr "--windowid <HWND>\t³ Vim win32" - -#~ msgid "No display" -#~ msgstr " " - -#~ msgid ": Send failed.\n" -#~ msgstr ": .\n" - -#~ msgid ": Send failed. Trying to execute locally\n" -#~ msgstr ": . \n" - -#~ msgid "%d of %d edited" -#~ msgstr " %d %d" - -#~ msgid "No display: Send expression failed.\n" -#~ msgstr " : ³ .\n" - -#~ msgid ": Send expression failed.\n" -#~ msgstr ": ³ .\n" - -#~ msgid "E543: Not a valid codepage" -#~ msgstr "E543: " - -#~ msgid "E284: Cannot set IC values" -#~ msgstr "E284: " - -#~ msgid "E285: Failed to create input context" -#~ msgstr "E285: " - -#~ msgid "E286: Failed to open input method" -#~ msgstr "E286: " - -# msgstr "E286: " -#~ msgid "E287: Warning: Could not set destroy callback to IM" -#~ msgstr "" -#~ "E287: : " - -# msgstr "E287: " -#~ msgid "E288: input method doesn't support any style" -#~ msgstr "E288: " - -# msgstr "E288: " -#~ msgid "E289: input method doesn't support my preedit type" -#~ msgstr "E289: " - -#~ msgid "E843: Error while updating swap file crypt" -#~ msgstr "E843: " - -#~ msgid "" -#~ "E833: %s is encrypted and this version of Vim does not support encryption" -#~ msgstr "E833: %s , Vim " - -#~ msgid "Swap file is encrypted: \"%s\"" -#~ msgstr " : %s" - -#~ msgid "" -#~ "\n" -#~ "If you entered a new crypt key but did not write the text file," -#~ msgstr "" -#~ "\n" -#~ " , ," - -#~ msgid "" -#~ "\n" -#~ "enter the new crypt key." -#~ msgstr "" -#~ "\n" -#~ " ." - -#~ msgid "" -#~ "\n" -#~ "If you wrote the text file after changing the crypt key press enter" -#~ msgstr "" -#~ "\n" -#~ " , enter" - -#~ msgid "" -#~ "\n" -#~ "to use the same key for text file and swap file" -#~ msgstr "" -#~ "\n" -#~ " " - -#~ msgid "Using crypt key from swap file for the text file.\n" -#~ msgstr " .\n" - -#~ msgid "" -#~ "\n" -#~ " [not usable with this version of Vim]" -#~ msgstr "" -#~ "\n" -#~ " [ Vim]" - -#~ msgid "Tear off this menu" -#~ msgstr "³ " - -#~ msgid "Select Directory dialog" -#~ msgstr " " - -#~ msgid "Save File dialog" -#~ msgstr "' " - -#~ msgid "Open File dialog" -#~ msgstr "³ " - -#~ msgid "E338: Sorry, no file browser in console mode" -#~ msgstr "E338: , " - -#~ msgid "ERROR: " -#~ msgstr ": " - -#~ msgid "" -#~ "\n" -#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use " -#~ "%<PRIu64>\n" -#~ msgstr "" -#~ "\n" -#~ "[] /. %<PRIu64>/%<PRIu64>, . %<PRIu64>, . " -#~ "%<PRIu64>\n" - -#~ msgid "" -#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n" -#~ "\n" -#~ msgstr "" -#~ "[] re/malloc() - %<PRIu64>, free() - %<PRIu64>\n" -#~ "\n" - -#~ msgid "E340: Line is becoming too long" -#~ msgstr "E340: " - -# msgstr "E340: " -#~ msgid "E341: Internal error: lalloc(%<PRId64>, )" -#~ msgstr "E341: : lalloc(%<PRId64>, )" - -#~ msgid "E547: Illegal mouseshape" -#~ msgstr "E547: " - -#~ msgid "Enter encryption key: " -#~ msgstr " : " - -#~ msgid "Enter same key again: " -#~ msgstr " : " - -#~ msgid "Keys don't match!" -#~ msgstr " !" - -#~ msgid "Cannot connect to Netbeans #2" -#~ msgstr " ' Netbeans #2" - -#~ msgid "Cannot connect to Netbeans" -#~ msgstr " ' Netbeans" - -#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\"" -#~ msgstr "" -#~ "E668: ' " -#~ "NetBenans: %s" - -#~ msgid "read from Netbeans socket" -#~ msgstr " Netbeans" - -#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>" -#~ msgstr "E658: ' NetBeans %<PRId64>" - -#~ msgid "E838: netbeans is not supported with this GUI" -#~ msgstr "E838: netbeans GUI" - -#~ msgid "E511: netbeans already connected" -#~ msgstr "E511: netbeans '" - -#~ msgid "E505: %s is read-only (add ! to override)" -#~ msgstr "E505: %s (! )" - -#~ msgid "E775: Eval feature not available" -#~ msgstr "E775: eval " - -#~ msgid "freeing %<PRId64> lines" -#~ msgstr " : %<PRId64>" - -#~ msgid "E530: Cannot change term in GUI" -#~ msgstr "E530: term GUI" - -#~ msgid "E531: Use \":gui\" to start the GUI" -#~ msgstr "E531: :gui GUI" - -#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI" -#~ msgstr "E617: GUI GTK+ 2" - -#~ msgid "E596: Invalid font(s)" -#~ msgstr "E596: () ()" - -#~ msgid "E597: can't select fontset" -#~ msgstr "E597: " - -#~ msgid "E598: Invalid fontset" -#~ msgstr "E598: " - -#~ msgid "E533: can't select wide font" -#~ msgstr "E533: " - -#~ msgid "E534: Invalid wide font" -#~ msgstr "E534: " - -#~ msgid "E538: No mouse support" -#~ msgstr "E538: " - -# msgstr "E358: " -#~ msgid "cannot open " -#~ msgstr " " - -#~ msgid "VIM: Can't open window!\n" -#~ msgstr "VIM: !\n" - -#~ msgid "Need Amigados version 2.04 or later\n" -#~ msgstr " Amigados 2.04 \n" - -#~ msgid "Need %s version %<PRId64>\n" -#~ msgstr " %s %<PRId64>\n" - -#~ msgid "Cannot open NIL:\n" -#~ msgstr " NIL:\n" - -#~ msgid "Cannot create " -#~ msgstr " " - -#~ msgid "Vim exiting with %d\n" -#~ msgstr "Vim %d\n" - -#~ msgid "cannot change console mode ?!\n" -#~ msgstr " ?!\n" - -# msgstr "E359: " -#~ msgid "mch_get_shellsize: not a console??\n" -#~ msgstr "mch_get_shellsize: ??\n" - -#~ msgid "E360: Cannot execute shell with -f option" -#~ msgstr "E360: -f" - -# msgstr "E360: " -#~ msgid "Cannot execute " -#~ msgstr " " - -#~ msgid "shell " -#~ msgstr " " - -#~ msgid " returned\n" -#~ msgstr " \n" - -#~ msgid "ANCHOR_BUF_SIZE too small." -#~ msgstr "ANCHOR_BUF_SIZE " - -#~ msgid "I/O ERROR" -#~ msgstr " /" - -#~ msgid "Message" -#~ msgstr "" - -#~ msgid "'columns' is not 80, cannot execute external commands" -#~ msgstr "'columns' 80, " - -# msgstr "E364: " -#~ msgid "E237: Printer selection failed" -#~ msgstr "E237: " - -#~ msgid "to %s on %s" -#~ msgstr " %s %s" - -#~ msgid "E613: Unknown printer font: %s" -#~ msgstr "E613: : %s" - -#~ msgid "E238: Print error: %s" -#~ msgstr "E238: : %s" - -#~ msgid "Printing '%s'" -#~ msgstr " '%s'" - -#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\"" -#~ msgstr "E244: %s %s" - -#~ msgid "E245: Illegal char '%c' in font name \"%s\"" -#~ msgstr "E245: %c %s" - -#~ msgid "Opening the X display took %<PRId64> msec" -#~ msgstr " X %<PRId64> " - -#~ msgid "" -#~ "\n" -#~ "Vim: Got X error\n" -#~ msgstr "" -#~ "\n" -#~ "Vim: X\n" - -#~ msgid "Testing the X display failed" -#~ msgstr " " - -#~ msgid "Opening the X display timed out" -#~ msgstr " " - -#~ msgid "" -#~ "\n" -#~ "Cannot execute shell sh\n" -#~ msgstr "" -#~ "\n" -#~ " `sh'\n" - -#~ msgid "" -#~ "\n" -#~ "Cannot create pipes\n" -#~ msgstr "" -#~ "\n" -#~ " \n" - -#~ msgid "" -#~ "\n" -#~ "Cannot fork\n" -#~ msgstr "" -#~ "\n" -#~ " \n" - -#~ msgid "" -#~ "\n" -#~ "Command terminated\n" -#~ msgstr "" -#~ "\n" -#~ " \n" - -#~ msgid "XSMP lost ICE connection" -#~ msgstr "XSMP ' ICE" - -#~ msgid "Opening the X display failed" -#~ msgstr " X" - -#~ msgid "XSMP handling save-yourself request" -#~ msgstr "XSMP ' '" - -#~ msgid "XSMP opening connection" -#~ msgstr "XSMP '" - -#~ msgid "XSMP ICE connection watch failed" -#~ msgstr "XSMP ' ICE " - -#~ msgid "XSMP SmcOpenConnection failed: %s" -#~ msgstr "XSMP SmcOpenConnection: %s" - -#~ msgid "At line" -#~ msgstr ":" - -#~ msgid "Could not load vim32.dll!" -#~ msgstr " vim32.dll" - -#~ msgid "VIM Error" -#~ msgstr " VIM" - -#~ msgid "Could not fix up function pointers to the DLL!" -#~ msgstr " DLL!" - -#~ msgid "shell returned %d" -#~ msgstr " %d" - -#~ msgid "Vim: Caught %s event\n" -#~ msgstr "Vim: %s\n" - -#~ msgid "close" -#~ msgstr "close" - -#~ msgid "logoff" -#~ msgstr "logoff" - -#~ msgid "shutdown" -#~ msgstr "shutdown" - -#~ msgid "E371: Command not found" -#~ msgstr "E371: " - -#~ msgid "" -#~ "VIMRUN.EXE not found in your $PATH.\n" -#~ "External commands will not pause after completion.\n" -#~ "See :help win32-vimrun for more information." -#~ msgstr "" -#~ " VIMRUN.EXE .\n" -#~ " .\n" -#~ " :help win32-vimrun ." - -#~ msgid "Vim Warning" -#~ msgstr " Vim" - -# msgstr "E231: " -#~ msgid "Error file" -#~ msgstr " " - -#~ msgid "E868: Error building NFA with equivalence class!" -#~ msgstr "E868: NFA !" - -#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!" -#~ msgstr "E878: (NFA) !" - -#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\"" -#~ msgstr "" -#~ ": %s_%s.spl %s_ascii.spl" - -#~ msgid "Conversion in %s not supported" -#~ msgstr " %s " - -#~ msgid "E845: Insufficient memory, word list will be incomplete" -#~ msgstr "E845: , " - -#~ msgid "E430: Tag file path truncated for %s\n" -#~ msgstr "E430: 崳 %s\n" - -#~ msgid "new shell started\n" -#~ msgstr " \n" - -# msgstr "E242: " -#~ msgid "Used CUT_BUFFER0 instead of empty selection" -#~ msgstr " CUT_BUFFER0 " - -#~ msgid "No undo possible; continue anyway" -#~ msgstr " , " - -#~ msgid "E832: Non-encrypted file has encrypted undo file: %s" -#~ msgstr "E832: : %s" - -#~ msgid "E826: Undo file decryption failed: %s" -#~ msgstr "E826: : %s" - -#~ msgid "E827: Undo file is encrypted: %s" -#~ msgstr "E827: : %s" - -# msgstr "E440: " -# --------------------------------------- -#~ msgid "" -#~ "\n" -#~ "MS-Windows 16/32-bit GUI version" -#~ msgstr "" -#~ "\n" -#~ " GUI 16/32- Windows" - -#~ msgid "" -#~ "\n" -#~ "MS-Windows 64-bit GUI version" -#~ msgstr "" -#~ "\n" -#~ " GUI 64- MS-Windows" - -#~ msgid "" -#~ "\n" -#~ "MS-Windows 32-bit GUI version" -#~ msgstr "" -#~ "\n" -#~ " GUI 32- Windows" - -#~ msgid " in Win32s mode" -#~ msgstr " Win32s" - -#~ msgid " with OLE support" -#~ msgstr " OLE" - -#~ msgid "" -#~ "\n" -#~ "MS-Windows 64-bit console version" -#~ msgstr "" -#~ "\n" -#~ " 64- Windows" - -#~ msgid "" -#~ "\n" -#~ "MS-Windows 32-bit console version" -#~ msgstr "" -#~ "\n" -#~ " 32- Windows" - -#~ msgid "" -#~ "\n" -#~ "MS-Windows 16-bit version" -#~ msgstr "" -#~ "\n" -#~ " 16- Windows" - -#~ msgid "" -#~ "\n" -#~ "32-bit MS-DOS version" -#~ msgstr "" -#~ "\n" -#~ " 32- MS-DOS" - -#~ msgid "" -#~ "\n" -#~ "16-bit MS-DOS version" -#~ msgstr "" -#~ "\n" -#~ " 16- MS-DOS" - -#~ msgid "" -#~ "\n" -#~ "MacOS X (unix) version" -#~ msgstr "" -#~ "\n" -#~ " MacOS X (unix)" - -#~ msgid "" -#~ "\n" -#~ "MacOS X version" -#~ msgstr "" -#~ "\n" -#~ " MacOS X" - -#~ msgid "" -#~ "\n" -#~ "MacOS version" -#~ msgstr "" -#~ "\n" -#~ " MacOS" - -#~ msgid "" -#~ "\n" -#~ "OpenVMS version" -#~ msgstr "" -#~ "\n" -#~ " OpenVMS" - -#~ msgid "" -#~ "\n" -#~ "Big version " -#~ msgstr "" -#~ "\n" -#~ " " - -#~ msgid "" -#~ "\n" -#~ "Normal version " -#~ msgstr "" -#~ "\n" -#~ " " - -#~ msgid "" -#~ "\n" -#~ "Small version " -#~ msgstr "" -#~ "\n" -#~ " " - -#~ msgid "" -#~ "\n" -#~ "Tiny version " -#~ msgstr "" -#~ "\n" -#~ " " - -#~ msgid "with GTK2-GNOME GUI." -#~ msgstr " GUI GTK2-GNOME." - -#~ msgid "with GTK2 GUI." -#~ msgstr " GUI GTK2." - -#~ msgid "with X11-Motif GUI." -#~ msgstr " GUI X11-Motif." - -#~ msgid "with X11-neXtaw GUI." -#~ msgstr " GUI X11-neXtaw." - -#~ msgid "with X11-Athena GUI." -#~ msgstr " GUI X11-Athena." - -#~ msgid "with Photon GUI." -#~ msgstr " GUI Photon." - -#~ msgid "with GUI." -#~ msgstr " GUI." - -#~ msgid "with Carbon GUI." -#~ msgstr " GUI Carbon." - -#~ msgid "with Cocoa GUI." -#~ msgstr " GUI Cocoa." - -#~ msgid "with (classic) GUI." -#~ msgstr " () GUI." - -#~ msgid " system gvimrc file: \"" -#~ msgstr " gvimrc: \"" - -#~ msgid " user gvimrc file: \"" -#~ msgstr " gvimrc : \"" - -#~ msgid "2nd user gvimrc file: \"" -#~ msgstr " gvimrc : \"" - -#~ msgid "3rd user gvimrc file: \"" -#~ msgstr " gvimrc : \"" - -#~ msgid " system menu file: \"" -#~ msgstr " : \"" - -#~ msgid "Compiler: " -#~ msgstr ": " - -#~ msgid "menu Help->Orphans for information " -#~ msgstr " Help->Orphans " - -#~ msgid "Running modeless, typed text is inserted" -#~ msgstr " , " - -#~ msgid "menu Edit->Global Settings->Toggle Insert Mode " -#~ msgstr " Edit->Global Settings->Toggle Insert Mode " - -#~ msgid " for two modes " -#~ msgstr " " - -#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible" -#~ msgstr " Edit->Global Settings->Toggle Vi Compatible " - -#~ msgid " for Vim defaults " -#~ msgstr " Vi" - -#~ msgid "WARNING: Windows 95/98/ME detected" -#~ msgstr ": Windows 95/98/ME" - -#~ msgid "type :help windows95<Enter> for info on this" -#~ msgstr ":help windows95<Enter> " - -#~ msgid "E370: Could not load library %s" -#~ msgstr "E370: %s" - -#~ msgid "" -#~ "Sorry, this command is disabled: the Perl library could not be loaded." -#~ msgstr "" -#~ ", , Perl ." - -#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module" -#~ msgstr "" -#~ "E299: Perl Safe" - -#~ msgid "Edit with &multiple Vims" -#~ msgstr " (&m) Vim" - -#~ msgid "Edit with single &Vim" -#~ msgstr " &Vim" - -#~ msgid "Diff with Vim" -#~ msgstr " Vim" - -#~ msgid "Edit with &Vim" -#~ msgstr " &Vim" - -#~ msgid "Edit with existing Vim - " -#~ msgstr " Vim - " - -#~ msgid "Edits the selected file(s) with Vim" -#~ msgstr " Vim" - -#~ msgid "Error creating process: Check if gvim is in your path!" -#~ msgstr " , gvim !" - -#~ msgid "gvimext.dll error" -#~ msgstr " gvimext.dll" - -#~ msgid "Path length too long!" -#~ msgstr " !" - -# msgstr "E233: " -#~ msgid "E234: Unknown fontset: %s" -#~ msgstr "E234: : %s" - -#~ msgid "E235: Unknown font: %s" -#~ msgstr "E235: : %s" - -# msgstr "E235: " -#~ msgid "E236: Font \"%s\" is not fixed-width" -#~ msgstr "E236: %s " - -#~ msgid "E448: Could not load library function %s" -#~ msgstr "E448: %s" - -#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n" -#~ msgstr "E26: : \n" - -#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n" -#~ msgstr "E27: : \n" - -#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n" -#~ msgstr "" -#~ "E800: : " -#~ "\n" - -#~ msgid "E247: no registered server named \"%s\"" -#~ msgstr "E247: %s" - -#~ msgid "E233: cannot open display" -#~ msgstr "E233: " - -#~ msgid "E449: Invalid expression received" -#~ msgstr "E449: " - -#~ msgid "E463: Region is guarded, cannot modify" -#~ msgstr "E463: " - -#~ msgid "E744: NetBeans does not allow changes in read-only files" -#~ msgstr "E744: NetBeans " - -#~ msgid "Need encryption key for \"%s\"" -#~ msgstr " %s : " - -# msgstr "E406: " -#~ msgid "empty keys are not allowed" -#~ msgstr " " - -#~ msgid "dictionary is locked" -#~ msgstr " " - -#~ msgid "list is locked" -#~ msgstr " " - -#~ msgid "failed to add key '%s' to dictionary" -#~ msgstr " '%s' " - -#~ msgid "index must be int or slice, not %s" -#~ msgstr " , %s" - -#~ msgid "expected str() or unicode() instance, but got %s" -#~ msgstr " str() unicode(), %s" - -#~ msgid "expected bytes() or str() instance, but got %s" -#~ msgstr " bytes() str(), %s" - -#~ msgid "" -#~ "expected int(), long() or something supporting coercing to long(), but " -#~ "got %s" -#~ msgstr "" -#~ " int(), long() , long(), " -#~ " %s" - -#~ msgid "expected int() or something supporting coercing to int(), but got %s" -#~ msgstr "" -#~ " int() , int(), %s" - -#~ msgid "value is too large to fit into C int type" -#~ msgstr " , C int" - -#~ msgid "value is too small to fit into C int type" -#~ msgstr " , C int" - -#~ msgid "number must be greater then zero" -#~ msgstr " , " - -#~ msgid "number must be greater or equal to zero" -#~ msgstr " , " - -#~ msgid "can't delete OutputObject attributes" -#~ msgstr " OutputObject" - -# msgstr "E180: " -#~ msgid "invalid attribute: %s" -#~ msgstr " : %s" - -#~ msgid "E264: Python: Error initialising I/O objects" -#~ msgstr "E264: Python: ' /" - -#~ msgid "failed to change directory" -#~ msgstr " " - -#~ msgid "expected 3-tuple as imp.find_module() result, but got %s" -#~ msgstr " 3- imp.find_module(), %s" - -#~ msgid "" -#~ "expected 3-tuple as imp.find_module() result, but got tuple of size %d" -#~ msgstr " 3- imp.find_module(), %d" - -#~ msgid "internal error: imp.find_module returned tuple with NULL" -#~ msgstr " : imp.find_module NULL" - -#~ msgid "cannot delete vim.Dictionary attributes" -#~ msgstr " vim.Dictionary" - -#~ msgid "cannot modify fixed dictionary" -#~ msgstr " " - -#~ msgid "cannot set attribute %s" -#~ msgstr " %s" - -#~ msgid "hashtab changed during iteration" -#~ msgstr "- " - -#~ msgid "expected sequence element of size 2, but got sequence of size %d" -#~ msgstr "" -#~ " 2, " -#~ "%d" - -#~ msgid "list constructor does not accept keyword arguments" -#~ msgstr " " - -#~ msgid "list index out of range" -#~ msgstr " " - -#~ msgid "internal error: failed to get vim list item %d" -#~ msgstr " : vim %d" - -#~ msgid "failed to add item to list" -#~ msgstr " " - -#~ msgid "internal error: no vim list item %d" -#~ msgstr " : vim %d" - -#~ msgid "internal error: failed to add item to list" -#~ msgstr " : " - -#~ msgid "cannot delete vim.List attributes" -#~ msgstr " vim.List" - -#~ msgid "cannot modify fixed list" -#~ msgstr " " - -# msgstr "E428: " -#~ msgid "unnamed function %s does not exist" -#~ msgstr " %s " - -# msgstr "E428: " -#~ msgid "function %s does not exist" -#~ msgstr " %s " - -#~ msgid "function constructor does not accept keyword arguments" -#~ msgstr " " - -#~ msgid "failed to run function %s" -#~ msgstr " %s" - -#~ msgid "problem while switching windows" -#~ msgstr " " - -#~ msgid "unable to unset global option %s" -#~ msgstr " %s" - -#~ msgid "unable to unset option %s which does not have global value" -#~ msgstr " %s, " - -#~ msgid "attempt to refer to deleted tab page" -#~ msgstr " " - -#~ msgid "no such tab page" -#~ msgstr " " - -#~ msgid "attempt to refer to deleted window" -#~ msgstr " " - -#~ msgid "readonly attribute: buffer" -#~ msgstr " : " - -#~ msgid "cursor position outside buffer" -#~ msgstr " " - -#~ msgid "no such window" -#~ msgstr " " - -#~ msgid "attempt to refer to deleted buffer" -#~ msgstr " " - -#~ msgid "failed to rename buffer" -#~ msgstr " " - -#~ msgid "mark name must be a single character" -#~ msgstr " " - -#~ msgid "expected vim.Buffer object, but got %s" -#~ msgstr " ᒺ vim.Buffer, %s" - -#~ msgid "failed to switch to buffer %d" -#~ msgstr " %d" - -#~ msgid "expected vim.Window object, but got %s" -#~ msgstr " ᒺ vim.Window, %s" - -#~ msgid "failed to find window in the current tab page" -#~ msgstr " " - -#~ msgid "did not switch to the specified window" -#~ msgstr " " - -#~ msgid "expected vim.TabPage object, but got %s" -#~ msgstr " ᒺ vim.TabPage, %s" - -#~ msgid "did not switch to the specified tab page" -#~ msgstr " " - -#~ msgid "failed to run the code" -#~ msgstr " " - -#~ msgid "E858: Eval did not return a valid python object" -#~ msgstr "E858: Eval ᒺ python" - -#~ msgid "E859: Failed to convert returned python object to vim value" -#~ msgstr "E859: ᒺ python vim" - -#~ msgid "unable to convert %s to vim dictionary" -#~ msgstr " %s vim" - -#~ msgid "unable to convert %s to vim structure" -#~ msgstr " %s vim" - -#~ msgid "internal error: NULL reference passed" -#~ msgstr " : NULL" - -#~ msgid "internal error: invalid value type" -#~ msgstr " : " - -#~ msgid "" -#~ "Failed to set path hook: sys.path_hooks is not a list\n" -#~ "You should now do the following:\n" -#~ "- append vim.path_hook to sys.path_hooks\n" -#~ "- append vim.VIM_SPECIAL_PATH to sys.path\n" -#~ msgstr "" -#~ " : sys.path_hooks \n" -#~ " :\n" -#~ "- vim.path_hook sys.path_hooks\n" -#~ "- vim.VIM_SPECIAL_PATH sys.path\n" - -#~ msgid "" -#~ "Failed to set path: sys.path is not a list\n" -#~ "You should now append vim.VIM_SPECIAL_PATH to sys.path" -#~ msgstr "" -#~ " : sys.path \n" -#~ " vim.VIM_SPECIAL_PATH sys.path" diff --git a/src/nvim/po/uk.po b/src/nvim/po/uk.po index eaa3a5bfa9..6a75018726 100644 --- a/src/nvim/po/uk.po +++ b/src/nvim/po/uk.po @@ -21,204 +21,157 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../api/private/helpers.c:201 -#, fuzzy msgid "Unable to get option value" -msgstr "не вдалося отримати значення опції" +msgstr "Не вдалося отримати значення опції" -#: ../api/private/helpers.c:204 msgid "internal error: unknown option type" msgstr "внутрішня помилка: невідомий тип опції" -#: ../buffer.c:92 msgid "[Location List]" msgstr "[Список місць]" -#: ../buffer.c:93 msgid "[Quickfix List]" msgstr "[Список виправлень]" -#: ../buffer.c:94 msgid "E855: Autocommands caused command to abort" msgstr "E855: Автокоманди призвели до скасування команди" -#: ../buffer.c:135 msgid "E82: Cannot allocate any buffer, exiting..." msgstr "E82: Немає можливості розмістити хоч один буфер, завершення роботи..." -#: ../buffer.c:138 msgid "E83: Cannot allocate buffer, using other one..." msgstr "E83: Немає можливості розмістити буфер, буде використано інший..." -#: ../buffer.c:763 msgid "E515: No buffers were unloaded" msgstr "E515: Жоден з буферів не був вивантажений" -#: ../buffer.c:765 msgid "E516: No buffers were deleted" msgstr "E516: Жоден з буферів не знищено" -#: ../buffer.c:767 msgid "E517: No buffers were wiped out" msgstr "E517: Жоден з буферів не витерто" -#: ../buffer.c:772 msgid "1 buffer unloaded" msgstr "Вивантажено один буфер" -#: ../buffer.c:774 #, c-format msgid "%d buffers unloaded" msgstr "Вивантажено %d буфери(ів)" -#: ../buffer.c:777 msgid "1 buffer deleted" msgstr "Знищено один буфер" -#: ../buffer.c:779 #, c-format msgid "%d buffers deleted" msgstr "Знищено %d буфери(ів)" -#: ../buffer.c:782 msgid "1 buffer wiped out" msgstr "Витерто один буфер" -#: ../buffer.c:784 #, c-format msgid "%d buffers wiped out" msgstr "Витерто %d буфери(ів)" -#: ../buffer.c:806 msgid "E90: Cannot unload last buffer" msgstr "E90: Не можу вивантажити останній буфер" -#: ../buffer.c:874 msgid "E84: No modified buffer found" msgstr "E84: Жоден буфер не змінено" #. back where we started, didn't find anything. -#: ../buffer.c:903 msgid "E85: There is no listed buffer" msgstr "E85: У списку немає буферів" -#: ../buffer.c:913 #, c-format msgid "E86: Buffer %<PRId64> does not exist" msgstr "E86: Буфера %<PRId64> немає" -#: ../buffer.c:915 msgid "E87: Cannot go beyond last buffer" msgstr "E87: Це вже останній буфер" -#: ../buffer.c:917 msgid "E88: Cannot go before first buffer" msgstr "E88: Це вже найперший буфер" -#: ../buffer.c:945 #, c-format msgid "" "E89: No write since last change for buffer %<PRId64> (add ! to override)" msgstr "E89: Буфер %<PRId64> має зміни (! щоб не зважати)" #. wrap around (may cause duplicates) -#: ../buffer.c:1423 msgid "W14: Warning: List of file names overflow" msgstr "W14: Обережно: Список назв файлів переповнено" -#: ../buffer.c:1555 ../quickfix.c:3361 #, c-format msgid "E92: Buffer %<PRId64> not found" msgstr "E92: Буфер %<PRId64> не знайдено" -#: ../buffer.c:1798 #, c-format msgid "E93: More than one match for %s" msgstr "E93: Знайдено кілька збігів з %s" -#: ../buffer.c:1800 #, c-format msgid "E94: No matching buffer for %s" msgstr "E94: Не знайдено буфер, схожий на %s" -#: ../buffer.c:2161 #, c-format msgid "line %<PRId64>" msgstr "рядок %<PRId64>" -#: ../buffer.c:2233 msgid "E95: Buffer with this name already exists" msgstr "E95: Буфер з такою назвою вже існує" -#: ../buffer.c:2498 msgid " [Modified]" msgstr " [Змінено]" -#: ../buffer.c:2501 msgid "[Not edited]" msgstr "[Не редаговано]" -#: ../buffer.c:2504 msgid "[New file]" msgstr "[Новий файл]" -#: ../buffer.c:2505 msgid "[Read errors]" msgstr "[Помилки читання]" -#: ../buffer.c:2506 ../buffer.c:3217 ../fileio.c:1807 ../screen.c:4895 msgid "[RO]" msgstr "[RO]" -#: ../buffer.c:2507 ../fileio.c:1807 msgid "[readonly]" msgstr "[лише читати]" -#: ../buffer.c:2524 #, c-format msgid "1 line --%d%%--" msgstr "один рядок --%d%%--" -#: ../buffer.c:2526 #, c-format msgid "%<PRId64> lines --%d%%--" msgstr "%<PRId64> рядки(ів) --%d%%--" -#: ../buffer.c:2530 #, c-format msgid "line %<PRId64> of %<PRId64> --%d%%-- col " msgstr "рядок %<PRId64> з %<PRId64> --%d%%-- колонка " -#: ../buffer.c:2632 ../buffer.c:4292 ../memline.c:1554 msgid "[No Name]" msgstr "[Без назви]" #. must be a help buffer -#: ../buffer.c:2667 msgid "help" msgstr "допомога" -#: ../buffer.c:3225 ../screen.c:4883 msgid "[Help]" msgstr "[Допомога]" -#: ../buffer.c:3254 ../screen.c:4887 msgid "[Preview]" msgstr "[Перегляд]" -#: ../buffer.c:3528 msgid "All" msgstr "Усе" -#: ../buffer.c:3528 msgid "Bot" msgstr "Знизу" -#: ../buffer.c:3531 msgid "Top" msgstr "Вгорі" -#: ../buffer.c:4244 msgid "" "\n" "# Buffer list:\n" @@ -226,11 +179,9 @@ msgstr "" "\n" "# Список буферів:\n" -#: ../buffer.c:4289 msgid "[Scratch]" msgstr "[З нуля]" -#: ../buffer.c:4529 msgid "" "\n" "--- Signs ---" @@ -238,202 +189,155 @@ msgstr "" "\n" "--- Позначки ---" -#: ../buffer.c:4538 #, c-format msgid "Signs for %s:" msgstr "Позначки для %s:" -#: ../buffer.c:4543 #, c-format msgid " line=%<PRId64> id=%d name=%s" msgstr " рядок=%<PRId64> id=%d назва=%s" -#: ../cursor_shape.c:68 msgid "E545: Missing colon" msgstr "E545: Пропущено двокрапку" -#: ../cursor_shape.c:70 ../cursor_shape.c:94 msgid "E546: Illegal mode" msgstr "E546: Неправильний режим" -#: ../cursor_shape.c:134 msgid "E548: digit expected" msgstr "E548: Потрібна цифра" -#: ../cursor_shape.c:138 msgid "E549: Illegal percentage" msgstr "E549: Неправильний відсоток" -#: ../diff.c:146 #, c-format msgid "E96: Can not diff more than %<PRId64> buffers" msgstr "E96: Не можна порівнювати понад %<PRId64> буфери(ів)" -#: ../diff.c:753 msgid "E810: Cannot read or write temp files" msgstr "E810: Не можна читати чи записувати тимчасові файли" -#: ../diff.c:755 msgid "E97: Cannot create diffs" msgstr "E97: Не вдалося створити порівняння" -#: ../diff.c:966 msgid "E816: Cannot read patch output" msgstr "E816: Не вдалося прочитати результат patch" -#: ../diff.c:1220 msgid "E98: Cannot read diff output" msgstr "E98: Не вдалося прочитати результат diff" -#: ../diff.c:2081 msgid "E99: Current buffer is not in diff mode" msgstr "E99: Цей буфер не в режимі порівняння" -#: ../diff.c:2100 msgid "E793: No other buffer in diff mode is modifiable" msgstr "E793: Немає більше модифіковних буферів в режимі порівняння" -#: ../diff.c:2102 msgid "E100: No other buffer in diff mode" msgstr "E100: Немає інших буферів в режимі порівняння" -#: ../diff.c:2112 msgid "E101: More than two buffers in diff mode, don't know which one to use" msgstr "" "E101: Понад два буфери у режимі порівняння, не зрозуміло, котрий із них " "використати" -#: ../diff.c:2141 #, c-format msgid "E102: Can't find buffer \"%s\"" msgstr "E102: Не вдалося знайти буфер «%s»" -#: ../diff.c:2152 #, c-format msgid "E103: Buffer \"%s\" is not in diff mode" msgstr "E103: Буфер «%s» не в режимі порівняння" -#: ../diff.c:2193 msgid "E787: Buffer changed unexpectedly" msgstr "E787: Буфер несподівано змінився" -#: ../digraph.c:1598 msgid "E104: Escape not allowed in digraph" msgstr "E104: У диграфах не може міститися escape" -#: ../digraph.c:1760 msgid "E544: Keymap file not found" msgstr "E544: Не знайдено файл розкладки" -#: ../digraph.c:1785 msgid "E105: Using :loadkeymap not in a sourced file" msgstr "E105: :loadkeymap використано не у файлі команд" -#: ../digraph.c:1821 msgid "E791: Empty keymap entry" msgstr "E791: Елемент розкладки порожній" -#: ../edit.c:82 msgid " Keyword completion (^N^P)" msgstr " Доповнення ключових слів (^N^P)" #. ctrl_x_mode == 0, ^P/^N compl. -#: ../edit.c:83 msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)" msgstr " Режим ^X (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)" -#: ../edit.c:85 msgid " Whole line completion (^L^N^P)" msgstr " Доповнення усього рядка (^L^N^P)" -#: ../edit.c:86 msgid " File name completion (^F^N^P)" msgstr " Доповнення назви файлу (^F^N^P)" -#: ../edit.c:87 msgid " Tag completion (^]^N^P)" msgstr " Доповнення теґів (^]^N^P)" -#: ../edit.c:88 msgid " Path pattern completion (^N^P)" msgstr " Доповнення шляху за зразком (^N^P)" -#: ../edit.c:89 msgid " Definition completion (^D^N^P)" msgstr " Доповнення визначення (^D^N^P)" -#: ../edit.c:91 msgid " Dictionary completion (^K^N^P)" msgstr " Доповнення зі словника (^K^N^P)" -#: ../edit.c:92 msgid " Thesaurus completion (^T^N^P)" msgstr " Доповнення з тезаурусу (^T^N^P)" -#: ../edit.c:93 msgid " Command-line completion (^V^N^P)" msgstr " Доповнення команд (^V^N^P)" -#: ../edit.c:94 msgid " User defined completion (^U^N^P)" msgstr " Користувацьке доповнення (^U^N^P)" -#: ../edit.c:95 msgid " Omni completion (^O^N^P)" msgstr " Кмітливе доповнення (^O^N^P)" -#: ../edit.c:96 msgid " Spelling suggestion (s^N^P)" msgstr " Орфографічна підказка (s^N^P)" -#: ../edit.c:97 msgid " Keyword Local completion (^N^P)" msgstr " Доповнення місцевих ключових слів (^N^P)" -#: ../edit.c:100 msgid "Hit end of paragraph" msgstr "Трапився кінець параграфа" # msgstr "E443: " -#: ../edit.c:101 msgid "E839: Completion function changed window" msgstr "E839: Функція доповнення змінила вікно" -#: ../edit.c:102 msgid "E840: Completion function deleted text" msgstr "E840: Функція доповнення знищила текст" -#: ../edit.c:1847 msgid "'dictionary' option is empty" msgstr "Опція 'dictionary' порожня" -#: ../edit.c:1848 msgid "'thesaurus' option is empty" msgstr "Опція 'thesaurus' порожня" -#: ../edit.c:2655 #, c-format msgid "Scanning dictionary: %s" msgstr "Сканується словник: %s" -#: ../edit.c:3079 msgid " (insert) Scroll (^E/^Y)" msgstr " (вставка) Прогорнути (^E/^Y)" -#: ../edit.c:3081 msgid " (replace) Scroll (^E/^Y)" msgstr " (заміна) Прогорнути (^E/^Y)" -#: ../edit.c:3587 #, c-format msgid "Scanning: %s" msgstr "Пошук у: %s" -#: ../edit.c:3614 msgid "Scanning tags." msgstr "Пошук серед теґів." -#: ../edit.c:4519 msgid " Adding" msgstr " Додається" @@ -441,598 +345,468 @@ msgstr " Додається" #. * be called before line = ml_get(), or when this address is no #. * longer needed. -- Acevedo. #. -#: ../edit.c:4562 msgid "-- Searching..." msgstr "-- Пошук..." -#: ../edit.c:4618 msgid "Back at original" msgstr "Початковий варіант" -#: ../edit.c:4621 msgid "Word from other line" msgstr "Слово з іншого рядка" -#: ../edit.c:4624 msgid "The only match" msgstr "Єдиний збіг" -#: ../edit.c:4680 #, c-format msgid "match %d of %d" msgstr "збіг %d з %d" -#: ../edit.c:4684 #, c-format msgid "match %d" msgstr "збіг %d" # msgstr "E17: " -#: ../eval.c:137 msgid "E18: Unexpected characters in :let" msgstr "E18: Неочікувані символи у :let" -#: ../eval.c:138 #, c-format msgid "E684: list index out of range: %<PRId64>" msgstr "E684: Індекс списку поза межами: %<PRId64>" -#: ../eval.c:139 #, c-format msgid "E121: Undefined variable: %s" msgstr "E121: Невизначена змінна: %s" -#: ../eval.c:140 msgid "E111: Missing ']'" msgstr "E111: Бракує ']'" -#: ../eval.c:141 #, c-format msgid "E686: Argument of %s must be a List" msgstr "E686: Аргумент у %s має бути списком" -#: ../eval.c:143 #, c-format msgid "E712: Argument of %s must be a List or Dictionary" msgstr "E712: Аргумент у %s має бути списком чи словником" -#: ../eval.c:144 msgid "E713: Cannot use empty key for Dictionary" msgstr "E713: Ключ словника не може бути порожнім" # msgstr "E396: " -#: ../eval.c:145 msgid "E714: List required" msgstr "E714: Потрібен список" -#: ../eval.c:146 msgid "E715: Dictionary required" msgstr "E715: Потрібен словник" -#: ../eval.c:147 #, c-format msgid "E118: Too many arguments for function: %s" msgstr "E118: Забагато аргументів для функції: %s" -#: ../eval.c:148 #, c-format msgid "E716: Key not present in Dictionary: %s" msgstr "E716: Немає такого ключа у словнику: %s" -#: ../eval.c:150 #, c-format msgid "E122: Function %s already exists, add ! to replace it" msgstr "E122: Функція %s уже існує, ! щоб замінити" -#: ../eval.c:151 msgid "E717: Dictionary entry already exists" msgstr "E717: Запис у словнику вже існує" -#: ../eval.c:152 msgid "E718: Funcref required" msgstr "E718: Треба посилання на функцію" -#: ../eval.c:153 msgid "E719: Cannot use [:] with a Dictionary" msgstr "E719: Не можна використати [:] зі словником" -#: ../eval.c:154 #, c-format msgid "E734: Wrong variable type for %s=" msgstr "E734: Неправильний тип змінної для %s=" -#: ../eval.c:155 #, c-format msgid "E130: Unknown function: %s" msgstr "E130: Невідома функція: %s" -#: ../eval.c:156 #, c-format msgid "E461: Illegal variable name: %s" msgstr "E461: Неприпустима назва змінної: %s" # msgstr "E373: " -#: ../eval.c:157 msgid "E806: using Float as a String" msgstr "E806: Float вжито як String" -#: ../eval.c:1830 msgid "E687: Less targets than List items" msgstr "E687: Цілей менше, ніж елементів списку" -#: ../eval.c:1834 msgid "E688: More targets than List items" msgstr "E688: Цілей більше, ніж елементів списку" -#: ../eval.c:1906 msgid "Double ; in list of variables" msgstr "Друга ; у списку змінних" # msgstr "E235: " -#: ../eval.c:2078 #, c-format msgid "E738: Can't list variables for %s" msgstr "E738: Не можна перерахувати змінні у %s" -#: ../eval.c:2391 msgid "E689: Can only index a List or Dictionary" msgstr "E689: Індексний доступ може бути тільки до списку чи словника" -#: ../eval.c:2396 msgid "E708: [:] must come last" msgstr "E708: [:] має бути останньою" -#: ../eval.c:2439 msgid "E709: [:] requires a List value" msgstr "E709: [:] вимагає список" -#: ../eval.c:2674 msgid "E710: List value has more items than target" msgstr "E710: Список має більше елементів, ніж ціль" -#: ../eval.c:2678 msgid "E711: List value has not enough items" msgstr "E711: Список має недостатньо елементів" -#: ../eval.c:2867 msgid "E690: Missing \"in\" after :for" msgstr "E690: Пропущено «in» після :for" -#: ../eval.c:3063 #, c-format msgid "E107: Missing parentheses: %s" msgstr "E107: Пропущено дужки: %s" -#: ../eval.c:3263 #, c-format msgid "E108: No such variable: \"%s\"" msgstr "E108: Змінної немає: «%s»" -#: ../eval.c:3333 msgid "E743: variable nested too deep for (un)lock" msgstr "E743: Змінна має забагато вкладень щоб бути за-/відкритою." -#: ../eval.c:3630 msgid "E109: Missing ':' after '?'" msgstr "E109: Бракує ':' після '?'" -#: ../eval.c:3893 msgid "E691: Can only compare List with List" msgstr "E691: Список можна порівняти тільки зі списком" -#: ../eval.c:3895 msgid "E692: Invalid operation for Lists" msgstr "E692: Некоректна операція над списком" -#: ../eval.c:3915 msgid "E735: Can only compare Dictionary with Dictionary" msgstr "E735: Словник можна порівняти тільки із словником" -#: ../eval.c:3917 msgid "E736: Invalid operation for Dictionary" msgstr "E736: Некоректна операція над словником" -#: ../eval.c:3932 msgid "E693: Can only compare Funcref with Funcref" msgstr "E693: Функцію можна порівняти тільки з функцією" -#: ../eval.c:3934 msgid "E694: Invalid operation for Funcrefs" msgstr "E694: Некоректна операція над функцією" -#: ../eval.c:4277 msgid "E804: Cannot use '%' with Float" msgstr "E804: Не можна виконати '%' над Float" -#: ../eval.c:4478 msgid "E110: Missing ')'" msgstr "E110: Пропущено ')'" -#: ../eval.c:4609 msgid "E695: Cannot index a Funcref" msgstr "E695: Функція не має індексації" -#: ../eval.c:4839 #, c-format msgid "E112: Option name missing: %s" msgstr "E112: Бракує назви опції: %s" -#: ../eval.c:4855 #, c-format msgid "E113: Unknown option: %s" msgstr "E113: Невідома опція: %s" -#: ../eval.c:4904 #, c-format msgid "E114: Missing quote: %s" msgstr "E114: Бракує лапки: %s" -#: ../eval.c:5020 #, c-format msgid "E115: Missing quote: %s" msgstr "E115: Бракує лапки: %s" # msgstr "E404: " -#: ../eval.c:5084 #, c-format msgid "E696: Missing comma in List: %s" msgstr "E696: Бракує коми у списку: %s" -#: ../eval.c:5091 #, c-format msgid "E697: Missing end of List ']': %s" msgstr "E697: Немає кінцівки списку ']': %s" # msgstr "E235: " -#: ../eval.c:6475 #, c-format msgid "E720: Missing colon in Dictionary: %s" msgstr "E720: Бракує двокрапки у словнику: %s" -#: ../eval.c:6499 #, c-format msgid "E721: Duplicate key in Dictionary: \"%s\"" msgstr "E721: Повторення ключа в словнику: «%s»" # msgstr "E235: " -#: ../eval.c:6517 #, c-format msgid "E722: Missing comma in Dictionary: %s" msgstr "E722: Бракує коми у словнику: %s" -#: ../eval.c:6524 #, c-format msgid "E723: Missing end of Dictionary '}': %s" msgstr "E723: Немає кінцівки словника '}': %s" # msgstr "E21: " -#: ../eval.c:6555 msgid "E724: variable nested too deep for displaying" msgstr "E724: У змінній забагато вкладень щоб її показати" -#: ../eval.c:7188 #, c-format msgid "E740: Too many arguments for function %s" msgstr "E740: Забагато аргументів для функції %s" -#: ../eval.c:7190 #, c-format msgid "E116: Invalid arguments for function %s" msgstr "E116: Неправильні аргументи функції %s" -#: ../eval.c:7377 #, c-format msgid "E117: Unknown function: %s" msgstr "E117: Невідома функція: %s" -#: ../eval.c:7383 #, c-format msgid "E119: Not enough arguments for function: %s" msgstr "E119: Замало аргументів для функції %s" -#: ../eval.c:7387 #, c-format msgid "E120: Using <SID> not in a script context: %s" msgstr "E120: <SID> використовується не у контексті скрипту: %s" -#: ../eval.c:7391 #, c-format msgid "E725: Calling dict function without Dictionary: %s" msgstr "E725: Виклик dict-функції без словника: %s" -#: ../eval.c:7453 msgid "E808: Number or Float required" msgstr "E808: Треба вказати Number чи Float" # msgstr "E14: " -#: ../eval.c:7503 msgid "add() argument" msgstr "аргумент add()" -#: ../eval.c:7907 msgid "E699: Too many arguments" msgstr "E699: Забагато аргументів" # msgstr "E327: " -#: ../eval.c:8073 msgid "E785: complete() can only be used in Insert mode" msgstr "E785: complete() можна вживати тільки в режимі вставки" -#: ../eval.c:8156 msgid "&Ok" msgstr "&O:Гаразд" # msgstr "E226: " -#: ../eval.c:8676 #, c-format msgid "E737: Key already exists: %s" msgstr "E737: Ключ вже існує: %s" # msgstr "E14: " -#: ../eval.c:8692 msgid "extend() argument" msgstr "аргумент extend()" # msgstr "E14: " -#: ../eval.c:8915 msgid "map() argument" msgstr "аргумент map()" # msgstr "E14: " -#: ../eval.c:8916 msgid "filter() argument" msgstr "аргумент filter()" -#: ../eval.c:9229 #, c-format msgid "+-%s%3ld lines: " msgstr "+-%s%3ld рядків: " -#: ../eval.c:9291 #, c-format msgid "E700: Unknown function: %s" msgstr "E700: Невідома функція: %s" -#: ../eval.c:10729 msgid "called inputrestore() more often than inputsave()" msgstr "Виклики до inputrestore() частіше, ніж до inputsave()" # msgstr "E14: " -#: ../eval.c:10771 msgid "insert() argument" msgstr "аргумент insert()" # msgstr "E406: " -#: ../eval.c:10841 msgid "E786: Range not allowed" msgstr "E786: Інтервал не дозволено" # msgstr "E177: " -#: ../eval.c:11140 msgid "E701: Invalid type for len()" msgstr "E701: Некоректний тип для len()" -#: ../eval.c:11980 msgid "E726: Stride is zero" msgstr "E726: Крок нульовий" -#: ../eval.c:11982 msgid "E727: Start past end" msgstr "E727: Початок за кінцем" -#: ../eval.c:12024 ../eval.c:15297 msgid "<empty>" msgstr "<нічого>" # msgstr "E14: " -#: ../eval.c:12282 msgid "remove() argument" msgstr "аргумент remove()" -#: ../eval.c:12466 msgid "E655: Too many symbolic links (cycle?)" msgstr "E655: Забагато символьних посилань (цикл?)" # msgstr "E14: " -#: ../eval.c:12593 msgid "reverse() argument" msgstr "аргумент reverse()" # msgstr "E14: " -#: ../eval.c:13721 msgid "sort() argument" msgstr "аргумент sort()" # msgstr "E14: " -#: ../eval.c:13721 -#, fuzzy msgid "uniq() argument" -msgstr "аргумент add()" +msgstr "аргумент uniq()" # msgstr "E364: " -#: ../eval.c:13776 msgid "E702: Sort compare function failed" msgstr "E702: Помилка у функції порівняння" # msgstr "E364: " -#: ../eval.c:13806 -#, fuzzy msgid "E882: Uniq compare function failed" -msgstr "E702: Помилка у функції порівняння" +msgstr "E882: Помилка у функції порівняння uniq" -#: ../eval.c:14085 msgid "(Invalid)" msgstr "(Неможливо)" -#: ../eval.c:14590 msgid "E677: Error writing temp file" msgstr "E677: Не вдалося записати тимчасовий файл" -#: ../eval.c:16159 msgid "E805: Using a Float as a Number" msgstr "E805: Float вжито як Number" -#: ../eval.c:16162 msgid "E703: Using a Funcref as a Number" msgstr "E703: Funcref вжито як Number" -#: ../eval.c:16170 msgid "E745: Using a List as a Number" msgstr "E745: List вжито як Number" -#: ../eval.c:16173 msgid "E728: Using a Dictionary as a Number" msgstr "E728: Dictionary вжито як Number" -#: ../eval.c:16259 msgid "E729: using Funcref as a String" msgstr "E729: Funcref вжито як String" # msgstr "E373: " -#: ../eval.c:16262 msgid "E730: using List as a String" msgstr "E730: List вжито як String" -#: ../eval.c:16265 msgid "E731: using Dictionary as a String" msgstr "E731: Dictionary вжито як String" -#: ../eval.c:16619 #, c-format msgid "E706: Variable type mismatch for: %s" msgstr "E706: Неправильний тип змінної: %s" -#: ../eval.c:16705 #, c-format msgid "E795: Cannot delete variable %s" msgstr "E795: Не можна знищити змінну %s" -#: ../eval.c:16724 #, c-format msgid "E704: Funcref variable name must start with a capital: %s" msgstr "E704: Назва змінної Funcref має починатися з великої літери: %s" -#: ../eval.c:16732 #, c-format msgid "E705: Variable name conflicts with existing function: %s" msgstr "E705: Назва змінної співпадає з існуючою функцією: %s" -#: ../eval.c:16763 #, c-format msgid "E741: Value is locked: %s" msgstr "E741: Значення захищене: %s" -#: ../eval.c:16764 ../eval.c:16769 ../message.c:1839 msgid "Unknown" msgstr "Невідомо" -#: ../eval.c:16768 #, c-format msgid "E742: Cannot change value of %s" msgstr "E742: Не можна змінити значення %s" -#: ../eval.c:16838 msgid "E698: variable nested too deep for making a copy" msgstr "E698: Змінна вкладена занадто глибоко щоб зробити її копію" -#: ../eval.c:17249 #, c-format msgid "E123: Undefined function: %s" msgstr "E123: Невизначена функція: %s" -#: ../eval.c:17260 #, c-format msgid "E124: Missing '(': %s" msgstr "E124: Бракує '(': %s" -#: ../eval.c:17293 msgid "E862: Cannot use g: here" msgstr "E862: Тут не можна використати g:" -#: ../eval.c:17312 #, c-format msgid "E125: Illegal argument: %s" msgstr "E125: Недозволений аргумент: %s" -#: ../eval.c:17323 #, c-format msgid "E853: Duplicate argument name: %s" msgstr "E853: Назва аргументу повторюється: %s" -#: ../eval.c:17416 msgid "E126: Missing :endfunction" msgstr "E126: Бракує :endfunction" -#: ../eval.c:17537 #, c-format msgid "E707: Function name conflicts with variable: %s" msgstr "E707: Назва функції співпадає зі змінною: %s" -#: ../eval.c:17549 #, c-format msgid "E127: Cannot redefine function %s: It is in use" msgstr "E127: Не вдалося перевизначити функцію %s: вона використовується" -#: ../eval.c:17604 #, c-format msgid "E746: Function name does not match script file name: %s" msgstr "E746: Назва функції не збігається з назвою файлу скрипту: %s" -#: ../eval.c:17716 msgid "E129: Function name required" msgstr "E129: Не вказано назву функції" -#: ../eval.c:17824 -#, fuzzy, c-format +#, c-format msgid "E128: Function name must start with a capital or \"s:\": %s" msgstr "" -"E128: Назва функції має починатися з великої літери або містити двокрапку: %s" +"E128: Назва функції має починатися з великої літери або \"s:\": %s" -#: ../eval.c:17833 -#, fuzzy, c-format +#, c-format msgid "E884: Function name cannot contain a colon: %s" msgstr "" -"E128: Назва функції має починатися з великої літери або містити двокрапку: %s" +"E884: Назва функції не може містити двокрапку: %s" -#: ../eval.c:18336 #, c-format msgid "E131: Cannot delete function %s: It is in use" msgstr "E131: Не вдалося знищити функцію %s: Вона використовується" -#: ../eval.c:18441 msgid "E132: Function call depth is higher than 'maxfuncdepth'" msgstr "E132: Глибина викликів функції перевищує 'maxfuncdepth'" -#: ../eval.c:18568 #, c-format msgid "calling %s" msgstr "викликається %s" -#: ../eval.c:18651 #, c-format msgid "%s aborted" msgstr "%s припинено" -#: ../eval.c:18653 #, c-format msgid "%s returning #%<PRId64>" msgstr "%s повертає #%<PRId64>" -#: ../eval.c:18670 #, c-format msgid "%s returning %s" msgstr "%s повертає %s" -#: ../eval.c:18691 ../ex_cmds2.c:2695 #, c-format msgid "continuing in %s" msgstr "продовження в %s" -#: ../eval.c:18795 msgid "E133: :return not inside a function" msgstr "E133: :return поза межами функції" -#: ../eval.c:19159 msgid "" "\n" "# global variables:\n" @@ -1040,7 +814,6 @@ msgstr "" "\n" "# глобальні змінні:\n" -#: ../eval.c:19254 msgid "" "\n" "\tLast set from " @@ -1048,104 +821,82 @@ msgstr "" "\n" "\tВостаннє змінена у " -#: ../eval.c:19272 msgid "No old files" msgstr "Жодного старого файлу" -#: ../ex_cmds.c:122 #, c-format msgid "<%s>%s%s %d, Hex %02x, Octal %03o" msgstr "<%s>%s%s %d, шіст %02x, віс %03o" -#: ../ex_cmds.c:145 #, c-format msgid "> %d, Hex %04x, Octal %o" msgstr "> %d, шіст %04x, віс %o" -#: ../ex_cmds.c:146 #, c-format msgid "> %d, Hex %08x, Octal %o" msgstr "> %d, шіст %08x, віс %o" -#: ../ex_cmds.c:684 msgid "E134: Move lines into themselves" msgstr "E134: Неможливо перемістити рядки самі в себе" -#: ../ex_cmds.c:747 msgid "1 line moved" msgstr "Переміщено один рядок" -#: ../ex_cmds.c:749 #, c-format msgid "%<PRId64> lines moved" msgstr "Переміщено %<PRId64> рядки(ів)" -#: ../ex_cmds.c:1175 #, c-format msgid "%<PRId64> lines filtered" msgstr "Відфільтровано %<PRId64> рядки(ів)" -#: ../ex_cmds.c:1194 msgid "E135: *Filter* Autocommands must not change current buffer" msgstr "E135: Автокоманди *Filter* не повинні змінювати поточний буфер" -#: ../ex_cmds.c:1244 msgid "[No write since last change]\n" msgstr "[Зміни не записано]\n" -#: ../ex_cmds.c:1424 #, c-format msgid "%sviminfo: %s in line: " msgstr "%sviminfo: %s в рядку: " -#: ../ex_cmds.c:1431 msgid "E136: viminfo: Too many errors, skipping rest of file" msgstr "E136: viminfo: Забагато помилок, решта файлу буде пропущено" -#: ../ex_cmds.c:1458 #, c-format msgid "Reading viminfo file \"%s\"%s%s%s" msgstr "Зчитується файл viminfo: «%s»%s%s%s" -#: ../ex_cmds.c:1460 msgid " info" msgstr " інформація" -#: ../ex_cmds.c:1461 msgid " marks" msgstr " позначки" -#: ../ex_cmds.c:1462 msgid " oldfiles" msgstr " старі файли" -#: ../ex_cmds.c:1463 msgid " FAILED" msgstr " НЕ ВДАЛОСЯ" #. avoid a wait_return for this message, it's annoying -#: ../ex_cmds.c:1541 #, c-format msgid "E137: Viminfo file is not writable: %s" msgstr "E137: Не дозволено запис у файл viminfo: %s" -#: ../ex_cmds.c:1626 #, c-format msgid "E138: Can't write viminfo file %s!" msgstr "E138: Не вдалося записати файл viminfo %s!" -#: ../ex_cmds.c:1635 #, c-format msgid "Writing viminfo file \"%s\"" msgstr "Записується файл viminfo «%s»" #. Write the info: -#: ../ex_cmds.c:1720 #, c-format msgid "# This viminfo file was generated by Vim %s.\n" msgstr "# Цей файл автоматично створений Vim %s.\n" -#: ../ex_cmds.c:1722 msgid "" "# You may edit it if you're careful!\n" "\n" @@ -1153,47 +904,37 @@ msgstr "" "# Можете редагувати, але ОБЕРЕЖНО!\n" "\n" -#: ../ex_cmds.c:1723 msgid "# Value of 'encoding' when this file was written\n" msgstr "# Значення 'encoding' під час створення цього файлу\n" -#: ../ex_cmds.c:1800 msgid "Illegal starting char" msgstr "Недозволений символ на початку рядка" -#: ../ex_cmds.c:2162 msgid "Write partial file?" msgstr "Записати частину файлу?" -#: ../ex_cmds.c:2166 msgid "E140: Use ! to write partial buffer" msgstr "E140: Використайте ! для запису частини буфера" -#: ../ex_cmds.c:2281 #, c-format msgid "Overwrite existing file \"%s\"?" msgstr "Переписати існуючий файл «%s»?" -#: ../ex_cmds.c:2317 #, c-format msgid "Swap file \"%s\" exists, overwrite anyway?" msgstr "Файл обміну «%s» існує, перезаписати?" -#: ../ex_cmds.c:2326 #, c-format msgid "E768: Swap file exists: %s (:silent! overrides)" msgstr "E768: Файл обміну існує: %s (:silent! переважує)" -#: ../ex_cmds.c:2381 #, c-format msgid "E141: No file name for buffer %<PRId64>" msgstr "E141: Немає вхідного файлу для буфера %<PRId64>" -#: ../ex_cmds.c:2412 msgid "E142: File not written: Writing is disabled by 'write' option" msgstr "E142: Файл не записано: запис заборонено опцією 'write'" -#: ../ex_cmds.c:2434 #, c-format msgid "" "'readonly' option is set for \"%s\".\n" @@ -1202,7 +943,6 @@ msgstr "" "Для «%s» встановлено 'readonly'.\n" "Бажаєте все одно продовжити запис?" -#: ../ex_cmds.c:2439 #, c-format msgid "" "File permissions of \"%s\" are read-only.\n" @@ -1213,84 +953,66 @@ msgstr "" "Проте, можливо, його можна записати.\n" "Хочете спробувати?" -#: ../ex_cmds.c:2451 #, c-format msgid "E505: \"%s\" is read-only (add ! to override)" msgstr "E505: «%s» тільки для читання (! щоб не зважати)" -#: ../ex_cmds.c:3120 #, c-format msgid "E143: Autocommands unexpectedly deleted new buffer %s" msgstr "E143: Автокоманди несподівано знищили новий буфер %s" -#: ../ex_cmds.c:3313 msgid "E144: non-numeric argument to :z" msgstr "E144: нечисловий аргумент для :z" -#: ../ex_cmds.c:3404 msgid "E145: Shell commands not allowed in rvim" msgstr "E145: У rvim не дозволені команди оболонки" -#: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Регулярні вирази не можна розділяти літерами" -#: ../ex_cmds.c:3964 #, c-format msgid "replace with %s (y/n/a/q/l/^E/^Y)?" msgstr "Замінити на %s (y/n/a/q/l/^E/^Y)?" -#: ../ex_cmds.c:4379 msgid "(Interrupted) " msgstr "(Перервано) " # msgstr "E31: " -#: ../ex_cmds.c:4384 msgid "1 match" msgstr "Один збіг" -#: ../ex_cmds.c:4384 msgid "1 substitution" msgstr "Одна заміна" -#: ../ex_cmds.c:4387 #, c-format msgid "%<PRId64> matches" msgstr "%<PRId64> збіги(ів)" -#: ../ex_cmds.c:4388 #, c-format msgid "%<PRId64> substitutions" msgstr "%<PRId64> замін(и)" -#: ../ex_cmds.c:4392 msgid " on 1 line" msgstr " в одному рядку" -#: ../ex_cmds.c:4395 #, c-format msgid " on %<PRId64> lines" msgstr " в %<PRId64> рядках" -#: ../ex_cmds.c:4438 msgid "E147: Cannot do :global recursive" msgstr "E147: :global не можна вживати рекурсивно" -#: ../ex_cmds.c:4467 msgid "E148: Regular expression missing from global" msgstr "E148: У global бракує зразка" -#: ../ex_cmds.c:4508 #, c-format msgid "Pattern found in every line: %s" msgstr "Зразок знайдено у кожному рядку: %s" -#: ../ex_cmds.c:4510 #, c-format msgid "Pattern not found: %s" msgstr "Зразок не знайдено: %s" -#: ../ex_cmds.c:4587 msgid "" "\n" "# Last Substitute String:\n" @@ -1300,338 +1022,265 @@ msgstr "" "# Остання заміна:\n" "$" -#: ../ex_cmds.c:4679 msgid "E478: Don't panic!" msgstr "E478: Без паніки!" -#: ../ex_cmds.c:4717 #, c-format msgid "E661: Sorry, no '%s' help for %s" msgstr "E661: Вибачте, немає допомоги '%s' для %s" -#: ../ex_cmds.c:4719 #, c-format msgid "E149: Sorry, no help for %s" msgstr "E149: Вибачте, немає допомоги для %s" -#: ../ex_cmds.c:4751 #, c-format msgid "Sorry, help file \"%s\" not found" msgstr "Вибачте, файл допомоги «%s» не знайдено" -#: ../ex_cmds.c:5323 #, c-format msgid "E150: Not a directory: %s" msgstr "E150: Не є каталогом: %s" -#: ../ex_cmds.c:5446 #, c-format msgid "E152: Cannot open %s for writing" msgstr "E152: Не вдалося відкрити %s для запису" -#: ../ex_cmds.c:5471 #, c-format msgid "E153: Unable to open %s for reading" msgstr "E153: Не вдалося відкрити %s для читання" -#: ../ex_cmds.c:5500 #, c-format msgid "E670: Mix of help file encodings within a language: %s" msgstr "E670: Мішанина кодувань файлу допомоги для мови %s" -#: ../ex_cmds.c:5565 #, c-format msgid "E154: Duplicate tag \"%s\" in file %s/%s" msgstr "E154: Повторення теґу «%s» у файлі %s/%s" -#: ../ex_cmds.c:5687 #, c-format msgid "E160: Unknown sign command: %s" msgstr "E160: Невідома команда надпису: %s" -#: ../ex_cmds.c:5704 msgid "E156: Missing sign name" msgstr "E156: Пропущено назву надпису" -#: ../ex_cmds.c:5746 msgid "E612: Too many signs defined" msgstr "E612: Визначено забагато надписів" -#: ../ex_cmds.c:5813 #, c-format msgid "E239: Invalid sign text: %s" msgstr "E239: Некоректний надпис: %s" -#: ../ex_cmds.c:5844 ../ex_cmds.c:6035 #, c-format msgid "E155: Unknown sign: %s" msgstr "E155: Невідомий надпис: %s" -#: ../ex_cmds.c:5877 msgid "E159: Missing sign number" msgstr "E159: Пропущено номер надпису" -#: ../ex_cmds.c:5971 #, c-format msgid "E158: Invalid buffer name: %s" msgstr "E158: Некоректна назва буфера: %s" -#: ../ex_cmds.c:6008 #, c-format msgid "E157: Invalid sign ID: %<PRId64>" msgstr "E157: Неправильний ID надпису: %<PRId64>" -#: ../ex_cmds.c:6066 msgid " (not supported)" msgstr " (не підтримується)" -#: ../ex_cmds.c:6169 msgid "[Deleted]" msgstr "[Знищено]" -#: ../ex_cmds2.c:139 msgid "Entering Debug mode. Type \"cont\" to continue." msgstr "Режим налагодження. Щоб продовжити введіть «cont»." -#: ../ex_cmds2.c:143 ../ex_docmd.c:759 #, c-format msgid "line %<PRId64>: %s" msgstr "рядок %<PRId64>: %s" -#: ../ex_cmds2.c:145 #, c-format msgid "cmd: %s" msgstr "команда: %s" -#: ../ex_cmds2.c:322 #, c-format msgid "Breakpoint in \"%s%s\" line %<PRId64>" msgstr "Точка зупинки в «%s%s» рядок %<PRId64>" -#: ../ex_cmds2.c:581 #, c-format msgid "E161: Breakpoint not found: %s" msgstr "E161: Точку зупинки не знайдено: %s" -#: ../ex_cmds2.c:611 msgid "No breakpoints defined" msgstr "Не визначено жодної точки зупинки" -#: ../ex_cmds2.c:617 #, c-format msgid "%3d %s %s line %<PRId64>" msgstr "%3d %s %s рядок %<PRId64>" -#: ../ex_cmds2.c:942 msgid "E750: First use \":profile start {fname}\"" msgstr "E750: Спочатку зробіть «:profile start {файл}»" -#: ../ex_cmds2.c:1269 #, c-format msgid "Save changes to \"%s\"?" msgstr "Зберегти зміни в «%s»?" -#: ../ex_cmds2.c:1271 ../ex_docmd.c:8851 msgid "Untitled" msgstr "Неназваний" -#: ../ex_cmds2.c:1421 #, c-format msgid "E162: No write since last change for buffer \"%s\"" msgstr "E162: Буфер «%s» має незбережені зміни" -#: ../ex_cmds2.c:1480 msgid "Warning: Entered other buffer unexpectedly (check autocommands)" msgstr "" "Обережно: Несподівано опинилися у іншому буфері (перевірте автокоманди)" -#: ../ex_cmds2.c:1826 msgid "E163: There is only one file to edit" msgstr "E163: Редагується лише один файл" -#: ../ex_cmds2.c:1828 msgid "E164: Cannot go before first file" msgstr "E164: Це вже найперший файл" -#: ../ex_cmds2.c:1830 msgid "E165: Cannot go beyond last file" msgstr "E165: Це вже останній файл" -#: ../ex_cmds2.c:2175 #, c-format msgid "E666: compiler not supported: %s" msgstr "E666: Компілятор не підтримується: %s" # msgstr "E195: " -#: ../ex_cmds2.c:2257 #, c-format msgid "Searching for \"%s\" in \"%s\"" msgstr "Пошук «%s» в «%s»" -#: ../ex_cmds2.c:2284 #, c-format msgid "Searching for \"%s\"" msgstr "Пошук «%s»" -#: ../ex_cmds2.c:2307 #, c-format msgid "not found in 'runtimepath': \"%s\"" msgstr "В 'runtimepath' не знайдено «%s»" -#: ../ex_cmds2.c:2472 #, c-format msgid "Cannot source a directory: \"%s\"" msgstr "Не вдалося прочитати каталог: «%s»" -#: ../ex_cmds2.c:2518 #, c-format msgid "could not source \"%s\"" msgstr "Не вдалося виконати «%s»" -#: ../ex_cmds2.c:2520 #, c-format msgid "line %<PRId64>: could not source \"%s\"" msgstr "рядок %<PRId64>: не вдалося виконати «%s»" -#: ../ex_cmds2.c:2535 #, c-format msgid "sourcing \"%s\"" msgstr "виконується «%s»" -#: ../ex_cmds2.c:2537 #, c-format msgid "line %<PRId64>: sourcing \"%s\"" msgstr "рядок %<PRId64>: виконується «%s»" -#: ../ex_cmds2.c:2693 #, c-format msgid "finished sourcing %s" msgstr "закінчено виконання %s" -#: ../ex_cmds2.c:2765 msgid "modeline" msgstr "modeline" # msgstr "E14: " -#: ../ex_cmds2.c:2767 msgid "--cmd argument" msgstr "--cmd аргумент" # msgstr "E14: " -#: ../ex_cmds2.c:2769 msgid "-c argument" msgstr "-c аргумент" -#: ../ex_cmds2.c:2771 msgid "environment variable" msgstr "змінна оточення" -#: ../ex_cmds2.c:2773 msgid "error handler" msgstr "обробник помилки" -#: ../ex_cmds2.c:3020 msgid "W15: Warning: Wrong line separator, ^M may be missing" msgstr "W15: Застереження: Неправильний роздільник рядків, можливо, бракує ^M" -#: ../ex_cmds2.c:3139 msgid "E167: :scriptencoding used outside of a sourced file" msgstr "E167: :scriptencoding використано поза виконуваним файлом" -#: ../ex_cmds2.c:3166 msgid "E168: :finish used outside of a sourced file" msgstr "E168: :finish використано поза виконуваним файлом" -#: ../ex_cmds2.c:3389 #, c-format msgid "Current %slanguage: \"%s\"" msgstr "Мова (%s): «%s»" -#: ../ex_cmds2.c:3404 #, c-format msgid "E197: Cannot set language to \"%s\"" msgstr "E197: Не вдалося встановити мову «%s»" #. don't redisplay the window #. don't wait for return -#: ../ex_docmd.c:387 msgid "Entering Ex mode. Type \"visual\" to go to Normal mode." msgstr "Режим Ex. Для повернення до нормального режиму виконайте «visual»" -#: ../ex_docmd.c:428 msgid "E501: At end-of-file" msgstr "E501: Кінець файлу" -#: ../ex_docmd.c:513 msgid "E169: Command too recursive" msgstr "E169: Команда занадто рекурсивна" -#: ../ex_docmd.c:1006 #, c-format msgid "E605: Exception not caught: %s" msgstr "E605: Виняткова ситуація не оброблена: %s" -#: ../ex_docmd.c:1085 msgid "End of sourced file" msgstr "Кінець виконуваного файлу" -#: ../ex_docmd.c:1086 msgid "End of function" msgstr "Кінець функції" -#: ../ex_docmd.c:1628 msgid "E464: Ambiguous use of user-defined command" msgstr "E464: Неоднозначний вжиток команди користувача" -#: ../ex_docmd.c:1638 msgid "E492: Not an editor command" msgstr "E492: Це не команда редактора" -#: ../ex_docmd.c:1729 msgid "E493: Backwards range given" msgstr "E493: Інтервал задано навиворіт" -#: ../ex_docmd.c:1733 msgid "Backwards range given, OK to swap" msgstr "Інтервал задано навиворіт, щоб поміняти місцями — ГАРАЗД" #. append #. typed wrong -#: ../ex_docmd.c:1787 msgid "E494: Use w or w>>" msgstr "E494: Спробуйте w або w>>" -#: ../ex_docmd.c:3454 msgid "E319: The command is not available in this version" msgstr "E319: Вибачте, цієї команди немає у цій версії" -#: ../ex_docmd.c:3752 msgid "E172: Only one file name allowed" msgstr "E172: Дозволено тільки одну назву файлу" -#: ../ex_docmd.c:4238 msgid "1 more file to edit. Quit anyway?" msgstr "Залишилося відредагувати ще один файл. Все одно вийти?" -#: ../ex_docmd.c:4242 #, c-format msgid "%d more files to edit. Quit anyway?" msgstr "Ще є %d не редагованих файлів. Все одно вийти?" -#: ../ex_docmd.c:4248 msgid "E173: 1 more file to edit" msgstr "E173: Залишилося відредагувати ще один файл" -#: ../ex_docmd.c:4250 #, c-format msgid "E173: %<PRId64> more files to edit" msgstr "E173: Залишилося %<PRId64> не редагованих файлів" -#: ../ex_docmd.c:4320 msgid "E174: Command already exists: add ! to replace it" msgstr "E174: Команда вже існує, ! щоб замінити її" -#: ../ex_docmd.c:4432 msgid "" "\n" " Name Args Range Complete Definition" @@ -1639,353 +1288,276 @@ msgstr "" "\n" " Назва Арг. Межа Доповнення Визначення" -#: ../ex_docmd.c:4516 msgid "No user-defined commands found" msgstr "Не знайдено команд користувача" -#: ../ex_docmd.c:4538 msgid "E175: No attribute specified" msgstr "E175: Не вказано атрибутів" -#: ../ex_docmd.c:4583 msgid "E176: Invalid number of arguments" msgstr "E176: Неправильна кількість аргументів" -#: ../ex_docmd.c:4594 msgid "E177: Count cannot be specified twice" msgstr "E177: Лічильник не може бути вказано двічі" # msgstr "E177: " -#: ../ex_docmd.c:4603 msgid "E178: Invalid default value for count" msgstr "E178: Неправильне початкове значення лічильника" # msgstr "E178: " -#: ../ex_docmd.c:4625 msgid "E179: argument required for -complete" msgstr "E179: для -complete потрібний аргумент" # msgstr "E180: " -#: ../ex_docmd.c:4635 #, c-format msgid "E181: Invalid attribute: %s" msgstr "E181: Неправильний атрибут: %s" # msgstr "E181: " -#: ../ex_docmd.c:4678 msgid "E182: Invalid command name" msgstr "E182: Неправильна назва команди" # msgstr "E182: " -#: ../ex_docmd.c:4691 msgid "E183: User defined commands must start with an uppercase letter" msgstr "E183: Команди користувача повинні починатися з великої літери" -#: ../ex_docmd.c:4696 msgid "E841: Reserved name, cannot be used for user defined command" msgstr "" "E841: Зарезервована назва, не можна використати для користувацької команди" # msgstr "E183: " -#: ../ex_docmd.c:4751 #, c-format msgid "E184: No such user-defined command: %s" msgstr "E184: Команду користувача не знайдено: %s" # msgstr "E179: " -#: ../ex_docmd.c:5219 #, c-format msgid "E180: Invalid complete value: %s" msgstr "E180: Неправильне доповнення: %s" -#: ../ex_docmd.c:5225 msgid "E468: Completion argument only allowed for custom completion" msgstr "E468: Аргумент дозволений тільки для користувацького доповнення" -#: ../ex_docmd.c:5231 msgid "E467: Custom completion requires a function argument" msgstr "E467: Користувацьке доповнення вимагає аргумент-функцію" # msgstr "E184: " -#: ../ex_docmd.c:5257 #, c-format msgid "E185: Cannot find color scheme '%s'" msgstr "E185: Не вдалося знайти схему кольорів «%s»" -#: ../ex_docmd.c:5263 msgid "Greetings, Vim user!" msgstr "Вітання, користувачу Vim!" # msgstr "E443: " -#: ../ex_docmd.c:5431 msgid "E784: Cannot close last tab page" msgstr "E784: Не можна закрити останню вкладку" # msgstr "E444: " -#: ../ex_docmd.c:5462 msgid "Already only one tab page" msgstr "Вже й так лише одна вкладка" -#: ../ex_docmd.c:6004 #, c-format msgid "Tab page %d" msgstr "Вкладка %d" -#: ../ex_docmd.c:6295 msgid "No swap file" msgstr "Немає файлу обміну" -#: ../ex_docmd.c:6478 msgid "E747: Cannot change directory, buffer is modified (add ! to override)" msgstr "E747: Не вдалося змінити каталог, буфер має зміни (! щоб не зважати)" -#: ../ex_docmd.c:6485 msgid "E186: No previous directory" msgstr "E186: Це вже найперший каталог" # msgstr "E186: " -#: ../ex_docmd.c:6530 msgid "E187: Unknown" msgstr "E187: Невідомо" -#: ../ex_docmd.c:6610 msgid "E465: :winsize requires two number arguments" msgstr "E465: :winsize вимагає два числових аргументи" -#: ../ex_docmd.c:6655 msgid "E188: Obtaining window position not implemented for this platform" msgstr "E188: Не можна отримати позицію вікна на цій платформі" -#: ../ex_docmd.c:6662 msgid "E466: :winpos requires two number arguments" msgstr "E466: :winpos вимагає два числових аргументи" -#: ../ex_docmd.c:7241 #, c-format msgid "E739: Cannot create directory: %s" msgstr "E739: Не вдалося створити каталог: %s" -#: ../ex_docmd.c:7268 #, c-format msgid "E189: \"%s\" exists (add ! to override)" msgstr "E189: Файл «%s» існує (! щоб не зважати)" # msgstr "E189: " -#: ../ex_docmd.c:7273 #, c-format msgid "E190: Cannot open \"%s\" for writing" msgstr "E190: Не вдалося відкрити «%s» для запису" # msgstr "E190: " #. set mark -#: ../ex_docmd.c:7294 msgid "E191: Argument must be a letter or forward/backward quote" msgstr "E191: Аргумент має бути літерою, ` або '" # msgstr "E191: " -#: ../ex_docmd.c:7333 msgid "E192: Recursive use of :normal too deep" msgstr "E192: Забагато вкладених :normal" # msgstr "E193: " -#: ../ex_docmd.c:7807 msgid "E194: No alternate file name to substitute for '#'" msgstr "E194: Немає назви вторинного файлу для заміни '#'" -#: ../ex_docmd.c:7841 msgid "E495: no autocommand file name to substitute for \"<afile>\"" msgstr "E495: Немає назви файлу автокоманди для заміни «<afile>»" -#: ../ex_docmd.c:7850 msgid "E496: no autocommand buffer number to substitute for \"<abuf>\"" msgstr "E496: Немає номера буфера автокоманди для заміни «<abuf>»" -#: ../ex_docmd.c:7861 msgid "E497: no autocommand match name to substitute for \"<amatch>\"" msgstr "E497: Немає назви збігу автокоманди для заміни «<amatch>»" -#: ../ex_docmd.c:7870 msgid "E498: no :source file name to substitute for \"<sfile>\"" msgstr "E498: Немає назви файлу :source для заміни «<sfile>»" -#: ../ex_docmd.c:7876 msgid "E842: no line number to use for \"<slnum>\"" msgstr "E842: немає номера рядка, щоб використати з «<sfile>»" -#: ../ex_docmd.c:7903 -#, fuzzy, c-format +#, c-format msgid "E499: Empty file name for '%' or '#', only works with \":p:h\"" msgstr "E499: Назва файлу для '%' чи '#' порожня, працює лише з «:p:h»" -#: ../ex_docmd.c:7905 msgid "E500: Evaluates to an empty string" msgstr "E500: Результат — порожній рядок" -#: ../ex_docmd.c:8838 msgid "E195: Cannot open viminfo file for reading" msgstr "E195: Не вдалося прочитати файл viminfo" -#: ../ex_eval.c:464 msgid "E608: Cannot :throw exceptions with 'Vim' prefix" msgstr "E608: Не можна викидати (:throw) винятки з префіксом 'Vim'" #. always scroll up, don't overwrite -#: ../ex_eval.c:496 #, c-format msgid "Exception thrown: %s" msgstr "Виняткова ситуація: %s" -#: ../ex_eval.c:545 #, c-format msgid "Exception finished: %s" msgstr "Виняток закінчено: %s" -#: ../ex_eval.c:546 #, c-format msgid "Exception discarded: %s" msgstr "Виняток скинуто: %s" -#: ../ex_eval.c:588 ../ex_eval.c:634 #, c-format msgid "%s, line %<PRId64>" msgstr "%s, рядок %<PRId64>" #. always scroll up, don't overwrite -#: ../ex_eval.c:608 #, c-format msgid "Exception caught: %s" msgstr "Спіймано виняткову ситуацію: %s" -#: ../ex_eval.c:676 #, c-format msgid "%s made pending" msgstr "Очікується %s" -#: ../ex_eval.c:679 #, c-format msgid "%s resumed" msgstr "Відновлено %s" -#: ../ex_eval.c:683 #, c-format msgid "%s discarded" msgstr "Скинуто %s" -#: ../ex_eval.c:708 msgid "Exception" msgstr "Виняток" -#: ../ex_eval.c:713 msgid "Error and interrupt" msgstr "Помилка, перервано" # msgstr "E231: " -#: ../ex_eval.c:715 msgid "Error" msgstr "Помилка" #. if (pending & CSTP_INTERRUPT) -#: ../ex_eval.c:717 msgid "Interrupt" msgstr "Перервано" -#: ../ex_eval.c:795 msgid "E579: :if nesting too deep" msgstr "E579: Занадто багато вкладених :if" -#: ../ex_eval.c:830 msgid "E580: :endif without :if" msgstr "E580: :endif без :if" -#: ../ex_eval.c:873 msgid "E581: :else without :if" msgstr "E581: :else без :if" -#: ../ex_eval.c:876 msgid "E582: :elseif without :if" msgstr "E582: :elseif без :if" -#: ../ex_eval.c:880 msgid "E583: multiple :else" msgstr "E583: Не одне :else" -#: ../ex_eval.c:883 msgid "E584: :elseif after :else" msgstr "E584: :elseif після :else" -#: ../ex_eval.c:941 msgid "E585: :while/:for nesting too deep" msgstr "E585: Забагато вкладених :while/:for" -#: ../ex_eval.c:1028 msgid "E586: :continue without :while or :for" msgstr "E586: :continue без :while чи :for" -#: ../ex_eval.c:1061 msgid "E587: :break without :while or :for" msgstr "E587: :break без :while чи :for" -#: ../ex_eval.c:1102 msgid "E732: Using :endfor with :while" msgstr "E732: Вжито :endfor із :while" -#: ../ex_eval.c:1104 msgid "E733: Using :endwhile with :for" msgstr "E733: Вжито :endwhile із :for" -#: ../ex_eval.c:1247 msgid "E601: :try nesting too deep" msgstr "E601: Забагато вкладених :try" -#: ../ex_eval.c:1317 msgid "E603: :catch without :try" msgstr "E603: :catch без :try" #. Give up for a ":catch" after ":finally" and ignore it. #. * Just parse. -#: ../ex_eval.c:1332 msgid "E604: :catch after :finally" msgstr "E604: :catch після :finally" -#: ../ex_eval.c:1451 msgid "E606: :finally without :try" msgstr "E606: :finally без :try" #. Give up for a multiple ":finally" and ignore it. -#: ../ex_eval.c:1467 msgid "E607: multiple :finally" msgstr "E607: Не одне :finally" -#: ../ex_eval.c:1571 msgid "E602: :endtry without :try" msgstr "E602: :entry без :try" -#: ../ex_eval.c:2026 msgid "E193: :endfunction not inside a function" msgstr "E193: :endfunction поза межами функції" -#: ../ex_getln.c:1643 msgid "E788: Not allowed to edit another buffer now" msgstr "E788: Зараз не можна редагувати інший буфер" -#: ../ex_getln.c:1656 msgid "E811: Not allowed to change buffer information now" msgstr "E811: Зараз не можна змінювати інформацію буфера" # msgstr "E197: " -#: ../ex_getln.c:3178 msgid "tagname" msgstr "назва теґу" -#: ../ex_getln.c:3181 msgid " kind file\n" msgstr " тип файлу\n" -#: ../ex_getln.c:4799 msgid "'history' option is zero" msgstr "Опція 'history' порожня" -#: ../ex_getln.c:5046 #, c-format msgid "" "\n" @@ -1994,35 +1566,27 @@ msgstr "" "\n" "# Попередні %s (від найновіших):\n" -#: ../ex_getln.c:5047 msgid "Command Line" msgstr "команди" -#: ../ex_getln.c:5048 msgid "Search String" msgstr "шукані рядки" -#: ../ex_getln.c:5049 msgid "Expression" msgstr "вирази" -#: ../ex_getln.c:5050 msgid "Input Line" msgstr "введені рядки" -#: ../ex_getln.c:5117 msgid "E198: cmd_pchar beyond the command length" msgstr "E198: cmd_pchar поза межами команди" -#: ../ex_getln.c:5279 msgid "E199: Active window or buffer deleted" msgstr "E199: Активне вікно або буфер було знищено" -#: ../file_search.c:203 msgid "E854: path too long for completion" msgstr "E854: шлях занадто довгий для доповнення" -#: ../file_search.c:446 #, c-format msgid "" "E343: Invalid path: '**[number]' must be at the end of the path or be " @@ -2032,217 +1596,169 @@ msgstr "" "'%s'." # msgstr "E343: " -#: ../file_search.c:1505 #, c-format msgid "E344: Can't find directory \"%s\" in cdpath" msgstr "E344: Не вдалося знайти каталог «%s» у cdpath" # msgstr "E344: " -#: ../file_search.c:1508 #, c-format msgid "E345: Can't find file \"%s\" in path" msgstr "E345: Не вдалося знайти файл «%s» у path" # msgstr "E345: " -#: ../file_search.c:1512 #, c-format msgid "E346: No more directory \"%s\" found in cdpath" msgstr "E346: У cdpath немає більше каталогу «%s»" # msgstr "E346: " -#: ../file_search.c:1515 #, c-format msgid "E347: No more file \"%s\" found in path" msgstr "E347: У шляху пошуку більше немає файлів «%s»" -#: ../fileio.c:137 msgid "E812: Autocommands changed buffer or buffer name" msgstr "E812: Автокоманди змінили буфер чи його назву" # msgstr "E199: " -#: ../fileio.c:368 msgid "Illegal file name" msgstr "Недозволена назва файлу" -#: ../fileio.c:395 ../fileio.c:476 ../fileio.c:2543 ../fileio.c:2578 msgid "is a directory" msgstr "каталог" -#: ../fileio.c:397 msgid "is not a file" msgstr "не файл" -#: ../fileio.c:508 ../fileio.c:3522 msgid "[New File]" msgstr "[Новий файл]" -#: ../fileio.c:511 msgid "[New DIRECTORY]" msgstr "[Новий каталог]" -#: ../fileio.c:529 ../fileio.c:532 msgid "[File too big]" msgstr "[Файл завеликий]" -#: ../fileio.c:534 msgid "[Permission Denied]" msgstr "[Відмовлено]" -#: ../fileio.c:653 msgid "E200: *ReadPre autocommands made the file unreadable" msgstr "E200: Автокоманди *ReadPre унеможливили читання файлу" # msgstr "E200: " -#: ../fileio.c:655 msgid "E201: *ReadPre autocommands must not change current buffer" msgstr "E201: Автокоманди *ReadPre не повинні змінювати цей буфер" # msgstr "E201: " -#: ../fileio.c:672 msgid "Nvim: Reading from stdin...\n" msgstr "Vim: Читається з stdin...\n" #. Re-opening the original file failed! -#: ../fileio.c:909 msgid "E202: Conversion made file unreadable!" msgstr "E202: Конвертація унеможливила читання файлу!" # msgstr "E202: " #. fifo or socket -#: ../fileio.c:1782 msgid "[fifo/socket]" msgstr "[канал/сокет]" #. fifo -#: ../fileio.c:1788 msgid "[fifo]" msgstr "[канал]" #. or socket -#: ../fileio.c:1794 msgid "[socket]" msgstr "[сокет]" #. or character special -#: ../fileio.c:1801 msgid "[character special]" msgstr "[спец. символьний]" -#: ../fileio.c:1815 msgid "[CR missing]" msgstr "[Бракує CR]" -#: ../fileio.c:1819 msgid "[long lines split]" msgstr "[Розбито довгі рядки]" -#: ../fileio.c:1823 ../fileio.c:3512 msgid "[NOT converted]" msgstr "[НЕ конвертовано]" -#: ../fileio.c:1826 ../fileio.c:3515 msgid "[converted]" msgstr "[конвертовано]" -#: ../fileio.c:1831 #, c-format msgid "[CONVERSION ERROR in line %<PRId64>]" msgstr "[ПОМИЛКА КОНВЕРТАЦІЇ у рядку %<PRId64>]" -#: ../fileio.c:1835 #, c-format msgid "[ILLEGAL BYTE in line %<PRId64>]" msgstr "[НЕКОРЕКТНИЙ БАЙТ у рядку %<PRId64>]" -#: ../fileio.c:1838 msgid "[READ ERRORS]" msgstr "[ПОМИЛКА ЧИТАННЯ]" -#: ../fileio.c:2104 msgid "Can't find temp file for conversion" msgstr "Не вдалося підшукати тимчасовий файл для конвертації" -#: ../fileio.c:2110 msgid "Conversion with 'charconvert' failed" msgstr "Конвертація з 'charconvert' не вдалася" -#: ../fileio.c:2113 msgid "can't read output of 'charconvert'" msgstr "не вдалося прочитати вивід 'charconvert'" # msgstr "E217: " -#: ../fileio.c:2437 msgid "E676: No matching autocommands for acwrite buffer" msgstr "E676: Немає відповідних автокоманд" -#: ../fileio.c:2466 msgid "E203: Autocommands deleted or unloaded buffer to be written" msgstr "E203: Автокоманда знищила або вивантажила буфер, що мав бути записаний" -#: ../fileio.c:2486 msgid "E204: Autocommand changed number of lines in unexpected way" msgstr "E204: Автокоманда несподіваним чином змінила кількість рядків" -#: ../fileio.c:2548 ../fileio.c:2565 msgid "is not a file or writable device" msgstr "Не придатний для запису" -#: ../fileio.c:2601 msgid "is read-only (add ! to override)" msgstr "лише для читання (! щоб не зважати)" -#: ../fileio.c:2886 msgid "E506: Can't write to backup file (add ! to override)" msgstr "E506: Не вдалося записати резервний файл (! щоб не зважати)" -#: ../fileio.c:2898 msgid "E507: Close error for backup file (add ! to override)" msgstr "E507: Помилка закриття резервного файлу (! щоб не зважати)" -#: ../fileio.c:2901 msgid "E508: Can't read file for backup (add ! to override)" msgstr "" "E508: Не вдалося прочитати файл щоб створити резервну копію (! щоб не " "зважати)" -#: ../fileio.c:2923 msgid "E509: Cannot create backup file (add ! to override)" msgstr "E509: Не вдалося створити резервну копію (! щоб не зважати)" -#: ../fileio.c:3008 msgid "E510: Can't make backup file (add ! to override)" msgstr "E510: Не вдалося зробити резервну копію (! щоб не зважати)" #. Can't write without a tempfile! -#: ../fileio.c:3121 msgid "E214: Can't find temp file for writing" msgstr "E214: Не вдалося підшукати тимчасовий файл для запису" -#: ../fileio.c:3134 msgid "E213: Cannot convert (add ! to write without conversion)" msgstr "E213: Не вдалося перетворити (! щоб записати без конвертації)" -#: ../fileio.c:3169 msgid "E166: Can't open linked file for writing" msgstr "E166: Не вдалося відкрити для запису зв'язаний файл" -#: ../fileio.c:3173 msgid "E212: Can't open file for writing" msgstr "E212: Не вдалося відкрити файл для запису" -#: ../fileio.c:3363 msgid "E667: Fsync failed" msgstr "E667: Не вдалося виконати fsync" -#: ../fileio.c:3398 msgid "E512: Close failed" msgstr "E512: Не вдалося закрити" -#: ../fileio.c:3436 msgid "E513: write error, conversion failed (make 'fenc' empty to override)" msgstr "E513: Помилка запису, конвертація не вдалася (скиньте 'fenc')" -#: ../fileio.c:3441 #, c-format msgid "" "E513: write error, conversion failed in line %<PRId64> (make 'fenc' empty to " @@ -2251,56 +1767,43 @@ msgstr "" "E513: Помилка запису, конвертація не вдалася у рядку %<PRId64> (скиньте " "'fenc')" -#: ../fileio.c:3448 msgid "E514: write error (file system full?)" msgstr "E514: Помилка запису (скінчилось вільне місце?)" -#: ../fileio.c:3506 msgid " CONVERSION ERROR" msgstr " ПОМИЛКА КОНВЕРТАЦІЇ" -#: ../fileio.c:3509 #, c-format msgid " in line %<PRId64>;" msgstr " у рядку %<PRId64>;" -#: ../fileio.c:3519 msgid "[Device]" msgstr "[Пристрій]" -#: ../fileio.c:3522 msgid "[New]" msgstr "[Новий]" -#: ../fileio.c:3535 msgid " [a]" msgstr "[д]" -#: ../fileio.c:3535 msgid " appended" msgstr " дописаний" -#: ../fileio.c:3537 msgid " [w]" msgstr "[з]" -#: ../fileio.c:3537 msgid " written" msgstr " записаний" -#: ../fileio.c:3579 msgid "E205: Patchmode: can't save original file" msgstr "E205: Латання: не вдалося зберегти оригінал" -#: ../fileio.c:3602 msgid "E206: patchmode: can't touch empty original file" msgstr "E206: Латання: не вдалося створити оригінал" -#: ../fileio.c:3616 msgid "E207: Can't delete backup file" msgstr "E207: Не вдалося знищити резервний файл" -#: ../fileio.c:3672 msgid "" "\n" "WARNING: Original file may be lost or damaged\n" @@ -2308,134 +1811,105 @@ msgstr "" "\n" "ЗАСТЕРЕЖЕННЯ: Оригінал, мабуть, втрачений чи пошкоджений\n" -#: ../fileio.c:3675 msgid "don't quit the editor until the file is successfully written!" msgstr "Не виходьте з редактора, доки файл не записано!" -#: ../fileio.c:3795 msgid "[dos]" msgstr "[dos]" -#: ../fileio.c:3795 msgid "[dos format]" msgstr "[формат dos]" -#: ../fileio.c:3801 msgid "[mac]" msgstr "[mac]" -#: ../fileio.c:3801 msgid "[mac format]" msgstr "[формат mac]" -#: ../fileio.c:3807 msgid "[unix]" msgstr "[unix]" -#: ../fileio.c:3807 msgid "[unix format]" msgstr "[формат unix]" -#: ../fileio.c:3831 msgid "1 line, " msgstr "один рядок, " -#: ../fileio.c:3833 #, c-format msgid "%<PRId64> lines, " msgstr "%<PRId64> рядків, " -#: ../fileio.c:3836 msgid "1 character" msgstr "один символ" -#: ../fileio.c:3838 #, c-format msgid "%<PRId64> characters" msgstr "%<PRId64> символів" -#: ../fileio.c:3849 msgid "[noeol]" msgstr "[noeol]" -#: ../fileio.c:3849 msgid "[Incomplete last line]" msgstr "[Неповний останній рядок]" #. don't overwrite messages here #. must give this prompt #. don't use emsg() here, don't want to flush the buffers -#: ../fileio.c:3865 msgid "WARNING: The file has been changed since reading it!!!" msgstr "ЗАСТЕРЕЖЕННЯ: Файл змінився з часу останнього читання!!!" -#: ../fileio.c:3867 msgid "Do you really want to write to it" msgstr "Ви справді хочете його переписати??" -#: ../fileio.c:4648 #, c-format msgid "E208: Error writing to \"%s\"" msgstr "E208: Помилка запису у «%s»" -#: ../fileio.c:4655 #, c-format msgid "E209: Error closing \"%s\"" msgstr "E209: Помилка закриття «%s»" -#: ../fileio.c:4657 #, c-format msgid "E210: Error reading \"%s\"" msgstr "E210: Помилка читання «%s»" -#: ../fileio.c:4883 msgid "E246: FileChangedShell autocommand deleted buffer" msgstr "E246: Автокоманда FileChangedShell знищила буфер" -#: ../fileio.c:4894 #, c-format msgid "E211: File \"%s\" no longer available" msgstr "E211: Файл «%s» більше не досяжний" -#: ../fileio.c:4906 #, c-format msgid "" "W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as " "well" msgstr "W12: Застереження: Файл «%s» змінився, але й буфер у Vim також" -#: ../fileio.c:4907 msgid "See \":help W12\" for more info." msgstr "Див. «:help W12» для уточнення." -#: ../fileio.c:4910 #, c-format msgid "W11: Warning: File \"%s\" has changed since editing started" msgstr "W11: Застереження: Файл «%s» змінився після початку редагування" -#: ../fileio.c:4911 msgid "See \":help W11\" for more info." msgstr "Див. «:help W11» для уточнення." -#: ../fileio.c:4914 #, c-format msgid "W16: Warning: Mode of file \"%s\" has changed since editing started" msgstr "W16: Застереження: Режим файлу «%s» змінився після початку редагування" -#: ../fileio.c:4915 msgid "See \":help W16\" for more info." msgstr "Див. «:help W16» для уточнення." -#: ../fileio.c:4927 #, c-format msgid "W13: Warning: File \"%s\" has been created after editing started" msgstr "W13: Застереження: Файл «%s» було створено після початку редагування" -#: ../fileio.c:4947 msgid "Warning" msgstr "Застереження" -#: ../fileio.c:4948 msgid "" "&OK\n" "&Load File" @@ -2443,51 +1917,42 @@ msgstr "" "&O:Гаразд\n" "&L:Завантажити" -#: ../fileio.c:5065 #, c-format msgid "E462: Could not prepare for reloading \"%s\"" msgstr "E462: Не вдалося підготувати «%s», щоб перечитати" -#: ../fileio.c:5078 #, c-format msgid "E321: Could not reload \"%s\"" msgstr "E321: Не вдалося перечитати «%s»" -#: ../fileio.c:5601 msgid "--Deleted--" msgstr "--Знищено--" -#: ../fileio.c:5732 #, c-format msgid "auto-removing autocommand: %s <buffer=%d>" msgstr "Автоматичне знищення автокоманди: %s <буфер=%d>" #. the group doesn't exist -#: ../fileio.c:5772 #, c-format msgid "E367: No such group: \"%s\"" msgstr "E367: Немає такої групи: «%s»" -#: ../fileio.c:5897 #, c-format msgid "E215: Illegal character after *: %s" msgstr "E215: Недозволений символ після *: %s" # msgstr "E215: " -#: ../fileio.c:5905 #, c-format msgid "E216: No such event: %s" msgstr "E216: Немає такої події: %s" # msgstr "E215: " -#: ../fileio.c:5907 #, c-format msgid "E216: No such group or event: %s" msgstr "E216: Немає такої групи чи події: %s" # msgstr "E216: " #. Highlight title -#: ../fileio.c:6090 msgid "" "\n" "--- Auto-Commands ---" @@ -2495,111 +1960,89 @@ msgstr "" "\n" "--- Автокоманди ---" -#: ../fileio.c:6293 #, c-format msgid "E680: <buffer=%d>: invalid buffer number " msgstr "E680: <буфер=%d>: некоректний номер буфера " -#: ../fileio.c:6370 msgid "E217: Can't execute autocommands for ALL events" msgstr "E217: Не можу виконувати автокоманди для УСІХ подій" # msgstr "E217: " -#: ../fileio.c:6393 msgid "No matching autocommands" msgstr "Немає відповідних автокоманд" -#: ../fileio.c:6831 msgid "E218: autocommand nesting too deep" msgstr "E218: Забагато вкладених автокоманд" # msgstr "E218: " -#: ../fileio.c:7143 #, c-format msgid "%s Auto commands for \"%s\"" msgstr "Автокоманди %s для «%s»" -#: ../fileio.c:7149 #, c-format msgid "Executing %s" msgstr "Виконується %s" -#: ../fileio.c:7211 #, c-format msgid "autocommand %s" msgstr "автокоманда %s" -#: ../fileio.c:7795 msgid "E219: Missing {." msgstr "E219: Бракує {." # msgstr "E219: " -#: ../fileio.c:7797 msgid "E220: Missing }." msgstr "E220: Бракує }." # msgstr "E220: " -#: ../fold.c:93 msgid "E490: No fold found" msgstr "E490: Згорток не знайдено" # msgstr "E349: " -#: ../fold.c:544 msgid "E350: Cannot create fold with current 'foldmethod'" msgstr "E350: Не вдалося створити згортку методом 'foldmethod'" -#: ../fold.c:546 msgid "E351: Cannot delete fold with current 'foldmethod'" msgstr "E351: Не вдалося знищити згортку методом 'foldmethod'" -#: ../fold.c:1784 #, c-format msgid "+--%3ld lines folded " msgstr "+-- згорнуто %3ld рядків " #. buffer has already been read -#: ../getchar.c:273 msgid "E222: Add to read buffer" msgstr "E222: Додати до буфера читання" -#: ../getchar.c:2040 msgid "E223: recursive mapping" msgstr "E223: Заміна рекурсивна" # msgstr "E223: " -#: ../getchar.c:2849 #, c-format msgid "E224: global abbreviation already exists for %s" msgstr "E224: Загальне скорочення для %s вже існує" # msgstr "E224: " -#: ../getchar.c:2852 #, c-format msgid "E225: global mapping already exists for %s" msgstr "E225: Загальна заміна для %s вже існує" # msgstr "E225: " -#: ../getchar.c:2952 #, c-format msgid "E226: abbreviation already exists for %s" msgstr "E226: Вже є скорочення для %s" # msgstr "E226: " -#: ../getchar.c:2955 #, c-format msgid "E227: mapping already exists for %s" msgstr "E227: Вже є заміна для %s" # msgstr "E227: " -#: ../getchar.c:3008 msgid "No abbreviation found" msgstr "Скорочення не знайдено" -#: ../getchar.c:3010 msgid "No mapping found" msgstr "Заміни не знайдено" -#: ../getchar.c:3974 msgid "E228: makemap: Illegal mode" msgstr "E228: makemap: Неприпустимий режим" @@ -2607,7 +2050,6 @@ msgstr "E228: makemap: Неприпустимий режим" #. key value of 'cedit' option #. type of cmdline window or 0 #. result of cmdline window or 0 -#: ../globals.h:924 msgid "--No lines in buffer--" msgstr "--Жодного рядка--" @@ -2615,680 +2057,526 @@ msgstr "--Жодного рядка--" #. * The error messages that can be shared are included here. #. * Excluded are errors that are only used once and debugging messages. #. -#: ../globals.h:996 msgid "E470: Command aborted" msgstr "E470: Команду перервано" -#: ../globals.h:997 msgid "E471: Argument required" msgstr "E471: Необхідно вказати аргумент" -#: ../globals.h:998 msgid "E10: \\ should be followed by /, ? or &" msgstr "E10: За \\ має йти /, ? або &" # msgstr "E10: " -#: ../globals.h:1000 msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits" msgstr "E11: Неприпустимо у вікні команд, <CR> виконує, CTRL-C виходить" -#: ../globals.h:1002 msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search" msgstr "" "E12: Команда не дозволена у exrc/vimrc у пошуку поточного каталогу чи теґу" -#: ../globals.h:1003 msgid "E171: Missing :endif" msgstr "E171: Бракує :endif" -#: ../globals.h:1004 msgid "E600: Missing :endtry" msgstr "E600: Бракує :endtry" -#: ../globals.h:1005 msgid "E170: Missing :endwhile" msgstr "E170: Бракує :endwhile" -#: ../globals.h:1006 msgid "E170: Missing :endfor" msgstr "E170: Бракує :endfor" -#: ../globals.h:1007 msgid "E588: :endwhile without :while" msgstr "E588: :endwhile без :while" -#: ../globals.h:1008 msgid "E588: :endfor without :for" msgstr "E588: :endfor без :for" -#: ../globals.h:1009 msgid "E13: File exists (add ! to override)" msgstr "E13: Файл існує (! щоб не зважати)" -#: ../globals.h:1010 msgid "E472: Command failed" msgstr "E472: Команда на вдалась" -#: ../globals.h:1011 msgid "E473: Internal error" msgstr "E473: Внутрішня помилка" -#: ../globals.h:1012 msgid "Interrupted" msgstr "Перервано" -#: ../globals.h:1013 msgid "E14: Invalid address" msgstr "E14: Неправильна адреса" # msgstr "E14: " -#: ../globals.h:1014 msgid "E474: Invalid argument" msgstr "E474: Некоректний аргумент" -#: ../globals.h:1015 #, c-format msgid "E475: Invalid argument: %s" msgstr "E475: Некоректний аргумент: %s" -#: ../globals.h:1016 #, c-format msgid "E15: Invalid expression: %s" msgstr "E15: Неправильний вираз: %s" # msgstr "E15: " -#: ../globals.h:1017 msgid "E16: Invalid range" msgstr "E16: Неправильні межі" # msgstr "E16: " -#: ../globals.h:1018 msgid "E476: Invalid command" msgstr "E476: Некоректна команда" -#: ../globals.h:1019 #, c-format msgid "E17: \"%s\" is a directory" msgstr "E17: «%s» — це каталог" -#: ../globals.h:1020 -#, fuzzy msgid "E900: Invalid job id" -msgstr "E49: Некоректний розмір зсуву" +msgstr "E900: Некоректний ід. завдання" -#: ../globals.h:1021 msgid "E901: Job table is full" -msgstr "" +msgstr "E901: Таблиця завдань заповнена" -#: ../globals.h:1022 #, c-format msgid "E902: \"%s\" is not an executable" -msgstr "" +msgstr "E902: \"%s\" не можна виконати" -#: ../globals.h:1024 #, c-format msgid "E364: Library call failed for \"%s()\"" msgstr "E364: Бібліотечний виклик до «%s()» не вдався" # msgstr "E18: " -#: ../globals.h:1026 msgid "E19: Mark has invalid line number" msgstr "E19: У помітки некоректний номер рядка" # msgstr "E19: " -#: ../globals.h:1027 msgid "E20: Mark not set" msgstr "E20: Помітку не встановлено" # msgstr "E20: " -#: ../globals.h:1029 msgid "E21: Cannot make changes, 'modifiable' is off" msgstr "E21: Зміни не дозволені: вимкнено 'modifiable'" # msgstr "E21: " -#: ../globals.h:1030 msgid "E22: Scripts nested too deep" msgstr "E22: Забагато вкладених скриптів" # msgstr "E22: " -#: ../globals.h:1031 msgid "E23: No alternate file" msgstr "E23: Немає вторинного файлу" # msgstr "E23: " -#: ../globals.h:1032 msgid "E24: No such abbreviation" msgstr "E24: Такого скорочення немає" # msgstr "E24: " -#: ../globals.h:1033 msgid "E477: No ! allowed" msgstr "E477: ! не дозволено" -#: ../globals.h:1035 msgid "E25: Nvim does not have a built-in GUI" msgstr "E25: Не можна використати GUI: Не ввімкнено під час компіляції" # msgstr "E25: " -#: ../globals.h:1036 #, c-format msgid "E28: No such highlight group name: %s" msgstr "E28: Немає такої групи підсвічування: %s" # msgstr "E28: " -#: ../globals.h:1037 msgid "E29: No inserted text yet" msgstr "E29: Текст ще не було додано" # msgstr "E29: " -#: ../globals.h:1038 msgid "E30: No previous command line" msgstr "E30: Ще не було команд" # msgstr "E30: " -#: ../globals.h:1039 msgid "E31: No such mapping" msgstr "E31: Немає такої заміни" # msgstr "E31: " -#: ../globals.h:1040 msgid "E479: No match" msgstr "E479: Жодного збігу" -#: ../globals.h:1041 #, c-format msgid "E480: No match: %s" msgstr "E480: Жодного збігу: %s" -#: ../globals.h:1042 msgid "E32: No file name" msgstr "E32: Бракує назви файлу" # msgstr "E32: " -#: ../globals.h:1044 msgid "E33: No previous substitute regular expression" msgstr "E33: Заміна зразків ще не використовувалась" # msgstr "E33: " -#: ../globals.h:1045 msgid "E34: No previous command" msgstr "E34: Команд ще не було" # msgstr "E34: " -#: ../globals.h:1046 msgid "E35: No previous regular expression" msgstr "E35: Зразків пошуку ще не було" # msgstr "E35: " -#: ../globals.h:1047 msgid "E481: No range allowed" msgstr "E481: Не дозволено вказувати межі" -#: ../globals.h:1048 msgid "E36: Not enough room" msgstr "E36: Місця не вистачить" # msgstr "E36: " -#: ../globals.h:1049 #, c-format msgid "E482: Can't create file %s" msgstr "E482: Не вдалося створити файл %s" -#: ../globals.h:1050 msgid "E483: Can't get temp file name" msgstr "E483: Не вдалося сформувати назву тимчасового файлу" -#: ../globals.h:1051 #, c-format msgid "E484: Can't open file %s" msgstr "E484: Не вдалося відкрити файл %s" -#: ../globals.h:1052 #, c-format msgid "E485: Can't read file %s" msgstr "E485: Не вдалося прочитати файл %s" -#: ../globals.h:1054 msgid "E37: No write since last change (add ! to override)" msgstr "E37: Зміни не було записано (! щоб не зважати)" -#: ../globals.h:1055 -#, fuzzy msgid "E37: No write since last change" -msgstr "[Зміни не записано]\n" +msgstr "E37: Не записано після останніх змін" -#: ../globals.h:1056 msgid "E38: Null argument" msgstr "E38: Відсутній аргумент" -#: ../globals.h:1057 msgid "E39: Number expected" msgstr "E39: Очікується число" -#: ../globals.h:1058 #, c-format msgid "E40: Can't open errorfile %s" msgstr "E40: Не вдалося відкрити файл помилок %s" -#: ../globals.h:1059 msgid "E41: Out of memory!" msgstr "E41: Забракло пам'яті!" -#: ../globals.h:1060 msgid "Pattern not found" msgstr "Зразок не знайдено" -#: ../globals.h:1061 #, c-format msgid "E486: Pattern not found: %s" msgstr "E486: Зразок не знайдено: %s" -#: ../globals.h:1062 msgid "E487: Argument must be positive" msgstr "E487: Аргумент має бути додатний" -#: ../globals.h:1064 msgid "E459: Cannot go back to previous directory" msgstr "E459: Не вдалося перейти до попереднього каталогу" -#: ../globals.h:1066 msgid "E42: No Errors" msgstr "E42: Жодної помилки" -#: ../globals.h:1067 msgid "E776: No location list" msgstr "E776: Немає списку місць" -#: ../globals.h:1068 msgid "E43: Damaged match string" msgstr "E43: Текст збігу пошкоджено" -#: ../globals.h:1069 msgid "E44: Corrupted regexp program" msgstr "E44: Зіпсована програма регулярних виразів" -#: ../globals.h:1071 msgid "E45: 'readonly' option is set (add ! to override)" msgstr "E45: Встановлено опцію 'readonly' (! щоб не зважати)" -#: ../globals.h:1073 #, c-format msgid "E46: Cannot change read-only variable \"%s\"" msgstr "E46: Змінна тільки для читання: «%s»" -#: ../globals.h:1075 #, c-format msgid "E794: Cannot set variable in the sandbox: \"%s\"" msgstr "E794: Не можна встановити змінну у пісочниці: «%s»" -#: ../globals.h:1076 msgid "E47: Error while reading errorfile" msgstr "E47: Помилка читання файлу помилок" -#: ../globals.h:1078 msgid "E48: Not allowed in sandbox" msgstr "E48: На дозволено у пісочниці" -#: ../globals.h:1080 msgid "E523: Not allowed here" msgstr "E523: Не дозволено тут" -#: ../globals.h:1082 msgid "E359: Screen mode setting not supported" msgstr "E359: Режим екрану не підтримується" -#: ../globals.h:1083 msgid "E49: Invalid scroll size" msgstr "E49: Некоректний розмір зсуву" -#: ../globals.h:1084 msgid "E91: 'shell' option is empty" msgstr "E91: Опція 'shell' порожня" # msgstr "E254: " -#: ../globals.h:1085 msgid "E255: Couldn't read in sign data!" msgstr "E255: Не можна зчитати дані напису!" -#: ../globals.h:1086 msgid "E72: Close error on swap file" msgstr "E72: Помилка під час закриття файлу обміну" -#: ../globals.h:1087 msgid "E73: tag stack empty" msgstr "E73: Стек теґів порожній" -#: ../globals.h:1088 msgid "E74: Command too complex" msgstr "E74: Занадто складна команда" -#: ../globals.h:1089 msgid "E75: Name too long" msgstr "E75: Задовге ім'я" -#: ../globals.h:1090 msgid "E76: Too many [" msgstr "E76: Забагато '['" -#: ../globals.h:1091 msgid "E77: Too many file names" msgstr "E77: Забагато назв файлів" -#: ../globals.h:1092 msgid "E488: Trailing characters" msgstr "E488: Надлишкові символи" -#: ../globals.h:1093 msgid "E78: Unknown mark" msgstr "E78: Невідома помітка" -#: ../globals.h:1094 msgid "E79: Cannot expand wildcards" msgstr "E79: Не вдалося розкрити шаблон" -#: ../globals.h:1096 msgid "E591: 'winheight' cannot be smaller than 'winminheight'" msgstr "E591: 'winheight' не може бути меншим за 'winminheight'" -#: ../globals.h:1098 msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'" msgstr "E592: 'winwidth' не може бути меншим за 'winminwidth'" # msgstr "E79: " -#: ../globals.h:1099 msgid "E80: Error while writing" msgstr "E80: Помилка під час запису" -#: ../globals.h:1100 msgid "Zero count" msgstr "Нульова кількість" -#: ../globals.h:1101 msgid "E81: Using <SID> not in a script context" msgstr "E81: <SID> використовується не в контексті скрипту" -#: ../globals.h:1102 #, c-format msgid "E685: Internal error: %s" msgstr "E685: Внутрішня помилка: %s" -#: ../globals.h:1104 msgid "E363: pattern uses more memory than 'maxmempattern'" msgstr "E363: Зразок використовує більше, ніж 'maxmempattern', пам'яті" -#: ../globals.h:1105 msgid "E749: empty buffer" msgstr "E749: Порожній буфер" -#: ../globals.h:1108 msgid "E682: Invalid search pattern or delimiter" msgstr "E682: Некоректний зразок для пошуку чи роздільник" -#: ../globals.h:1109 msgid "E139: File is loaded in another buffer" msgstr "E139: Файл уже завантажено в інший буфер" # msgstr "E235: " -#: ../globals.h:1110 #, c-format msgid "E764: Option '%s' is not set" msgstr "E764: Опція '%s' не встановлена" -#: ../globals.h:1111 msgid "E850: Invalid register name" msgstr "E850: Неправильна назва регістру" -#: ../globals.h:1114 msgid "search hit TOP, continuing at BOTTOM" msgstr "Пошук дійшов до ПОЧАТКУ, продовжується з КІНЦЯ" -#: ../globals.h:1115 msgid "search hit BOTTOM, continuing at TOP" msgstr "Пошук дійшов до КІНЦЯ, продовжується з ПОЧАТКУ" -#: ../hardcopy.c:240 msgid "E550: Missing colon" msgstr "E550: Пропущено двокрапку" # msgstr "E347: " -#: ../hardcopy.c:252 msgid "E551: Illegal component" msgstr "E551: Некоректний компонент" -#: ../hardcopy.c:259 msgid "E552: digit expected" msgstr "E552: очікується цифра" -#: ../hardcopy.c:473 #, c-format msgid "Page %d" msgstr "Сторінка %d" -#: ../hardcopy.c:597 msgid "No text to be printed" msgstr "Нічого друкувати" -#: ../hardcopy.c:668 #, c-format msgid "Printing page %d (%d%%)" msgstr "Друкується сторінка %d (%d%%)" -#: ../hardcopy.c:680 #, c-format msgid " Copy %d of %d" msgstr " Копія %d з %d" -#: ../hardcopy.c:733 #, c-format msgid "Printed: %s" msgstr "Надруковано: %s" -#: ../hardcopy.c:740 msgid "Printing aborted" msgstr "Друк перервано" -#: ../hardcopy.c:1365 msgid "E455: Error writing to PostScript output file" msgstr "E455: Не вдалося записати вихідний файл PostScript" -#: ../hardcopy.c:1747 #, c-format msgid "E624: Can't open file \"%s\"" msgstr "E624: Не вдалося відкрити файл «%s»" -#: ../hardcopy.c:1756 ../hardcopy.c:2470 #, c-format msgid "E457: Can't read PostScript resource file \"%s\"" msgstr "E457: Не вдалося прочитати файл ресурсів PostScript «%s»" -#: ../hardcopy.c:1772 #, c-format msgid "E618: file \"%s\" is not a PostScript resource file" msgstr "E618: «%s» не є файлом ресурсів PostScript" -#: ../hardcopy.c:1788 ../hardcopy.c:1805 ../hardcopy.c:1844 #, c-format msgid "E619: file \"%s\" is not a supported PostScript resource file" msgstr "E619: «%s» не є підтримуваним файлом ресурсів PostScript" -#: ../hardcopy.c:1856 #, c-format msgid "E621: \"%s\" resource file has wrong version" msgstr "E621: Неправильна версія файлу ресурсів «%s»" -#: ../hardcopy.c:2225 msgid "E673: Incompatible multi-byte encoding and character set." msgstr "E673: Несумісні багатобайтове кодування й набір символів." -#: ../hardcopy.c:2238 msgid "E674: printmbcharset cannot be empty with multi-byte encoding." msgstr "" "E674: printmbcharset не може бути порожнім з багатобайтовим кодуванням." -#: ../hardcopy.c:2254 msgid "E675: No default font specified for multi-byte printing." msgstr "E675: Не зазначено шрифт для багатобайтового друку." -#: ../hardcopy.c:2426 msgid "E324: Can't open PostScript output file" msgstr "E324: Не вдалося відкрити файл PostScript для виводу" -#: ../hardcopy.c:2458 #, c-format msgid "E456: Can't open file \"%s\"" msgstr "E456: Не вдалося відкрити файл «%s»" -#: ../hardcopy.c:2583 msgid "E456: Can't find PostScript resource file \"prolog.ps\"" msgstr "E456: Не вдалося знайти файл ресурсів PostScript «prolog.ps»" -#: ../hardcopy.c:2593 msgid "E456: Can't find PostScript resource file \"cidfont.ps\"" msgstr "E456: Не вдалося знайти файл ресурсів PostScript «cidfont.ps»" -#: ../hardcopy.c:2622 ../hardcopy.c:2639 ../hardcopy.c:2665 #, c-format msgid "E456: Can't find PostScript resource file \"%s.ps\"" msgstr "E456: Не вдалося знайти файл ресурсів PostScript «%s.ps»" -#: ../hardcopy.c:2654 #, c-format msgid "E620: Unable to convert to print encoding \"%s\"" msgstr "E620: Не вдалося перетворити до кодування друку «%s»" -#: ../hardcopy.c:2877 msgid "Sending to printer..." msgstr "Відсилається на принтер..." -#: ../hardcopy.c:2881 msgid "E365: Failed to print PostScript file" msgstr "E365: Не вдалося надрукувати файл PostScript" -#: ../hardcopy.c:2883 msgid "Print job sent." msgstr "Завдання друку відіслано." # msgstr "E255: " -#: ../if_cscope.c:85 msgid "Add a new database" msgstr "Додати нову базу даних" -#: ../if_cscope.c:87 msgid "Query for a pattern" msgstr "Запит за зразком" -#: ../if_cscope.c:89 msgid "Show this message" msgstr "Показати це повідомлення" -#: ../if_cscope.c:91 msgid "Kill a connection" msgstr "Знищити з'єднання" -#: ../if_cscope.c:93 msgid "Reinit all connections" msgstr "Перезапустити усі з'єднання" -#: ../if_cscope.c:95 msgid "Show connections" msgstr "Показати з'єднання" -#: ../if_cscope.c:101 #, c-format msgid "E560: Usage: cs[cope] %s" msgstr "E560: Використання: cs[cope] %s" -#: ../if_cscope.c:225 msgid "This cscope command does not support splitting the window.\n" msgstr "Ця команда cscope не вміє ділити вікно.\n" -#: ../if_cscope.c:266 msgid "E562: Usage: cstag <ident>" msgstr "E562: Використання: cstag <ідентиф-ор>" -#: ../if_cscope.c:313 msgid "E257: cstag: tag not found" msgstr "E257: cstag: теґ не знайдено" # msgstr "E257: " -#: ../if_cscope.c:461 #, c-format msgid "E563: stat(%s) error: %d" msgstr "E563: stat(%s) помилка: %d" -#: ../if_cscope.c:551 #, c-format msgid "E564: %s is not a directory or a valid cscope database" msgstr "E564: %s не є ні каталогом, ні базою даних cscope" -#: ../if_cscope.c:566 #, c-format msgid "Added cscope database %s" msgstr "Додано базу даних cscope %s" -#: ../if_cscope.c:616 #, c-format msgid "E262: error reading cscope connection %<PRId64>" msgstr "E262: Помилка читання зі з'єднання cscope %<PRId64>" -#: ../if_cscope.c:711 msgid "E561: unknown cscope search type" msgstr "E561: Невідомий тип пошуку cscope" -#: ../if_cscope.c:752 ../if_cscope.c:789 msgid "E566: Could not create cscope pipes" msgstr "E566: Не вдалося створити канали до cscope" -#: ../if_cscope.c:767 msgid "E622: Could not fork for cscope" msgstr "E622: Не вдалося розділити процес для cscope" -#: ../if_cscope.c:849 msgid "cs_create_connection setpgid failed" msgstr "cs_create_connection: помилка setpgid" -#: ../if_cscope.c:853 ../if_cscope.c:889 msgid "cs_create_connection exec failed" msgstr "cs_create_connection: помилка під час виконання" -#: ../if_cscope.c:863 ../if_cscope.c:902 msgid "cs_create_connection: fdopen for to_fp failed" msgstr "cs_create_connection: fdopen для to_fp не вдався" -#: ../if_cscope.c:865 ../if_cscope.c:906 msgid "cs_create_connection: fdopen for fr_fp failed" msgstr "cs_create_connection: fdopen для fr_fp не вдався" -#: ../if_cscope.c:890 msgid "E623: Could not spawn cscope process" msgstr "E623: Не вдалося створити процес cscope" -#: ../if_cscope.c:932 msgid "E567: no cscope connections" msgstr "E567: жодного з'єднання із cscope" -#: ../if_cscope.c:1009 #, c-format msgid "E469: invalid cscopequickfix flag %c for %c" msgstr "E469: Некоректний прапорець cscopequickfix %c для %c" # msgstr "E258: " -#: ../if_cscope.c:1058 #, c-format msgid "E259: no matches found for cscope query %s of %s" msgstr "E259: Для запиту cscope %s з %s нічого не знайдено" # msgstr "E259: " -#: ../if_cscope.c:1142 msgid "cscope commands:\n" msgstr "Команди cscope:\n" -#: ../if_cscope.c:1150 #, c-format msgid "%-5s: %s%*s (Usage: %s)" msgstr "%-5s: %s%*s (Використання: %s)" -#: ../if_cscope.c:1155 msgid "" "\n" " c: Find functions calling this function\n" @@ -3310,32 +2598,26 @@ msgstr "" " s: Знайти цей символ C\n" " t: Знайти цей текст\n" -#: ../if_cscope.c:1226 msgid "E568: duplicate cscope database not added" msgstr "E568: Повторна база даних cscope не додана" # msgstr "E260: " -#: ../if_cscope.c:1335 #, c-format msgid "E261: cscope connection %s not found" msgstr "E261: З'єднання з cscope %s не знайдено" -#: ../if_cscope.c:1364 #, c-format msgid "cscope connection %s closed" msgstr "З'єднання з cscope %s закінчено" #. should not reach here -#: ../if_cscope.c:1486 msgid "E570: fatal error in cs_manage_matches" msgstr "E570: Фатальна помилка в cs_manage_matches" -#: ../if_cscope.c:1693 #, c-format msgid "Cscope tag: %s" msgstr "Теґ cscope: %s" -#: ../if_cscope.c:1711 msgid "" "\n" " # line" @@ -3343,89 +2625,69 @@ msgstr "" "\n" " # рядок" -#: ../if_cscope.c:1713 msgid "filename / context / line\n" msgstr "файл / контекст / рядок\n" -#: ../if_cscope.c:1809 #, c-format msgid "E609: Cscope error: %s" msgstr "E609: Помилка cscope: %s" -#: ../if_cscope.c:2053 msgid "All cscope databases reset" msgstr "Усі бази даних cscope перезавантажено" -#: ../if_cscope.c:2123 msgid "no cscope connections\n" msgstr "Жодного з'єднання з cscope\n" -#: ../if_cscope.c:2126 msgid " # pid database name prepend path\n" msgstr " # pid назва бази даних шлях\n" -#: ../main.c:144 msgid "Unknown option argument" msgstr "Невідомий аргумент опції" -#: ../main.c:146 msgid "Too many edit arguments" msgstr "Забагато аргументів" -#: ../main.c:148 msgid "Argument missing after" msgstr "Пропущено аргумент після" -#: ../main.c:150 msgid "Garbage after option argument" msgstr "Сміття після аргументу опції" -#: ../main.c:152 msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments" msgstr "Забагато аргументів у «+команда», «-c команда» або «--cmd команда»" # msgstr "E14: " -#: ../main.c:154 msgid "Invalid argument for" msgstr "Неправильний аргумент у" -#: ../main.c:294 #, c-format msgid "%d files to edit\n" msgstr "%d файли(ів)\n" -#: ../main.c:1342 msgid "Attempt to open script file again: \"" msgstr "Спроба повторно відкрити скрипт: \"" -#: ../main.c:1350 msgid "Cannot open for reading: \"" msgstr "Не вдалося прочитати: \"" -#: ../main.c:1393 msgid "Cannot open for script output: \"" msgstr "Не вдалося відкрити як вихідний файл: \"" -#: ../main.c:1622 msgid "Vim: Warning: Output is not to a terminal\n" msgstr "Vim: Застереження: Вивід не у термінал\n" -#: ../main.c:1624 msgid "Vim: Warning: Input is not from a terminal\n" msgstr "Vim: Застереження: Уведення не з терміналу\n" #. just in case.. -#: ../main.c:1891 msgid "pre-vimrc command line" msgstr "команди перед vimrc" -#: ../main.c:1964 #, c-format msgid "E282: Cannot read from \"%s\"" msgstr "E282: Не вдалося прочитати з «%s»" # msgstr "E282: " -#: ../main.c:2149 msgid "" "\n" "More info with: \"vim -h\"\n" @@ -3433,23 +2695,18 @@ msgstr "" "\n" "Дізнайтеся більше: «vim -h»\n" -#: ../main.c:2178 msgid "[file ..] edit specified file(s)" msgstr "[файл ..] редагувати вказані файли" -#: ../main.c:2179 msgid "- read text from stdin" msgstr "- читати текст з stdin" -#: ../main.c:2180 msgid "-t tag edit file where tag is defined" msgstr "-t помітка перейти до теґу" -#: ../main.c:2181 msgid "-q [errorfile] edit file with first error" msgstr "-q [файл] перейти до першої помилки" -#: ../main.c:2187 msgid "" "\n" "\n" @@ -3459,11 +2716,9 @@ msgstr "" "\n" "Вжиток:" -#: ../main.c:2189 msgid " vim [arguments] " msgstr " vim [аргументи] " -#: ../main.c:2193 msgid "" "\n" " or:" @@ -3471,7 +2726,6 @@ msgstr "" "\n" " або:" -#: ../main.c:2196 msgid "" "\n" "\n" @@ -3481,192 +2735,146 @@ msgstr "" "\n" "Аргументи:\n" -#: ../main.c:2197 msgid "--\t\t\tOnly file names after this" msgstr "--\t\t\tЛише назви файлів після цього" -#: ../main.c:2199 msgid "--literal\t\tDon't expand wildcards" msgstr "--literal\t\tНе розкривати шаблони" -#: ../main.c:2201 msgid "-v\t\t\tVi mode (like \"vi\")" msgstr "-v\t\t\tРежим Vi (ніби «vi»)" -#: ../main.c:2202 msgid "-e\t\t\tEx mode (like \"ex\")" msgstr "-e\t\t\tРежим Ex (ніби «ex»)" -#: ../main.c:2203 msgid "-E\t\t\tImproved Ex mode" msgstr "-E\t\t\tПокращений режим Ex" -#: ../main.c:2204 msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")" msgstr "-s\t\t\tМовчазний (пакетний) режим (лише для «ex»)" -#: ../main.c:2205 msgid "-d\t\t\tDiff mode (like \"vimdiff\")" msgstr "-d\t\t\tРежим порівняння (ніби «vimdiff»)" -#: ../main.c:2206 msgid "-y\t\t\tEasy mode (like \"evim\", modeless)" msgstr "-y\t\t\tПростий режим (ніби «evim», без режимів)" -#: ../main.c:2207 msgid "-R\t\t\tReadonly mode (like \"view\")" msgstr "-R\t\t\tРежим перегляду (ніби «view»)" -#: ../main.c:2208 msgid "-Z\t\t\tRestricted mode (like \"rvim\")" msgstr "-Z\t\t\tОбмежений режим (ніби «rvim»)" -#: ../main.c:2209 msgid "-m\t\t\tModifications (writing files) not allowed" msgstr "-m\t\t\tЗміни (запис файлів) не дозволено" -#: ../main.c:2210 msgid "-M\t\t\tModifications in text not allowed" msgstr "-M\t\t\tЗміни в тексті файлів не дозволено" -#: ../main.c:2211 msgid "-b\t\t\tBinary mode" msgstr "-b\t\t\tДвійковий режим" -#: ../main.c:2212 msgid "-l\t\t\tLisp mode" msgstr "-l\t\t\tРежим lisp" -#: ../main.c:2213 msgid "-C\t\t\tCompatible with Vi: 'compatible'" msgstr "-C\t\t\tСумісний з Vi режим: 'compatible'" -#: ../main.c:2214 msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'" msgstr "-N\t\t\tНе зовсім сумісний з Vi режим: 'nocompatible'" -#: ../main.c:2215 msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]" msgstr "-V[N][файл]\t\tБільше повідомлень [рівень N] [файл журн. повідомлень]" -#: ../main.c:2216 msgid "-D\t\t\tDebugging mode" msgstr "-D\t\t\tРежим налагодження" -#: ../main.c:2217 msgid "-n\t\t\tNo swap file, use memory only" msgstr "-n\t\t\tНе використовувати файл обміну, тримати усе в пам'яті" -#: ../main.c:2218 msgid "-r\t\t\tList swap files and exit" msgstr "-r\t\t\tПоказати файли обміну і вийти" -#: ../main.c:2219 msgid "-r (with file name)\tRecover crashed session" msgstr "-r (назва файлу)\tВідновити аварійно закінчений сеанс" -#: ../main.c:2220 msgid "-L\t\t\tSame as -r" msgstr "-L\t\t\tТе саме, що й -r" -#: ../main.c:2221 msgid "-A\t\t\tstart in Arabic mode" msgstr "-A\t\t\tЗапустити в режимі арабської мови" -#: ../main.c:2222 msgid "-H\t\t\tStart in Hebrew mode" msgstr "-H\t\t\tЗапустити в режимі івриту" -#: ../main.c:2223 msgid "-F\t\t\tStart in Farsi mode" msgstr "-F\t\t\tЗапустити в режимі перської мови" -#: ../main.c:2224 msgid "-T <terminal>\tSet terminal type to <terminal>" msgstr "-T <термінал>\tВстановити тип терміналу у <термінал>" -#: ../main.c:2225 msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc" msgstr "-u <vimrc>\t\tВикористати поданий файл замість .vimrc" -#: ../main.c:2226 msgid "--noplugin\t\tDon't load plugin scripts" msgstr "--noplugin\t\tНе вантажити скрипти доповнення" -#: ../main.c:2227 msgid "-p[N]\t\tOpen N tab pages (default: one for each file)" msgstr "-p[N]\t\tВідкрити N вкладок (або по одній для кожного файлу)" -#: ../main.c:2228 msgid "-o[N]\t\tOpen N windows (default: one for each file)" msgstr "-o[N]\t\tВідкрити N вікон (або по одному для кожного файлу)" -#: ../main.c:2229 msgid "-O[N]\t\tLike -o but split vertically" msgstr "-O[N]\t\tНіби -o, але поділити вікна вертикально" -#: ../main.c:2230 msgid "+\t\t\tStart at end of file" msgstr "+\t\t\tРозпочати в кінці файлу" -#: ../main.c:2231 msgid "+<lnum>\t\tStart at line <lnum>" msgstr "+<рядок>\t\tРозпочати у вказаному <рядку>" -#: ../main.c:2232 msgid "--cmd <command>\tExecute <command> before loading any vimrc file" msgstr "--cmd <команда>\tВиконати <команду> перед завантаженням vimrc" -#: ../main.c:2233 msgid "-c <command>\t\tExecute <command> after loading the first file" msgstr "-c <команда>\t\tВиконати <команду> після завантаження першого файлу" -#: ../main.c:2235 msgid "-S <session>\t\tSource file <session> after loading the first file" msgstr "-S <сеанс>\t\tВиконати поданий файл після першого завантаженого файлу" -#: ../main.c:2236 msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>" msgstr "-s <скрипт>\t\tЗчитати команди нормального режиму з файлу <скрипт>" -#: ../main.c:2237 msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>" msgstr "-w <скрипт>\t\tДописати усі набрані команди до файлу <скрипт>" -#: ../main.c:2238 msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>" msgstr "-w <скрипт>\t\tЗаписати усі набрані команди у файл <скрипт>" -#: ../main.c:2240 msgid "--startuptime <file>\tWrite startup timing messages to <file>" msgstr "" "--startuptime <файл>\tЗаписати запускні повідомлення з часовими відмітками " "до <файлу>" -#: ../main.c:2242 msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo" msgstr "-i <viminfo>\t\tВикористати <viminfo> замість .viminfo" -#: ../main.c:2243 msgid "-h or --help\tPrint Help (this message) and exit" msgstr "-h чи --help\tНадрукувати це повідомлення і вийти" -#: ../main.c:2244 msgid "--version\t\tPrint version information and exit" msgstr "--version\t\tНадрукувати інформацію про версію програми і вийти" -#: ../mark.c:676 msgid "No marks set" msgstr "Не встановлено жодної помітки" -#: ../mark.c:678 #, c-format msgid "E283: No marks matching \"%s\"" msgstr "E283: Помітку «%s» не знайдено" # msgstr "E283: " #. Highlight title -#: ../mark.c:687 msgid "" "\n" "mark line col file/text" @@ -3675,7 +2883,6 @@ msgstr "" "пом. ряд. кол. файл/текст" #. Highlight title -#: ../mark.c:789 msgid "" "\n" " jump line col file/text" @@ -3685,7 +2892,6 @@ msgstr "" # msgstr "E283: " #. Highlight title -#: ../mark.c:831 msgid "" "\n" "change line col text" @@ -3694,7 +2900,6 @@ msgstr "" "змінити ряд. стовп. текст" # TODO -#: ../mark.c:1238 msgid "" "\n" "# File marks:\n" @@ -3703,7 +2908,6 @@ msgstr "" "# Помітки:\n" #. Write the jumplist with -' -#: ../mark.c:1271 msgid "" "\n" "# Jumplist (newest first):\n" @@ -3712,7 +2916,6 @@ msgstr "" "# Список переходів (від найновіших):\n" # TODO -#: ../mark.c:1352 msgid "" "\n" "# History of marks within files (newest to oldest):\n" @@ -3720,90 +2923,71 @@ msgstr "" "\n" "# Попередні помітки в файлах (від найновіших):\n" -#: ../mark.c:1431 msgid "Missing '>'" msgstr "Пропущено '>'" # msgstr "E292: " -#: ../memfile.c:426 msgid "E293: block was not locked" msgstr "E293: Блок не було зафіксовано" # msgstr "E293: " -#: ../memfile.c:799 msgid "E294: Seek error in swap file read" msgstr "E294: Помилка зміни позиції у файлі обміну" -#: ../memfile.c:803 msgid "E295: Read error in swap file" msgstr "E295: Помилка зчитування файлу обміну" -#: ../memfile.c:849 msgid "E296: Seek error in swap file write" msgstr "E296: Помилка зміни позиції під час запису у файл обміну" -#: ../memfile.c:865 msgid "E297: Write error in swap file" msgstr "E297: Помилка запису файлу обміну" -#: ../memfile.c:1036 msgid "E300: Swap file already exists (symlink attack?)" msgstr "E300: Файл обміну вже існує (атака символьним посиланням?)" -#: ../memline.c:318 msgid "E298: Didn't get block nr 0?" msgstr "E298: Немає блоку 0?" -#: ../memline.c:361 msgid "E298: Didn't get block nr 1?" msgstr "E298: Немає блоку 1?" # msgstr "E298: " -#: ../memline.c:377 msgid "E298: Didn't get block nr 2?" msgstr "E298: Немає блоку 2?" #. could not (re)open the swap file, what can we do???? -#: ../memline.c:465 msgid "E301: Oops, lost the swap file!!!" msgstr "E301: Ой, втрачено файл обміну!!!" # msgstr "E301: " -#: ../memline.c:477 msgid "E302: Could not rename swap file" msgstr "E302: Не вдалося перейменувати файлу обміну" # msgstr "E302: " -#: ../memline.c:554 #, c-format msgid "E303: Unable to open swap file for \"%s\", recovery impossible" msgstr "E303: Не вдалося прочитати файл обміну для «%s», відновлення неможливе" -#: ../memline.c:666 msgid "E304: ml_upd_block0(): Didn't get block 0??" msgstr "E304: ml_upd_block0(): Немає блоку 0??" #. no swap files found -#: ../memline.c:830 #, c-format msgid "E305: No swap file found for %s" msgstr "E305: Не знайдено файлу обміну для %s" # msgstr "E305: " -#: ../memline.c:839 msgid "Enter number of swap file to use (0 to quit): " msgstr "Введіть номер файлу обміну, котрий використати, (0 для виходу):" -#: ../memline.c:879 #, c-format msgid "E306: Cannot open %s" msgstr "E306: Не вдалося відкрити %s" -#: ../memline.c:897 msgid "Unable to read block 0 from " msgstr "Не вдалося прочитати блок 0 з " -#: ../memline.c:900 msgid "" "\n" "Maybe no changes were made or Vim did not update the swap file." @@ -3811,28 +2995,22 @@ msgstr "" "\n" "Напевно, змін не було, або Vim не поновив файл обміну." -#: ../memline.c:909 msgid " cannot be used with this version of Vim.\n" msgstr " не можна використати з цією версією Vim.\n" -#: ../memline.c:911 msgid "Use Vim version 3.0.\n" msgstr "Знайдіть Vim 3.0\n" -#: ../memline.c:916 #, c-format msgid "E307: %s does not look like a Vim swap file" msgstr "E307: %s не схоже на файл обміну Vim" -#: ../memline.c:922 msgid " cannot be used on this computer.\n" msgstr " не можна використати на цьому комп'ютері.\n" -#: ../memline.c:924 msgid "The file was created on " msgstr "Файл було створено на " -#: ../memline.c:928 msgid "" ",\n" "or the file has been damaged." @@ -3840,89 +3018,70 @@ msgstr "" ",\n" "або файл було пошкоджено." -#: ../memline.c:945 msgid " has been damaged (page size is smaller than minimum value).\n" msgstr " пошкоджений (розмір сторінки менший мінімального значення).\n" -#: ../memline.c:974 #, c-format msgid "Using swap file \"%s\"" msgstr "Використовується файл обміну «%s»" -#: ../memline.c:980 #, c-format msgid "Original file \"%s\"" msgstr "Початковий файл «%s»" -#: ../memline.c:995 msgid "E308: Warning: Original file may have been changed" msgstr "E308: Застереження: Можливо, початковий файл було змінено" # msgstr "E308: " -#: ../memline.c:1061 #, c-format msgid "E309: Unable to read block 1 from %s" msgstr "E309: Не вдалося прочитати блок 1 з %s" # msgstr "E309: " -#: ../memline.c:1065 msgid "???MANY LINES MISSING" msgstr "??? БРАКУЄ БАГАТЬОХ РЯДКІВ" -#: ../memline.c:1076 msgid "???LINE COUNT WRONG" msgstr "??? НЕПРАВИЛЬНА КІЛЬКІСТЬ РЯДКІВ" -#: ../memline.c:1082 msgid "???EMPTY BLOCK" msgstr "??? ПОРОЖНІЙ БЛОК" -#: ../memline.c:1103 msgid "???LINES MISSING" msgstr "??? ПРОПУЩЕНІ РЯДКИ" -#: ../memline.c:1128 #, c-format msgid "E310: Block 1 ID wrong (%s not a .swp file?)" msgstr "E310: Ідентифікатор блоку 1 неправильний (%s не є файлом обміну?)" # msgstr "E310: " -#: ../memline.c:1133 msgid "???BLOCK MISSING" msgstr "??? ПРОПУЩЕНО БЛОК" -#: ../memline.c:1147 msgid "??? from here until ???END lines may be messed up" msgstr "??? звідси і до `??? КІНЕЦЬ' рядки, можливо, сплутані" -#: ../memline.c:1164 msgid "??? from here until ???END lines may have been inserted/deleted" msgstr "??? звідси і до `??? КІНЕЦЬ' рядки, можливо, були додані/знищені" -#: ../memline.c:1181 msgid "???END" msgstr "??? КІНЕЦЬ" -#: ../memline.c:1238 msgid "E311: Recovery Interrupted" msgstr "E311: Відновлення перервано" -#: ../memline.c:1243 msgid "" "E312: Errors detected while recovering; look for lines starting with ???" msgstr "" "E312: Під час відновлення знайдено помилки. Перегляньте рядки, що " "починаються з ???" -#: ../memline.c:1245 msgid "See \":help E312\" for more information." msgstr "Див. «:help E312» для уточнення." -#: ../memline.c:1249 msgid "Recovery completed. You should check if everything is OK." msgstr "Відновлення закінчено, перевірте чи все гаразд." -#: ../memline.c:1251 msgid "" "\n" "(You might want to write out this file under another name\n" @@ -3930,15 +3089,12 @@ msgstr "" "\n" "(Можливо, потрібно записати цей файл під іншою назвою\n" -#: ../memline.c:1252 msgid "and run diff with the original file to check for changes)" msgstr "і запустити diff з оригіналом щоб перевірити зміни)" -#: ../memline.c:1254 msgid "Recovery completed. Buffer contents equals file contents." msgstr "Відновлення закінчено. Вміст буфера співпадає зі вмістом файлу." -#: ../memline.c:1255 msgid "" "\n" "You may want to delete the .swp file now.\n" @@ -3949,51 +3105,39 @@ msgstr "" "\n" #. use msg() to start the scrolling properly -#: ../memline.c:1327 msgid "Swap files found:" msgstr "Знайдено файли обміну:" -#: ../memline.c:1446 msgid " In current directory:\n" msgstr " В поточному каталозі:\n" -#: ../memline.c:1448 msgid " Using specified name:\n" msgstr " Використовуючи вказану назву:\n" -#: ../memline.c:1450 msgid " In directory " msgstr " У каталозі " -#: ../memline.c:1465 msgid " -- none --\n" msgstr " -- жодного --\n" -#: ../memline.c:1527 msgid " owned by: " msgstr " власник: " -#: ../memline.c:1529 msgid " dated: " msgstr " дата: " -#: ../memline.c:1532 ../memline.c:3231 msgid " dated: " msgstr " дата: " -#: ../memline.c:1548 msgid " [from Vim version 3.0]" msgstr " [від Vim 3.0]" -#: ../memline.c:1550 msgid " [does not look like a Vim swap file]" msgstr " [не схоже на файл обміну]" -#: ../memline.c:1552 msgid " file name: " msgstr " назва файлу: " -#: ../memline.c:1558 msgid "" "\n" " modified: " @@ -4001,15 +3145,12 @@ msgstr "" "\n" " змінено: " -#: ../memline.c:1559 msgid "YES" msgstr "ТАК" -#: ../memline.c:1559 msgid "no" msgstr "ні" -#: ../memline.c:1562 msgid "" "\n" " user name: " @@ -4017,11 +3158,9 @@ msgstr "" "\n" " користувач: " -#: ../memline.c:1568 msgid " host name: " msgstr " назва вузла: " -#: ../memline.c:1570 msgid "" "\n" " host name: " @@ -4029,7 +3168,6 @@ msgstr "" "\n" " назва вузла: " -#: ../memline.c:1575 msgid "" "\n" " process ID: " @@ -4037,11 +3175,9 @@ msgstr "" "\n" " ID процесу: " -#: ../memline.c:1579 msgid " (still running)" msgstr " (виконується)" -#: ../memline.c:1586 msgid "" "\n" " [not usable on this computer]" @@ -4049,106 +3185,84 @@ msgstr "" "\n" " [непридатний на цьому комп'ютері]" -#: ../memline.c:1590 msgid " [cannot be read]" msgstr " [не можна прочитати]" -#: ../memline.c:1593 msgid " [cannot be opened]" msgstr " [не можна відкрити]" -#: ../memline.c:1698 msgid "E313: Cannot preserve, there is no swap file" msgstr "E313: Не вдалося заготовити, немає файлу обміну" # msgstr "E313: " -#: ../memline.c:1747 msgid "File preserved" msgstr "Файл збережено" -#: ../memline.c:1749 msgid "E314: Preserve failed" msgstr "E314: Збереження не вдалося" # msgstr "E314: " -#: ../memline.c:1819 #, c-format msgid "E315: ml_get: invalid lnum: %<PRId64>" msgstr "E315: ml_get: неправильний lnum: %<PRId64>" # msgstr "E315: " -#: ../memline.c:1851 #, c-format msgid "E316: ml_get: cannot find line %<PRId64>" msgstr "E316: ml_get: не знайшов рядок %<PRId64>" # msgstr "E316: " -#: ../memline.c:2236 msgid "E317: pointer block id wrong 3" msgstr "E317: Вказівник блоку помилковий 3" # msgstr "E317: " -#: ../memline.c:2311 msgid "stack_idx should be 0" msgstr "stack_idx має бути рівним 0" -#: ../memline.c:2369 msgid "E318: Updated too many blocks?" msgstr "E318: Поновлено забагато блоків?" -#: ../memline.c:2511 msgid "E317: pointer block id wrong 4" msgstr "E317: Вказівник блоку помилковий 4" -#: ../memline.c:2536 msgid "deleted block 1?" msgstr "блок 1 знищено?" -#: ../memline.c:2707 #, c-format msgid "E320: Cannot find line %<PRId64>" msgstr "E320: Не вдалося знайти рядок %<PRId64>" -#: ../memline.c:2916 msgid "E317: pointer block id wrong" msgstr "E317: Вказівник блоку помилковий" # msgstr "E317: " -#: ../memline.c:2930 msgid "pe_line_count is zero" msgstr "pe_line_count дорівнює 0" -#: ../memline.c:2955 #, c-format msgid "E322: line number out of range: %<PRId64> past the end" msgstr "E322: Номер рядка вийшов за межі: %<PRId64> за кінцем" # msgstr "E322: " -#: ../memline.c:2959 #, c-format msgid "E323: line count wrong in block %<PRId64>" msgstr "E323: Кількість рядків у блоці %<PRId64>" # msgstr "E323: " -#: ../memline.c:2999 msgid "Stack size increases" msgstr "Розмір стеку збільшується" -#: ../memline.c:3038 msgid "E317: pointer block id wrong 2" msgstr "E317: Вказівник блоку помилковий 2" -#: ../memline.c:3070 #, c-format msgid "E773: Symlink loop for \"%s\"" msgstr "E773: Циклічні символьні посилання «%s»" # msgstr "E317: " -#: ../memline.c:3221 msgid "E325: ATTENTION" msgstr "E325: УВАГА" -#: ../memline.c:3222 msgid "" "\n" "Found a swap file by the name \"" @@ -4156,15 +3270,12 @@ msgstr "" "\n" "Знайдено файл обміну з назвою \"" -#: ../memline.c:3226 msgid "While opening file \"" msgstr "При відкритті файлу \"" -#: ../memline.c:3239 msgid " NEWER than swap file!\n" msgstr " НОВІШИЙ за файл обміну!\n" -#: ../memline.c:3244 msgid "" "\n" "(1) Another program may be editing the same file. If this is the case,\n" @@ -4176,19 +3287,15 @@ msgstr "" " будьте обережні, щоб не залишилися два різні екземпляри\n" " одного й того самого файлу після змін." -#: ../memline.c:3245 msgid " Quit, or continue with caution.\n" msgstr " Вийдіть або продовжуйте обережно.\n" -#: ../memline.c:3246 msgid "(2) An edit session for this file crashed.\n" msgstr "(2) Сеанс редагування цього файлу зазнав краху.\n" -#: ../memline.c:3247 msgid " If this is the case, use \":recover\" or \"vim -r " msgstr " Якщо це справді трапилося, спробуйте «:recover» або «vim -r " -#: ../memline.c:3249 msgid "" "\"\n" " to recover the changes (see \":help recovery\").\n" @@ -4196,11 +3303,9 @@ msgstr "" "»\n" " щоб відновити зміни (див. «:help recovery»).\n" -#: ../memline.c:3250 msgid " If you did this already, delete the swap file \"" msgstr " Якщо ви вже це зробили, знищіть файл обміну «" -#: ../memline.c:3252 msgid "" "\"\n" " to avoid this message.\n" @@ -4209,23 +3314,18 @@ msgstr "" " щоб позбутися цього повідомлення.\n" "\n" -#: ../memline.c:3450 ../memline.c:3452 msgid "Swap file \"" msgstr "Файл обміну «" -#: ../memline.c:3451 ../memline.c:3455 msgid "\" already exists!" msgstr "» вже існує!" -#: ../memline.c:3457 msgid "VIM - ATTENTION" msgstr "VIM — УВАГА" -#: ../memline.c:3459 msgid "Swap file already exists!" msgstr "Файл обміну вже існує!" -#: ../memline.c:3464 msgid "" "&Open Read-Only\n" "&Edit anyway\n" @@ -4239,7 +3339,6 @@ msgstr "" "&Q:Вийти\n" "&A:Перервати" -#: ../memline.c:3467 msgid "" "&Open Read-Only\n" "&Edit anyway\n" @@ -4263,56 +3362,46 @@ msgstr "" #. #. ".s?a" #. ".saa": tried enough, give up -#: ../memline.c:3528 msgid "E326: Too many swap files found" msgstr "E326: Знайдено забагато файлів обміну" # msgstr "E341: " -#: ../memory.c:227 #, c-format msgid "E342: Out of memory! (allocating %<PRIu64> bytes)" msgstr "E342: Забракло пам'яті! (потрібно було %<PRIu64> байтів)" # msgstr "E326: " -#: ../menu.c:62 msgid "E327: Part of menu-item path is not sub-menu" msgstr "E327: Частина шляху до елемента меню не є підменю" # msgstr "E327: " -#: ../menu.c:63 msgid "E328: Menu only exists in another mode" msgstr "E328: Меню може бути тільки в іншому режимі" # msgstr "E328: " -#: ../menu.c:64 #, c-format msgid "E329: No menu \"%s\"" msgstr "E329: Немає меню «%s»" #. Only a mnemonic or accelerator is not valid. -#: ../menu.c:329 msgid "E792: Empty menu name" msgstr "E792: Порожня назва меню" # msgstr "E329: " -#: ../menu.c:340 msgid "E330: Menu path must not lead to a sub-menu" msgstr "E330: Шлях до меню не повинен вести до підменю" # msgstr "E330: " -#: ../menu.c:365 msgid "E331: Must not add menu items directly to menu bar" msgstr "E331: Не можна додавати елементи меню просто до верхнього меню" # msgstr "E331: " -#: ../menu.c:370 msgid "E332: Separator cannot be part of a menu path" msgstr "E332: Роздільник не може бути частиною шляху меню" # msgstr "E332: " #. Now we have found the matching menu, and we list the mappings #. Highlight title -#: ../menu.c:762 msgid "" "\n" "--- Menus ---" @@ -4320,78 +3409,59 @@ msgstr "" "\n" "--- Меню ---" -#: ../menu.c:1313 msgid "E333: Menu path must lead to a menu item" msgstr "E333: Шлях повинен вести до елемента меню" # msgstr "E333: " -#: ../menu.c:1330 #, c-format msgid "E334: Menu not found: %s" msgstr "E334: Меню не знайдено: %s" # msgstr "E334: " -#: ../menu.c:1396 #, c-format msgid "E335: Menu not defined for %s mode" msgstr "E335: Для режиму %s меню не визначено" # msgstr "E335: " -#: ../menu.c:1426 msgid "E336: Menu path must lead to a sub-menu" msgstr "E336: Шлях повинен вести до підменю" # msgstr "E336: " -#: ../menu.c:1447 msgid "E337: Menu not found - check menu names" msgstr "E337: Меню не знайдено — перевірте назву" # msgstr "E337: " -#: ../message.c:423 #, c-format msgid "Error detected while processing %s:" msgstr "Виявлено помилку під час виконання %s:" -#: ../message.c:445 #, c-format msgid "line %4ld:" msgstr "рядок %4ld:" -#: ../message.c:617 #, c-format msgid "E354: Invalid register name: '%s'" msgstr "E354: Неправильна назва регістру: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Українізація: Анатолій Сахнік <sakhnik@gmail.com>" - -#: ../message.c:986 msgid "Interrupt: " msgstr "Перервано: " -#: ../message.c:988 msgid "Press ENTER or type command to continue" msgstr "Натисніть ENTER або введіть команду для продовження" -#: ../message.c:1843 #, c-format msgid "%s line %<PRId64>" msgstr "%s рядок %<PRId64>" -#: ../message.c:2392 msgid "-- More --" msgstr "-- Ще --" -#: ../message.c:2398 msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit " msgstr " ПРОБІЛ/d/j: вниз на екран/сторінку/рядок, b/u/k: вгору, q: вийти " -#: ../message.c:3021 ../message.c:3031 msgid "Question" msgstr "Запитання" -#: ../message.c:3023 msgid "" "&Yes\n" "&No" @@ -4399,7 +3469,6 @@ msgstr "" "&Y:Так\n" "&N:Ні" -#: ../message.c:3033 msgid "" "&Yes\n" "&No\n" @@ -4409,7 +3478,6 @@ msgstr "" "&N:Ні\n" "&C:Скасувати" -#: ../message.c:3045 msgid "" "&Yes\n" "&No\n" @@ -4423,178 +3491,139 @@ msgstr "" "&D:Жодного\n" "&C:Скасувати" -#: ../message.c:3058 msgid "E766: Insufficient arguments for printf()" msgstr "E766: Недостатньо аргументів для printf()" -#: ../message.c:3119 msgid "E807: Expected Float argument for printf()" msgstr "E807: Очікується аргумент Float для printf()" -#: ../message.c:3873 msgid "E767: Too many arguments to printf()" msgstr "E767: Забагато аргументів для printf()" # msgstr "E338: " -#: ../misc1.c:2256 msgid "W10: Warning: Changing a readonly file" msgstr "W10: Застереження: Змінюється файл призначений лише для читання" -#: ../misc1.c:2537 msgid "Type number and <Enter> or click with mouse (empty cancels): " msgstr "Наберіть число й <Enter> чи клацніть мишкою (порожнє скасовує): " -#: ../misc1.c:2539 msgid "Type number and <Enter> (empty cancels): " msgstr "Наберіть число й <Enter> (порожнє скасовує): " -#: ../misc1.c:2585 msgid "1 more line" msgstr "додано один рядок" -#: ../misc1.c:2588 msgid "1 line less" msgstr "знищено один рядок" -#: ../misc1.c:2593 #, c-format msgid "%<PRId64> more lines" msgstr "додано рядків: %<PRId64>" -#: ../misc1.c:2596 #, c-format msgid "%<PRId64> fewer lines" msgstr "знищено рядків: %<PRId64>" -#: ../misc1.c:2599 msgid " (Interrupted)" msgstr " (Перервано)" -#: ../misc1.c:2635 msgid "Beep!" msgstr "Дзень!" # msgstr "E342: " -#: ../misc2.c:738 #, c-format msgid "Calling shell to execute: \"%s\"" msgstr "Викликається оболонка щоб виконати: «%s»" # msgstr "E348: " -#: ../normal.c:183 msgid "E349: No identifier under cursor" msgstr "E349: Немає ідентифікатора над курсором" -#: ../normal.c:1866 msgid "E774: 'operatorfunc' is empty" msgstr "E774: 'operatorfunc' порожня" -#: ../normal.c:2637 msgid "Warning: terminal cannot highlight" msgstr "Застереження: Термінал не підтримує кольори" -#: ../normal.c:2807 msgid "E348: No string under cursor" msgstr "E348: Немає рядка на курсорі" -#: ../normal.c:3937 msgid "E352: Cannot erase folds with current 'foldmethod'" msgstr "E352: Не вдалося знищити згортки поточним методом 'foldmethod'" -#: ../normal.c:5897 msgid "E664: changelist is empty" msgstr "E664: Список змін порожній" -#: ../normal.c:5899 msgid "E662: At start of changelist" msgstr "E662: Початок списку змін" -#: ../normal.c:5901 msgid "E663: At end of changelist" msgstr "E663: Кінець списку змін" -#: ../normal.c:7053 msgid "Type :quit<Enter> to exit Nvim" msgstr "Уведіть :quit<Enter> щоб вийти з Vim" -#: ../ops.c:248 #, c-format msgid "1 line %sed 1 time" msgstr "Один рядок %s-но" -#: ../ops.c:250 #, c-format msgid "1 line %sed %d times" msgstr "Один рядок %s-но %d разів" -#: ../ops.c:253 #, c-format msgid "%<PRId64> lines %sed 1 time" msgstr "%<PRId64> рядків %s-но" -#: ../ops.c:256 #, c-format msgid "%<PRId64> lines %sed %d times" msgstr "%<PRId64> рядків %s-но %d разів" -#: ../ops.c:592 #, c-format msgid "%<PRId64> lines to indent... " msgstr "Залишилося вирівняти %<PRId64> рядків..." -#: ../ops.c:634 msgid "1 line indented " msgstr "Вирівняно один рядок" -#: ../ops.c:636 #, c-format msgid "%<PRId64> lines indented " msgstr "Вирівняно рядків: %<PRId64>" -#: ../ops.c:938 msgid "E748: No previously used register" msgstr "E748: Регістри перед цим не вживались" #. must display the prompt -#: ../ops.c:1433 msgid "cannot yank; delete anyway" msgstr "не вдалося запам'ятати; все одно знищити?" -#: ../ops.c:1929 msgid "1 line changed" msgstr "Один рядок змінено" -#: ../ops.c:1931 #, c-format msgid "%<PRId64> lines changed" msgstr "Змінено рядків: %<PRId64>" -#: ../ops.c:2521 msgid "block of 1 line yanked" msgstr "Запам'ятав блок з одного рядка" -#: ../ops.c:2523 msgid "1 line yanked" msgstr "Запам'ятав один рядок" -#: ../ops.c:2525 #, c-format msgid "block of %<PRId64> lines yanked" msgstr "Запам'ятав блок із %<PRId64> рядків" -#: ../ops.c:2528 #, c-format msgid "%<PRId64> lines yanked" msgstr "Запам'ятав рядків: %<PRId64>" -#: ../ops.c:2710 #, c-format msgid "E353: Nothing in register %s" msgstr "E353: У регістрі %s нічого немає" # msgstr "E353: " #. Highlight title -#: ../ops.c:3185 msgid "" "\n" "--- Registers ---" @@ -4602,11 +3631,9 @@ msgstr "" "\n" "--- Регістри ---" -#: ../ops.c:4455 msgid "Illegal register name" msgstr "Неправильна назва регістру" -#: ../ops.c:4533 msgid "" "\n" "# Registers:\n" @@ -4614,17 +3641,14 @@ msgstr "" "\n" "# Регістри:\n" -#: ../ops.c:4575 #, c-format msgid "E574: Unknown register type %d" msgstr "E574: Невідомий тип регістру %d" -#: ../ops.c:5089 #, c-format msgid "%<PRId64> Cols; " msgstr "довж.: %<PRId64>; " -#: ../ops.c:5097 #, c-format msgid "" "Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; " @@ -4633,7 +3657,6 @@ msgstr "" "Вибрано %s%<PRId64> з %<PRId64> рядків; %<PRId64> з %<PRId64> слів; " "%<PRId64> з %<PRId64> байтів" -#: ../ops.c:5105 #, c-format msgid "" "Selected %s%<PRId64> of %<PRId64> Lines; %<PRId64> of %<PRId64> Words; " @@ -4642,7 +3665,6 @@ msgstr "" "Вибрано %s%<PRId64> з %<PRId64> рядків; %<PRId64> з %<PRId64> слів; " "%<PRId64> of %<PRId64> символів; %<PRId64> з %<PRId64> байтів" -#: ../ops.c:5123 #, c-format msgid "" "Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Byte " @@ -4651,7 +3673,6 @@ msgstr "" "Колонка %s з %s; рядок %<PRId64> з %<PRId64>; слово %<PRId64> з %<PRId64>; " "байт %<PRId64> з %<PRId64>" -#: ../ops.c:5133 #, c-format msgid "" "Col %s of %s; Line %<PRId64> of %<PRId64>; Word %<PRId64> of %<PRId64>; Char " @@ -4660,136 +3681,105 @@ msgstr "" "Колонка %s з %s; рядок %<PRId64> з %<PRId64>; слово %<PRId64> з %<PRId64>; " "символ %<PRId64> of %<PRId64>; байт %<PRId64> з %<PRId64>" -#: ../ops.c:5146 #, c-format msgid "(+%<PRId64> for BOM)" msgstr "(+%<PRId64> для BOM)" -#: ../option.c:1238 msgid "%<%f%h%m%=Page %N" msgstr "%<%f%h%m%=Стор. %N" -#: ../option.c:1574 msgid "Thanks for flying Vim" msgstr "Дякуємо за вибір Vim" #. found a mismatch: skip -#: ../option.c:2698 msgid "E518: Unknown option" msgstr "E518: Невідома опція" -#: ../option.c:2709 msgid "E519: Option not supported" msgstr "E519: Опція не підтримується" -#: ../option.c:2740 msgid "E520: Not allowed in a modeline" msgstr "E520: Не дозволено у modeline" -#: ../option.c:2815 msgid "E846: Key code not set" msgstr "E846: Код ключа не встановлено" -#: ../option.c:2924 msgid "E521: Number required after =" msgstr "E521: Після = потрібно вказати число" -#: ../option.c:3226 ../option.c:3864 msgid "E522: Not found in termcap" msgstr "E522: Не знайдено серед можливостей терміналів" -#: ../option.c:3335 #, c-format msgid "E539: Illegal character <%s>" msgstr "E539: Недозволений символ <%s>" -#: ../option.c:3862 msgid "E529: Cannot set 'term' to empty string" msgstr "E529: Не вдалося спорожнити 'term'" -#: ../option.c:3885 msgid "E589: 'backupext' and 'patchmode' are equal" msgstr "E589: Опції 'backupext' і 'patchmode' однакові" -#: ../option.c:3964 msgid "E834: Conflicts with value of 'listchars'" msgstr "E834: Конфліктує із значенням 'listchars'" -#: ../option.c:3966 msgid "E835: Conflicts with value of 'fillchars'" msgstr "E835: Конфліктує із значенням 'fillchars'" -#: ../option.c:4163 msgid "E524: Missing colon" msgstr "E524: Бракує двокрапки" -#: ../option.c:4165 msgid "E525: Zero length string" msgstr "E525: Рядок порожній" -#: ../option.c:4220 #, c-format msgid "E526: Missing number after <%s>" msgstr "E526: Після <%s> бракує числа" -#: ../option.c:4232 msgid "E527: Missing comma" msgstr "E527: Бракує коми" -#: ../option.c:4239 msgid "E528: Must specify a ' value" msgstr "E528: Потрібно вказати значення '" -#: ../option.c:4271 msgid "E595: contains unprintable or wide character" msgstr "E595: Містить недруковні або розширені символи" -#: ../option.c:4469 #, c-format msgid "E535: Illegal character after <%c>" msgstr "E535: Недозволений символ після <%c>" -#: ../option.c:4534 msgid "E536: comma required" msgstr "E536: Потрібна кома" -#: ../option.c:4543 #, c-format msgid "E537: 'commentstring' must be empty or contain %s" msgstr "E537: 'commentstring' має бути порожньою чи містити %s" -#: ../option.c:4928 msgid "E540: Unclosed expression sequence" msgstr "E540: Послідовність виразів не завершено" -#: ../option.c:4932 msgid "E541: too many items" msgstr "E541: Забагато елементів" -#: ../option.c:4934 msgid "E542: unbalanced groups" msgstr "E542: Групи не збалансовано" -#: ../option.c:5148 msgid "E590: A preview window already exists" msgstr "E590: Вікно перегляду вже існує" -#: ../option.c:5311 msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" msgstr "" "W17: Для арабської мови потрібне UTF-8, виконайте ':set encoding=utf-8'" -#: ../option.c:5623 #, c-format msgid "E593: Need at least %d lines" msgstr "E593: Потрібно щонайменше %d рядків" -#: ../option.c:5631 #, c-format msgid "E594: Need at least %d columns" msgstr "E594: Потрібно щонайменше %d стовпців" -#: ../option.c:6011 #, c-format msgid "E355: Unknown option: %s" msgstr "E355: Невідома опція: %s" @@ -4797,13 +3787,11 @@ msgstr "E355: Невідома опція: %s" #. There's another character after zeros or the string #. * is empty. In both cases, we are trying to set a #. * num option using a string. -#: ../option.c:6037 #, c-format msgid "E521: Number required: &%s = '%s'" msgstr "E521: Потрібно вказати Number: &%s = '%s'" # msgstr "E355: " -#: ../option.c:6149 msgid "" "\n" "--- Terminal codes ---" @@ -4811,7 +3799,6 @@ msgstr "" "\n" "--- Коди терміналу ---" -#: ../option.c:6151 msgid "" "\n" "--- Global option values ---" @@ -4819,7 +3806,6 @@ msgstr "" "\n" "--- Значення загальних опцій ---" -#: ../option.c:6153 msgid "" "\n" "--- Local option values ---" @@ -4827,7 +3813,6 @@ msgstr "" "\n" "--- Значення локальних опцій ---" -#: ../option.c:6155 msgid "" "\n" "--- Options ---" @@ -4835,23 +3820,19 @@ msgstr "" "\n" "--- Опції ---" -#: ../option.c:6816 msgid "E356: get_varp ERROR" msgstr "E356: Помилка get_varp" # msgstr "E356: " -#: ../option.c:7696 #, c-format msgid "E357: 'langmap': Matching character missing for %s" msgstr "E357: 'langmap': Для символу %s немає пари" # msgstr "E357: " -#: ../option.c:7715 #, c-format msgid "E358: 'langmap': Extra characters after semicolon: %s" msgstr "E358: 'langmap': Зайві символи після `;': %s" -#: ../os/shell.c:194 msgid "" "\n" "Cannot execute shell " @@ -4860,7 +3841,6 @@ msgstr "" "Не вдалося запустити оболонку" # msgstr "E362: " -#: ../os/shell.c:439 msgid "" "\n" "shell returned " @@ -4868,7 +3848,6 @@ msgstr "" "\n" "оболонка повернула: " -#: ../os_unix.c:465 ../os_unix.c:471 msgid "" "\n" "Could not get security context for " @@ -4876,7 +3855,6 @@ msgstr "" "\n" "Не вдалося отримати контекст безпеки для " -#: ../os_unix.c:479 msgid "" "\n" "Could not set security context for " @@ -4884,234 +3862,187 @@ msgstr "" "\n" "Не вдалося встановити контекст безпеки для " -#: ../os_unix.c:1558 ../os_unix.c:1647 #, c-format msgid "dlerror = \"%s\"" msgstr "dlerror = «%s»" # msgstr "E446: " -#: ../path.c:1449 #, c-format msgid "E447: Can't find file \"%s\" in path" msgstr "E447: Файл «%s» не знайдено у шляху пошуку" # msgstr "E371: " -#: ../quickfix.c:359 #, c-format msgid "E372: Too many %%%c in format string" msgstr "E372: Забагато %%%c у рядку формату" # msgstr "E372: " -#: ../quickfix.c:371 #, c-format msgid "E373: Unexpected %%%c in format string" msgstr "E373: Неочікуваний `%%%c' у рядку формату" # msgstr "E373: " -#: ../quickfix.c:420 msgid "E374: Missing ] in format string" msgstr "E374: Пропущено ] у рядку формату" # msgstr "E374: " -#: ../quickfix.c:431 #, c-format msgid "E375: Unsupported %%%c in format string" msgstr "E375: %%%c у рядку формату не підтримується" # msgstr "E375: " -#: ../quickfix.c:448 #, c-format msgid "E376: Invalid %%%c in format string prefix" msgstr "E376: Помилковий `%%%c' у префіксі рядку формату" # msgstr "E376: " -#: ../quickfix.c:454 #, c-format msgid "E377: Invalid %%%c in format string" msgstr "E377: Помилковий `%%%c' у рядку формату" # msgstr "E377: " #. nothing found -#: ../quickfix.c:477 msgid "E378: 'errorformat' contains no pattern" msgstr "E378: 'errorformat' не містить зразок" # msgstr "E378: " -#: ../quickfix.c:695 msgid "E379: Missing or empty directory name" msgstr "E379: Пропущена чи порожня назва каталогу" -#: ../quickfix.c:1305 msgid "E553: No more items" msgstr "E553: Немає більше елементів" -#: ../quickfix.c:1674 #, c-format msgid "(%d of %d)%s%s: " msgstr "(%d з %d)%s%s: " -#: ../quickfix.c:1676 msgid " (line deleted)" msgstr " (рядок знищено)" -#: ../quickfix.c:1863 msgid "E380: At bottom of quickfix stack" msgstr "E380: Дно стеку виправлень" -#: ../quickfix.c:1869 msgid "E381: At top of quickfix stack" msgstr "E381: Вершина стеку виправлень" -#: ../quickfix.c:1880 #, c-format msgid "error list %d of %d; %d errors" msgstr "список помилок %d з %d; %d помилок" -#: ../quickfix.c:2427 msgid "E382: Cannot write, 'buftype' option is set" msgstr "E382: Не можу записати, вказана опція 'buftype'" -#: ../quickfix.c:2812 msgid "E683: File name missing or invalid pattern" msgstr "E683: Пропущено назву файлу чи некоректний шаблон" -#: ../quickfix.c:2911 #, c-format msgid "Cannot open file \"%s\"" msgstr "Не вдалося відкрити файл «%s»" -#: ../quickfix.c:3429 msgid "E681: Buffer is not loaded" msgstr "E681: Буфер не завантажено" -#: ../quickfix.c:3487 msgid "E777: String or List expected" msgstr "E777: Очікується String чи List" -#: ../regexp.c:359 #, c-format msgid "E369: invalid item in %s%%[]" msgstr "E369: Некоректний елемент у %s%%[]" -#: ../regexp.c:374 #, c-format msgid "E769: Missing ] after %s[" msgstr "E769: Бракує ] після %s[" -#: ../regexp.c:375 #, c-format msgid "E53: Unmatched %s%%(" msgstr "E53: Немає пари %s%%(" -#: ../regexp.c:376 #, c-format msgid "E54: Unmatched %s(" msgstr "E54: Немає пари %s(" -#: ../regexp.c:377 #, c-format msgid "E55: Unmatched %s)" msgstr "E55: Немає пари %s)" # msgstr "E406: " -#: ../regexp.c:378 msgid "E66: \\z( not allowed here" msgstr "E66: \\z( тут не дозволено" # msgstr "E406: " -#: ../regexp.c:379 msgid "E67: \\z1 et al. not allowed here" msgstr "E67: \\z1 та ін. тут не дозволено" -#: ../regexp.c:380 #, c-format msgid "E69: Missing ] after %s%%[" msgstr "E69: Пропущено ] після %s%%[" -#: ../regexp.c:381 #, c-format msgid "E70: Empty %s%%[]" msgstr "E70: %s%%[] порожній" # msgstr "E382: " -#: ../regexp.c:1209 ../regexp.c:1224 msgid "E339: Pattern too long" msgstr "E339: Зразок занадто довгий" -#: ../regexp.c:1371 msgid "E50: Too many \\z(" msgstr "E50: Забагато \\z(" -#: ../regexp.c:1378 #, c-format msgid "E51: Too many %s(" msgstr "E51: Забагато %s(" -#: ../regexp.c:1427 msgid "E52: Unmatched \\z(" msgstr "E52: Немає пари \\z(" -#: ../regexp.c:1637 #, c-format msgid "E59: invalid character after %s@" msgstr "E59: Недозволений символ після %s@" -#: ../regexp.c:1672 #, c-format msgid "E60: Too many complex %s{...}s" msgstr "E60: Забагато складних %s{...}" # msgstr "E339: " -#: ../regexp.c:1687 #, c-format msgid "E61: Nested %s*" msgstr "E61: Вкладені %s*" # msgstr "E61: " -#: ../regexp.c:1690 #, c-format msgid "E62: Nested %s%c" msgstr "E62: Вкладені %s%c" -#: ../regexp.c:1800 msgid "E63: invalid use of \\_" msgstr "E63: Некоректно вжито \\_" # msgstr "E62: " -#: ../regexp.c:1850 #, c-format msgid "E64: %s%c follows nothing" msgstr "E64: Після %s%c нічого немає" -#: ../regexp.c:1902 msgid "E65: Illegal back reference" msgstr "E65: Некоректне зворотнє посилання" -#: ../regexp.c:1943 msgid "E68: Invalid character after \\z" msgstr "E68: Неправильний символ після \\z" -#: ../regexp.c:2049 ../regexp_nfa.c:1296 #, c-format msgid "E678: Invalid character after %s%%[dxouU]" msgstr "E678: Недозволений символ після %s%%[dxouU]" -#: ../regexp.c:2107 #, c-format msgid "E71: Invalid character after %s%%" msgstr "E71: Недозволений символ після %s%%" # msgstr "E64: " -#: ../regexp.c:3017 #, c-format msgid "E554: Syntax error in %s{...}" msgstr "E554: Синтаксична помилка в %s{...}" -#: ../regexp.c:3805 msgid "External submatches:\n" msgstr "Зовнішні під-збіги:\n" -#: ../regexp.c:7022 msgid "" "E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " "used " @@ -5119,62 +4050,49 @@ msgstr "" "E864: після \\%#= може бути тільки 0, 1, or 2. Буде використано автоматичний " "механізм " -#: ../regexp_nfa.c:239 msgid "E865: (NFA) Regexp end encountered prematurely" msgstr "E865: (NFA) Зарано трапився кінець регулярного виразу" -#: ../regexp_nfa.c:240 #, c-format msgid "E866: (NFA regexp) Misplaced %c" msgstr "E866: (NFA regexp) Не на місці %c" -#: ../regexp_nfa.c:242 #, c-format msgid "E877: (NFA regexp) Invalid character class: %<PRId64>" -msgstr "" +msgstr "E877: (NFA regexp) Неправильний клас символів: %<PRId64>" -#: ../regexp_nfa.c:1261 #, c-format msgid "E867: (NFA) Unknown operator '\\z%c'" msgstr "E867: (NFA) Невідомий оператор '\\z%c'" -#: ../regexp_nfa.c:1387 #, c-format msgid "E867: (NFA) Unknown operator '\\%%%c'" msgstr "E867: (NFA) Невідомий оператор '\\%%%c'" -#: ../regexp_nfa.c:1802 #, c-format msgid "E869: (NFA) Unknown operator '\\@%c'" msgstr "E869: (NFA) Невідомий оператор '\\@%c'" -#: ../regexp_nfa.c:1831 msgid "E870: (NFA regexp) Error reading repetition limits" msgstr "E870: (NFA regexp) Не вдалося прочитати межі повторення" #. Can't have a multi follow a multi. -#: ../regexp_nfa.c:1895 msgid "E871: (NFA regexp) Can't have a multi follow a multi !" msgstr "E871: (NFA regexp) Мульти не може бути за мульти!" #. Too many `(' -#: ../regexp_nfa.c:2037 msgid "E872: (NFA regexp) Too many '('" msgstr "E872: (NFA regexp) Забагато '('" -#: ../regexp_nfa.c:2042 msgid "E879: (NFA regexp) Too many \\z(" msgstr "E879: (NFA regexp) Забагато \\z(" -#: ../regexp_nfa.c:2066 msgid "E873: (NFA regexp) proper termination error" msgstr "E873: (NFA regexp) помилка належного припинення" -#: ../regexp_nfa.c:2599 msgid "E874: (NFA) Could not pop the stack !" msgstr "E874: (NFA) Стек порожній!" -#: ../regexp_nfa.c:3298 msgid "" "E875: (NFA regexp) (While converting from postfix to NFA), too many states " "left on stack" @@ -5182,178 +4100,137 @@ msgstr "" "E875: (NFA regexp) (Під час перетворення з постфікс у NFA) залишилося " "забагато станів у стеку" -#: ../regexp_nfa.c:3302 msgid "E876: (NFA regexp) Not enough space to store the whole NFA " msgstr "E876: (NFA regexp) Недостатньо пам’яті, щоб зберегти весь NFA " -#: ../regexp_nfa.c:4571 ../regexp_nfa.c:4869 msgid "" "Could not open temporary log file for writing, displaying on stderr ... " msgstr "" "Не вдалося відкрити тимчасовий файл журналу для запису, показується на " "stderr ... " -#: ../regexp_nfa.c:4840 #, c-format msgid "(NFA) COULD NOT OPEN %s !" msgstr "(NFA) НЕ ВДАЛОСЯ ВІДКРИТИ %s!" -#: ../regexp_nfa.c:6049 msgid "Could not open temporary log file for writing " msgstr "Не вдалося відкрити тимчасовий файл журналу для запису " -#: ../screen.c:7435 msgid " VREPLACE" msgstr " ВІРТ ЗАМІНА" -#: ../screen.c:7437 msgid " REPLACE" msgstr " ЗАМІНА" -#: ../screen.c:7440 msgid " REVERSE" msgstr " НАВИВОРІТ" -#: ../screen.c:7441 msgid " INSERT" msgstr " ВСТАВКА" -#: ../screen.c:7443 msgid " (insert)" msgstr " (вставка)" -#: ../screen.c:7445 msgid " (replace)" msgstr " (заміна)" -#: ../screen.c:7447 msgid " (vreplace)" msgstr " (вірт заміна)" -#: ../screen.c:7449 msgid " Hebrew" msgstr " Іврит" -#: ../screen.c:7454 msgid " Arabic" msgstr " Арабська" -#: ../screen.c:7456 msgid " (lang)" msgstr " (мова)" -#: ../screen.c:7459 msgid " (paste)" msgstr " (клей)" -#: ../screen.c:7469 msgid " VISUAL" msgstr " ВИБІР" -#: ../screen.c:7470 msgid " VISUAL LINE" msgstr " ВИБІР РЯДКІВ" -#: ../screen.c:7471 msgid " VISUAL BLOCK" msgstr " ВИБІР БЛОКУ" -#: ../screen.c:7472 msgid " SELECT" msgstr " ВИДІЛЕННЯ" -#: ../screen.c:7473 msgid " SELECT LINE" msgstr " ВИДІЛЕННЯ РЯДКІВ" -#: ../screen.c:7474 msgid " SELECT BLOCK" msgstr " ВИДІЛЕННЯ БЛОКУ" -#: ../screen.c:7486 ../screen.c:7541 msgid "recording" msgstr "йде запис" -#: ../search.c:487 #, c-format msgid "E383: Invalid search string: %s" msgstr "E383: Неправильний зразок для пошуку: %s" -#: ../search.c:832 #, c-format msgid "E384: search hit TOP without match for: %s" msgstr "E384: Пошук дійшов до ПОЧАТКУ без збігів з %s" -#: ../search.c:835 #, c-format msgid "E385: search hit BOTTOM without match for: %s" msgstr "E385: Пошук дійшов до КІНЦЯ без збігів з %s" -#: ../search.c:1200 msgid "E386: Expected '?' or '/' after ';'" msgstr "E386: Після `;' має бути `?' або `/'" # msgstr "E386: " -#: ../search.c:4085 msgid " (includes previously listed match)" msgstr " (разом з попередніми збігами)" #. cursor at status line -#: ../search.c:4104 msgid "--- Included files " msgstr "--- Включені файли " -#: ../search.c:4106 msgid "not found " msgstr "не знайдено " -#: ../search.c:4107 msgid "in path ---\n" msgstr "у шляху пошуку ---\n" -#: ../search.c:4168 msgid " (Already listed)" msgstr " (Уже у списку)" -#: ../search.c:4170 msgid " NOT FOUND" msgstr " НЕ ЗНАЙДЕНО" -#: ../search.c:4211 #, c-format msgid "Scanning included file: %s" msgstr "Пошук у включеному файлі: %s" -#: ../search.c:4216 #, c-format msgid "Searching included file %s" msgstr "Шукається у включеному файлі %s" -#: ../search.c:4405 msgid "E387: Match is on current line" msgstr "E387: Збіг у поточному рядку" -#: ../search.c:4517 msgid "All included files were found" msgstr "Були знайдені всі включені файли" -#: ../search.c:4519 msgid "No included files" msgstr "Жодного включеного файлу" -#: ../search.c:4527 msgid "E388: Couldn't find definition" msgstr "E388: Визначення не знайдено" -#: ../search.c:4529 msgid "E389: Couldn't find pattern" msgstr "E389: Зразок не знайдено" -#: ../search.c:4668 msgid "Substitute " msgstr "Заміна " -#: ../search.c:4681 #, c-format msgid "" "\n" @@ -5364,100 +4241,79 @@ msgstr "" "# Ост. %sЗразок пошуку:\n" "~" -#: ../spell.c:951 msgid "E759: Format error in spell file" msgstr "E759: Помилка формату у файлі орфографії" # msgstr "E364: " -#: ../spell.c:952 msgid "E758: Truncated spell file" msgstr "E758: Обірваний файл орфографії" -#: ../spell.c:953 #, c-format msgid "Trailing text in %s line %d: %s" msgstr "Зайвий текст у %s у рядку %d: %s" -#: ../spell.c:954 #, c-format msgid "Affix name too long in %s line %d: %s" msgstr "Назва афіксу завелика у %s у рядку %d: %s" # msgstr "E430: " -#: ../spell.c:955 msgid "E761: Format error in affix file FOL, LOW or UPP" msgstr "E761: Помилка формату у файлі афіксів FOL, LOW чи UPP" -#: ../spell.c:957 msgid "E762: Character in FOL, LOW or UPP is out of range" msgstr "E762: Символ у FOL, LOW чи UPP поза межами" -#: ../spell.c:958 msgid "Compressing word tree..." msgstr "Стискується дерево слів..." -#: ../spell.c:1951 msgid "E756: Spell checking is not enabled" msgstr "E756: Перевірка орфографії не дозволена" -#: ../spell.c:2249 #, c-format msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\"" msgstr "" "Застереження: Не вдалося знайти список слів «%s.%s.spl» чи «%s.ascii.spl»" -#: ../spell.c:2473 #, c-format msgid "Reading spell file \"%s\"" msgstr "Читається файл орфографії «%s»" -#: ../spell.c:2496 msgid "E757: This does not look like a spell file" msgstr "E757: Не схоже на файл орфографії" -#: ../spell.c:2501 msgid "E771: Old spell file, needs to be updated" msgstr "E771: Файл орфографії старий, треба поновити" -#: ../spell.c:2504 msgid "E772: Spell file is for newer version of Vim" msgstr "E772: Файл орфографії призначений для більш нової версії Vim" -#: ../spell.c:2602 msgid "E770: Unsupported section in spell file" msgstr "E770: Недозволена секція у файлі орфографії" -#: ../spell.c:3762 #, c-format msgid "Warning: region %s not supported" msgstr "Застереження: регіон %s не підтримується" -#: ../spell.c:4550 #, c-format msgid "Reading affix file %s ..." msgstr "Читається файл афіксів %s ..." -#: ../spell.c:4589 ../spell.c:5635 ../spell.c:6140 #, c-format msgid "Conversion failure for word in %s line %d: %s" msgstr "Помилка перетворення слова у %s у рядку %d: %s" -#: ../spell.c:4630 ../spell.c:6170 #, c-format msgid "Conversion in %s not supported: from %s to %s" msgstr "Перетворення у %s не підтримується: з %s до %s" -#: ../spell.c:4642 #, c-format msgid "Invalid value for FLAG in %s line %d: %s" msgstr "Некоректне значення FLAG у %s у рядку %d: %s" -#: ../spell.c:4655 #, c-format msgid "FLAG after using flags in %s line %d: %s" msgstr "FLAG після використання прапорців у %s у рядку %d: %s" -#: ../spell.c:4723 #, c-format msgid "" "Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line " @@ -5466,7 +4322,6 @@ msgstr "" "Визначення COMPOUNDFORBIDFLAG після елементу PFX може дати неправильний " "результат у %s у рядку %d" -#: ../spell.c:4731 #, c-format msgid "" "Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line " @@ -5475,43 +4330,35 @@ msgstr "" "Визначення COMPOUNDPERMITFLAG після елементу PFX можу дати неправильний " "результат у %s у рядку %d" -#: ../spell.c:4747 #, c-format msgid "Wrong COMPOUNDRULES value in %s line %d: %s" msgstr "Неправильне значення COMPOUNDRULES у %s у рядку %d: %s" -#: ../spell.c:4771 #, c-format msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s" msgstr "Неправильне значення COMPOUNDWORDMAX у %s у рядку %d: %s" -#: ../spell.c:4777 #, c-format msgid "Wrong COMPOUNDMIN value in %s line %d: %s" msgstr "Неправильне значення COMPOUNDMIN у %s у рядку %d: %s" -#: ../spell.c:4783 #, c-format msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s" msgstr "Неправильне значення COMPOUNDSYLMAX у %s у рядку %d: %s" -#: ../spell.c:4795 #, c-format msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s" msgstr "Неправильне значення CHECKCOMPOUNDPATTERN у %s у рядку %d: %s" -#: ../spell.c:4847 #, c-format msgid "Different combining flag in continued affix block in %s line %d: %s" msgstr "" "Інший прапорець комбінації у продовженні блоку афіксів у %s у рядку %d: %s" -#: ../spell.c:4850 #, c-format msgid "Duplicate affix in %s line %d: %s" msgstr "Подвійний афікс у %s у рядку %d: %s" -#: ../spell.c:4871 #, c-format msgid "" "Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s " @@ -5520,337 +4367,268 @@ msgstr "" "Афікс також використовується для BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/" "NOSUGGEST у %s у рядку %d: %s" -#: ../spell.c:4893 #, c-format msgid "Expected Y or N in %s line %d: %s" msgstr "Треба Y чи N у %s у рядку %d: %s" -#: ../spell.c:4968 #, c-format msgid "Broken condition in %s line %d: %s" msgstr "Непридатна умова у %s у рядку %d: %s" -#: ../spell.c:5091 #, c-format msgid "Expected REP(SAL) count in %s line %d" msgstr "Треба кількість REP(SAL) у %s у рядку %d" -#: ../spell.c:5120 #, c-format msgid "Expected MAP count in %s line %d" msgstr "Треба кількість MAP у %s у рядку %d" -#: ../spell.c:5132 #, c-format msgid "Duplicate character in MAP in %s line %d" msgstr "Повторення символу у MAP у %s у рядку %d" -#: ../spell.c:5176 #, c-format msgid "Unrecognized or duplicate item in %s line %d: %s" msgstr "Нерозпізнаний чи повторний елемент у %s у рядку %d: %s" -#: ../spell.c:5197 #, c-format msgid "Missing FOL/LOW/UPP line in %s" msgstr "Пропущено рядок FOL/LOW/UPP у %s" -#: ../spell.c:5220 msgid "COMPOUNDSYLMAX used without SYLLABLE" msgstr "Вжито COMPOUNDSYLMAX без SYLLABLE" -#: ../spell.c:5236 msgid "Too many postponed prefixes" msgstr "Забагато відкладених префіксів" -#: ../spell.c:5238 msgid "Too many compound flags" msgstr "Забагато складних прапорців" -#: ../spell.c:5240 msgid "Too many postponed prefixes and/or compound flags" msgstr "Забагато відкладених префіксів і/або складних прапорців" -#: ../spell.c:5250 #, c-format msgid "Missing SOFO%s line in %s" msgstr "Пропущено рядок SOFO%s у %s" -#: ../spell.c:5253 #, c-format msgid "Both SAL and SOFO lines in %s" msgstr "Обидва рядки SAL і SOFO у %s" -#: ../spell.c:5331 #, c-format msgid "Flag is not a number in %s line %d: %s" msgstr "Прапорець не є числом у %s у рядку %d: %s" -#: ../spell.c:5334 #, c-format msgid "Illegal flag in %s line %d: %s" msgstr "Неправильний прапорець у %s у рядку %d: %s" -#: ../spell.c:5493 ../spell.c:5501 #, c-format msgid "%s value differs from what is used in another .aff file" msgstr "Значення %s відрізняється від того, що вжито у іншому файлі .aff" -#: ../spell.c:5602 #, c-format msgid "Reading dictionary file %s ..." msgstr "Зчитується словниковий файл %s ..." -#: ../spell.c:5611 #, c-format msgid "E760: No word count in %s" msgstr "E760: Немає кількості слів у %s" -#: ../spell.c:5669 #, c-format msgid "line %6d, word %6d - %s" msgstr "рядок %6d, слово %6d - %s" -#: ../spell.c:5691 #, c-format msgid "Duplicate word in %s line %d: %s" msgstr "Повторення слова у %s у рядку %d: %s" -#: ../spell.c:5694 #, c-format msgid "First duplicate word in %s line %d: %s" msgstr "Перше повторення слова у %s у рядку %d: %s" -#: ../spell.c:5746 #, c-format msgid "%d duplicate word(s) in %s" msgstr "%d повторюваних слів у %s" -#: ../spell.c:5748 #, c-format msgid "Ignored %d word(s) with non-ASCII characters in %s" msgstr "Пропущено %d слів(~) із не-ASCII символами у %s" -#: ../spell.c:6115 #, c-format msgid "Reading word file %s ..." msgstr "Читається файл слів %s ..." -#: ../spell.c:6155 #, c-format msgid "Duplicate /encoding= line ignored in %s line %d: %s" msgstr "Повторення рядка /encoding= проігноровано у %s у рядку %d: %s" -#: ../spell.c:6159 #, c-format msgid "/encoding= line after word ignored in %s line %d: %s" msgstr "Рядок /encoding= після слова проігноровано у %s у рядку %d: %s" -#: ../spell.c:6180 #, c-format msgid "Duplicate /regions= line ignored in %s line %d: %s" msgstr "Повторення рядка /regions= проігноровано у %s у рядку %d: %s" -#: ../spell.c:6185 #, c-format msgid "Too many regions in %s line %d: %s" msgstr "Забагато регіонів у %s у рядку %d: %s" -#: ../spell.c:6198 #, c-format msgid "/ line ignored in %s line %d: %s" msgstr "Рядок / проігноровано у %s у рядку %d: %s" -#: ../spell.c:6224 #, c-format msgid "Invalid region nr in %s line %d: %s" msgstr "Некоректний номер регіону у %s у рядку %d: %s" -#: ../spell.c:6230 #, c-format msgid "Unrecognized flags in %s line %d: %s" msgstr "Нерозпізнані прапорці у %s у рядку %d: %s" -#: ../spell.c:6257 #, c-format msgid "Ignored %d words with non-ASCII characters" msgstr "Проігноровано %d слів із не-ASCII символами" -#: ../spell.c:6656 #, c-format msgid "Compressed %d of %d nodes; %d (%d%%) remaining" msgstr "Стиснено %d з %d вузлів; залишилося %d (%d%%)" -#: ../spell.c:7340 msgid "Reading back spell file..." msgstr "Перечитується файл орфографії..." #. Go through the trie of good words, soundfold each word and add it to #. the soundfold trie. -#: ../spell.c:7357 msgid "Performing soundfolding..." msgstr "Виконується згортання звуків..." -#: ../spell.c:7368 #, c-format msgid "Number of words after soundfolding: %<PRId64>" msgstr "Кількість слів після згортання звуків: %<PRId64>" -#: ../spell.c:7476 #, c-format msgid "Total number of words: %d" msgstr "Повна кількість слів: %d" -#: ../spell.c:7655 #, c-format msgid "Writing suggestion file %s ..." msgstr "Записується файл припущень %s ..." -#: ../spell.c:7707 ../spell.c:7927 #, c-format msgid "Estimated runtime memory use: %d bytes" msgstr "Оцінка споживання пам'яті: %d байт" -#: ../spell.c:7820 msgid "E751: Output file name must not have region name" msgstr "E751: Вихідний файл не повинен мати назву регіону" -#: ../spell.c:7822 msgid "E754: Only up to 8 regions supported" msgstr "E754: Підтримується тільки до восьми регіонів" -#: ../spell.c:7846 #, c-format msgid "E755: Invalid region in %s" msgstr "E755: Некоректний регіон у %s" -#: ../spell.c:7907 msgid "Warning: both compounding and NOBREAK specified" msgstr "Застереження: зазначено обидва `складні слова' і NOBREAK" -#: ../spell.c:7920 #, c-format msgid "Writing spell file %s ..." msgstr "Записується файл орфографії %s ..." -#: ../spell.c:7925 msgid "Done!" msgstr "Зроблено!" -#: ../spell.c:8034 #, c-format msgid "E765: 'spellfile' does not have %<PRId64> entries" msgstr "E765: 'spellfile' не містить %<PRId64> елементів" -#: ../spell.c:8074 #, c-format msgid "Word '%.*s' removed from %s" msgstr "Слово '%.*s' знищено з %s" -#: ../spell.c:8117 #, c-format msgid "Word '%.*s' added to %s" msgstr "Слово '%.*s' додано до %s" -#: ../spell.c:8381 msgid "E763: Word characters differ between spell files" msgstr "E763: Символи у слові відрізняються у файлах орфографії" -#: ../spell.c:8684 msgid "Sorry, no suggestions" msgstr "Пробачте, немає пропозицій" -#: ../spell.c:8687 #, c-format msgid "Sorry, only %<PRId64> suggestions" msgstr "Пробачте, тільки %<PRId64> пропозицій" #. for when 'cmdheight' > 1 #. avoid more prompt -#: ../spell.c:8704 #, c-format msgid "Change \"%.*s\" to:" msgstr "Замінити «%.*s» на:" -#: ../spell.c:8737 #, c-format msgid " < \"%.*s\"" msgstr " < «%.*s»" # msgstr "E34: " -#: ../spell.c:8882 msgid "E752: No previous spell replacement" msgstr "E752: Немає попередньої заміни" # msgstr "E333: " -#: ../spell.c:8925 #, c-format msgid "E753: Not found: %s" msgstr "E753: Не знайдено: %s" -#: ../spell.c:9276 #, c-format msgid "E778: This does not look like a .sug file: %s" msgstr "E778: Не схоже на файл .sug: %s" -#: ../spell.c:9282 #, c-format msgid "E779: Old .sug file, needs to be updated: %s" msgstr "E779: Застарілий файл .sug, треба поновити: %s" -#: ../spell.c:9286 #, c-format msgid "E780: .sug file is for newer version of Vim: %s" msgstr "E780: Файл .sug для більш нової версії Vim: %s" -#: ../spell.c:9295 #, c-format msgid "E781: .sug file doesn't match .spl file: %s" msgstr "E781: Файл .sug не відповідає файлу .spl: %s" -#: ../spell.c:9305 #, c-format msgid "E782: error while reading .sug file: %s" msgstr "E782: Помилка читання файлу .sug: %s" #. This should have been checked when generating the .spl #. file. -#: ../spell.c:11575 msgid "E783: duplicate char in MAP entry" msgstr "E783: Повторено символ у елементі MAP" # msgstr "E391: " -#: ../syntax.c:266 msgid "No Syntax items defined for this buffer" msgstr "Для буфера не визначено елементів синтаксису" -#: ../syntax.c:3083 ../syntax.c:3104 ../syntax.c:3127 #, c-format msgid "E390: Illegal argument: %s" msgstr "E390: Неправильний аргумент: %s" -#: ../syntax.c:3299 #, c-format msgid "E391: No such syntax cluster: %s" msgstr "E391: Немає такого синтаксичного кластера: %s" -#: ../syntax.c:3433 msgid "syncing on C-style comments" msgstr "синхронізується по коментарях стилю С" -#: ../syntax.c:3439 msgid "no syncing" msgstr "без синхронізації" -#: ../syntax.c:3441 msgid "syncing starts " msgstr "починається синхронізація за " -#: ../syntax.c:3443 ../syntax.c:3506 msgid " lines before top line" msgstr " рядків перед першим рядком" -#: ../syntax.c:3448 msgid "" "\n" "--- Syntax sync items ---" @@ -5858,7 +4636,6 @@ msgstr "" "\n" "--- Елементи синхронізації синтаксису ---" -#: ../syntax.c:3452 msgid "" "\n" "syncing on items" @@ -5866,7 +4643,6 @@ msgstr "" "\n" "синхронізація по елементах" -#: ../syntax.c:3457 msgid "" "\n" "--- Syntax items ---" @@ -5874,300 +4650,241 @@ msgstr "" "\n" "--- Елементи синтаксису ---" -#: ../syntax.c:3475 #, c-format msgid "E392: No such syntax cluster: %s" msgstr "E392: Немає такого синтаксичного кластера: %s" -#: ../syntax.c:3497 msgid "minimal " msgstr "мінімальний " -#: ../syntax.c:3503 msgid "maximal " msgstr "максимальний " -#: ../syntax.c:3513 msgid "; match " msgstr "; збіг " -#: ../syntax.c:3515 msgid " line breaks" msgstr " розриви рядків" -#: ../syntax.c:4076 msgid "E395: contains argument not accepted here" msgstr "E395: Містить неприйнятні тут аргументи" # msgstr "E14: " -#: ../syntax.c:4096 msgid "E844: invalid cchar value" msgstr "E844: Некоректне значення cchar" -#: ../syntax.c:4107 msgid "E393: group[t]here not accepted here" msgstr "E393: group[t]hete тут неприйнятний" -#: ../syntax.c:4126 #, c-format msgid "E394: Didn't find region item for %s" msgstr "E394: Не знайдено елемент регіону для %s" # msgstr "E396: " -#: ../syntax.c:4188 msgid "E397: Filename required" msgstr "E397: Потрібна назва файлу" -#: ../syntax.c:4221 msgid "E847: Too many syntax includes" msgstr "E847: Забагато синтаксичних включень" -#: ../syntax.c:4303 #, c-format msgid "E789: Missing ']': %s" msgstr "E789: Пропущено ']': %s" -#: ../syntax.c:4531 #, c-format msgid "E398: Missing '=': %s" msgstr "E398: Пропущено `=': %s" # --------------------------------------- -#: ../syntax.c:4666 #, c-format msgid "E399: Not enough arguments: syntax region %s" msgstr "E399: Бракує аргументів: синтаксичний регіон %s" -#: ../syntax.c:4870 msgid "E848: Too many syntax clusters" msgstr "E848: Забагато синтаксичних кластерів" -#: ../syntax.c:4954 msgid "E400: No cluster specified" msgstr "E400: Кластер не вказано" #. end delimiter not found -#: ../syntax.c:4986 #, c-format msgid "E401: Pattern delimiter not found: %s" msgstr "E401: Кінець зразку не знайдено: %s" -#: ../syntax.c:5049 #, c-format msgid "E402: Garbage after pattern: %s" msgstr "E402: Сміття після зразку: %s" # msgstr "E402: " -#: ../syntax.c:5120 msgid "E403: syntax sync: line continuations pattern specified twice" msgstr "" "E403: Синтаксична синхронізація: зразок для продовження рядка вказано двічі" -#: ../syntax.c:5169 #, c-format msgid "E404: Illegal arguments: %s" msgstr "E404: Неправильні аргументи: %s" # msgstr "E404: " -#: ../syntax.c:5217 #, c-format msgid "E405: Missing equal sign: %s" msgstr "E405: Пропущено знак рівності: %s" # msgstr "E405: " -#: ../syntax.c:5222 #, c-format msgid "E406: Empty argument: %s" msgstr "E406: Порожній аргумент: %s" # msgstr "E406: " -#: ../syntax.c:5240 #, c-format msgid "E407: %s not allowed here" msgstr "E407: %s тут не дозволено" -#: ../syntax.c:5246 #, c-format msgid "E408: %s must be first in contains list" msgstr "E408: %s має бути першим рядком у списку contains" -#: ../syntax.c:5304 #, c-format msgid "E409: Unknown group name: %s" msgstr "E409: Невідома назва групи: %s" # msgstr "E409: " -#: ../syntax.c:5512 #, c-format msgid "E410: Invalid :syntax subcommand: %s" msgstr "E410: Неправильна підкоманда :syntax: %s" -#: ../syntax.c:5854 msgid "" " TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN" msgstr "" " ВСЬОГО К-ТЬ СПІВП. НАЙПОВІЛ. СЕРЕДН. НАЗВА ШАБЛОН" -#: ../syntax.c:6146 msgid "E679: recursive loop loading syncolor.vim" msgstr "E679: Рекурсивний цикл читання syncolor.vim" # msgstr "E410: " -#: ../syntax.c:6256 #, c-format msgid "E411: highlight group not found: %s" msgstr "E411: Групу підсвічування не знайдено: %s" # msgstr "E411: " -#: ../syntax.c:6278 #, c-format msgid "E412: Not enough arguments: \":highlight link %s\"" msgstr "E412: Недостатньо аргументів: «:highlight link %s»" # msgstr "E412: " -#: ../syntax.c:6284 #, c-format msgid "E413: Too many arguments: \":highlight link %s\"" msgstr "E413: Забагато аргументів: «:highlight link %s»" # msgstr "E413: " -#: ../syntax.c:6302 msgid "E414: group has settings, highlight link ignored" msgstr "E414: Грума має settings, highlight link проігноровано" # msgstr "E414: " -#: ../syntax.c:6367 #, c-format msgid "E415: unexpected equal sign: %s" msgstr "E415: Несподіваний знак рівності: %s" # msgstr "E415: " -#: ../syntax.c:6395 #, c-format msgid "E416: missing equal sign: %s" msgstr "E416: Пропущено знак рівності: %s" -#: ../syntax.c:6418 #, c-format msgid "E417: missing argument: %s" msgstr "E417: Пропущено аргумент: %s" -#: ../syntax.c:6446 #, c-format msgid "E418: Illegal value: %s" msgstr "E418: Неправильне значення: %s" # msgstr "E418: " -#: ../syntax.c:6496 msgid "E419: FG color unknown" msgstr "E419: Невідомий колір тексту" # msgstr "E419: " -#: ../syntax.c:6504 msgid "E420: BG color unknown" msgstr "E420: Невідомий колір фону" # msgstr "E420: " -#: ../syntax.c:6564 #, c-format msgid "E421: Color name or number not recognized: %s" msgstr "E421: Нерозпізнана назва або номер кольору: %s" # msgstr "E421: " -#: ../syntax.c:6714 #, c-format msgid "E422: terminal code too long: %s" msgstr "E422: Занадто довгий код терміналу: %s" # msgstr "E422: " -#: ../syntax.c:6753 #, c-format msgid "E423: Illegal argument: %s" msgstr "E423: Неправильний аргумент: %s" # msgstr "E423: " -#: ../syntax.c:6925 msgid "E424: Too many different highlighting attributes in use" msgstr "E424: Використано забагато різних атрибутів кольору" -#: ../syntax.c:7427 msgid "E669: Unprintable character in group name" msgstr "E669: Недруковний символ у назві групи" # msgstr "E181: " -#: ../syntax.c:7434 msgid "W18: Invalid character in group name" msgstr "W18: Некоректний символ у назві групи" -#: ../syntax.c:7448 msgid "E849: Too many highlight and syntax groups" msgstr "E849: Забагато груп підсвічування і синтаксису" # msgstr "E424: " -#: ../tag.c:104 msgid "E555: at bottom of tag stack" msgstr "E555: Кінець стеку теґів" -#: ../tag.c:105 msgid "E556: at top of tag stack" msgstr "E556: Вершина стеку теґів" -#: ../tag.c:380 msgid "E425: Cannot go before first matching tag" msgstr "E425: Це вже найперший відповідний теґ" # msgstr "E425: " -#: ../tag.c:504 #, c-format msgid "E426: tag not found: %s" msgstr "E426: Теґ не знайдено: %s" # msgstr "E426: " -#: ../tag.c:528 msgid " # pri kind tag" msgstr " # прі тип теґ" -#: ../tag.c:531 msgid "file\n" msgstr "файл\n" -#: ../tag.c:829 msgid "E427: There is only one matching tag" msgstr "E427: Лише один відповідний теґ" # msgstr "E427: " -#: ../tag.c:831 msgid "E428: Cannot go beyond last matching tag" msgstr "E428: Це вже останній відповідний теґ" # msgstr "E428: " -#: ../tag.c:850 #, c-format msgid "File \"%s\" does not exist" msgstr "Файл «%s» не існує" #. Give an indication of the number of matching tags -#: ../tag.c:859 #, c-format msgid "tag %d of %d%s" msgstr "теґ %d з %d%s" -#: ../tag.c:862 msgid " or more" msgstr " або більше" -#: ../tag.c:864 msgid " Using tag with different case!" msgstr " Використано теґ, не розрізняючи великі й малі літери" -#: ../tag.c:909 #, c-format msgid "E429: File \"%s\" does not exist" msgstr "E429: Файл «%s» не існує" # msgstr "E429: " #. Highlight title -#: ../tag.c:960 msgid "" "\n" " # TO tag FROM line in file/text" @@ -6175,85 +4892,68 @@ msgstr "" "\n" " # ДО теґу З рядка у файлі/тексті" -#: ../tag.c:1303 #, c-format msgid "Searching tags file %s" msgstr "Шукається у файлі теґів %s" -#: ../tag.c:1545 msgid "Ignoring long line in tags file" msgstr "Ігнорується довгий рядок у файлі з позначками" # msgstr "E430: " -#: ../tag.c:1915 #, c-format msgid "E431: Format error in tags file \"%s\"" msgstr "E431: Помилка формату у файлі теґів «%s»" # msgstr "E431: " -#: ../tag.c:1917 #, c-format msgid "Before byte %<PRId64>" msgstr "Перед байтом %<PRId64>" -#: ../tag.c:1929 #, c-format msgid "E432: Tags file not sorted: %s" msgstr "E432: Файл теґів не впорядкований: %s" # msgstr "E432: " #. never opened any tags file -#: ../tag.c:1960 msgid "E433: No tags file" msgstr "E433: Немає файлу теґів" # msgstr "E433: " -#: ../tag.c:2536 msgid "E434: Can't find tag pattern" msgstr "E434: Не вдалося знайти зразок теґу" # msgstr "E434: " -#: ../tag.c:2544 msgid "E435: Couldn't find tag, just guessing!" msgstr "E435: Не вдалося знайти теґ, тільки припущення!" -#: ../tag.c:2797 #, c-format msgid "Duplicate field name: %s" msgstr "Назва поля повторюється: %s" # msgstr "E435: " -#: ../term.c:1442 msgid "' not known. Available builtin terminals are:" msgstr "' не відомий. Вбудовані термінали:" -#: ../term.c:1463 msgid "defaulting to '" msgstr "початково '" -#: ../term.c:1731 msgid "E557: Cannot open termcap file" msgstr "E557: Не вдалося відкрити файл можливостей терміналів" -#: ../term.c:1735 msgid "E558: Terminal entry not found in terminfo" msgstr "E558: Немає інформації про термінал" -#: ../term.c:1737 msgid "E559: Terminal entry not found in termcap" msgstr "E559: Немає інформації про можливості терміналу" -#: ../term.c:1878 #, c-format msgid "E436: No \"%s\" entry in termcap" msgstr "E436: Немає запису «%s» про можливості терміналу" -#: ../term.c:2249 msgid "E437: terminal capability \"cm\" required" msgstr "E437: Потрібна можливість терміналу «cm»" #. Highlight title -#: ../term.c:4376 msgid "" "\n" "--- Terminal keys ---" @@ -6261,174 +4961,136 @@ msgstr "" "\n" "--- Клавіші терміналу ---" -#: ../ui.c:481 msgid "Vim: Error reading input, exiting...\n" msgstr "Vim: Помилка читання вводу, робота завершується...\n" #. This happens when the FileChangedRO autocommand changes the #. * file in a way it becomes shorter. -#: ../undo.c:379 -#, fuzzy msgid "E881: Line count changed unexpectedly" -msgstr "E834: Кількість рядків несподівано змінилася" +msgstr "E881: Кількість рядків несподівано змінилася" -#: ../undo.c:627 #, c-format msgid "E828: Cannot open undo file for writing: %s" msgstr "E828: Не вдалося відкрити файл історії для запису: %s" -#: ../undo.c:717 #, c-format msgid "E825: Corrupted undo file (%s): %s" msgstr "E825: Файл історії пошкоджено (%s): %s" -#: ../undo.c:1039 msgid "Cannot write undo file in any directory in 'undodir'" msgstr "Не вдалося записати файл історії у жодну з директорій у 'undodir'" -#: ../undo.c:1074 #, c-format msgid "Will not overwrite with undo file, cannot read: %s" msgstr "Will not overwrite with undo file, cannot read: %s" -#: ../undo.c:1092 #, c-format msgid "Will not overwrite, this is not an undo file: %s" msgstr "Не можна перезаписати, це не файл історії: %s" -#: ../undo.c:1108 msgid "Skipping undo file write, nothing to undo" msgstr "Файл історії не записується, нічого повертати" -#: ../undo.c:1121 #, c-format msgid "Writing undo file: %s" msgstr "Записується файл історії: %s" -#: ../undo.c:1213 #, c-format msgid "E829: write error in undo file: %s" msgstr "E829: Помилка запису у файлі історії: %s" -#: ../undo.c:1280 #, c-format msgid "Not reading undo file, owner differs: %s" msgstr "Файл історії прочитано не буде, власник інший: %s" -#: ../undo.c:1292 #, c-format msgid "Reading undo file: %s" msgstr "Читається файл історії: %s" -#: ../undo.c:1299 #, c-format msgid "E822: Cannot open undo file for reading: %s" msgstr "E822: Не вдалося відкрити файл для читання: %s" # msgstr "E333: " -#: ../undo.c:1308 #, c-format msgid "E823: Not an undo file: %s" msgstr "E823: Не файл історії: %s" -#: ../undo.c:1313 #, c-format msgid "E824: Incompatible undo file: %s" msgstr "E824: Несумісний файл історії: %s" -#: ../undo.c:1328 msgid "File contents changed, cannot use undo info" msgstr "Вміст файлу змінився, не можна використати інформацію про історію" -#: ../undo.c:1497 #, c-format msgid "Finished reading undo file %s" msgstr "Закінчено читання файлу історії %s" -#: ../undo.c:1586 ../undo.c:1812 msgid "Already at oldest change" msgstr "Вже на найстаршій зміні" -#: ../undo.c:1597 ../undo.c:1814 msgid "Already at newest change" msgstr "Вже на найновішій зміні" -#: ../undo.c:1806 #, c-format msgid "E830: Undo number %<PRId64> not found" msgstr "E830: Зміну %<PRId64> не знайдено в історії" -#: ../undo.c:1979 msgid "E438: u_undo: line numbers wrong" msgstr "E438: u_undo: неправильні номери рядків" -#: ../undo.c:2183 msgid "more line" msgstr "додано рядок" -#: ../undo.c:2185 msgid "more lines" msgstr "рядків додано" -#: ../undo.c:2187 msgid "line less" msgstr "знищено рядок" -#: ../undo.c:2189 msgid "fewer lines" msgstr "рядків знищено" # msgstr "E438: " -#: ../undo.c:2193 msgid "change" msgstr "зміна" # msgstr "E438: " -#: ../undo.c:2195 msgid "changes" msgstr "змін" -#: ../undo.c:2225 #, c-format msgid "%<PRId64> %s; %s #%<PRId64> %s" msgstr "%<PRId64> %s; %s #%<PRId64> %s" -#: ../undo.c:2228 msgid "before" msgstr "перед" -#: ../undo.c:2228 msgid "after" msgstr "після" -#: ../undo.c:2325 msgid "Nothing to undo" msgstr "Немає нічого скасовувати" -#: ../undo.c:2330 msgid "number changes when saved" msgstr "номер зміни час збережено" -#: ../undo.c:2360 #, c-format msgid "%<PRId64> seconds ago" msgstr "%<PRId64> секунд тому" # msgstr "E406: " -#: ../undo.c:2372 msgid "E790: undojoin is not allowed after undo" msgstr "E790: Не можна виконати undojoin після undo" -#: ../undo.c:2466 msgid "E439: undo list corrupt" msgstr "E439: Список скасування пошкоджено" # msgstr "E439: " -#: ../undo.c:2495 msgid "E440: undo line missing" msgstr "E440: Відсутній рядок скасування" -#: ../version.c:600 msgid "" "\n" "Included patches: " @@ -6436,7 +5098,6 @@ msgstr "" "\n" "Включені латки: " -#: ../version.c:627 msgid "" "\n" "Extra patches: " @@ -6444,11 +5105,9 @@ msgstr "" "\n" "Додаткові латки: " -#: ../version.c:639 ../version.c:864 msgid "Modified by " msgstr "Змінив " -#: ../version.c:646 msgid "" "\n" "Compiled " @@ -6456,11 +5115,9 @@ msgstr "" "\n" "Скомпілював " -#: ../version.c:649 msgid "by " msgstr " " -#: ../version.c:660 msgid "" "\n" "Huge version " @@ -6468,1921 +5125,126 @@ msgstr "" "\n" "Гігантська версія " -#: ../version.c:661 msgid "without GUI." msgstr "без GUI." -#: ../version.c:662 msgid " Features included (+) or not (-):\n" msgstr " Включені (+) або не включені (-) компоненти:\n" -#: ../version.c:667 msgid " system vimrc file: \"" msgstr " системний vimrc: \"" -#: ../version.c:672 msgid " user vimrc file: \"" msgstr " vimrc користувача: \"" -#: ../version.c:677 msgid " 2nd user vimrc file: \"" msgstr " другий vimrc користувача: \"" -#: ../version.c:682 msgid " 3rd user vimrc file: \"" msgstr " третій vimrc користувача: \"" -#: ../version.c:687 msgid " user exrc file: \"" msgstr " exrc користувача: \"" -#: ../version.c:692 msgid " 2nd user exrc file: \"" msgstr " другий exrc користувача: \"" -#: ../version.c:699 msgid " fall-back for $VIM: \"" msgstr " заміна для $VIM: \"" -#: ../version.c:705 msgid " f-b for $VIMRUNTIME: \"" msgstr " заміна для $VIMRUNTIME: \"" -#: ../version.c:709 msgid "Compilation: " msgstr "Скомпільовано: " -#: ../version.c:712 msgid "Linking: " msgstr "Скомпоновано: " -#: ../version.c:717 msgid " DEBUG BUILD" msgstr " ВЕРСІЯ ДЛЯ НАЛАГОДЖЕННЯ" -#: ../version.c:767 msgid "VIM - Vi IMproved" msgstr "VIM - Покращений Vi" -#: ../version.c:769 msgid "version " msgstr "версія " -#: ../version.c:770 msgid "by Bram Moolenaar et al." msgstr "автор: Bram Moolenaar та ін." -#: ../version.c:774 msgid "Vim is open source and freely distributable" msgstr "Vim — це відкрита й вільно розповсюджувана програма" -#: ../version.c:776 msgid "Help poor children in Uganda!" msgstr "Допоможіть сиротам з Уганди!" -#: ../version.c:777 msgid "type :help iccf<Enter> for information " msgstr ":help iccf<Enter> подробиці " -#: ../version.c:779 msgid "type :q<Enter> to exit " msgstr ":q<Enter> вихід з Vim " -#: ../version.c:780 msgid "type :help<Enter> or <F1> for on-line help" msgstr ":help<Enter> або <F1> перегляд допомоги " -#: ../version.c:781 msgid "type :help version7<Enter> for version info" msgstr ":help version7<Enter> інформація про версію " -#: ../version.c:784 msgid "Running in Vi compatible mode" msgstr "Ви працюєте в режимі сумісному з Vi" -#: ../version.c:785 msgid "type :set nocp<Enter> for Vim defaults" msgstr ":set nocp<Enter> режим несумісний з Vi " -#: ../version.c:786 msgid "type :help cp-default<Enter> for info on this" msgstr ":help cp-default<Enter> інформація про сумісність" -#: ../version.c:827 msgid "Sponsor Vim development!" msgstr "Підтримайте розробку редактора Vim!" -#: ../version.c:828 msgid "Become a registered Vim user!" msgstr "Станьте зареєстрованим користувачем Vim!" -#: ../version.c:831 msgid "type :help sponsor<Enter> for information " msgstr ":help sponsor<Enter> подальша інформація " -#: ../version.c:832 msgid "type :help register<Enter> for information " msgstr ":help register<Enter> подальша інформація " -#: ../version.c:834 msgid "menu Help->Sponsor/Register for information " msgstr "меню Допомога->Спонсор/Реєстрація подробиці " # msgstr "E444: " -#: ../window.c:119 msgid "Already only one window" msgstr "Це вже єдине вікно" -#: ../window.c:224 msgid "E441: There is no preview window" msgstr "E441: Немає вікна перегляду" # msgstr "E441: " -#: ../window.c:559 msgid "E442: Can't split topleft and botright at the same time" msgstr "E442: Не вдалося одночасно розбити topleft і botright" # msgstr "E442: " -#: ../window.c:1228 msgid "E443: Cannot rotate when another window is split" msgstr "E443: Не вдалося перемістити вікно, заважають інші" # msgstr "E443: " -#: ../window.c:1803 msgid "E444: Cannot close last window" msgstr "E444: Не вдалося закрити останнє вікно" # msgstr "E443: " -#: ../window.c:1810 msgid "E813: Cannot close autocmd window" msgstr "E813: Не вдалося закрити вікно autocmd" # msgstr "E443: " -#: ../window.c:1814 msgid "E814: Cannot close window, only autocmd window would remain" msgstr "E814: Не вдалося закрити вікно, залишилося б тільки вікно autocmd" -#: ../window.c:2717 msgid "E445: Other window contains changes" msgstr "E445: У іншому вікні є зміни" # msgstr "E445: " -#: ../window.c:4805 msgid "E446: No file name under cursor" msgstr "E446: Немає назви файлу над курсором" - -#~ msgid "E831: bf_key_init() called with empty password" -#~ msgstr "E831: Викликано bf_key_init() з порожнім паролем" - -#~ msgid "E820: sizeof(uint32_t) != 4" -#~ msgstr "E820: sizeof(uint32_t) != 4" - -#~ msgid "E817: Blowfish big/little endian use wrong" -#~ msgstr "E817: Неправильне використання порядку байтів Blowfish (BE/LE)" - -#~ msgid "E818: sha256 test failed" -#~ msgstr "E818: Не пройшла перевірка sha256" - -#~ msgid "E819: Blowfish test failed" -#~ msgstr "E819: Не пройшла перевірка Blowfish" - -#~ msgid "Patch file" -#~ msgstr "Латка" - -#~ msgid "" -#~ "&OK\n" -#~ "&Cancel" -#~ msgstr "" -#~ "&O:Гаразд\n" -#~ "&C:Скасувати" - -#~ msgid "E240: No connection to Vim server" -#~ msgstr "E240: Немає з'єднання із сервером Vim" - -#~ msgid "E241: Unable to send to %s" -#~ msgstr "E241: Не вдалося відіслати до %s" - -#~ msgid "E277: Unable to read a server reply" -#~ msgstr "E277: Не вдалося прочитати відповідь сервера" - -#~ msgid "E258: Unable to send to client" -#~ msgstr "E258: Не вдалося надіслати клієнту" - -#~ msgid "Save As" -#~ msgstr "Зберегти як" - -#~ msgid "Source Vim script" -#~ msgstr "Прочитати скрипт Vim" - -#~ msgid "Edit File" -#~ msgstr "Редагувати Файл" - -#~ msgid " (NOT FOUND)" -#~ msgstr " (НЕ ЗНАЙДЕНО)" - -#~ msgid "unknown" -#~ msgstr "Невідомо" - -# msgstr "E185: " -#~ msgid "Edit File in new window" -#~ msgstr "Редагувати файл у новому вікні" - -#~ msgid "Append File" -#~ msgstr "Дописати файл" - -# msgstr "E187: " -#~ msgid "Window position: X %d, Y %d" -#~ msgstr "Позиція вікна: X %d, Y %d" - -# msgstr "E188: " -#~ msgid "Save Redirection" -#~ msgstr "Зберегти переадресований вивід" - -#~ msgid "Save View" -#~ msgstr "Зберегти вигляд" - -#~ msgid "Save Session" -#~ msgstr "Зберегти сеанс" - -#~ msgid "Save Setup" -#~ msgstr "Зберегти налаштування" - -#~ msgid "E809: #< is not available without the +eval feature" -#~ msgstr "E809: #< не доступна без можливості +eval" - -#~ msgid "E196: No digraphs in this version" -#~ msgstr "E196: У цій версії немає диграфів" - -#~ msgid "is a device (disabled with 'opendevice' option)" -#~ msgstr "є пристроєм (вимкнено опцією 'opendevice')" - -#~ msgid "Reading from stdin..." -#~ msgstr "Читається з stdin..." - -#~ msgid "[blowfish]" -#~ msgstr "[blowfish]" - -#~ msgid "[crypted]" -#~ msgstr "[зашифровано]" - -#~ msgid "E821: File is encrypted with unknown method" -#~ msgstr "E821: Файл зашифровано невідомим методом" - -#~ msgid "NetBeans disallows writes of unmodified buffers" -#~ msgstr "NetBeans не дозволяє записувати у незмінені буфери" - -# msgstr "E391: " -#~ msgid "Partial writes disallowed for NetBeans buffers" -#~ msgstr "Часткові записи заборонені для буферів NetBeans" - -#~ msgid "writing to device disabled with 'opendevice' option" -#~ msgstr "Запис до пристрою заборонено опцією 'opendevice'" - -#~ msgid "E460: The resource fork would be lost (add ! to override)" -#~ msgstr "E460: Гілку ресурсів можна втратити (! щоб не зважати)" - -#~ msgid "<cannot open> " -#~ msgstr "<не відкривається> " - -#~ msgid "E616: vim_SelFile: can't get font %s" -#~ msgstr "E616: vim_SelFile: не вдалося отримати шрифт %s" - -#~ msgid "E614: vim_SelFile: can't return to current directory" -#~ msgstr "E614: vim_SelFile: не вдалося повернутися в поточний каталог" - -#~ msgid "Pathname:" -#~ msgstr "Шлях:" - -#~ msgid "E615: vim_SelFile: can't get current directory" -#~ msgstr "E615: vim_SelFile: не вдалося отримати поточний каталог" - -#~ msgid "OK" -#~ msgstr "Гаразд" - -#~ msgid "Cancel" -#~ msgstr "Скасувати" - -#~ msgid "Vim dialog" -#~ msgstr "Діалог Vim" - -#~ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap." -#~ msgstr "Scrollbar Widget: Не вдалося визначити розмір скороченої картинки." - -#~ msgid "E232: Cannot create BalloonEval with both message and callback" -#~ msgstr "E232: Не вдалося створити BalloonEval з повідомленням і функцією" - -#~ msgid "E851: Failed to create a new process for the GUI" -#~ msgstr "E851: Не вдалося створити новий процес для GUI" - -#~ msgid "E852: The child process failed to start the GUI" -#~ msgstr "E852: Дочірній процес не зміг запустити GUI" - -# msgstr "E228: " -#~ msgid "E229: Cannot start the GUI" -#~ msgstr "E229: Не вдалося запустити GUI" - -# msgstr "E229: " -#~ msgid "E230: Cannot read from \"%s\"" -#~ msgstr "E230: Не вдалося прочитати з «%s»" - -#~ msgid "E665: Cannot start GUI, no valid font found" -#~ msgstr "E665: Не вдалося запустити GUI, не знайдено шрифт" - -# msgstr "E230: " -#~ msgid "E231: 'guifontwide' invalid" -#~ msgstr "E231: Некоректний 'guifontwide'" - -#~ msgid "E599: Value of 'imactivatekey' is invalid" -#~ msgstr "E599: Значення 'imactivatekey' некоректне" - -#~ msgid "E254: Cannot allocate color %s" -#~ msgstr "E254: Не вдалося отримати колір %s" - -#~ msgid "No match at cursor, finding next" -#~ msgstr "Немає над курсором, пошук триває" - -#~ msgid "Input _Methods" -#~ msgstr "Методи введення" - -#~ msgid "VIM - Search and Replace..." -#~ msgstr "VIM - Знайти й замінити..." - -#~ msgid "VIM - Search..." -#~ msgstr "VIM - Пошук..." - -#~ msgid "Find what:" -#~ msgstr "Знайти:" - -#~ msgid "Replace with:" -#~ msgstr "Замінити на:" - -#~ msgid "Match whole word only" -#~ msgstr "Лише повне слово" - -#~ msgid "Match case" -#~ msgstr "Зважати на регістр" - -#~ msgid "Direction" -#~ msgstr "Напрям" - -#~ msgid "Up" -#~ msgstr "Вгору" - -#~ msgid "Down" -#~ msgstr "Униз" - -#~ msgid "Find Next" -#~ msgstr "Наступне" - -#~ msgid "Replace" -#~ msgstr "Замінити" - -#~ msgid "Replace All" -#~ msgstr "Замінити усі" - -#~ msgid "Vim: Received \"die\" request from session manager\n" -#~ msgstr "Vim: Отримав запит «die» від менеджера сесій\n" - -#~ msgid "Close" -#~ msgstr "Закрити" - -#~ msgid "New tab" -#~ msgstr "Нова вкладка" - -#~ msgid "Open Tab..." -#~ msgstr "Відкрити вкладку..." - -#~ msgid "Vim: Main window unexpectedly destroyed\n" -#~ msgstr "Vim: Несподівано знищилося головне вікно\n" - -#~ msgid "&Filter" -#~ msgstr "&F:Фільтрувати" - -#~ msgid "&Cancel" -#~ msgstr "&C:Скасувати" - -#~ msgid "Directories" -#~ msgstr "Каталоги" - -#~ msgid "Filter" -#~ msgstr "Фільтр" - -#~ msgid "&Help" -#~ msgstr "&H:Допомога" - -#~ msgid "Files" -#~ msgstr "Файли" - -#~ msgid "&OK" -#~ msgstr "&O:Гаразд" - -#~ msgid "Selection" -#~ msgstr "Виділення" - -#~ msgid "Find &Next" -#~ msgstr "&N:Знайти далі" - -#~ msgid "&Replace" -#~ msgstr "&R:Замінити" - -#~ msgid "Replace &All" -#~ msgstr "&A:Замінити усі" - -#~ msgid "&Undo" -#~ msgstr "&U:Скасувати" - -#~ msgid "E671: Cannot find window title \"%s\"" -#~ msgstr "E671: Не вдалося знайти вікно «%s»" - -#~ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version." -#~ msgstr "E243: Аргумент не підтримується: «-%s»; користуйтесь версією з OLE." - -#~ msgid "E672: Unable to open window inside MDI application" -#~ msgstr "E672: Не вдалося відкрити вікно всередині програми MDI" - -#~ msgid "Close tab" -#~ msgstr "Закрити вкладку" - -#~ msgid "Open tab..." -#~ msgstr "Відкрити вкладку..." - -# msgstr "E245: " -#~ msgid "Find string (use '\\\\' to find a '\\')" -#~ msgstr "Знайти рядок ('\\\\' щоб знайти '\\')" - -#~ msgid "Find & Replace (use '\\\\' to find a '\\')" -#~ msgstr "Знайти і замінити ('\\\\' щоб знайти '\\')" - -#~ msgid "Not Used" -#~ msgstr "Немає" - -#~ msgid "Directory\t*.nothing\n" -#~ msgstr "Каталог\t*.нічого\n" - -#~ msgid "" -#~ "Vim E458: Cannot allocate colormap entry, some colors may be incorrect" -#~ msgstr "" -#~ "Vim E458: Немає вільних комірок у палітрі, деякі кольори можуть бути " -#~ "неправильні" - -#~ msgid "E250: Fonts for the following charsets are missing in fontset %s:" -#~ msgstr "E250: Шрифти для цих символів відсутні у наборі %s:" - -# msgstr "E250: " -#~ msgid "E252: Fontset name: %s" -#~ msgstr "E252: Назва набору шрифтів: %s" - -# msgstr "E252: " -#~ msgid "Font '%s' is not fixed-width" -#~ msgstr "Шрифт '%s' не є моноширинним" - -#~ msgid "E253: Fontset name: %s" -#~ msgstr "E253: Назва набору шрифтів: %s" - -#~ msgid "Font0: %s" -#~ msgstr "Шрифт0: %s" - -#~ msgid "Font1: %s" -#~ msgstr "Шрифт1: %s" - -#~ msgid "Font%<PRId64> width is not twice that of font0" -#~ msgstr "Ширина шрифту%<PRId64> не більша удвічі за ширину шрифту0" - -#~ msgid "Font0 width: %<PRId64>" -#~ msgstr "Ширина шрифту0: %<PRId64>" - -#~ msgid "Font1 width: %<PRId64>" -#~ msgstr "Ширина шрифту1: %<PRId64>" - -#~ msgid "Invalid font specification" -#~ msgstr "Некоректна специфікація шрифту" - -#~ msgid "&Dismiss" -#~ msgstr "&D:Припинити" - -#~ msgid "no specific match" -#~ msgstr "немає конкретного збігу" - -# msgstr "E234: " -#~ msgid "Vim - Font Selector" -#~ msgstr "Vim - Вибір шрифту" - -#~ msgid "Name:" -#~ msgstr "Назва:" - -#~ msgid "Show size in Points" -#~ msgstr "Показати розмір у пунктах" - -#~ msgid "Encoding:" -#~ msgstr "Кодування:" - -#~ msgid "Font:" -#~ msgstr "Шрифт:" - -#~ msgid "Style:" -#~ msgstr "Стиль:" - -#~ msgid "Size:" -#~ msgstr "Розмір:" - -#~ msgid "E256: Hangul automata ERROR" -#~ msgstr "E256: Помилка автомату Hangul" - -#~ msgid "E563: stat error" -#~ msgstr "E563: помилка stat" - -#~ msgid "E625: cannot open cscope database: %s" -#~ msgstr "E625: Не вдалося відкрити базу даних cscope: %s" - -#~ msgid "E626: cannot get cscope database information" -#~ msgstr "E626: Не вдалося отримати інформацію з бази даних cscope" - -#~ msgid "Lua library cannot be loaded." -#~ msgstr "Не вдалося завантажити бібліотеку Lua" - -#~ msgid "cannot save undo information" -#~ msgstr "не вдалося зберегти інформацію для скасування" - -#~ msgid "" -#~ "E815: Sorry, this command is disabled, the MzScheme libraries could not " -#~ "be loaded." -#~ msgstr "" -#~ "E815: Вибачте, ця команда вимкнена, бібліотеки MzScheme не можуть бути " -#~ "завантажені." - -#~ msgid "invalid expression" -#~ msgstr "некоректний вираз" - -#~ msgid "expressions disabled at compile time" -#~ msgstr "обробку виразів вимкнено під час компіляції" - -#~ msgid "hidden option" -#~ msgstr "прихована опція" - -#~ msgid "unknown option" -#~ msgstr "невідома опція" - -#~ msgid "window index is out of range" -#~ msgstr "некоректний номер вікна" - -#~ msgid "couldn't open buffer" -#~ msgstr "не вдалося відкрити буфер" - -#~ msgid "cannot delete line" -#~ msgstr "неможливо знищити рядок" - -#~ msgid "cannot replace line" -#~ msgstr "неможливо замінити рядок" - -#~ msgid "cannot insert line" -#~ msgstr "не вдалося вставити рядок" - -#~ msgid "string cannot contain newlines" -#~ msgstr "більше ніж один рядок" - -#~ msgid "error converting Scheme values to Vim" -#~ msgstr "не вдалося перетворити значення Scheme у Vim" - -#~ msgid "Vim error: ~a" -#~ msgstr "Помилка Vim: ~a" - -#~ msgid "Vim error" -#~ msgstr "Помилка Vim" - -#~ msgid "buffer is invalid" -#~ msgstr "буфер непридатний" - -#~ msgid "window is invalid" -#~ msgstr "вікно непридатне" - -#~ msgid "linenr out of range" -#~ msgstr "номер рядка за межами файлу" - -#~ msgid "not allowed in the Vim sandbox" -#~ msgstr "не дозволено у пісочниці Vim" - -#~ msgid "E837: This Vim cannot execute :py3 after using :python" -#~ msgstr "E837: Python: Не можна використати :py і :py3 в одному сеансі" - -#~ msgid "" -#~ "E263: Sorry, this command is disabled, the Python library could not be " -#~ "loaded." -#~ msgstr "" -#~ "E263: Вибачте, ця команда вимкнена, бібліотека Python не може бути " -#~ "завантажена." - -#~ msgid "E836: This Vim cannot execute :python after using :py3" -#~ msgstr "E836: Python: Не можна використати :py і :py3 в одному сеансі" - -#~ msgid "E659: Cannot invoke Python recursively" -#~ msgstr "E659: Не можна рекурсивно викликати Python" - -#~ msgid "E265: $_ must be an instance of String" -#~ msgstr "E265: $_ має бути екземпляром String" - -#~ msgid "" -#~ "E266: Sorry, this command is disabled, the Ruby library could not be " -#~ "loaded." -#~ msgstr "" -#~ "E266: Вибачте, ця команда вимкнена, бібліотека Ruby не може бути " -#~ "завантажена." - -# msgstr "E414: " -#~ msgid "E267: unexpected return" -#~ msgstr "E267: несподіваний return" - -#~ msgid "E268: unexpected next" -#~ msgstr "E268: несподіваний next" - -#~ msgid "E269: unexpected break" -#~ msgstr "E269: несподіваний break" - -#~ msgid "E270: unexpected redo" -#~ msgstr "E270: несподіваний redo" - -#~ msgid "E271: retry outside of rescue clause" -#~ msgstr "E271: retry поза rescue" - -#~ msgid "E272: unhandled exception" -#~ msgstr "E272: Необроблений виняток" - -# msgstr "E233: " -#~ msgid "E273: unknown longjmp status %d" -#~ msgstr "E273: Невідомий статус longjmp: %d" - -#~ msgid "Toggle implementation/definition" -#~ msgstr "Перемкнути реалізацію/визначення" - -#~ msgid "Show base class of" -#~ msgstr "Знайти базовий клас" - -#~ msgid "Show overridden member function" -#~ msgstr "Показати замінені функції-члени" - -#~ msgid "Retrieve from file" -#~ msgstr "Прочитати з файлу" - -#~ msgid "Retrieve from project" -#~ msgstr "Отримати з проекту" - -#~ msgid "Retrieve from all projects" -#~ msgstr "Отримати з усіх проектів" - -#~ msgid "Retrieve" -#~ msgstr "Отримати" - -#~ msgid "Show source of" -#~ msgstr "Джерело" - -#~ msgid "Find symbol" -#~ msgstr "Знайти символ" - -#~ msgid "Browse class" -#~ msgstr "Переглянути клас" - -#~ msgid "Show class in hierarchy" -#~ msgstr "Показати клас в ієрархії" - -#~ msgid "Show class in restricted hierarchy" -#~ msgstr "Показати клас в обмеженій ієрархії" - -#~ msgid "Xref refers to" -#~ msgstr "Xref вказує на" - -#~ msgid "Xref referred by" -#~ msgstr "На Xref вказано з" - -#~ msgid "Xref has a" -#~ msgstr "Xref має" - -#~ msgid "Xref used by" -#~ msgstr "Xref використано" - -#~ msgid "Show docu of" -#~ msgstr "Показати docu" - -#~ msgid "Generate docu for" -#~ msgstr "Створити docu для" - -#~ msgid "" -#~ "Cannot connect to SNiFF+. Check environment (sniffemacs must be found in " -#~ "$PATH).\n" -#~ msgstr "" -#~ "Не вдалося з'єднатися зі SNiFF+. Перевірте оточення (sniffemacs має бути " -#~ "у $PATH).\n" - -#~ msgid "E274: Sniff: Error during read. Disconnected" -#~ msgstr "E274: Sniff: Помилка під час читання. Від'єднано" - -#~ msgid "SNiFF+ is currently " -#~ msgstr "SNiFF+ зараз " - -#~ msgid "not " -#~ msgstr "не " - -#~ msgid "connected" -#~ msgstr "під'єднаний" - -#~ msgid "E275: Unknown SNiFF+ request: %s" -#~ msgstr "E275: Невідомий запит до SNiFF+: %s" - -#~ msgid "E276: Error connecting to SNiFF+" -#~ msgstr "E276: Помилка з'єднання до SNiFF+" - -#~ msgid "E278: SNiFF+ not connected" -#~ msgstr "E278: SNiFF+ не під'єднано" - -#~ msgid "E279: Not a SNiFF+ buffer" -#~ msgstr "E279: Не є буфером SNiFF+" - -#~ msgid "Sniff: Error during write. Disconnected" -#~ msgstr "Sniff: Помилка запису. Від'єднано" - -#~ msgid "invalid buffer number" -#~ msgstr "неправильна назва буфера" - -#~ msgid "not implemented yet" -#~ msgstr "ще не реалізовано" - -#~ msgid "cannot set line(s)" -#~ msgstr "не вдалося встановити рядки" - -#~ msgid "invalid mark name" -#~ msgstr "неправильна назва позначки" - -# msgstr "E19: " -#~ msgid "mark not set" -#~ msgstr "помітку не вказано" - -#~ msgid "row %d column %d" -#~ msgstr "рядок %d колонка %d" - -#~ msgid "cannot insert/append line" -#~ msgstr "Не вдалося вставити/додати рядок" - -#~ msgid "line number out of range" -#~ msgstr "номер рядка за межами файлу" - -#~ msgid "unknown flag: " -#~ msgstr "невідомий прапорець: " - -#~ msgid "unknown vimOption" -#~ msgstr "Невідома vimOption" - -#~ msgid "keyboard interrupt" -#~ msgstr "перервано з клавіатури" - -#~ msgid "vim error" -#~ msgstr "помилка Vim" - -#~ msgid "cannot create buffer/window command: object is being deleted" -#~ msgstr "не вдалося створити команду вікна/буфера: об'єкт знищується" - -#~ msgid "" -#~ "cannot register callback command: buffer/window is already being deleted" -#~ msgstr "Не вдалося зареєструвати подію: буфер/вікно уже знищується" - -#~ msgid "" -#~ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-" -#~ "dev@vim.org" -#~ msgstr "" -#~ "E280: ФАТАЛЬНА ПОМИЛКА TCL: можливо пошкоджено список посилань!? Будь " -#~ "ласка, повідомте у vim-dev@vim.org" - -#~ msgid "cannot register callback command: buffer/window reference not found" -#~ msgstr "" -#~ "Не вдалося зареєструвати команду події: посилання на буфер/вікно не " -#~ "знайдено" - -#~ msgid "" -#~ "E571: Sorry, this command is disabled: the Tcl library could not be " -#~ "loaded." -#~ msgstr "" -#~ "E571: Вибачте, ця команда вимкнена, бібліотека Tcl не може бути " -#~ "завантажена." - -#~ msgid "E572: exit code %d" -#~ msgstr "E572: Код виходу %d" - -#~ msgid "cannot get line" -#~ msgstr "не вдалося дістати рядок" - -#~ msgid "Unable to register a command server name" -#~ msgstr "Не вдалося зареєструвати назву сервера команд" - -#~ msgid "E248: Failed to send command to the destination program" -#~ msgstr "E248: Не вдалося відіслати команду до програми-цілі" - -#~ msgid "E573: Invalid server id used: %s" -#~ msgstr "E573: Використано некоректний ідентифікатор сервера: %s" - -#~ msgid "E251: VIM instance registry property is badly formed. Deleted!" -#~ msgstr "" -#~ "E251: Реквізит реєстру зразку VIM сформований неправильно. Знищено!" - -#~ msgid "netbeans is not supported with this GUI\n" -#~ msgstr "netbeans не підтримується з цим GUI\n" - -#~ msgid "This Vim was not compiled with the diff feature." -#~ msgstr "Ця версія Vim не була скомпільована з підтримкою порівняння." - -#~ msgid "'-nb' cannot be used: not enabled at compile time\n" -#~ msgstr "Не можна використати '-nb': не дозволено під час компіляції\n" - -#~ msgid "Vim: Error: Failure to start gvim from NetBeans\n" -#~ msgstr "Vim: Помилка: Не вдалося запустити gvim для NetBeans\n" - -#~ msgid "" -#~ "\n" -#~ "Where case is ignored prepend / to make flag upper case" -#~ msgstr "" -#~ "\n" -#~ "Якщо регістр ігнорується, додайте / спереду щоб прапорець був у верхньому " -#~ "регістрі." - -#~ msgid "-register\t\tRegister this gvim for OLE" -#~ msgstr "-register\t\tЗареєструвати цей gvim для OLE" - -#~ msgid "-unregister\t\tUnregister gvim for OLE" -#~ msgstr "-unregister\t\tСкасувати реєстрацію цього gvim для OLE" - -#~ msgid "-g\t\t\tRun using GUI (like \"gvim\")" -#~ msgstr "-g\t\t\tЗапустити GUI (ніби «gvim»)" - -#~ msgid "-f or --nofork\tForeground: Don't fork when starting GUI" -#~ msgstr "-f чи --nofork\tПередній план: тримати термінал після запуску GUI" - -#~ msgid "-f\t\t\tDon't use newcli to open window" -#~ msgstr "-f\t\t\tНе використовувати newcli для відкриття вікна" - -#~ msgid "-dev <device>\t\tUse <device> for I/O" -#~ msgstr "-dev <пристрій>\t\t\tВикористовувати <пристрій> для вводу/виводу" - -#~ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc" -#~ msgstr "-u <gvimrc>\t\tВикористати поданий файл замість .gvimrc" - -#~ msgid "-x\t\t\tEdit encrypted files" -#~ msgstr "-x\t\t\tРедагувати зашифровані файли" - -#~ msgid "-display <display>\tConnect vim to this particular X-server" -#~ msgstr "-display <дисплей>\tПід'єднати vim до заданого дисплею сервера X" - -#~ msgid "-X\t\t\tDo not connect to X server" -#~ msgstr "-X\t\t\tНе з'єднуватися з X сервером" - -#~ msgid "--remote <files>\tEdit <files> in a Vim server if possible" -#~ msgstr "" -#~ "--remote <файли>\tРедагувати <файли> на сервері Vim, якщо це можливо" - -#~ msgid "--remote-silent <files> Same, don't complain if there is no server" -#~ msgstr "" -#~ "--remote-silent <файли> Те саме, тільки не скаржитися на відсутність " -#~ "сервера" - -#~ msgid "" -#~ "--remote-wait <files> As --remote but wait for files to have been edited" -#~ msgstr "" -#~ "--remote-wait <файли> ..., але зачекати поки усі файли будуть " -#~ "відредаговані" - -#~ msgid "" -#~ "--remote-wait-silent <files> Same, don't complain if there is no server" -#~ msgstr "" -#~ "--remote-wait-silent <файли> Те саме, тільки не скаржитися, якщо сервера " -#~ "немає" - -#~ msgid "" -#~ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per " -#~ "file" -#~ msgstr "" -#~ "--remote-tab[-wait][-silent] <файли> Так само, як --remote, але по " -#~ "вкладці на файл" - -#~ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit" -#~ msgstr "" -#~ "--remote-send <символи> Відіслати <символи> серверу і завершити роботу" - -#~ msgid "" -#~ "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result" -#~ msgstr "" -#~ "--remote-expr <вираз> Виконати <вираз> у сервері Vim і надрукувати " -#~ "результат" - -#~ msgid "--serverlist\t\tList available Vim server names and exit" -#~ msgstr "" -#~ "--serverlist\t\tПоказати список наявних серверів Vim і завершити роботу" - -#~ msgid "--servername <name>\tSend to/become the Vim server <name>" -#~ msgstr "--servername <назва>\tНадіслати до/стати Vim сервером з <назвою>" - -#~ msgid "" -#~ "\n" -#~ "Arguments recognised by gvim (Motif version):\n" -#~ msgstr "" -#~ "\n" -#~ "Аргументи для gvim (версія Motif)\n" - -#~ msgid "" -#~ "\n" -#~ "Arguments recognised by gvim (neXtaw version):\n" -#~ msgstr "" -#~ "\n" -#~ "Аргументи для gvim (версія neXtaw):\n" - -#~ msgid "" -#~ "\n" -#~ "Arguments recognised by gvim (Athena version):\n" -#~ msgstr "" -#~ "\n" -#~ "Аргументи для gvim (версія Athena)\n" - -#~ msgid "-display <display>\tRun vim on <display>" -#~ msgstr "-display <дисплей>\tВиконати vim на заданому <дисплеї>" - -#~ msgid "-iconic\t\tStart vim iconified" -#~ msgstr "-iconic\t\tЗапустити Vim і згорнути його вікно" - -#~ msgid "-background <color>\tUse <color> for the background (also: -bg)" -#~ msgstr "-background <колір>\tВикористати <колір> для фону (також: -bg)" - -#~ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)" -#~ msgstr "" -#~ "-foreground <колір>\tВикористати <колір> для звичайного тексту (також: -" -#~ "fg)" - -#~ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)" -#~ msgstr "" -#~ "-font <шрифт>\tВикористати <шрифт> для звичайного тексту (також: -fn)" - -#~ msgid "-boldfont <font>\tUse <font> for bold text" -#~ msgstr "-boldfont <шрифт>\tВикористати <шрифт> для жирного тексту" - -#~ msgid "-italicfont <font>\tUse <font> for italic text" -#~ msgstr "-italicfont <шрифт>\tВикористати <шрифт> для похилого тексту" - -#~ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)" -#~ msgstr "-geometry <геом>\tЗадати розміри й положення (також: -geom)" - -#~ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)" -#~ msgstr "-borderwidth <товщ>\tВстановити товщину меж <товщ> (також: -bw)" - -#~ msgid "" -#~ "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)" -#~ msgstr "" -#~ "-scrollbarwidth <товщ> Встановити товщину лінійки зсуву (також: -sw)" - -#~ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)" -#~ msgstr "-menuheight <висота>\tВстановити висоту меню <висота> (також: -mh)" - -#~ msgid "-reverse\t\tUse reverse video (also: -rv)" -#~ msgstr "-reverse\t\tОбернути кольори (також: -rv)" - -#~ msgid "+reverse\t\tDon't use reverse video (also: +rv)" -#~ msgstr "+reverse\t\tНе обертати кольори (також: +rv)" - -#~ msgid "-xrm <resource>\tSet the specified resource" -#~ msgstr "-xrm <ресурс>\t\tВстановити зазначений ресурс" - -#~ msgid "" -#~ "\n" -#~ "Arguments recognised by gvim (GTK+ version):\n" -#~ msgstr "" -#~ "\n" -#~ "Аргументи gvim (версія GTK+)\n" - -#~ msgid "-display <display>\tRun vim on <display> (also: --display)" -#~ msgstr "-display <дисплей>\tВиконати vim на <дисплеї> (також: --display)" - -#~ msgid "--role <role>\tSet a unique role to identify the main window" -#~ msgstr "" -#~ "--role <роль>\tВстановити унікальну роль для ідентифікації головного вікна" - -#~ msgid "--socketid <xid>\tOpen Vim inside another GTK widget" -#~ msgstr "--socketid <xid>\tВідкрити Vim в іншому елементі інтерфейсу GTK" - -#~ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout" -#~ msgstr "--echo-wid\t\tХай gvim надрукує ідентифікатор вікна на stdout" - -#~ msgid "-P <parent title>\tOpen Vim inside parent application" -#~ msgstr "-P <заголовок батька>\tВідкрити Vim всередині батьківського вікна" - -#~ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget" -#~ msgstr "--windowid <HWND>\tВідкрити Vim всередині іншого елементу win32" - -#~ msgid "No display" -#~ msgstr "Немає дисплею" - -#~ msgid ": Send failed.\n" -#~ msgstr ": Не вдалося відіслати.\n" - -#~ msgid ": Send failed. Trying to execute locally\n" -#~ msgstr ": Не вдалося відіслати. Спроба виконати на місці\n" - -#~ msgid "%d of %d edited" -#~ msgstr "відредаговано %d з %d" - -#~ msgid "No display: Send expression failed.\n" -#~ msgstr "Немає дисплею: Відіслати вираз не вдалося.\n" - -#~ msgid ": Send expression failed.\n" -#~ msgstr ": Відіслати вираз не вдалося.\n" - -#~ msgid "E543: Not a valid codepage" -#~ msgstr "E543: Некоректна кодова сторінка" - -#~ msgid "E284: Cannot set IC values" -#~ msgstr "E284: Не вдалося встановити значення контексту вводу" - -#~ msgid "E285: Failed to create input context" -#~ msgstr "E285: Не вдалося створити контекст вводу" - -#~ msgid "E286: Failed to open input method" -#~ msgstr "E286: Не вдалося створити метод вводу" - -# msgstr "E286: " -#~ msgid "E287: Warning: Could not set destroy callback to IM" -#~ msgstr "" -#~ "E287: Застереження: Не вдалося встановити в методі вводу подію знищення" - -# msgstr "E287: " -#~ msgid "E288: input method doesn't support any style" -#~ msgstr "E288: Метод вводу не підтримує стилі" - -# msgstr "E288: " -#~ msgid "E289: input method doesn't support my preedit type" -#~ msgstr "E289: Метод вводу не підтримує відредаговані типи" - -#~ msgid "E843: Error while updating swap file crypt" -#~ msgstr "E843: Помилка поновлення шифрування файлу обміну" - -#~ msgid "" -#~ "E833: %s is encrypted and this version of Vim does not support encryption" -#~ msgstr "E833: %s зашифровано, а ця версія Vim не підтримує шифрування" - -#~ msgid "Swap file is encrypted: \"%s\"" -#~ msgstr "Файл обміну зашифрований: «%s»" - -#~ msgid "" -#~ "\n" -#~ "If you entered a new crypt key but did not write the text file," -#~ msgstr "" -#~ "\n" -#~ "Якщо ви задали новий ключ шифру, але не записали текстовий файл," - -#~ msgid "" -#~ "\n" -#~ "enter the new crypt key." -#~ msgstr "" -#~ "\n" -#~ "введіть новий ключ шифру." - -#~ msgid "" -#~ "\n" -#~ "If you wrote the text file after changing the crypt key press enter" -#~ msgstr "" -#~ "\n" -#~ "Якщо ви записали текстовий файл після зміни ключа шифру, натисніть enter" - -#~ msgid "" -#~ "\n" -#~ "to use the same key for text file and swap file" -#~ msgstr "" -#~ "\n" -#~ "щоб використати однаковий ключ для текстового файлу та файлу обміну" - -#~ msgid "Using crypt key from swap file for the text file.\n" -#~ msgstr "Для текстового файлу використовується ключ шифру з файлу обміну.\n" - -#~ msgid "" -#~ "\n" -#~ " [not usable with this version of Vim]" -#~ msgstr "" -#~ "\n" -#~ " [не придатний для цієї версії Vim]" - -#~ msgid "Tear off this menu" -#~ msgstr "Відірвати це меню" - -#~ msgid "Select Directory dialog" -#~ msgstr "Вибрати каталог" - -#~ msgid "Save File dialog" -#~ msgstr "Запам'ятати файл" - -#~ msgid "Open File dialog" -#~ msgstr "Відкрити файл" - -#~ msgid "E338: Sorry, no file browser in console mode" -#~ msgstr "E338: Вибачте, але в консолі немає діалогу вибору файлу" - -#~ msgid "ERROR: " -#~ msgstr "ПОМИЛКА: " - -#~ msgid "" -#~ "\n" -#~ "[bytes] total alloc-freed %<PRIu64>-%<PRIu64>, in use %<PRIu64>, peak use " -#~ "%<PRIu64>\n" -#~ msgstr "" -#~ "\n" -#~ "[байт] всього розм/знищ. %<PRIu64>/%<PRIu64>, викор. %<PRIu64>, макс. " -#~ "%<PRIu64>\n" - -#~ msgid "" -#~ "[calls] total re/malloc()'s %<PRIu64>, total free()'s %<PRIu64>\n" -#~ "\n" -#~ msgstr "" -#~ "[виклики] усього re/malloc() - %<PRIu64>, усього free() - %<PRIu64>\n" -#~ "\n" - -#~ msgid "E340: Line is becoming too long" -#~ msgstr "E340: Рядок стає занадто довгим" - -# msgstr "E340: " -#~ msgid "E341: Internal error: lalloc(%<PRId64>, )" -#~ msgstr "E341: Внутрішня помилка: lalloc(%<PRId64>, )" - -#~ msgid "E547: Illegal mouseshape" -#~ msgstr "E547: Неправильний вигляд миші" - -#~ msgid "Enter encryption key: " -#~ msgstr "Вкажіть ключ шифру: " - -#~ msgid "Enter same key again: " -#~ msgstr "Повторіть ключ: " - -#~ msgid "Keys don't match!" -#~ msgstr "Ключі не однакові!" - -#~ msgid "Cannot connect to Netbeans #2" -#~ msgstr "Не вдалося з'єднатися із Netbeans #2" - -#~ msgid "Cannot connect to Netbeans" -#~ msgstr "Не вдалося з'єднатися із Netbeans" - -#~ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\"" -#~ msgstr "" -#~ "E668: Неправильний режим доступу до файлу інформації про з'єднання з " -#~ "NetBenans: «%s»" - -#~ msgid "read from Netbeans socket" -#~ msgstr "читається з сокета Netbeans" - -#~ msgid "E658: NetBeans connection lost for buffer %<PRId64>" -#~ msgstr "E658: Втрачено зв'язок із NetBeans для буфера %<PRId64>" - -#~ msgid "E838: netbeans is not supported with this GUI" -#~ msgstr "E838: netbeans не підтримується з цим GUI" - -#~ msgid "E511: netbeans already connected" -#~ msgstr "E511: netbeans вже під'єднано" - -#~ msgid "E505: %s is read-only (add ! to override)" -#~ msgstr "E505: %s тільки для читання (! щоб не зважати)" - -#~ msgid "E775: Eval feature not available" -#~ msgstr "E775: Можливість eval недоступна" - -#~ msgid "freeing %<PRId64> lines" -#~ msgstr "Звільнено рядків: %<PRId64>" - -#~ msgid "E530: Cannot change term in GUI" -#~ msgstr "E530: Не вдалося змінити term в GUI" - -#~ msgid "E531: Use \":gui\" to start the GUI" -#~ msgstr "E531: Застосуйте «:gui» для запуску GUI" - -#~ msgid "E617: Cannot be changed in the GTK+ 2 GUI" -#~ msgstr "E617: Не можна змінити в GUI GTK+ 2" - -#~ msgid "E596: Invalid font(s)" -#~ msgstr "E596: Некоректний(і) шрифт(и)" - -#~ msgid "E597: can't select fontset" -#~ msgstr "E597: Не вдалося вибрати набір шрифтів" - -#~ msgid "E598: Invalid fontset" -#~ msgstr "E598: Неправильний набір шрифтів" - -#~ msgid "E533: can't select wide font" -#~ msgstr "E533: Не вдалося використати розширений шрифт" - -#~ msgid "E534: Invalid wide font" -#~ msgstr "E534: Некоректний розширений шрифт" - -#~ msgid "E538: No mouse support" -#~ msgstr "E538: Миша не підтримується" - -# msgstr "E358: " -#~ msgid "cannot open " -#~ msgstr "не вдалося відкрити " - -#~ msgid "VIM: Can't open window!\n" -#~ msgstr "VIM: Не вдалося відкрити вікно!\n" - -#~ msgid "Need Amigados version 2.04 or later\n" -#~ msgstr "Потрібна Amigados 2.04 або пізніша\n" - -#~ msgid "Need %s version %<PRId64>\n" -#~ msgstr "Потрібно %s версії %<PRId64>\n" - -#~ msgid "Cannot open NIL:\n" -#~ msgstr "Не вдалося відкрити NIL:\n" - -#~ msgid "Cannot create " -#~ msgstr "Не вдалося створити " - -#~ msgid "Vim exiting with %d\n" -#~ msgstr "Vim завершує роботу з %d\n" - -#~ msgid "cannot change console mode ?!\n" -#~ msgstr "не можу змінити режим консолі ?!\n" - -# msgstr "E359: " -#~ msgid "mch_get_shellsize: not a console??\n" -#~ msgstr "mch_get_shellsize: не консоль??\n" - -#~ msgid "E360: Cannot execute shell with -f option" -#~ msgstr "E360: Не вдалося запустити оболонку з опцією -f" - -# msgstr "E360: " -#~ msgid "Cannot execute " -#~ msgstr "Не вдалося виконати " - -#~ msgid "shell " -#~ msgstr "оболонку " - -#~ msgid " returned\n" -#~ msgstr " повернуто\n" - -#~ msgid "ANCHOR_BUF_SIZE too small." -#~ msgstr "ANCHOR_BUF_SIZE замалий" - -#~ msgid "I/O ERROR" -#~ msgstr "Помилка вводу/виводу" - -#~ msgid "Message" -#~ msgstr "Повідомлення" - -#~ msgid "'columns' is not 80, cannot execute external commands" -#~ msgstr "'columns' не 80, не можна виконувати зовнішні команди" - -# msgstr "E364: " -#~ msgid "E237: Printer selection failed" -#~ msgstr "E237: Не вдалося вибрати принтер" - -#~ msgid "to %s on %s" -#~ msgstr "на %s з %s" - -#~ msgid "E613: Unknown printer font: %s" -#~ msgstr "E613: Невідомий шрифт принтера: %s" - -#~ msgid "E238: Print error: %s" -#~ msgstr "E238: Помилка друку: %s" - -#~ msgid "Printing '%s'" -#~ msgstr "Друкується '%s'" - -#~ msgid "E244: Illegal charset name \"%s\" in font name \"%s\"" -#~ msgstr "E244: Некоректна назва набору символів «%s» у назві шрифту «%s»" - -#~ msgid "E245: Illegal char '%c' in font name \"%s\"" -#~ msgstr "E245: Помилковий символ %c в назві шрифту «%s»" - -#~ msgid "Opening the X display took %<PRId64> msec" -#~ msgstr "На відкриття дисплею X пішло %<PRId64> мілісекунд" - -#~ msgid "" -#~ "\n" -#~ "Vim: Got X error\n" -#~ msgstr "" -#~ "\n" -#~ "Vim: Помилка X\n" - -#~ msgid "Testing the X display failed" -#~ msgstr "Дисплей Х не пройшов перевірку" - -#~ msgid "Opening the X display timed out" -#~ msgstr "Сплив час очікування відкриття дисплею Х" - -#~ msgid "" -#~ "\n" -#~ "Cannot execute shell sh\n" -#~ msgstr "" -#~ "\n" -#~ "Не вдалося запустити оболонку `sh'\n" - -#~ msgid "" -#~ "\n" -#~ "Cannot create pipes\n" -#~ msgstr "" -#~ "\n" -#~ "Не можна створити канали\n" - -#~ msgid "" -#~ "\n" -#~ "Cannot fork\n" -#~ msgstr "" -#~ "\n" -#~ "Не вдалося роздвоїтися\n" - -#~ msgid "" -#~ "\n" -#~ "Command terminated\n" -#~ msgstr "" -#~ "\n" -#~ "Команда закінчила виконання\n" - -#~ msgid "XSMP lost ICE connection" -#~ msgstr "XSMP втратив з'єднання ICE" - -#~ msgid "Opening the X display failed" -#~ msgstr "Не вдалося відкрити дисплей X" - -#~ msgid "XSMP handling save-yourself request" -#~ msgstr "XSMP обробляється запит 'збережи себе'" - -#~ msgid "XSMP opening connection" -#~ msgstr "XSMP відкривається з'єднання" - -#~ msgid "XSMP ICE connection watch failed" -#~ msgstr "XSMP спостереження за з'єднанням з ICE не вдалося" - -#~ msgid "XSMP SmcOpenConnection failed: %s" -#~ msgstr "XSMP не вдалося SmcOpenConnection: %s" - -#~ msgid "At line" -#~ msgstr "Рядок:" - -#~ msgid "Could not load vim32.dll!" -#~ msgstr "Не вдалося завантажити vim32.dll" - -#~ msgid "VIM Error" -#~ msgstr "Помилка VIM" - -#~ msgid "Could not fix up function pointers to the DLL!" -#~ msgstr "Не вдалося виправити вказівники на функції DLL!" - -#~ msgid "shell returned %d" -#~ msgstr "оболонка повернула %d" - -#~ msgid "Vim: Caught %s event\n" -#~ msgstr "Vim: Виявлено подію %s\n" - -#~ msgid "close" -#~ msgstr "close" - -#~ msgid "logoff" -#~ msgstr "logoff" - -#~ msgid "shutdown" -#~ msgstr "shutdown" - -#~ msgid "E371: Command not found" -#~ msgstr "E371: Команду не знайдено" - -#~ msgid "" -#~ "VIMRUN.EXE not found in your $PATH.\n" -#~ "External commands will not pause after completion.\n" -#~ "See :help win32-vimrun for more information." -#~ msgstr "" -#~ "Файл VIMRUN.EXE не знайдено у шляху пошуку.\n" -#~ "Зовнішні команди не будуть призупинені після виконання.\n" -#~ "Гляньте :help win32-vimrun щоб отримати подробиці." - -#~ msgid "Vim Warning" -#~ msgstr "Застереження Vim" - -# msgstr "E231: " -#~ msgid "Error file" -#~ msgstr "Файл помилок" - -#~ msgid "E868: Error building NFA with equivalence class!" -#~ msgstr "E868: Не вдалося побудувати NFA з класом еквівалентності!" - -#~ msgid "E878: (NFA) Could not allocate memory for branch traversal!" -#~ msgstr "E878: (NFA) Не вдалося отримати пам’ять для обходу гілок!" - -#~ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\"" -#~ msgstr "" -#~ "Застереження: Не вдалося знайти список слів «%s_%s.spl» чи «%s_ascii.spl»" - -#~ msgid "Conversion in %s not supported" -#~ msgstr "Перетворення у %s не підтримується" - -#~ msgid "E845: Insufficient memory, word list will be incomplete" -#~ msgstr "E845: Недостатньо пам’яті, список слів буде неповним" - -#~ msgid "E430: Tag file path truncated for %s\n" -#~ msgstr "E430: Шлях файлу теґів скорочено до %s\n" - -#~ msgid "new shell started\n" -#~ msgstr "запущено нову оболонку\n" - -# msgstr "E242: " -#~ msgid "Used CUT_BUFFER0 instead of empty selection" -#~ msgstr "Використано CUT_BUFFER0 замість порожнього виділення" - -#~ msgid "No undo possible; continue anyway" -#~ msgstr "Скасування буде неможливе, все одно продовжити" - -#~ msgid "E832: Non-encrypted file has encrypted undo file: %s" -#~ msgstr "E832: Незашифрований файл має зашифрований файл історії: %s" - -#~ msgid "E826: Undo file decryption failed: %s" -#~ msgstr "E826: Не вдалося розшифрувати файл історії: %s" - -#~ msgid "E827: Undo file is encrypted: %s" -#~ msgstr "E827: Файл історії зашифрований: %s" - -# msgstr "E440: " -# --------------------------------------- -#~ msgid "" -#~ "\n" -#~ "MS-Windows 16/32-bit GUI version" -#~ msgstr "" -#~ "\n" -#~ "Версія з GUI для 16/32-розрядної Windows" - -#~ msgid "" -#~ "\n" -#~ "MS-Windows 64-bit GUI version" -#~ msgstr "" -#~ "\n" -#~ "Версія з GUI для 64-розрядної MS-Windows" - -#~ msgid "" -#~ "\n" -#~ "MS-Windows 32-bit GUI version" -#~ msgstr "" -#~ "\n" -#~ "Версія з GUI для 32-розрядної Windows" - -#~ msgid " in Win32s mode" -#~ msgstr " в режимі Win32s" - -#~ msgid " with OLE support" -#~ msgstr " з підтримкою OLE" - -#~ msgid "" -#~ "\n" -#~ "MS-Windows 64-bit console version" -#~ msgstr "" -#~ "\n" -#~ "Консольна версія для 64-розрядної Windows" - -#~ msgid "" -#~ "\n" -#~ "MS-Windows 32-bit console version" -#~ msgstr "" -#~ "\n" -#~ "Консольна версія для 32-розрядної Windows" - -#~ msgid "" -#~ "\n" -#~ "MS-Windows 16-bit version" -#~ msgstr "" -#~ "\n" -#~ "Версія для 16-розрядної Windows" - -#~ msgid "" -#~ "\n" -#~ "32-bit MS-DOS version" -#~ msgstr "" -#~ "\n" -#~ "Версія для 32-розрядної MS-DOS" - -#~ msgid "" -#~ "\n" -#~ "16-bit MS-DOS version" -#~ msgstr "" -#~ "\n" -#~ "Версія для 16-розрядної MS-DOS" - -#~ msgid "" -#~ "\n" -#~ "MacOS X (unix) version" -#~ msgstr "" -#~ "\n" -#~ "Версія для MacOS X (unix)" - -#~ msgid "" -#~ "\n" -#~ "MacOS X version" -#~ msgstr "" -#~ "\n" -#~ "Версія для MacOS X" - -#~ msgid "" -#~ "\n" -#~ "MacOS version" -#~ msgstr "" -#~ "\n" -#~ "Версія для MacOS" - -#~ msgid "" -#~ "\n" -#~ "OpenVMS version" -#~ msgstr "" -#~ "\n" -#~ "Версія для OpenVMS" - -#~ msgid "" -#~ "\n" -#~ "Big version " -#~ msgstr "" -#~ "\n" -#~ "Велика версія " - -#~ msgid "" -#~ "\n" -#~ "Normal version " -#~ msgstr "" -#~ "\n" -#~ "Нормальна версія " - -#~ msgid "" -#~ "\n" -#~ "Small version " -#~ msgstr "" -#~ "\n" -#~ "Мала версія " - -#~ msgid "" -#~ "\n" -#~ "Tiny version " -#~ msgstr "" -#~ "\n" -#~ "Крихітна версія " - -#~ msgid "with GTK2-GNOME GUI." -#~ msgstr "з GUI GTK2-GNOME." - -#~ msgid "with GTK2 GUI." -#~ msgstr "з GUI GTK2." - -#~ msgid "with X11-Motif GUI." -#~ msgstr "з GUI X11-Motif." - -#~ msgid "with X11-neXtaw GUI." -#~ msgstr "з GUI X11-neXtaw." - -#~ msgid "with X11-Athena GUI." -#~ msgstr "з GUI X11-Athena." - -#~ msgid "with Photon GUI." -#~ msgstr "з GUI Photon." - -#~ msgid "with GUI." -#~ msgstr "з GUI." - -#~ msgid "with Carbon GUI." -#~ msgstr "з GUI Carbon." - -#~ msgid "with Cocoa GUI." -#~ msgstr "з GUI Cocoa." - -#~ msgid "with (classic) GUI." -#~ msgstr "з (класичним) GUI." - -#~ msgid " system gvimrc file: \"" -#~ msgstr " системний gvimrc: \"" - -#~ msgid " user gvimrc file: \"" -#~ msgstr " gvimrc користувача: \"" - -#~ msgid "2nd user gvimrc file: \"" -#~ msgstr "другий gvimrc користувача: \"" - -#~ msgid "3rd user gvimrc file: \"" -#~ msgstr "третій gvimrc користувача: \"" - -#~ msgid " system menu file: \"" -#~ msgstr " системне меню: \"" - -#~ msgid "Compiler: " -#~ msgstr "Компілятор: " - -#~ msgid "menu Help->Orphans for information " -#~ msgstr "меню Help->Orphans подальша інформація " - -#~ msgid "Running modeless, typed text is inserted" -#~ msgstr "Без режимів, текст що набрано вставляється" - -#~ msgid "menu Edit->Global Settings->Toggle Insert Mode " -#~ msgstr "меню Edit->Global Settings->Toggle Insert Mode " - -#~ msgid " for two modes " -#~ msgstr " для двох режимів " - -#~ msgid "menu Edit->Global Settings->Toggle Vi Compatible" -#~ msgstr "меню Edit->Global Settings->Toggle Vi Compatible " - -#~ msgid " for Vim defaults " -#~ msgstr " щоб починати в режимі сумісності з Vi" - -#~ msgid "WARNING: Windows 95/98/ME detected" -#~ msgstr "ЗАСТЕРЕЖЕННЯ: Ви користуєтеся Windows 95/98/ME" - -#~ msgid "type :help windows95<Enter> for info on this" -#~ msgstr ":help windows95<Enter> інформація про це " - -#~ msgid "E370: Could not load library %s" -#~ msgstr "E370: Не вдалося завантажити бібліотеку %s" - -#~ msgid "" -#~ "Sorry, this command is disabled: the Perl library could not be loaded." -#~ msgstr "" -#~ "Вибачте, ця команда вимкнена, бібліотека Perl не може бути завантажена." - -#~ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module" -#~ msgstr "" -#~ "E299: Обчислення виразів Perl заборонене у пісочниці без модуля Safe" - -#~ msgid "Edit with &multiple Vims" -#~ msgstr "Редагувати у (&m)різних Vim" - -#~ msgid "Edit with single &Vim" -#~ msgstr "Редагувати у одному &Vim" - -#~ msgid "Diff with Vim" -#~ msgstr "Порівняти з допомогою Vim" - -#~ msgid "Edit with &Vim" -#~ msgstr "Редагувати за допомогою &Vim" - -#~ msgid "Edit with existing Vim - " -#~ msgstr "Редагувати у вже запущеному Vim - " - -#~ msgid "Edits the selected file(s) with Vim" -#~ msgstr "Редагує вибрані файли з допомогою Vim" - -#~ msgid "Error creating process: Check if gvim is in your path!" -#~ msgstr "Помилка створення процесу, перевірте чи є gvim у шляху пошуку!" - -#~ msgid "gvimext.dll error" -#~ msgstr "помилка gvimext.dll" - -#~ msgid "Path length too long!" -#~ msgstr "Шлях занадто довгий!" - -# msgstr "E233: " -#~ msgid "E234: Unknown fontset: %s" -#~ msgstr "E234: Невідомий набір шрифтів: %s" - -#~ msgid "E235: Unknown font: %s" -#~ msgstr "E235: Невідомий шрифт: %s" - -# msgstr "E235: " -#~ msgid "E236: Font \"%s\" is not fixed-width" -#~ msgstr "E236: Шрифт «%s» не моноширинний" - -#~ msgid "E448: Could not load library function %s" -#~ msgstr "E448: Не вдалося завантажити бібліотечну функцію %s" - -#~ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n" -#~ msgstr "E26: Не можна використати іврит: Не ввімкнено під час компіляції\n" - -#~ msgid "E27: Farsi cannot be used: Not enabled at compile time\n" -#~ msgstr "E27: Не можна використати фарсі: Не ввімкнено під час компіляції\n" - -#~ msgid "E800: Arabic cannot be used: Not enabled at compile time\n" -#~ msgstr "" -#~ "E800: Не можна використати арабську мову: Не ввімкнено під час " -#~ "компіляції\n" - -#~ msgid "E247: no registered server named \"%s\"" -#~ msgstr "E247: Немає зареєстрованих серверів з назвою «%s»" - -#~ msgid "E233: cannot open display" -#~ msgstr "E233: Не вдалося відкрити дисплей" - -#~ msgid "E449: Invalid expression received" -#~ msgstr "E449: Отримано некоректний вираз" - -#~ msgid "E463: Region is guarded, cannot modify" -#~ msgstr "E463: Не можна змінити захищений регіон" - -#~ msgid "E744: NetBeans does not allow changes in read-only files" -#~ msgstr "E744: NetBeans не дозволяє змінювати захищені від запису файли" - -#~ msgid "Need encryption key for \"%s\"" -#~ msgstr "Для «%s» потрібен ключ: " - -# msgstr "E406: " -#~ msgid "empty keys are not allowed" -#~ msgstr "порожні ключі не дозволені" - -#~ msgid "dictionary is locked" -#~ msgstr "словник заблоковано" - -#~ msgid "list is locked" -#~ msgstr "список заблоковано" - -#~ msgid "failed to add key '%s' to dictionary" -#~ msgstr "не вдалося додати ключ '%s' до словника" - -#~ msgid "index must be int or slice, not %s" -#~ msgstr "індекс має бути цілий чи зріз, не %s" - -#~ msgid "expected str() or unicode() instance, but got %s" -#~ msgstr "очікувався екземпляр str() чи unicode(), але отримано %s" - -#~ msgid "expected bytes() or str() instance, but got %s" -#~ msgstr "очікувався екземпляр bytes() чи str(), але отримано %s" - -#~ msgid "" -#~ "expected int(), long() or something supporting coercing to long(), but " -#~ "got %s" -#~ msgstr "" -#~ "очікувався int(), long() чи щось, що може бути вміщене long(), але " -#~ "отримано %s" - -#~ msgid "expected int() or something supporting coercing to int(), but got %s" -#~ msgstr "" -#~ "очікувався int() чи щось, що може бути вміщене int(), але отримано %s" - -#~ msgid "value is too large to fit into C int type" -#~ msgstr "значення завелике, щоб вміститися у тип C int" - -#~ msgid "value is too small to fit into C int type" -#~ msgstr "значення замале, щоб вміститися у тип C int" - -#~ msgid "number must be greater then zero" -#~ msgstr "число має бути більше, ніж нуль" - -#~ msgid "number must be greater or equal to zero" -#~ msgstr "число має бути не менше, ніж нуль" - -#~ msgid "can't delete OutputObject attributes" -#~ msgstr "не вдалося знищити атрибути OutputObject" - -# msgstr "E180: " -#~ msgid "invalid attribute: %s" -#~ msgstr "неправильний атрибут: %s" - -#~ msgid "E264: Python: Error initialising I/O objects" -#~ msgstr "E264: Python: Помилка ініціалізації об'єктів вводу/виводу" - -#~ msgid "failed to change directory" -#~ msgstr "не вдалося змінити директорію" - -#~ msgid "expected 3-tuple as imp.find_module() result, but got %s" -#~ msgstr "очікувався 3-кортеж як результат imp.find_module(), але отримано %s" - -#~ msgid "" -#~ "expected 3-tuple as imp.find_module() result, but got tuple of size %d" -#~ msgstr "очікувався 3-кортеж як результат imp.find_module(), але отримано %d" - -#~ msgid "internal error: imp.find_module returned tuple with NULL" -#~ msgstr "внутрішня помилка: imp.find_module повернула кортеж з NULL" - -#~ msgid "cannot delete vim.Dictionary attributes" -#~ msgstr "не вдалося знищити атрибути vim.Dictionary" - -#~ msgid "cannot modify fixed dictionary" -#~ msgstr "не можна змінити фіксований словник" - -#~ msgid "cannot set attribute %s" -#~ msgstr "не можна встановити атрибут %s" - -#~ msgid "hashtab changed during iteration" -#~ msgstr "хеш-таблиця змінилася під час перебирання" - -#~ msgid "expected sequence element of size 2, but got sequence of size %d" -#~ msgstr "" -#~ "очікувалась послідовність розміром 2, але отримано послідовність розміру " -#~ "%d" - -#~ msgid "list constructor does not accept keyword arguments" -#~ msgstr "списковий конструктор не приймає іменовані аргументи" - -#~ msgid "list index out of range" -#~ msgstr "індекс списку за межами" - -#~ msgid "internal error: failed to get vim list item %d" -#~ msgstr "внутрішня помилка: не вдалося отримати елемент списку vim %d" - -#~ msgid "failed to add item to list" -#~ msgstr "не вдалося додати елемент до списку" - -#~ msgid "internal error: no vim list item %d" -#~ msgstr "внутрішня помилка: немає елемента списку vim %d" - -#~ msgid "internal error: failed to add item to list" -#~ msgstr "внутрішня помилка: не вдалося додати елемент до списку" - -#~ msgid "cannot delete vim.List attributes" -#~ msgstr "не вдалося знищити атрибути vim.List" - -#~ msgid "cannot modify fixed list" -#~ msgstr "не можна змінити фіксований список" - -# msgstr "E428: " -#~ msgid "unnamed function %s does not exist" -#~ msgstr "безіменної функції %s не існує" - -# msgstr "E428: " -#~ msgid "function %s does not exist" -#~ msgstr "функції %s не існує" - -#~ msgid "function constructor does not accept keyword arguments" -#~ msgstr "конструктор функції не приймає іменовані аргументи" - -#~ msgid "failed to run function %s" -#~ msgstr "не вдалося виконати функцію %s" - -#~ msgid "problem while switching windows" -#~ msgstr "не вдалося перемкнути вікна" - -#~ msgid "unable to unset global option %s" -#~ msgstr "не вдалося скинути глобальну опцію %s" - -#~ msgid "unable to unset option %s which does not have global value" -#~ msgstr "не вдалося скинути опцію %s, яка не має глобального значення" - -#~ msgid "attempt to refer to deleted tab page" -#~ msgstr "спроба звернення до знищеної вкладки" - -#~ msgid "no such tab page" -#~ msgstr "такої вкладки немає" - -#~ msgid "attempt to refer to deleted window" -#~ msgstr "спроба звернутися до знищеного вікна" - -#~ msgid "readonly attribute: buffer" -#~ msgstr "атрибут лише для читання: буфер" - -#~ msgid "cursor position outside buffer" -#~ msgstr "курсор за межами буфера" - -#~ msgid "no such window" -#~ msgstr "такого вікна немає" - -#~ msgid "attempt to refer to deleted buffer" -#~ msgstr "спроба звернення до знищеного буфера" - -#~ msgid "failed to rename buffer" -#~ msgstr "не вдалося перейменувати буфер" - -#~ msgid "mark name must be a single character" -#~ msgstr "назвою мітки має бути один символ" - -#~ msgid "expected vim.Buffer object, but got %s" -#~ msgstr "очікувався об’єкт vim.Buffer, але отримано %s" - -#~ msgid "failed to switch to buffer %d" -#~ msgstr "не вдалося перемкнутися до буфера %d" - -#~ msgid "expected vim.Window object, but got %s" -#~ msgstr "очікувався об’єкт vim.Window, але отримано %s" - -#~ msgid "failed to find window in the current tab page" -#~ msgstr "не вдалося знайти вікно у поточній вкладці" - -#~ msgid "did not switch to the specified window" -#~ msgstr "не перемкнувся до вказаного вікна" - -#~ msgid "expected vim.TabPage object, but got %s" -#~ msgstr "очікувався об’єкт vim.TabPage, але отримано %s" - -#~ msgid "did not switch to the specified tab page" -#~ msgstr "не перемкнувся до вказаної вкладки" - -#~ msgid "failed to run the code" -#~ msgstr "не вдалося виконати код" - -#~ msgid "E858: Eval did not return a valid python object" -#~ msgstr "E858: Eval не повернув дійсний об’єкт python" - -#~ msgid "E859: Failed to convert returned python object to vim value" -#~ msgstr "E859: Не вдалося перетворити об’єкт python у значення vim" - -#~ msgid "unable to convert %s to vim dictionary" -#~ msgstr "не вдалося перетворити %s у словник vim" - -#~ msgid "unable to convert %s to vim structure" -#~ msgstr "не вдалося перетворити %s у структуру vim" - -#~ msgid "internal error: NULL reference passed" -#~ msgstr "внутрішня помилка: передано посилання NULL" - -#~ msgid "internal error: invalid value type" -#~ msgstr "внутрішня помилка: неправильний тип значення" - -#~ msgid "" -#~ "Failed to set path hook: sys.path_hooks is not a list\n" -#~ "You should now do the following:\n" -#~ "- append vim.path_hook to sys.path_hooks\n" -#~ "- append vim.VIM_SPECIAL_PATH to sys.path\n" -#~ msgstr "" -#~ "Не вдалося встановити обробник шляху: sys.path_hooks не список\n" -#~ "Вам слід вчинити так:\n" -#~ "- додайте vim.path_hook до sys.path_hooks\n" -#~ "- додайте vim.VIM_SPECIAL_PATH до sys.path\n" - -#~ msgid "" -#~ "Failed to set path: sys.path is not a list\n" -#~ "You should now append vim.VIM_SPECIAL_PATH to sys.path" -#~ msgstr "" -#~ "Не вдалося встановити шлях: sys.path не список\n" -#~ "Вас слід додати vim.VIM_SPECIAL_PATH до sys.path" diff --git a/src/nvim/po/vi.po b/src/nvim/po/vi.po index a720510426..49c6765843 100644 --- a/src/nvim/po/vi.po +++ b/src/nvim/po/vi.po @@ -4311,11 +4311,6 @@ msgstr "dòng %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: Tên sổ đăng ký không cho phép: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "" -"Bản dịch các thông báo sang tiếng Việt: Phan Vĩnh Thịnh <teppi@vnlinux.org>" - #: ../message.c:986 msgid "Interrupt: " msgstr "Gián đoạn: " diff --git a/src/nvim/po/zh_CN.UTF-8.po b/src/nvim/po/zh_CN.UTF-8.po index 82b895d9d6..e88efed8e3 100644 --- a/src/nvim/po/zh_CN.UTF-8.po +++ b/src/nvim/po/zh_CN.UTF-8.po @@ -4264,10 +4264,6 @@ msgstr "第 %4ld 行:" msgid "E354: Invalid register name: '%s'" msgstr "E354: 无效的寄存器名: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "简体中文消息维护者: Yuheng Xie <elephant@linux.net.cn>" - #: ../message.c:986 msgid "Interrupt: " msgstr "已中断: " diff --git a/src/nvim/po/zh_CN.cp936.po b/src/nvim/po/zh_CN.cp936.po index cf66010c71..e5351cc22a 100644 --- a/src/nvim/po/zh_CN.cp936.po +++ b/src/nvim/po/zh_CN.cp936.po @@ -4265,10 +4265,6 @@ msgstr " %4ld :" msgid "E354: Invalid register name: '%s'" msgstr "E354: ЧļĴ: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Ϣά: Yuheng Xie <elephant@linux.net.cn>" - #: ../message.c:986 msgid "Interrupt: " msgstr "ж: " diff --git a/src/nvim/po/zh_CN.po b/src/nvim/po/zh_CN.po index 254ebbce6b..6cc4dd42ac 100644 --- a/src/nvim/po/zh_CN.po +++ b/src/nvim/po/zh_CN.po @@ -4265,10 +4265,6 @@ msgstr " %4ld :" msgid "E354: Invalid register name: '%s'" msgstr "E354: ЧļĴ: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "Ϣά: Yuheng Xie <elephant@linux.net.cn>" - #: ../message.c:986 msgid "Interrupt: " msgstr "ж: " diff --git a/src/nvim/po/zh_TW.UTF-8.po b/src/nvim/po/zh_TW.UTF-8.po index 79e09c83d1..da86d80c27 100644 --- a/src/nvim/po/zh_TW.UTF-8.po +++ b/src/nvim/po/zh_TW.UTF-8.po @@ -4304,12 +4304,6 @@ msgstr "行 %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: 暫存器名稱錯誤: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "" -"正體中文訊息維護者: Francis S.Lin <piaip@csie.ntu.edu." -"tw>, Cecil Sheng <b7506022@csie.ntu.edu.tw>" - #: ../message.c:986 msgid "Interrupt: " msgstr "已中斷: " diff --git a/src/nvim/po/zh_TW.po b/src/nvim/po/zh_TW.po index 07d510c0c6..977f18086e 100644 --- a/src/nvim/po/zh_TW.po +++ b/src/nvim/po/zh_TW.po @@ -4296,12 +4296,6 @@ msgstr " %4ld:" msgid "E354: Invalid register name: '%s'" msgstr "E354: ȦsWٿ~: '%s'" -#: ../message.c:745 -msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" -msgstr "" -"餤T@: Francis S.Lin <piaip@csie.ntu.edu." -"tw>, Cecil Sheng <b7506022@csie.ntu.edu.tw>" - #: ../message.c:986 msgid "Interrupt: " msgstr "w_: " diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c index 5ad621e666..947814de4f 100644 --- a/src/nvim/popupmnu.c +++ b/src/nvim/popupmnu.c @@ -7,12 +7,12 @@ #include <stdbool.h> #include "nvim/vim.h" +#include "nvim/api/private/helpers.h" #include "nvim/ascii.h" #include "nvim/popupmnu.h" #include "nvim/charset.h" #include "nvim/ex_cmds.h" #include "nvim/memline.h" -#include "nvim/misc2.h" #include "nvim/move.h" #include "nvim/option.h" #include "nvim/screen.h" @@ -21,6 +21,7 @@ #include "nvim/memory.h" #include "nvim/window.h" #include "nvim/edit.h" +#include "nvim/ui.h" static pumitem_T *pum_array = NULL; // items of displayed pum static int pum_size; // nr of items in "pum_array" @@ -36,8 +37,10 @@ static int pum_scrollbar; // TRUE when scrollbar present static int pum_row; // top row of pum static int pum_col; // left column of pum -static int pum_do_redraw = FALSE; // do redraw anyway +static bool pum_is_visible = false; +static bool pum_external = false; +static bool pum_wants_external = false; #ifdef INCLUDE_GENERATED_DECLARATIONS # include "popupmnu.c.generated.h" @@ -53,7 +56,10 @@ static int pum_do_redraw = FALSE; // do redraw anyway /// @param array /// @param size /// @param selected index of initially selected item, none if out of range -void pum_display(pumitem_T *array, int size, int selected) +/// @param array_changed if true, array contains different items since last call +/// if false, a new item is selected, but the array +/// is the same +void pum_display(pumitem_T *array, int size, int selected, bool array_changed) { int w; int def_width; @@ -68,20 +74,55 @@ void pum_display(pumitem_T *array, int size, int selected) int above_row = cmdline_row; int redo_count = 0; + if (!pum_is_visible) { + // To keep the code simple, we only allow changing the + // draw mode when the popup menu is not being displayed + pum_external = pum_wants_external; + } + redo: + // Mark the pum as visible already here, + // to avoid that must_redraw is set when 'cursorcolumn' is on. + pum_is_visible = true; + validate_cursor_col(); + + // anchor position: the start of the completed word + row = curwin->w_wrow + curwin->w_winrow; + if (curwin->w_p_rl) { + col = curwin->w_wincol + curwin->w_width - curwin->w_wcol - 1; + } else { + col = curwin->w_wincol + curwin->w_wcol; + } + + if (pum_external) { + Array args = ARRAY_DICT_INIT; + if (array_changed) { + Array arr = ARRAY_DICT_INIT; + for (i = 0; i < size; i++) { + Array item = ARRAY_DICT_INIT; + ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_text))); + ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_kind))); + ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_extra))); + ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_info))); + ADD(arr, ARRAY_OBJ(item)); + } + ADD(args, ARRAY_OBJ(arr)); + ADD(args, INTEGER_OBJ(selected)); + ADD(args, INTEGER_OBJ(row)); + ADD(args, INTEGER_OBJ(col)); + ui_event("popupmenu_show", args); + } else { + ADD(args, INTEGER_OBJ(selected)); + ui_event("popupmenu_select", args); + } + return; + } + def_width = PUM_DEF_WIDTH; max_width = 0; kind_width = 0; extra_width = 0; - // Pretend the pum is already there to avoid that must_redraw is set when - // 'cuc' is on. - pum_array = (pumitem_T *)1; - validate_cursor_col(); - pum_array = NULL; - - row = curwin->w_wrow + curwin->w_winrow; - if (firstwin->w_p_pvw) { top_clear = firstwin->w_height; } else { @@ -194,13 +235,6 @@ redo: pum_base_width = max_width; pum_kind_width = kind_width; - // Calculate column - if (curwin->w_p_rl) { - col = curwin->w_wincol + curwin->w_width - curwin->w_wcol - 1; - } else { - col = curwin->w_wincol + curwin->w_wcol; - } - // if there are more items than room we need a scrollbar if (pum_height < size) { pum_scrollbar = 1; @@ -641,9 +675,9 @@ static int pum_set_selected(int n, int repeat) // Update the screen before drawing the popup menu. // Enable updating the status lines. - pum_do_redraw = TRUE; + pum_is_visible = false; update_screen(0); - pum_do_redraw = FALSE; + pum_is_visible = true; if (!resized && win_valid(curwin_save)) { no_u_sync++; @@ -653,9 +687,9 @@ static int pum_set_selected(int n, int repeat) // May need to update the screen again when there are // autocommands involved. - pum_do_redraw = TRUE; + pum_is_visible = false; update_screen(0); - pum_do_redraw = FALSE; + pum_is_visible = true; } } } @@ -672,10 +706,17 @@ static int pum_set_selected(int n, int repeat) /// Undisplay the popup menu (later). void pum_undisplay(void) { + pum_is_visible = false; pum_array = NULL; - redraw_all_later(SOME_VALID); - redraw_tabline = TRUE; - status_redraw_all(); + + if (pum_external) { + Array args = ARRAY_DICT_INIT; + ui_event("popupmenu_hide", args); + } else { + redraw_all_later(SOME_VALID); + redraw_tabline = true; + status_redraw_all(); + } } /// Clear the popup menu. Currently only resets the offset to the first @@ -685,12 +726,16 @@ void pum_clear(void) pum_first = 0; } -/// Overruled when "pum_do_redraw" is set, used to redraw the status lines. -/// -/// @return TRUE if the popup menu is displayed. -int pum_visible(void) +/// @return true if the popup menu is displayed. +bool pum_visible(void) { - return !pum_do_redraw && pum_array != NULL; + return pum_is_visible; +} + +/// @return true if the popup menu is displayed and drawn on the grid. +bool pum_drawn(void) +{ + return pum_visible() && !pum_external; } /// Gets the height of the menu. @@ -701,3 +746,8 @@ int pum_get_height(void) { return pum_height; } + +void pum_set_external(bool external) +{ + pum_wants_external = external; +} diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index dfd795b0ba..a7aff15121 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -27,7 +27,6 @@ #include "nvim/memline.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/memory.h" #include "nvim/move.h" #include "nvim/normal.h" @@ -1732,15 +1731,29 @@ void qf_list(exarg_T *eap) EMSG(_(e_quickfix)); return; } + + bool plus = false; + if (*arg == '+') { + arg++; + plus = true; + } if (!get_list_range(&arg, &idx1, &idx2) || *arg != NUL) { EMSG(_(e_trailing)); return; } - i = qi->qf_lists[qi->qf_curlist].qf_count; - if (idx1 < 0) - idx1 = (-idx1 > i) ? 0 : idx1 + i + 1; - if (idx2 < 0) - idx2 = (-idx2 > i) ? 0 : idx2 + i + 1; + if (plus) { + i = qi->qf_lists[qi->qf_curlist].qf_index; + idx2 = i + idx1; + idx1 = i; + } else { + i = qi->qf_lists[qi->qf_curlist].qf_count; + if (idx1 < 0) { + idx1 = (-idx1 > i) ? 0 : idx1 + i + 1; + } + if (idx2 < 0) { + idx2 = (-idx2 > i) ? 0 : idx2 + i + 1; + } + } if (qi->qf_lists[qi->qf_curlist].qf_nonevalid) all = TRUE; @@ -1764,16 +1777,18 @@ void qf_list(exarg_T *eap) vim_snprintf((char *)IObuff, IOSIZE, "%2d %s", i, (char *)fname); msg_outtrans_attr(IObuff, i == qi->qf_lists[qi->qf_curlist].qf_index - ? hl_attr(HLF_L) : hl_attr(HLF_D)); - if (qfp->qf_lnum == 0) + ? hl_attr(HLF_QFL) : hl_attr(HLF_D)); + if (qfp->qf_lnum == 0) { IObuff[0] = NUL; - else if (qfp->qf_col == 0) - sprintf((char *)IObuff, ":%" PRId64, (int64_t)qfp->qf_lnum); - else - sprintf((char *)IObuff, ":%" PRId64 " col %d", - (int64_t)qfp->qf_lnum, qfp->qf_col); - sprintf((char *)IObuff + STRLEN(IObuff), "%s:", - (char *)qf_types(qfp->qf_type, qfp->qf_nr)); + } else if (qfp->qf_col == 0) { + vim_snprintf((char *)IObuff, IOSIZE, ":%" PRId64, + (int64_t)qfp->qf_lnum); + } else { + vim_snprintf((char *)IObuff, IOSIZE, ":%" PRId64 " col %d", + (int64_t)qfp->qf_lnum, qfp->qf_col); + } + vim_snprintf((char *)IObuff + STRLEN(IObuff), IOSIZE, "%s:", + (char *)qf_types(qfp->qf_type, qfp->qf_nr)); msg_puts_attr(IObuff, hl_attr(HLF_N)); if (qfp->qf_pattern != NULL) { qf_fmt_text(qfp->qf_pattern, IObuff, IOSIZE); @@ -3503,15 +3518,15 @@ int set_errorlist(win_T *wp, list_T *list, int action, char_u *title) if (d == NULL) continue; - char_u *filename = get_dict_string(d, (char_u *)"filename", true); - int bufnum = (int)get_dict_number(d, (char_u *)"bufnr"); - long lnum = get_dict_number(d, (char_u *)"lnum"); - int col = (int)get_dict_number(d, (char_u *)"col"); - char_u vcol = (char_u)get_dict_number(d, (char_u *)"vcol"); - int nr = (int)get_dict_number(d, (char_u *)"nr"); - char_u *type = get_dict_string(d, (char_u *)"type", true); - char_u *pattern = get_dict_string(d, (char_u *)"pattern", true); - char_u *text = get_dict_string(d, (char_u *)"text", true); + char_u *filename = get_dict_string(d, "filename", true); + int bufnum = (int)get_dict_number(d, "bufnr"); + long lnum = get_dict_number(d, "lnum"); + int col = (int)get_dict_number(d, "col"); + char_u vcol = (char_u)get_dict_number(d, "vcol"); + int nr = (int)get_dict_number(d, "nr"); + char_u *type = get_dict_string(d, "type", true); + char_u *pattern = get_dict_string(d, "pattern", true); + char_u *text = get_dict_string(d, "text", true); if (text == NULL) { text = vim_strsave((char_u *)""); } diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c index f8fd7d4ef8..64a70c295a 100644 --- a/src/nvim/regexp.c +++ b/src/nvim/regexp.c @@ -59,7 +59,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/strings.h" diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index 92dbd693ea..35308b7411 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -11,7 +11,6 @@ #include <limits.h> #include "nvim/ascii.h" -#include "nvim/misc2.h" #include "nvim/garray.h" /* @@ -4855,9 +4854,15 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, // recursive_regmatch(). Allow interrupting them with CTRL-C. fast_breakcheck(); if (got_int) { +#ifdef NFA_REGEXP_DEBUG_LOG + fclose(debug); +#endif return false; } if (nfa_time_limit != NULL && profile_passed_limit(*nfa_time_limit)) { +#ifdef NFA_REGEXP_DEBUG_LOG + fclose(debug); +#endif return false; } diff --git a/src/nvim/screen.c b/src/nvim/screen.c index d67142822f..9a2eeda8b2 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -108,7 +108,6 @@ #include "nvim/menu.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/move.h" #include "nvim/normal.h" @@ -120,6 +119,7 @@ #include "nvim/regexp.h" #include "nvim/search.h" #include "nvim/spell.h" +#include "nvim/state.h" #include "nvim/strings.h" #include "nvim/syntax.h" #include "nvim/terminal.h" @@ -420,9 +420,10 @@ void update_screen(int type) } } end_search_hl(); - /* May need to redraw the popup menu. */ - if (pum_visible()) + // May need to redraw the popup menu. + if (pum_drawn()) { pum_redraw(); + } /* Reset b_mod_set flags. Going through all windows is probably faster * than going through all buffers (there could be many buffers). */ @@ -2403,11 +2404,14 @@ win_line ( if (v != 0) line_attr = sign_get_attr((int)v, TRUE); - /* Highlight the current line in the quickfix window. */ - if (bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum) - line_attr = hl_attr(HLF_L); - if (line_attr != 0) - area_highlighting = TRUE; + // Highlight the current line in the quickfix window. + if (bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum) { + line_attr = hl_attr(HLF_QFL); + } + + if (line_attr != 0) { + area_highlighting = true; + } line = ml_get_buf(wp->w_buffer, lnum, FALSE); ptr = line; @@ -2624,7 +2628,12 @@ win_line ( * then. */ if (wp->w_p_cul && lnum == wp->w_cursor.lnum && !(wp == curwin && VIsual_active)) { - line_attr = hl_attr(HLF_CUL); + if (line_attr != 0 && !(State & INSERT) && bt_quickfix(wp->w_buffer) + && qf_current_entry(wp) == lnum) { + line_attr = hl_combine_attr(hl_attr(HLF_CUL), line_attr); + } else { + line_attr = hl_attr(HLF_CUL); + } area_highlighting = true; } @@ -4819,15 +4828,12 @@ void win_redr_status(win_T *wp) wp->w_redr_status = FALSE; if (wp->w_status_height == 0) { - /* no status line, can only be last window */ - redraw_cmdline = TRUE; - } else if (!redrawing() - /* don't update status line when popup menu is visible and may be - * drawn over it */ - || pum_visible() - ) { - /* Don't redraw right now, do it later. */ - wp->w_redr_status = TRUE; + // no status line, can only be last window + redraw_cmdline = true; + } else if (!redrawing() || pum_drawn()) { + // Don't redraw right now, do it later. Don't update status line when + // popup menu is visible and may be drawn over it + wp->w_redr_status = true; } else if (*p_stl != NUL || *wp->w_p_stl != NUL) { /* redraw custom status line */ redraw_custom_statusline(wp); @@ -7073,9 +7079,9 @@ void showruler(int always) { if (!always && !redrawing()) return; - if (pum_visible()) { - /* Don't redraw right now, do it later. */ - curwin->w_redr_status = TRUE; + if (pum_drawn()) { + // Don't redraw right now, do it later. + curwin->w_redr_status = true; return; } if ((*p_stl != NUL || *curwin->w_p_stl != NUL) && curwin->w_status_height) { @@ -7111,9 +7117,10 @@ static void win_redr_ruler(win_T *wp, int always) if (wp == lastwin && lastwin->w_status_height == 0) if (edit_submode != NULL) return; - /* Don't draw the ruler when the popup menu is visible, it may overlap. */ - if (pum_visible()) + // Don't draw the ruler when the popup menu is visible, it may overlap. + if (pum_drawn()) { return; + } if (*p_ruf) { int save_called_emsg = called_emsg; @@ -7363,7 +7370,7 @@ void screen_resize(int width, int height) redrawcmdline(); } else { update_topline(); - if (pum_visible()) { + if (pum_drawn()) { redraw_later(NOT_VALID); ins_compl_show_pum(); /* This includes the redraw. */ } else diff --git a/src/nvim/search.c b/src/nvim/search.c index 6e2b69fff7..5f4df3be92 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -31,7 +31,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/move.h" #include "nvim/mouse.h" #include "nvim/normal.h" diff --git a/src/nvim/shada.c b/src/nvim/shada.c index b5921eb810..01c0807d82 100644 --- a/src/nvim/shada.c +++ b/src/nvim/shada.c @@ -27,7 +27,6 @@ #include "nvim/api/private/helpers.h" #include "nvim/buffer.h" #include "nvim/buffer_defs.h" -#include "nvim/misc2.h" #include "nvim/ex_getln.h" #include "nvim/search.h" #include "nvim/regexp.h" @@ -1524,7 +1523,7 @@ static const char *shada_get_default_file(void) FUNC_ATTR_WARN_UNUSED_RESULT { if (default_shada_file == NULL) { - char *shada_dir = stdpaths_user_data_subpath("shada", 0); + char *shada_dir = stdpaths_user_data_subpath("shada", 0, false); default_shada_file = concat_fnames_realloc(shada_dir, "main.shada", true); } return default_shada_file; @@ -2976,7 +2975,7 @@ shada_write_file_nomerge: {} if (sd_writer.cookie == NULL) { xfree(fname); xfree(tempname); - if (sd_reader.close != NULL) { + if (sd_reader.cookie != NULL) { sd_reader.close(&sd_reader); } return FAIL; diff --git a/src/nvim/spell.c b/src/nvim/spell.c index 610fb660e7..ba7f31be25 100644 --- a/src/nvim/spell.c +++ b/src/nvim/spell.c @@ -312,7 +312,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/normal.h" #include "nvim/option.h" diff --git a/src/nvim/state.c b/src/nvim/state.c index 30133e2201..f792ec00a4 100644 --- a/src/nvim/state.c +++ b/src/nvim/state.c @@ -2,10 +2,12 @@ #include "nvim/lib/kvec.h" +#include "nvim/ascii.h" #include "nvim/state.h" #include "nvim/vim.h" #include "nvim/main.h" #include "nvim/getchar.h" +#include "nvim/option_defs.h" #include "nvim/ui.h" #include "nvim/os/input.h" @@ -61,3 +63,35 @@ getkey: } } } + +/// Return TRUE if in the current mode we need to use virtual. +int virtual_active(void) +{ + // While an operator is being executed we return "virtual_op", because + // VIsual_active has already been reset, thus we can't check for "block" + // being used. + if (virtual_op != MAYBE) { + return virtual_op; + } + return ve_flags == VE_ALL + || ((ve_flags & VE_BLOCK) && VIsual_active && VIsual_mode == Ctrl_V) + || ((ve_flags & VE_INSERT) && (State & INSERT)); +} + +/// VISUAL, SELECTMODE and OP_PENDING State are never set, they are equal to +/// NORMAL State with a condition. This function returns the real State. +int get_real_state(void) +{ + if (State & NORMAL) { + if (VIsual_active) { + if (VIsual_select) { + return SELECTMODE; + } + return VISUAL; + } else if (finish_op) { + return OP_PENDING; + } + } + return State; +} + diff --git a/src/nvim/strings.c b/src/nvim/strings.c index 37a0fb82da..c1800a0639 100644 --- a/src/nvim/strings.c +++ b/src/nvim/strings.c @@ -5,7 +5,6 @@ #include "nvim/vim.h" #include "nvim/ascii.h" #include "nvim/strings.h" -#include "nvim/misc2.h" #include "nvim/file_search.h" #include "nvim/buffer.h" #include "nvim/charset.h" diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index 3215f7ea14..6fd7603629 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -25,7 +25,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/keymap.h" #include "nvim/garray.h" #include "nvim/option.h" @@ -5902,6 +5901,7 @@ static char *highlight_init_both[] = "VertSplit cterm=reverse gui=reverse", "WildMenu ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black", "default link EndOfBuffer NonText", + "default link QuickFixLine Search", NULL }; @@ -6597,6 +6597,9 @@ do_highlight ( else { if (is_normal_group) { HL_TABLE()[idx].sg_attr = 0; + // Need to update all groups, because they might be using "bg" and/or + // "fg", which have been changed now. + highlight_attr_set_all(); // If the normal group has changed, it is simpler to refresh every UI ui_refresh(); } else @@ -6998,11 +7001,15 @@ highlight_color ( if (font || sp) return NULL; if (modec == 'c') { - if (fg) + if (fg) { n = HL_TABLE()[id - 1].sg_cterm_fg - 1; - else + } else { n = HL_TABLE()[id - 1].sg_cterm_bg - 1; - sprintf((char *)name, "%d", n); + } + if (n < 0) { + return NULL; + } + snprintf((char *)name, sizeof(name), "%d", n); return name; } /* term doesn't have color */ @@ -7261,6 +7268,23 @@ int syn_get_final_id(int hl_id) return hl_id; } +/// Refresh the color attributes of all highlight groups. +static void highlight_attr_set_all(void) +{ + for (int idx = 0; idx < highlight_ga.ga_len; idx++) { + struct hl_group *sgp = &HL_TABLE()[idx]; + if (sgp->sg_rgb_bg_name != NULL) { + sgp->sg_rgb_bg = name_to_color(sgp->sg_rgb_bg_name); + } + if (sgp->sg_rgb_fg_name != NULL) { + sgp->sg_rgb_fg = name_to_color(sgp->sg_rgb_fg_name); + } + if (sgp->sg_rgb_sp_name != NULL) { + sgp->sg_rgb_sp = name_to_color(sgp->sg_rgb_sp_name); + } + set_hl_attr(idx); + } +} /* * Translate the 'highlight' option into attributes in highlight_attr[] and @@ -7702,6 +7726,10 @@ RgbValue name_to_color(uint8_t *name) && isxdigit(name[6]) && name[7] == NUL) { // rgb hex string return strtol((char *)(name + 1), NULL, 16); + } else if (!STRICMP(name, "bg") || !STRICMP(name, "background")) { + return normal_bg; + } else if (!STRICMP(name, "fg") || !STRICMP(name, "foreground")) { + return normal_fg; } for (int i = 0; color_name_table[i].name != NULL; i++) { diff --git a/src/nvim/tag.c b/src/nvim/tag.c index dfecfb776d..81256b4f01 100644 --- a/src/nvim/tag.c +++ b/src/nvim/tag.c @@ -26,7 +26,6 @@ #include "nvim/mbyte.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/file_search.h" #include "nvim/garray.h" #include "nvim/memory.h" diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index 6f50c03be9..ff98dc9f22 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -127,7 +127,7 @@ struct terminal { // we can't store a direct reference to the buffer because the // refresh_timer_cb may be called after the buffer was freed, and there's // no way to know if the memory was reused. - uint64_t buf_handle; + handle_T buf_handle; // program exited bool closed, destroy; // some vterm properties @@ -623,11 +623,12 @@ static void buf_set_term_title(buf_T *buf, char *title) FUNC_ATTR_NONNULL_ALL { Error err; - api_free_object(dict_set_value(buf->b_vars, - cstr_as_string("term_title"), - STRING_OBJ(cstr_as_string(title)), - false, - &err)); + dict_set_value(buf->b_vars, + cstr_as_string("term_title"), + STRING_OBJ(cstr_as_string(title)), + false, + false, + &err); } static int term_settermprop(VTermProp prop, VTermValue *val, void *data) @@ -1081,7 +1082,8 @@ static void redraw(bool restore_cursor) restore_cursor = true; } - int save_row, save_col; + int save_row = 0; + int save_col = 0; if (restore_cursor) { // save the current row/col to restore after updating screen when not // focused diff --git a/src/nvim/testdir/Makefile b/src/nvim/testdir/Makefile index 9a0bba83fe..10d26bd8cf 100644 --- a/src/nvim/testdir/Makefile +++ b/src/nvim/testdir/Makefile @@ -9,7 +9,6 @@ SCRIPTSOURCE := ../../../runtime SCRIPTS := \ test8.out \ - test12.out \ test13.out \ test14.out \ test17.out \ @@ -32,13 +31,16 @@ SCRIPTS := \ # Tests using runtest.vim.vim. # Keep test_alot*.res as the last one, sort the others. NEW_TESTS = \ + test_cscope.res \ test_hardcopy.res \ test_help_tagjump.res \ test_langmap.res \ test_syntax.res \ + test_usercommands.res \ test_timers.res \ test_viml.res \ test_visual.res \ + test_window_id.res \ test_alot.res SCRIPTS_GUI := test16.out diff --git a/src/nvim/testdir/test12.in b/src/nvim/testdir/test12.in deleted file mode 100644 index 0c0623e5d4..0000000000 --- a/src/nvim/testdir/test12.in +++ /dev/null @@ -1,50 +0,0 @@ -Tests for 'directory' option. -- ".", in same dir as file -- "./dir", in directory relative to file -- "dir", in directory relative to current dir - -STARTTEST -:set dir=.,~ -:/start of testfile/,/end of testfile/w! Xtest1 -:" do an ls of the current dir to find the swap file (should not be there) -:if has("unix") -: !ls .X*.swp >test.out -:else -: r !ls X*.swp >test.out -:endif -:!echo first line >>test.out -:e Xtest1 -:if has("unix") -:" Do an ls of the current dir to find the swap file, remove the leading dot -:" to make the result the same for all systems. -: r!ls .X*.swp -: s/\.*X/X/ -: .w >>test.out -: undo -:else -: !ls X*.swp >>test.out -:endif -:!echo under Xtest1.swp >>test.out -:!mkdir Xtest2 -:set dir=./Xtest2,.,~ -:e Xtest1 -:!ls X*.swp >>test.out -:!echo under under >>test.out -:!ls Xtest2 >>test.out -:!echo under Xtest1.swp >>test.out -:!mkdir Xtest.je -:/start of testfile/,/end of testfile/w! Xtest2/Xtest3 -:set dir=Xtest.je,~ -:e Xtest2/Xtest3 -:swap -:!ls Xtest2 >>test.out -:!echo under Xtest3 >>test.out -:!ls Xtest.je >>test.out -:!echo under Xtest3.swp >>test.out -:qa! -ENDTEST - -start of testfile -line 2 Abcdefghij -line 3 Abcdefghij -end of testfile diff --git a/src/nvim/testdir/test12.ok b/src/nvim/testdir/test12.ok deleted file mode 100644 index 605623b117..0000000000 --- a/src/nvim/testdir/test12.ok +++ /dev/null @@ -1,10 +0,0 @@ -first line -Xtest1.swp -under Xtest1.swp -under under -Xtest1.swp -under Xtest1.swp -Xtest3 -under Xtest3 -Xtest3.swp -under Xtest3.swp diff --git a/src/nvim/testdir/test_alot.vim b/src/nvim/testdir/test_alot.vim index 30b8a9ceb8..f0efd6e4ed 100644 --- a/src/nvim/testdir/test_alot.vim +++ b/src/nvim/testdir/test_alot.vim @@ -3,7 +3,10 @@ source test_assign.vim source test_cursor_func.vim +source test_feedkeys.vim source test_cmdline.vim source test_menu.vim source test_popup.vim +source test_regexp_utf8.vim +source test_syn_attr.vim source test_unlet.vim diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim index 438b20cc5e..902ec1c05d 100644 --- a/src/nvim/testdir/test_cmdline.vim +++ b/src/nvim/testdir/test_cmdline.vim @@ -47,45 +47,79 @@ func Test_getcompletion() let l = getcompletion('v:n', 'var') call assert_true(index(l, 'v:null') >= 0) + let l = getcompletion('v:notexists', 'var') + call assert_equal([], l) let l = getcompletion('', 'augroup') call assert_true(index(l, 'END') >= 0) + let l = getcompletion('blahblah', 'augroup') + call assert_equal([], l) let l = getcompletion('', 'behave') call assert_true(index(l, 'mswin') >= 0) + let l = getcompletion('not', 'behave') + call assert_equal([], l) let l = getcompletion('', 'color') call assert_true(index(l, 'default') >= 0) + let l = getcompletion('dirty', 'color') + call assert_equal([], l) let l = getcompletion('', 'command') call assert_true(index(l, 'sleep') >= 0) + let l = getcompletion('awake', 'command') + call assert_equal([], l) let l = getcompletion('', 'dir') - call assert_true(index(l, 'sautest') >= 0) + call assert_true(index(l, 'sautest/') >= 0) + let l = getcompletion('NoMatch', 'dir') + call assert_equal([], l) let l = getcompletion('exe', 'expression') call assert_true(index(l, 'executable(') >= 0) + let l = getcompletion('kill', 'expression') + call assert_equal([], l) let l = getcompletion('tag', 'function') call assert_true(index(l, 'taglist(') >= 0) + let l = getcompletion('paint', 'function') + call assert_equal([], l) let l = getcompletion('run', 'file') call assert_true(index(l, 'runtest.vim') >= 0) + let l = getcompletion('walk', 'file') + call assert_equal([], l) let l = getcompletion('ha', 'filetype') call assert_true(index(l, 'hamster') >= 0) + let l = getcompletion('horse', 'filetype') + call assert_equal([], l) let l = getcompletion('z', 'syntax') call assert_true(index(l, 'zimbu') >= 0) + let l = getcompletion('emacs', 'syntax') + call assert_equal([], l) let l = getcompletion('jikes', 'compiler') call assert_true(index(l, 'jikes') >= 0) + let l = getcompletion('break', 'compiler') + call assert_equal([], l) + + helptags ALL + let l = getcompletion('last', 'help') + call assert_true(index(l, ':tablast') >= 0) + let l = getcompletion('giveup', 'help') + call assert_equal([], l) let l = getcompletion('time', 'option') call assert_true(index(l, 'timeoutlen') >= 0) + let l = getcompletion('space', 'option') + call assert_equal([], l) let l = getcompletion('er', 'highlight') call assert_true(index(l, 'ErrorMsg') >= 0) + let l = getcompletion('dark', 'highlight') + call assert_equal([], l) " For others test if the name is recognized. let names = ['buffer', 'environment', 'file_in_path', diff --git a/src/nvim/testdir/test_cscope.vim b/src/nvim/testdir/test_cscope.vim new file mode 100644 index 0000000000..b6d70f0765 --- /dev/null +++ b/src/nvim/testdir/test_cscope.vim @@ -0,0 +1,15 @@ +" Test for cscope commands. + +if !has('cscope') + finish +endif + +func Test_cscopequickfix() + set cscopequickfix=s-,g-,d+,c-,t+,e-,f0,i-,a- + call assert_equal('s-,g-,d+,c-,t+,e-,f0,i-,a-', &cscopequickfix) + + call assert_fails('set cscopequickfix=x-', 'E474:') + call assert_fails('set cscopequickfix=s', 'E474:') + call assert_fails('set cscopequickfix=s7', 'E474:') + call assert_fails('set cscopequickfix=s-a', 'E474:') +endfunc diff --git a/src/nvim/testdir/test_feedkeys.vim b/src/nvim/testdir/test_feedkeys.vim new file mode 100644 index 0000000000..33cd58949d --- /dev/null +++ b/src/nvim/testdir/test_feedkeys.vim @@ -0,0 +1,10 @@ +" Test feedkeys() function. + +func Test_feedkeys_x_with_empty_string() + new + call feedkeys("ifoo\<Esc>") + call assert_equal('', getline('.')) + call feedkeys('', 'x') + call assert_equal('foo', getline('.')) + quit! +endfunc diff --git a/src/nvim/testdir/test_help_tagjump.vim b/src/nvim/testdir/test_help_tagjump.vim index 9f9207d27d..42f8391aba 100644 --- a/src/nvim/testdir/test_help_tagjump.vim +++ b/src/nvim/testdir/test_help_tagjump.vim @@ -37,4 +37,14 @@ func Test_help_tagjump() call assert_equal("help", &filetype) call assert_true(getline('.') =~ '\*arglistid()\*') helpclose + + exec "help! 'autoindent'." + call assert_equal("help", &filetype) + call assert_true(getline('.') =~ "\\*'autoindent'\\*") + helpclose + + exec "help! {address}." + call assert_equal("help", &filetype) + call assert_true(getline('.') =~ '\*{address}\*') + helpclose endfunc diff --git a/src/nvim/testdir/test_regexp_utf8.vim b/src/nvim/testdir/test_regexp_utf8.vim new file mode 100644 index 0000000000..38f9ed41d5 --- /dev/null +++ b/src/nvim/testdir/test_regexp_utf8.vim @@ -0,0 +1,41 @@ +" Tests for regexp in utf8 encoding +scriptencoding utf-8 + +func s:equivalence_test() + let str = "AÀÁÂÃÄÅĀĂĄǍǞǠẢ BḂḆ CÇĆĈĊČ DĎĐḊḎḐ EÈÉÊËĒĔĖĘĚẺẼ FḞ GĜĞĠĢǤǦǴḠ HĤĦḢḦḨ IÌÍÎÏĨĪĬĮİǏỈ JĴ KĶǨḰḴ LĹĻĽĿŁḺ MḾṀ NÑŃŅŇṄṈ OÒÓÔÕÖØŌŎŐƠǑǪǬỎ PṔṖ Q RŔŖŘṘṞ SŚŜŞŠṠ TŢŤŦṪṮ UÙÚÛÜŨŪŬŮŰŲƯǓỦ VṼ WŴẀẂẄẆ XẊẌ YÝŶŸẎỲỶỸ ZŹŻŽƵẐẔ aàáâãäåāăąǎǟǡả bḃḇ cçćĉċč dďđḋḏḑ eèéêëēĕėęěẻẽ fḟ gĝğġģǥǧǵḡ hĥħḣḧḩẖ iìíîïĩīĭįǐỉ jĵǰ kķǩḱḵ lĺļľŀłḻ mḿṁ nñńņňʼnṅṉ oòóôõöøōŏőơǒǫǭỏ pṕṗ q rŕŗřṙṟ sśŝşšṡ tţťŧṫṯẗ uùúûüũūŭůűųưǔủ vṽ wŵẁẃẅẇẘ xẋẍ yýÿŷẏẙỳỷỹ zźżžƶẑẕ" + let groups = split(str) + for group1 in groups + for c in split(group1, '\zs') + " next statement confirms that equivalence class matches every + " character in group + call assert_match('^[[=' . c . '=]]*$', group1) + for group2 in groups + if group2 != group1 + " next statement converts that equivalence class doesn't match + " character in any other group + call assert_equal(-1, match(group2, '[[=' . c . '=]]')) + endif + endfor + endfor + endfor +endfunc + +func Test_equivalence_re1() + set re=1 + call s:equivalence_test() + set re=0 +endfunc + +func Test_equivalence_re2() + set re=2 + call s:equivalence_test() + set re=0 +endfunc + +func Test_recursive_substitute() + new + s/^/\=execute("s#^##gn") + " check we are now not in the sandbox + call setwinvar(1, 'myvar', 1) + bwipe! +endfunc diff --git a/src/nvim/testdir/test_syn_attr.vim b/src/nvim/testdir/test_syn_attr.vim new file mode 100644 index 0000000000..809442eb94 --- /dev/null +++ b/src/nvim/testdir/test_syn_attr.vim @@ -0,0 +1,24 @@ +" Test syntax highlighting functions. + +func Test_missing_attr() + hi Mine cterm=italic + call assert_equal('Mine', synIDattr(hlID("Mine"), "name")) + call assert_equal('1', synIDattr(hlID("Mine"), "italic", 'cterm')) + hi Mine cterm=inverse + call assert_equal('1', synIDattr(hlID("Mine"), "inverse", 'cterm')) + hi Mine cterm=standout gui=undercurl + call assert_equal('1', synIDattr(hlID("Mine"), "standout", 'cterm')) + call assert_equal('1', synIDattr(hlID("Mine"), "undercurl", 'gui')) + hi Mine cterm=NONE gui=NONE + call assert_equal('', synIDattr(hlID("Mine"), "italic", 'cterm')) + call assert_equal('', synIDattr(hlID("Mine"), "inverse", 'cterm')) + call assert_equal('', synIDattr(hlID("Mine"), "standout", 'cterm')) + call assert_equal('', synIDattr(hlID("Mine"), "undercurl", 'gui')) + + if has('gui') + hi Mine guifg=blue guibg=red font=something + call assert_equal('blue', synIDattr(hlID("Mine"), "fg", 'gui')) + call assert_equal('red', synIDattr(hlID("Mine"), "bg", 'gui')) + call assert_equal('something', synIDattr(hlID("Mine"), "font", 'gui')) + endif +endfunc diff --git a/src/nvim/testdir/test_usercommands.vim b/src/nvim/testdir/test_usercommands.vim new file mode 100644 index 0000000000..f593d16dbf --- /dev/null +++ b/src/nvim/testdir/test_usercommands.vim @@ -0,0 +1,48 @@ +" Tests for user defined commands + +" Test for <mods> in user defined commands +function Test_cmdmods() + let g:mods = '' + + command! -nargs=* MyCmd let g:mods .= '<mods> ' + + MyCmd + aboveleft MyCmd + belowright MyCmd + botright MyCmd + browse MyCmd + confirm MyCmd + hide MyCmd + keepalt MyCmd + keepjumps MyCmd + keepmarks MyCmd + keeppatterns MyCmd + lockmarks MyCmd + noswapfile MyCmd + silent MyCmd + tab MyCmd + topleft MyCmd + verbose MyCmd + vertical MyCmd + + aboveleft belowright botright browse confirm hide keepalt keepjumps + \ keepmarks keeppatterns lockmarks noswapfile silent tab + \ topleft verbose vertical MyCmd + + call assert_equal(' aboveleft belowright botright browse confirm ' . + \ 'hide keepalt keepjumps keepmarks keeppatterns lockmarks ' . + \ 'noswapfile silent tab topleft verbose vertical aboveleft ' . + \ 'belowright botright browse confirm hide keepalt keepjumps ' . + \ 'keepmarks keeppatterns lockmarks noswapfile silent tab topleft ' . + \ 'verbose vertical ', g:mods) + + let g:mods = '' + command! -nargs=* MyQCmd let g:mods .= '<q-mods> ' + + vertical MyQCmd + call assert_equal('"vertical" ', g:mods) + + delcommand MyCmd + delcommand MyQCmd + unlet g:mods +endfunction diff --git a/src/nvim/testdir/test_window_id.vim b/src/nvim/testdir/test_window_id.vim new file mode 100644 index 0000000000..fa3ebd757e --- /dev/null +++ b/src/nvim/testdir/test_window_id.vim @@ -0,0 +1,79 @@ +" Test using the window ID. + +func Test_win_getid() + edit one + let id1 = win_getid() + split two + let id2 = win_getid() + let bufnr2 = bufnr('%') + split three + let id3 = win_getid() + tabnew + edit four + let id4 = win_getid() + split five + let id5 = win_getid() + let bufnr5 = bufnr('%') + tabnext + + wincmd w + call assert_equal("two", expand("%")) + call assert_equal(id2, win_getid()) + let nr2 = winnr() + wincmd w + call assert_equal("one", expand("%")) + call assert_equal(id1, win_getid()) + let nr1 = winnr() + wincmd w + call assert_equal("three", expand("%")) + call assert_equal(id3, win_getid()) + let nr3 = winnr() + tabnext + call assert_equal("five", expand("%")) + call assert_equal(id5, win_getid()) + let nr5 = winnr() + wincmd w + call assert_equal("four", expand("%")) + call assert_equal(id4, win_getid()) + let nr4 = winnr() + tabnext + + exe nr1 . "wincmd w" + call assert_equal(id1, win_getid()) + exe nr2 . "wincmd w" + call assert_equal(id2, win_getid()) + exe nr3 . "wincmd w" + call assert_equal(id3, win_getid()) + tabnext + exe nr4 . "wincmd w" + call assert_equal(id4, win_getid()) + exe nr5 . "wincmd w" + call assert_equal(id5, win_getid()) + + call win_gotoid(id2) + call assert_equal("two", expand("%")) + call win_gotoid(id4) + call assert_equal("four", expand("%")) + call win_gotoid(id1) + call assert_equal("one", expand("%")) + call win_gotoid(id5) + call assert_equal("five", expand("%")) + + call assert_equal(0, win_id2win(9999)) + call assert_equal(nr5, win_id2win(id5)) + call assert_equal(0, win_id2win(id1)) + tabnext + call assert_equal(nr1, win_id2win(id1)) + + call assert_equal([0, 0], win_id2tabwin(9999)) + call assert_equal([1, nr2], win_id2tabwin(id2)) + call assert_equal([2, nr4], win_id2tabwin(id4)) + + call assert_equal([], win_findbuf(9999)) + call assert_equal([id2], win_findbuf(bufnr2)) + call win_gotoid(id5) + split + call assert_equal(sort([id5, win_getid()]), sort(win_findbuf(bufnr5))) + + only! +endfunc diff --git a/src/nvim/tui/input.c b/src/nvim/tui/input.c index be256f3ebc..68ea00ee63 100644 --- a/src/nvim/tui/input.c +++ b/src/nvim/tui/input.c @@ -5,7 +5,6 @@ #include "nvim/api/private/helpers.h" #include "nvim/ascii.h" #include "nvim/main.h" -#include "nvim/misc2.h" #include "nvim/os/os.h" #include "nvim/os/input.h" #include "nvim/event/rstream.h" @@ -38,7 +37,7 @@ void term_input_init(TermInput *input, Loop *loop) int curflags = termkey_get_canonflags(input->tk); termkey_set_canonflags(input->tk, curflags | TERMKEY_CANON_DELBS); // setup input handle - rstream_init_fd(loop, &input->read_stream, input->in_fd, 0xfff, input); + rstream_init_fd(loop, &input->read_stream, input->in_fd, 0xfff); // initialize a timer handle for handling ESC with libtermkey time_watcher_init(loop, &input->timer_handle, input); } @@ -49,13 +48,13 @@ void term_input_destroy(TermInput *input) uv_mutex_destroy(&input->key_buffer_mutex); uv_cond_destroy(&input->key_buffer_cond); time_watcher_close(&input->timer_handle, NULL); - stream_close(&input->read_stream, NULL); + stream_close(&input->read_stream, NULL, NULL); termkey_destroy(input->tk); } void term_input_start(TermInput *input) { - rstream_start(&input->read_stream, read_cb); + rstream_start(&input->read_stream, read_cb, input); } void term_input_stop(TermInput *input) @@ -216,8 +215,8 @@ static int get_key_code_timeout(void) // Check 'ttimeout' to determine if we should send ESC after 'ttimeoutlen'. // See :help 'ttimeout' for more information Error err = ERROR_INIT; - if (vim_get_option(cstr_as_string("ttimeout"), &err).data.boolean) { - ms = vim_get_option(cstr_as_string("ttimeoutlen"), &err).data.integer; + if (nvim_get_option(cstr_as_string("ttimeout"), &err).data.boolean) { + ms = nvim_get_option(cstr_as_string("ttimeoutlen"), &err).data.integer; } return (int)ms; @@ -340,7 +339,7 @@ static void read_cb(Stream *stream, RBuffer *buf, size_t c, void *data, // // ls *.md | xargs nvim input->in_fd = 2; - stream_close(&input->read_stream, NULL); + stream_close(&input->read_stream, NULL, NULL); queue_put(input->loop->fast_events, restart_reading, 1, input); } else { loop_schedule(&main_loop, event_create(1, input_done_event, 0)); @@ -391,6 +390,6 @@ static void read_cb(Stream *stream, RBuffer *buf, size_t c, void *data, static void restart_reading(void **argv) { TermInput *input = argv[0]; - rstream_init_fd(input->loop, &input->read_stream, input->in_fd, 0xfff, input); - rstream_start(&input->read_stream, read_cb); + rstream_init_fd(input->loop, &input->read_stream, input->in_fd, 0xfff); + rstream_start(&input->read_stream, read_cb, input); } diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c index d220df508a..bfc03dfb81 100644 --- a/src/nvim/tui/tui.c +++ b/src/nvim/tui/tui.c @@ -83,6 +83,7 @@ UI *tui_start(void) UI *ui = xcalloc(1, sizeof(UI)); ui->stop = tui_stop; ui->rgb = p_tgc; + ui->pum_external = false; ui->resize = tui_resize; ui->clear = tui_clear; ui->eol_clear = tui_eol_clear; @@ -106,6 +107,7 @@ UI *tui_start(void) ui->suspend = tui_suspend; ui->set_title = tui_set_title; ui->set_icon = tui_set_icon; + ui->event = tui_event; return ui_bridge_attach(ui, tui_main, tui_scheduler); } @@ -650,6 +652,12 @@ static void tui_set_icon(UI *ui, char *icon) { } +// NB: if we start to use this, the ui_bridge must be updated +// to make a copy for the tui thread +static void tui_event(UI *ui, char *name, Array args, bool *args_consumed) +{ +} + static void invalidate(UI *ui, int top, int bot, int left, int right) { TUIData *data = ui->data; diff --git a/src/nvim/types.h b/src/nvim/types.h index bfe8be2091..35a5d1e2bd 100644 --- a/src/nvim/types.h +++ b/src/nvim/types.h @@ -13,4 +13,5 @@ typedef unsigned char char_u; // Can hold one decoded UTF-8 character. typedef uint32_t u8char_T; +typedef struct expand expand_T; #endif // NVIM_TYPES_H diff --git a/src/nvim/ui.c b/src/nvim/ui.c index d968cbc390..dd278893c2 100644 --- a/src/nvim/ui.c +++ b/src/nvim/ui.c @@ -12,10 +12,8 @@ #include "nvim/ex_cmds2.h" #include "nvim/fold.h" #include "nvim/main.h" -#include "nvim/mbyte.h" #include "nvim/ascii.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/mbyte.h" #include "nvim/garray.h" #include "nvim/memory.h" @@ -27,6 +25,7 @@ #include "nvim/os/time.h" #include "nvim/os/input.h" #include "nvim/os/signal.h" +#include "nvim/popupmnu.h" #include "nvim/screen.h" #include "nvim/syntax.h" #include "nvim/window.h" @@ -35,6 +34,7 @@ #else # include "nvim/msgpack_rpc/server.h" #endif +#include "nvim/api/private/helpers.h" #ifdef INCLUDE_GENERATED_DECLARATIONS # include "ui.c.generated.h" @@ -143,6 +143,15 @@ void ui_set_icon(char *icon) UI_CALL(flush); } +void ui_event(char *name, Array args) +{ + bool args_consumed = false; + UI_CALL(event, name, args, &args_consumed); + if (!args_consumed) { + api_free_array(args); + } +} + // May update the shape of the cursor. void ui_cursor_shape(void) { @@ -156,15 +165,18 @@ void ui_refresh(void) } int width = INT_MAX, height = INT_MAX; + bool pum_external = true; for (size_t i = 0; i < ui_count; i++) { UI *ui = uis[i]; width = ui->width < width ? ui->width : width; height = ui->height < height ? ui->height : height; + pum_external &= ui->pum_external; } row = col = 0; screen_resize(width, height); + pum_set_external(pum_external); } void ui_resize(int new_width, int new_height) @@ -519,3 +531,4 @@ static void ui_mode_change(void) UI_CALL(mode_change, mode); conceal_check_cursur_line(); } + diff --git a/src/nvim/ui.h b/src/nvim/ui.h index 5934d2fee9..d14bc5812c 100644 --- a/src/nvim/ui.h +++ b/src/nvim/ui.h @@ -5,6 +5,8 @@ #include <stdbool.h> #include <stdint.h> +#include "api/private/defs.h" + typedef struct { bool bold, underline, undercurl, italic, reverse; int foreground, background, special; @@ -13,7 +15,7 @@ typedef struct { typedef struct ui_t UI; struct ui_t { - bool rgb; + bool rgb, pum_external; int width, height; void *data; void (*resize)(UI *ui, int rows, int columns); @@ -39,6 +41,7 @@ struct ui_t { void (*suspend)(UI *ui); void (*set_title)(UI *ui, char *title); void (*set_icon)(UI *ui, char *icon); + void (*event)(UI *ui, char *name, Array args, bool *args_consumed); void (*stop)(UI *ui); }; diff --git a/src/nvim/ui_bridge.c b/src/nvim/ui_bridge.c index 6290fb3d87..34b95baf6c 100644 --- a/src/nvim/ui_bridge.c +++ b/src/nvim/ui_bridge.c @@ -31,6 +31,7 @@ UI *ui_bridge_attach(UI *ui, ui_main_fn ui_main, event_scheduler scheduler) UIBridgeData *rv = xcalloc(1, sizeof(UIBridgeData)); rv->ui = ui; rv->bridge.rgb = ui->rgb; + rv->bridge.pum_external = ui->pum_external; rv->bridge.stop = ui_bridge_stop; rv->bridge.resize = ui_bridge_resize; rv->bridge.clear = ui_bridge_clear; diff --git a/src/nvim/undo.c b/src/nvim/undo.c index fc5d6acaa4..d80aaf443a 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -99,6 +99,7 @@ #include "nvim/quickfix.h" #include "nvim/screen.h" #include "nvim/sha256.h" +#include "nvim/state.h" #include "nvim/strings.h" #include "nvim/types.h" #include "nvim/os/os.h" diff --git a/src/nvim/version.c b/src/nvim/version.c index 6b189a820f..685a2a843b 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -15,7 +15,6 @@ #include "nvim/memline.h" #include "nvim/memory.h" #include "nvim/message.h" -#include "nvim/misc2.h" #include "nvim/screen.h" #include "nvim/strings.h" @@ -75,31 +74,198 @@ static char *features[] = { // clang-format off static int included_patches[] = { + // 2367, + // 2366 NA + // 2365 NA + // 2364, + // 2363 NA + // 2362, + // 2361 NA + // 2360, + // 2359 NA + // 2358 NA + // 2357, + // 2356, + // 2355, + // 2354, + // 2353, + // 2352 NA + // 2351 NA + // 2350, + // 2349, + // 2348, + // 2347, + // 2346, + // 2345 NA + // 2344 NA + // 2343, + // 2342 NA + // 2341, + // 2340 NA + // 2339, + // 2338 NA + // 2337, + // 2336, + // 2335, + // 2334, + // 2333, + // 2332 NA + // 2331, + // 2330, + // 2329, + // 2328, + // 2327 NA + // 2326, + // 2325 NA + // 2324, + // 2323, + // 2322, + // 2321, + // 2320, + // 2319, + // 2318, + // 2317, + // 2316 NA + // 2315, + // 2314, + // 2313, + // 2312, + // 2311, + // 2310 NA + // 2309, + // 2308 NA + // 2307, + // 2306, + // 2305, + // 2304 NA + // 2303, + // 2302 NA + // 2301 NA + // 2300, + // 2299, + // 2298 NA + // 2297 NA + // 2296, + // 2295, + // 2294, + // 2293, + // 2292, + // 2291, + // 2290 NA + // 2289 NA + // 2288 NA + // 2287 NA + // 2286 NA + // 2285 NA + 2284, + // 2283, + // 2282 NA + // 2281 NA + // 2280, + // 2279, + // 2278, + // 2277, + // 2276, + // 2275, + // 2274, + // 2273, + // 2272, + // 2271 NA + // 2270 NA + // 2269, + // 2268, + // 2267 NA + // 2266, + // 2265, + // 2264, + // 2263, + // 2262 NA + // 2261 NA + // 2260 NA + // 2259, + // 2258 NA + // 2257 NA + // 2256, + // 2255, + // 2254 NA + // 2253 NA + // 2252 NA + // 2251, + // 2250, + // 2249, + // 2248, + // 2247 NA + // 2246, + // 2245, + // 2244, + // 2243 NA + // 2242, + // 2241, + // 2240, + // 2239, + // 2238 NA + // 2237, + // 2236, + // 2235, + // 2234 NA + // 2233, + // 2232, + // 2231, + // 2230, + // 2229, + // 2228, + // 2227, + // 2226, + // 2225, + // 2224, + // 2223, + // 2222, + // 2221, + // 2220, + 2219, + // 2218 NA + // 2217, + // 2216 NA + // 2215, + // 2214 NA + 2213, + // 2212, + // 2211 NA + // 2210 NA + // 2209, + // 2208, + // 2207 NA + // 2206 NA + // 2205, + // 2204, + // 2203 NA + // 2202 NA + // 2201, // 2200, - // 2199, + // 2199 NA // 2198, // 2197, // 2196, - // 2195, + // 2195 NA // 2194, - // 2193, - // 2192, - // 2191, + // 2193 NA + // 2192 NA + // 2191 NA // 2190, // 2189, // 2188, // 2187, - // 2186, + // 2186 NA // 2185, // 2184, // 2183, - // 2182, + // 2182 NA // 2181, // 2180, // 2179, // 2178, // 2177, - // 2176, + // 2176 NA // 2175, // 2174, // 2173, @@ -107,9 +273,9 @@ static int included_patches[] = { // 2171, // 2170, // 2169, - // 2168, - // 2167, - // 2166, + // 2168 NA + // 2167 NA + // 2166 NA // 2165, // 2164, // 2163, @@ -118,56 +284,56 @@ static int included_patches[] = { // 2160, // 2159, // 2158, - // 2157, - // 2156, - // 2155, - // 2154, - // 2153, + // 2157 NA + // 2156 NA + // 2155 NA + // 2154 NA + // 2153 NA // 2152, // 2151, - // 2150, + // 2150 NA // 2149, // 2148, // 2147, // 2146, - // 2145, + // 2145 NA // 2144, // 2143, // 2142, // 2141, - // 2140, + // 2140 NA // 2139, - // 2138, + // 2138 NA // 2137, // 2136, // 2135, // 2134, - // 2133, + // 2133 NA // 2132, - // 2131, - // 2130, - // 2129, + // 2131 NA + // 2130 NA + // 2129 NA // 2128, // 2127, // 2126, // 2125, // 2124, // 2123, - // 2122, + // 2122 NA // 2121, // 2120, // 2119, - // 2118, + // 2118 NA // 2117, - // 2116, + // 2116 NA // 2115, - // 2114, + // 2114 NA // 2113, - // 2112, + 2112, // 2111, // 2110, // 2109, - // 2108, + // 2108 NA // 2107, // 2106, // 2105 NA @@ -242,7 +408,7 @@ static int included_patches[] = { // 2036, // 2035 NA // 2034 NA - // 2033, + 2033, // 2032 NA // 2031, // 2030 NA @@ -285,7 +451,7 @@ static int included_patches[] = { // 1993, // 1992, // 1991, - // 1990, + 1990, // 1989, // 1988 NA // 1987 NA @@ -304,7 +470,7 @@ static int included_patches[] = { // 1974 NA 1973, // 1972, - // 1971, + 1971, // 1970, // 1969 NA // 1968, @@ -323,7 +489,7 @@ static int included_patches[] = { // 1955, // 1954, // 1953, - // 1952, + 1952, // 1951 NA // 1950, // 1949, @@ -362,7 +528,7 @@ static int included_patches[] = { // 1916 NA // 1915 NA // 1914, - // 1913, + 1913, // 1912, // 1911, // 1910, @@ -375,11 +541,11 @@ static int included_patches[] = { // 1903, // 1902 NA // 1901 NA - // 1900, + 1900, // 1899 NA - // 1898, + 1898, // 1897, - // 1896, + 1896, // 1895, // 1894 NA // 1893, @@ -577,7 +743,7 @@ static int included_patches[] = { 1703, // 1702, // 1701, - // 1700, + 1700, // 1699, // 1698 NA // 1697, @@ -674,7 +840,7 @@ static int included_patches[] = { // 1606, // 1605, // 1604, - // 1603, + 1603, // 1602 NA // 1601 NA // 1600 NA @@ -719,8 +885,8 @@ static int included_patches[] = { // 1561 NA // 1560 NA // 1559, - // 1558, - // 1557, + 1558, + 1557, // 1556 NA // 1555 NA 1554, @@ -730,7 +896,7 @@ static int included_patches[] = { 1550, // 1549, 1548, - // 1547, + 1547, 1546, // 1545 NA // 1544 NA @@ -742,9 +908,9 @@ static int included_patches[] = { // 1538 NA // 1537 NA // 1536 NA - // 1535, + 1535, // 1534 NA - // 1533, + 1533, // 1532 NA // 1531 NA // 1530 NA @@ -1011,7 +1177,7 @@ static int included_patches[] = { 1269, // 1268 NA 1267, - // 1266 + 1266, // 1265 NA // 1264 NA // 1263 NA diff --git a/src/nvim/window.c b/src/nvim/window.c index e267d493bf..e9a66ad907 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -28,7 +28,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/file_search.h" #include "nvim/garray.h" #include "nvim/move.h" @@ -41,6 +40,7 @@ #include "nvim/regexp.h" #include "nvim/screen.h" #include "nvim/search.h" +#include "nvim/state.h" #include "nvim/strings.h" #include "nvim/syntax.h" #include "nvim/terminal.h" @@ -2926,7 +2926,9 @@ void win_init_size(void) */ 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); /* init t: variables */ @@ -2976,6 +2978,9 @@ int win_new_tabpage(int after, char_u *filename) xfree(newtp); return FAIL; } + + newtp->localdir = tp->localdir ? vim_strsave(tp->localdir) : NULL; + curtab = newtp; /* Create a new empty window. */ @@ -3689,13 +3694,15 @@ win_T *buf_jump_open_tab(buf_T *buf) */ static win_T *win_alloc(win_T *after, int hidden) { - /* - * allocate window structure and linesizes arrays - */ + static int last_win_id = 0; + + // allocate window structure and linesizes arrays win_T *new_wp = xcalloc(1, sizeof(win_T)); - handle_register_window(new_wp); win_alloc_lines(new_wp); + new_wp->handle = ++last_win_id; + handle_register_window(new_wp); + /* init w: variables */ new_wp->w_vars = dict_alloc(); init_var_dict(new_wp->w_vars, &new_wp->w_winvar, VAR_SCOPE); @@ -5674,3 +5681,107 @@ static bool frame_check_width(frame_T *topfrp, int width) } return true; } + +int win_getid(typval_T *argvars) +{ + if (argvars[0].v_type == VAR_UNKNOWN) { + return curwin->handle; + } + int winnr = get_tv_number(&argvars[0]); + win_T *wp; + if (winnr > 0) { + if (argvars[1].v_type == VAR_UNKNOWN) { + wp = firstwin; + } else { + tabpage_T *tp; + int tabnr = get_tv_number(&argvars[1]); + for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) { + if (--tabnr == 0) { + break; + } + } + if (tp == NULL) { + return -1; + } + wp = tp->tp_firstwin; + } + for ( ; wp != NULL; wp = wp->w_next) { + if (--winnr == 0) { + return wp->handle; + } + } + } + return 0; +} + +int win_gotoid(typval_T *argvars) +{ + win_T *wp; + tabpage_T *tp; + int id = get_tv_number(&argvars[0]); + + for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) { + for (wp = tp == curtab ? firstwin : tp->tp_firstwin; + wp != NULL; wp = wp->w_next) { + if (wp->handle == id) { + goto_tabpage_win(tp, wp); + return 1; + } + } + } + return 0; +} + +void win_id2tabwin(typval_T *argvars, list_T *list) +{ + win_T *wp; + tabpage_T *tp; + int winnr = 1; + int tabnr = 1; + int id = get_tv_number(&argvars[0]); + + for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) { + for (wp = tp == curtab ? firstwin : tp->tp_firstwin; + wp != NULL; wp = wp->w_next) { + if (wp->handle == id) { + list_append_number(list, tabnr); + list_append_number(list, winnr); + return; + } + winnr++; + } + tabnr++; + winnr = 1; + } + list_append_number(list, 0); + list_append_number(list, 0); +} + +int win_id2win(typval_T *argvars) +{ + win_T *wp; + int nr = 1; + int id = get_tv_number(&argvars[0]); + + for (wp = firstwin; wp != NULL; wp = wp->w_next) { + if (wp->handle == id) { + return nr; + } + nr++; + } + return 0; +} + +void win_findbuf(typval_T *argvars, list_T *list) +{ + int bufnr = get_tv_number(&argvars[0]); + + for (tabpage_T *tp = first_tabpage; tp != NULL; tp = tp->tp_next) { + for (win_T *wp = tp == curtab ? firstwin : tp->tp_firstwin; + wp != NULL; wp = wp->w_next) { + if (wp->w_buffer->b_fnum == bufnr) { + list_append_number(list, wp->handle); + } + } + } +} |