Доказательство
Поскольку нет альтернативного файла, вы на самом деле просто запускаете обычный старый файл :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, я проверил.