Несколько команд в одной строке

188

Я пытался найти что-то, что позволило бы мне запускать несколько команд в одной строке в Vim, подобно использованию точек с запятой для разделения команд в * nix системах или &в Windows. Есть ли способ сделать это?

Bub Bradlee
источник
2
Ух ты, я пытался узнать о vim из твоего вопроса (что я и сделал) и узнал, что могу использовать ;вместо того, &&чтобы разделять команды оболочки Unix!
8
@ebyrob Я чувствую, что важно отметить, что &&это 'boolean and' в командах оболочки, поэтому, если у вас есть command1 && command2, command2будет выполняться только в случае command1успешного выполнения. при этом ;вы просто вручную указываете конец этой строки и начинаете новую. Это то же самое, что написать каждую команду в отдельной строке в скрипте оболочки.
Будет
... и command1 || Команда 2, команда 2 будет выполняться только в случае сбоя команды 1. Это потому, что в компьютерной логике || и && являются побитовыми, и хотя "&&" подразумевает, что обе команды command1 и command2 должны быть оценены, command2 НЕ нужно оценивать, если команда command1 не выполняется, потому что независимо от того, что возвращает cmd2, он всегда будет неуспешным, так как первый вернул false ( 0), и 0 && 1 по-прежнему будет равно нулю. Аналогично, если command1 = true, нет никакой причины для команды 2 в оценке ИЛИ, потому что в этот момент это уже верно (1), потому что 1 || 0 равно 1, и только если это 0, потребуется 0 || 1 (который все еще 1)
osirisgothra
@osirisgothra, известная как оценка короткого замыкания / короткого замыкания.
говорящий

Ответы:

241

Бар |позволит вам сделать это. Из:help :bar

'|'может использоваться для разделения команд, поэтому вы можете задать несколько команд в одной строке. Если вы хотите использовать '|'аргумент, поставьте перед ним '\'.

Пример:

:echo "hello" | echo "goodbye"

Вывод:

hello
goodbye

NB: Вы можете обнаружить, что ваш ~/.vimrcне поддерживает отображение |, или \|. В этих случаях попробуйте использовать <bar>вместо.

michaelmichael
источник
8
Просто следите за несколькими командами, которые не работают с |!
слишком много php
31
Когда вы обнаружите, что хотите использовать несколько команд в mapвыражении (и поверьте мне, вы будете), проверьте :help map_bar.
Билл Одом
9
Это правда. Я задал этот самый вопрос о суперпользователе несколько месяцев назад. My .vimrcне поддерживает экранированный bar ( \|) для отображений. Я узнал, что мне нужно печатать <bar>.
Майкл Майкл
Спасибо за рабочее решение! :help barпоказывает motion.txt, хотя и ничего о нескольких командах.
geekQ
1
@geekQ должен быть:help <bar>
Шри Kadimisetty
92

Поместите <CR>(возврат каретки / ввод) между и после команд. Например:

map <F5> :w<CR>:!make && ./run<CR>

Не используйте, |потому что:

  • Некоторые команды имеют проблемы, если вы используете |после них

  • | не работает последовательно в файлах конфигурации, смотрите :help map_bar

Бабкен Варданян
источник
42

Вы можете определить функцию, которая выполняет ваши команды.

function Func()
     :command
     :command2 
endfunction

И поместите это, например, в ваш vimrc. Запустите функцию с

exec Func()
Йонатан
источник
1
Чистый раствор. Определенно будет удобно для более чем двух или просто длинных команд.
elimirks
1
Очень полезно также для возможности обрабатывать ошибки с помощью try / catch.
Иммануил Вейнахтен
2
Это более привычно для использования, :call Func()потому что :execute Func()означает нечто большее. Это означает выполнение возвращаемого значения функции в виде команды. Описанная здесь функция обычно не имеет команды, начинающейся с :return, поэтому ее возвращаемое значение будет равно нулю. Выполнение этого в виде команды переместит курсор на первую строку текущего буфера, что не всегда то, что вы имели в виду.
минопрет
26

Разделитель команд в vim есть |.

Daenyth
источник
16

Я всегда использовал ^Jдля разделения нескольких команд, нажимая Ctrl+ v, Ctrl+ j.

eruciform
источник
Кажется, это единственное решение, которое действительно работает. Кому я могу указать это, если я хочу использовать это в строке?
DerWeh
Вы не можете использовать в ^Jкачестве разделителя команд в строке, потому что он вставляет символ NULL, заканчивающий строку. однако вы можете использовать <CR> = "\ n".
Тинмарино
exe "echo 'foo' \n echo 'bar'"
Тинмарино
exe "echo 'foo'" . nr2char(0x0a) . "echo 'bar'"
Тинмарино
map aa :echo 'foo' <C-V><C-J> echo 'bar'<CR>
Тинмарино
12

Подумал, что это может помочь кому-то, пытающемуся сделать замену в цепочке, и один терпит неудачу

из комментария

% s/word/newword/ge | % s/word2/newword2/ge

Вы можете использовать eфлаг, чтобы игнорировать ошибку, когда строка не найдена.

Jerinaw
источник
2

Вы можете создать новый файл и написать свои команды на нем. Затем :so %, что означает исходный текущий файл.

песня
источник