Mercurial > vim
diff src/vim9execute.c @ 24952:ffe784fdec57 v8.2.3013
patch 8.2.3013: Vim: when debugging only first line of command is displayed
Commit: https://github.com/vim/vim/commit/4cea536bdf48df459e7ad651dfee006844bbf2c0
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Jun 16 22:24:40 2021 +0200
patch 8.2.3013: Vim: when debugging only first line of command is displayed
Problem: Vim: when debugging only the first line of a command using line
continuation is displayed.
Solution: Find the next command and concatenate lines until that one.
(closes #8392)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 16 Jun 2021 22:30:03 +0200 |
parents | 5c418c774f95 |
children | 9b7fac4c70a0 |
line wrap: on
line diff
--- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1433,6 +1433,52 @@ lookup_debug_var(char_u *name) return NULL; } + static void +handle_debug(isn_T *iptr, ectx_T *ectx) +{ + char_u *line; + ufunc_T *ufunc = (((dfunc_T *)def_functions.ga_data) + + ectx->ec_dfunc_idx)->df_ufunc; + isn_T *ni; + int end_lnum = iptr->isn_lnum; + garray_T ga; + int lnum; + + SOURCING_LNUM = iptr->isn_lnum; + debug_context = ectx; + debug_var_count = iptr->isn_arg.number; + + for (ni = iptr + 1; ni->isn_type != ISN_FINISH; ++ni) + if (ni->isn_type == ISN_DEBUG + || ni->isn_type == ISN_RETURN + || ni->isn_type == ISN_RETURN_VOID) + { + end_lnum = ni->isn_lnum; + break; + } + + if (end_lnum > iptr->isn_lnum) + { + ga_init2(&ga, sizeof(char_u *), 10); + for (lnum = iptr->isn_lnum; lnum < end_lnum; ++lnum) + if (ga_grow(&ga, 1) == OK) + ((char_u **)(ga.ga_data))[ga.ga_len++] = + skipwhite(((char_u **)ufunc->uf_lines.ga_data)[lnum - 1]); + line = ga_concat_strings(&ga, " "); + vim_free(ga.ga_data); + } + else + line = ((char_u **)ufunc->uf_lines.ga_data)[iptr->isn_lnum - 1]; + if (line == NULL) + line = (char_u *)"[empty]"; + + do_debug(line); + debug_context = NULL; + + if (end_lnum > iptr->isn_lnum) + vim_free(line); +} + /* * Execute instructions in execution context "ectx". * Return OK or FAIL; @@ -4156,21 +4202,7 @@ exec_instructions(ectx_T *ectx) case ISN_DEBUG: if (ex_nesting_level <= debug_break_level) - { - char_u *line; - ufunc_T *ufunc = (((dfunc_T *)def_functions.ga_data) - + ectx->ec_dfunc_idx)->df_ufunc; - - SOURCING_LNUM = iptr->isn_lnum; - debug_context = ectx; - debug_var_count = iptr->isn_arg.number; - line = ((char_u **)ufunc->uf_lines.ga_data)[ - iptr->isn_lnum - 1]; - if (line == NULL) - line = (char_u *)"[empty]"; - do_debug(line); - debug_context = NULL; - } + handle_debug(iptr, ectx); break; case ISN_SHUFFLE: