3

в основном мой рабочий процесс выглядит следующим образом: у меня есть несколько открытых окон с использованием split в терминале в обычном vim. Иногда у меня есть открытый файл, иногда я не переключаюсь между :buf и :tag чтобы получить файл. В идеале я хотел бы что-то, что будет работать, как :buf но если файл не находится в буфере в настоящее время, то это будет preform a :e .

Поэтому упростить:

Я :buf часть имени файла и нажимаю <tab> это дает мне совпадение для файлов и соответствует как можно большей части файла, если нужный мне файл уже не находится в буфере, который я бы хотел сохранить возможность ввести это имя файла и загрузить его. Обычно теперь я должен вернуться и изменить команду с :buf [file] на a :e [file] .

Есть ли способ создать команду, которая будет работать как :buf но открыть файл, если он еще не существует? Причина, по которой я использую :buf для начала, заключается в том, что он ограничивает область действия файлами в определенных каталогах и будет соответствовать им при нажатии на вкладку. Надеюсь, я все правильно объяснил :).

Пример:

:buf FooX[tab]

показывает 4 файла и имеет

:buf [very long path]/FooX

Теперь, если файл Exact с префиксом FooX не отображается, я все еще хочу иметь возможность напечатать FooXFileNotShown.cpp и заставить его загрузить его, как :e .

Заранее спасибо за помощь.

2 ответа2

1

:b[uffer] используется только для доступа к открытым буферам. "Область" его завершения не ограничивается "определенными каталогами", а буферами в вашем списке буферов / аргументах. Вы не можете использовать эту команду, чтобы открыть файл, который еще не был открыт.

:e[dit] используется для редактирования файла, и его завершение "ограничивается" файлами и каталогами непосредственно в рабочем каталоге Vim. Вы можете ограничить список завершения с помощью параметра wildignore (:help 'wildignore') или с использованием удивительного ** подстановочного знака (:help starstar).

Когда вы используете :e для редактирования файла, который уже находится в списке буферов / аргументах, Vim не создает новый буфер, он просто переключается на существующий буфер, эффективно действуя как :b .

Итак ... Похоже, вы немного озадачены поведением :b и просто ищете :e file<Tab> .

1

Поэтому вам нужна команда с завершением существующих буферов, которая затем либо открывает буфер (если он существует), либо редактирует переданный файл вместо того, чтобы выдавать ошибку E94: No matching buffer .

Как насчет этого:

:command! -nargs=1 -complete=buffer Buf try | execute 'buffer' <q-args> | catch /^Vim\%((\a\+)\)\=:E94/ | execute 'edit' <q-args> | endtry

Пользовательские команды должны начинаться с заглавной буквы, но вы используете cmdalias.vim - Плагин создания псевдонимов для команд Vim, чтобы перегрузить существующую команду :buf .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .