Как объединить две команды Vim в одну (команда без привязки клавиш)

Я нашел несколько вопросов о переполнении стека, в которых говорится об этом, но все они касаются только команд :nmap или :noremap. Мне нужна команда, а не просто привязка клавиш. Есть ли способ добиться этого?

Пример использования:

Когда я запускаю :make, я не сохраняю автоматически. Итак, я хотел бы объединить :make и :w. Я хотел бы создать команду _6 _ / _ 7_ или :Wmake для этого.


person Jan Kaifer    schedule 08.10.2018    source источник
comment
Возможный дубликат VIM - несколько команд в одной строке   -  person Doktor OSwaldo    schedule 09.10.2018


Ответы (3)


Общую информацию о соединении команды Ex через | можно найти по адресу :help cmdline-lines.

Вы можете применить это для интерактивных команд, в сопоставлениях, а также в пользовательских командах.

Обратите внимание, что вам нужно использовать только специальный <bar> в сопоставлениях (чтобы избежать преждевременного завершения определения сопоставления и немедленного выполнения оставшейся части, частая ошибка новичков: :nnoremap <F1> :write | echo "This causes an error during Vim startup!"<CR>). Для пользовательских команд вы можете просто написать |, но имейте в виду, какие команды сами видят это как свой аргумент.

:help line-continuation поможет с слишком длинными определениями команд. Также может помочь перенос нескольких команд в отдельный :help :function (но учтите, что это тонко меняет обработку ошибок).

аргументы

Если вы хотите передать настраиваемые аргументы командной строки, вы можете добавить -nargs=* в определение :command, а затем указать точку вставки с правой стороны через <args>. Например, чтобы разрешить команды вашей :write команде, вы можете использовать

:command -nargs=* C w <args> | silent make | redraw!
person Ingo Karkat    schedule 08.10.2018

Команды можно комбинировать с |, см. Справку для :bar:

command! C update | silent make | redraw!

Однако есть более чистый способ добиться желаемого. Просто включите параметр 'autowrite', чтобы автоматически записывать измененные файлы перед :make:

                                 'autowrite' 'aw' 'noautowrite' 'noaw'
'autowrite' 'aw'        boolean (default off)
                        global
        Write the contents of the file, if it has been modified, on each
        :next, :rewind, :last, :first, :previous, :stop, :suspend, :tag, :!,
        :make, CTRL-] and CTRL-^ command; and when a :buffer, CTRL-O, CTRL-I,
        '{A-Z0-9}, or `{A-Z0-9} command takes one to another file.
        Note that for some commands the 'autowrite' option is not used, see
        'autowriteall' for that.

Эта опция упоминается в справке для :make.

person sidyll    schedule 08.10.2018

Я нашел решение после небольшого количества проб и ошибок.

Решение для моего варианта использования

command C w <bar> silent make <bar> redraw!

Это для компиляции с использованием make, и он печатает вывод только в том случае, если есть ненулевой вывод.

Общее решение

command COMMAND_NAME COMMAND_TO_RUN

Где COMMAND_TO_RUN может быть построен с использованием более чем одной команды с использованием следующей конструкции.

COMMAND_1_THAN_2 = COMMAND_1 <bar> COMMAND_2

Вы можете использовать это несколько раз, и это очень похоже на трубы в оболочке.

person Jan Kaifer    schedule 08.10.2018