Использование SpaceVim на neovim и MacVim и не может получить местоположение скрипта плагина

Я пробовал все решения https://stackoverflow.com/questions/4976776/how-to-get-path-to-the-current-vimscript-being-executed/53274039#53274039, которые были опубликованы 7 лет назад, и ни один из них у меня работает в текущем (2018) MacVim (8.1) или neovim (0.3.1). Поскольку мой вопрос там продолжает удаляться, я решил задать новый вопрос.

Что-то изменилось в Vim с момента последнего ответа 7 лет назад? Все эти решения дают мне текущее местоположение файла, а не местоположение скрипта. Влияет ли SpaceVim на работу этих функций?

Это код, который я пытаюсь исправить:

function! TeaCodeExpand()
    <<some code>>
    echom fnamemodify(resolve(expand('<sfile>:p')), ':h')
    <<other code>>
endfunction

У меня есть эхо, чтобы показать путь, который должен быть текущим файлом сценария, но он всегда возвращает редактируемый в данный момент файл. Следующая строка предназначена для выполнения AppleScript в каталоге над файлом vimscript. Я могу жестко указать путь, и все работает нормально. Но я не могу заставить его работать как есть. Полный код находится здесь: github.com/raguay/TeaCode-Vim-Extension.


person Richard Guay    schedule 13.11.2018    source источник
comment
Нет, ничего не изменилось на что-то настолько основное. Чтобы лучше помочь вам, включите воспроизводимый пример, который показывает, какой путь вы ожидаете и что вы получаете вместо этого.   -  person Ingo Karkat    schedule 13.11.2018
comment
Вот код, который я пытаюсь исправить: ``` function! TeaCodeExpand() ‹‹какой-то код›› echom fnamemodify(resolve(expand('‹sfile›:p')), ':h') ‹‹другой код›› endfunction ``` У меня есть echom, чтобы показать путь, который должен быть текущим файлом сценария, но он всегда возвращает редактируемый в данный момент файл. Следующая строка предназначена для выполнения AppleScript в каталоге над файлом vimscript. Я могу жестко указать путь, и все работает нормально. Но я не могу заставить его работать как есть. Полный код находится здесь: github.com/raguay/TeaCode-Vim-Extension.   -  person Richard Guay    schedule 13.11.2018
comment
Кстати: вышеприведенный код эхома был добавлен к тому, что находится в репозитории, который я указал чуть выше вызова system. Я не мог разместить здесь полный код из-за ограничений по размеру.   -  person Richard Guay    schedule 13.11.2018


Ответы (1)


Чтобы <sfile> расширился до спецификации файла плагина, расширение должно произойти при получении скрипта. См. :help :<sfile>:

  <sfile>    When executing a ":source" command, is replaced with the
             file name of the sourced file.
             When executing a function, is replaced with:
             "function {function-name}[{lnum}]"

Если вам понадобится спецификация файла позже в функции, вам нужно сохранить ее в переменной (локальной для скрипта) и сослаться на нее из функции:

let s:scriptPath = fnamemodify(resolve(expand('<sfile>:p')), ':h')
function! TeaCodeExpand()
    <<some code>>
    echom s:scriptPath
    <<other code>>
endfunction
person Ingo Karkat    schedule 13.11.2018