vim-patch:8.2.4749: <script> is not expanded in autocmd context

Problem:    <script> is not expanded in autocmd context.
Solution:   Add the context to the pattern struct. (closes vim/vim#10144)
            Rename AutoPatCmd to AutoPatCmd_T.
eca7c60d68

Omit AutoPatCmd -> AutoPatCmd_T rename as it is inconsistent.
Use `.sn_name` instead of `->sn_name` as v8.2.0154 hasn't been ported.
Omit acp_script_stx(), use member directly.
This commit is contained in:
zeertzjq
2022-08-23 12:20:37 +08:00
parent 7afc17dec1
commit d0b9fe2d5a
4 changed files with 65 additions and 39 deletions

View File

@@ -104,7 +104,7 @@ void estack_pop(void)
/// ESTACK_SCRIPT for <script>.
char *estack_sfile(estack_arg_T which)
{
estack_T *entry = ((estack_T *)exestack.ga_data) + exestack.ga_len - 1;
const estack_T *entry = ((estack_T *)exestack.ga_data) + exestack.ga_len - 1;
if (which == ESTACK_SFILE && entry->es_type != ETYPE_UFUNC) {
if (entry->es_name == NULL) {
return NULL;
@@ -112,22 +112,31 @@ char *estack_sfile(estack_arg_T which)
return xstrdup(entry->es_name);
}
// If evaluated in a function return the path of the script where the
// function is defined, at script level the current script path is returned
// If evaluated in a function or autocommand, return the path of the script
// where it is defined, at script level the current script path is returned
// instead.
if (which == ESTACK_SCRIPT) {
if (entry->es_type == ETYPE_UFUNC) {
sctx_T *def_ctx = &entry->es_info.ufunc->uf_script_ctx;
if (def_ctx->sc_sid > 0) {
return xstrdup((char *)(SCRIPT_ITEM(def_ctx->sc_sid).sn_name));
}
} else if (exestack.ga_len > 0) {
// Walk the stack backwards, starting from the current frame.
for (int idx = exestack.ga_len - 1; idx; idx--) {
entry = ((estack_T *)exestack.ga_data) + idx;
if (entry->es_type == ETYPE_SCRIPT) {
return xstrdup(entry->es_name);
assert(entry == ((estack_T *)exestack.ga_data) + exestack.ga_len - 1);
// Walk the stack backwards, starting from the current frame.
for (int idx = exestack.ga_len - 1; idx >= 0; idx--, entry--) {
if (entry->es_type == ETYPE_UFUNC) {
const sctx_T *const def_ctx = &entry->es_info.ufunc->uf_script_ctx;
if (def_ctx->sc_sid > 0) {
return xstrdup((char *)(SCRIPT_ITEM(def_ctx->sc_sid).sn_name));
} else {
return NULL;
}
} else if (entry->es_type == ETYPE_AUCMD) {
const sctx_T *const def_ctx = &entry->es_info.aucmd->script_ctx;
if (def_ctx->sc_sid > 0) {
return xstrdup((char *)(SCRIPT_ITEM(def_ctx->sc_sid).sn_name));
} else {
return NULL;
}
} else if (entry->es_type == ETYPE_SCRIPT) {
return xstrdup(entry->es_name);
}
}
return NULL;