Доказательство
Поскольку нет альтернативного файла, вы на самом деле просто запускаете обычный старый файл :bd
, удаляя текущий буфер ... попробуйте без него, #
и вы увидите, что результат будет таким же. Подобное происходит и с :buffer
, :sbuffer
по крайней мере, парой других команд, которые принимают #
в качестве аргумента: они молча ведут себя так, как будто не было передано никаких аргументов.
В том же ключе, если вы попробуете :bunload #
вы получите эту ошибку: E90: Cannot unload last buffer
. Запустите :bunload
без аргументов и, опять же, вы получите тот же результат.
Документы
Таким образом, у нас есть свидетельство того, что #
его заменяют словом «ничего» (вероятно, пустой строкой). Куда мы отправимся отсюда? Некоторое время я копался в файлах справки, пытаясь найти упоминание об этом поведении. Там не было ничего явно, но :h cmdline-lines
говорит (прокрутите страницу вниз или две) ...
Когда символ «%» или «#» используется там, где ожидается имя файла, они расширяются до текущего и альтернативного имени файла.
Я прочитал , что , как Вим ввод #
через expand()
функцию (т.е. expand('#')
) или , по крайней мере , тот же исходный код используется там.
:h expand()
говорит:
Разверните .. специальные ключевые слова. .. Когда используется «%» или «#», а текущее или альтернативное имя файла не определено, используется пустая строка.
Звучит знакомо.
Код
Теперь ни одно из вышеперечисленного не является окончательным или дает представление о том, почему? так что я потратил немного времени на копание ... на этот раз в коде. Мой C очень ржавый, и у меня не установлено никаких хороших инструментов, но мне удалось найти функцию, которая выполняет некоторые настройки для :bdelete
вызываемого do_bufdel()
. Это посылает аргументы командной строки, через buflist_findpat()
которые, если #
встречается, возвращает значение curwin->w_alt_fnum
. Это «номер буфера» альтернативного буфера ... который не может быть положительным значением в нашем сценарии. (Там нет проверки, является ли файл alt действительным / существует до того, как это возвращаемое значение выбрано.)
Отклонение в do_bufdel()
проверке выполняется для этого возвращаемого значения для номера буфера меньше 0, и в этом случае цикл обработки параметров прерывается. Это привело бы к тому, что в основной :bdelete
код не были бы переданы никакие параметры ... что соответствует моим ранним представлениям.
Что дальше?
Кажется, он работает так, как задумано, и я не увидел ничего похожего на явную ошибку. Возможно, грех упущения, хотя ... угловой случай, который был упущен из виду и поэтому не имеет изящного обращения. Но только разработчики, написавшие это, знают наверняка. Таким образом, последний шаг - попытаться получить их вклад. Как сказал Кристиан Б., спросить в списке vim-dev - это путь.
(Обратите внимание , что buflist_findpat()
это функция полезности , поэтому он не будет требовать натяжки предположить , что :bunload
, :buffer
и т.д. использует это тоже ... что бы объяснить их общее поведение по отношению к #
.)
NVIM v0.3.0-dev
, я проверил.