Кілька команд в одному рядку


188

Я намагався знайти щось, що дозволить мені запускати кілька команд на одному рядку у Vim, подібне до використання крапками з комою для розділення команд у * nix системах або &в Windows. Чи є спосіб це зробити?


2
Нічого собі, я намагався дізнатися про vim з вашого запитання (що я зробив) і дізнався, що я можу використовувати ;замість того, &&щоб розділяти команди оболонки Unix теж!

8
@ebyrob Я вважаю, що важливо зазначити, що &&це "логічне значення" і в командах оболонки, тому, якщо у вас є command1 && command2, воно command2буде виконуватися лише у випадку command1успішного виконання. з ;ви просто вручну вказати кінець цього рядка і почати нову. Це те саме, що писати кожну команду в інший рядок у сценарії оболонки.
Буде

... і команда1 || command2, command2 буде виконуватися лише у тому випадку, якщо command1 не виконаний. Це тому, що в комп'ютерній логіці || і && побірно, і навіть якщо "&&" означає, що і команду1, і команду2 потрібно евакуювати, команду2 НЕ потрібно оцінювати, якщо команда1 не працює, тому що незалежно від того, що cmd2 повертається, воно завжди буде невдалим, оскільки перший повернув помилковий ( 0), а 0 && 1 все одно буде нульовим. Аналогічно, якщо command1 = true, немає значення для команди 2 в оцінці АБО, тому що в цей момент це вже вірно (1), тому що 1 || 0 - це 1, і лише якщо це 0, знадобиться 0 || 1 (що досі 1)
osirisgothra

@osirisgothra, яка відома як оцінка короткого замикання / короткого замикання.
speakingcode

Відповіді:


241

Бар |дозволить вам це зробити. З:help :bar

'|'можна використовувати для розділення команд, тому ви можете дати кілька команд в одному рядку. Якщо ви хочете використовувати '|'в аргументі, передуйте цьому '\'.

Приклад:

:echo "hello" | echo "goodbye"

Вихід:

hello
goodbye

Примітка: Ви можете виявити, що ваше ~/.vimrcне підтримує відображення |, або \|. У цих випадках спробуйте використовувати <bar>замість цього.


8
Просто стежте за кількома командами, які не працюють |!
занадто багато php

31
Коли ви виявите, що хочете використовувати декілька команд у mapзаяві (і повірте, ви хочете), перевірте :help map_bar.
Білл Одом

9
Це правда. Я запитав саме це питання про суперпользователя кілька місяців тому. Мій .vimrcне підтримує відображений рядок ( \|) для відображень. Я дізнався, що насправді треба набрати <bar>.
michaelmichael

Дякуємо за робоче рішення! :help barпоказує motion.txt, хоча нічого про декілька команд.
geekQ

1
@geekQ має бути:help <bar>
Шрі Кадимісетті

92

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

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

Не використовувати, |тому що:

  • Деякі команди мають проблеми, якщо ви користуєтесь |ними

  • | не працює послідовно у файлах конфігурації, див :help map_bar


42

Ви можете визначити функцію, яка виконує ваші команди.

function Func()
     :command
     :command2 
endfunction

І помістіть це, наприклад, у свій vimrc. Запустіть функцію за допомогою

exec Func()

1
Чистий розчин. Однозначно буде корисно для більш ніж двох або просто довгих команд.
усувається

1
Дуже корисно також для можливості передачі помилок за допомогою try / catch.
Іммануель Вайхнахтен

2
Це звичайніше використовувати, :call Func()оскільки :execute Func()означає щось більше. Це означає виконувати повернене значення функції як команди. Описана тут функція зазвичай не має команди, яка починається з :return, тому її поверненим значенням буде число нуль. Виконавши це, як команда перемістить курсор до першого рядка поточного буфера, що не завжди є на увазі.
мінопрет


16

Я завжди використовував ^Jдля розділення декількох команд, натискаючи Ctrl+ v, Ctrl+ j.


Це здається єдиним рішенням, яке насправді працює. Кого я можу вказати, якщо я хочу використовувати його в рядку?
DerWeh

Ви не можете використовувати ^Jяк роздільник команд у рядку, оскільки він вставляє символ NULL, що завершує рядок. проте ви можете використовувати <CR> = "\ n".
Tinmarino

exe "echo 'foo' \n echo 'bar'"
Tinmarino

exe "echo 'foo'" . nr2char(0x0a) . "echo 'bar'"
Tinmarino

map aa :echo 'foo' <C-V><C-J> echo 'bar'<CR>
Tinmarino

12

Думаючи, що це може допомогти комусь, хто намагається здійснити заміну в ланцюзі, і один не вдається

з коментаря

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

Ви можете використовувати eпрапор, щоб ігнорувати помилку, коли рядок не знайдено.


2

Ви можете створити новий файл і записати на нього команди. Потім :so %, що означає вихідний поточний файл.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.