Выполнить bash-скрипт из vim

21

Я использую Vim для сценариев Bash. иногда я не хочу создавать новый файл, делать его исполняемым, выполнять его и затем удалять. Я имею в виду сценарии, которые будут использоваться только один раз.

Например, я открываю vim и набираю это:

#!/bin/bash

ll | while read line
do
    echo $line
done

Я не сохранил этот файл, я просто использую vim для упрощения bash-скриптинга. Я знаю, что могу выполнить команду bash через !vim. Но как насчет выполнения всего, что находится в буфере?

St.Antario
источник
4
Вы знаете, что вы можете редактировать текущую командную строку в Vim <C-x><C-e>и выполнять ее при записи, верно?
romainl
Если вы запустите bash с этой опцией set -o vi, вы можете нажать Esc-vдля редактирования командной строки в vi. Затем Esc-:wqвыполнить.
roblogic

Ответы:

36

Я написал довольно обширный ответ на этот вопрос о переполнении стека . Основная идея заключается в том, что поскольку команда write предназначена для записи без сохранения , вы можете записать текст в своем буфере во внешнюю программу, такую ​​как python или bash. В вашем случае вы хотели бы сделать что-то вроде:

:w !bash

или

:w !sh

Эти команды буквально просто записывают текст в вашем буфере непосредственно в указанную вами программу !, что удобно, потому что тогда вам не нужно сохранять файл. Конечно, вы также можете сделать что-то вроде:

:w | !bash %

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

DJMcMayhem
источник
Есть ли способ предоставить опциям аргумент таким образом? Я пытался, :w !bash -a testно получил "не могу выполнить двоичный файл"
St.Antario
@ St.Antario Хм. Я уверен, что должен быть какой-то путь, но мой удар довольно ржавый (я в основном использую окна). Когда я пытаюсь сделать это в Cygwin с пустым testфайлом, он работает нормально для меня. Что должна делать команда и что должна testсодержать?
DJMcMayhem
Мой фактический случай довольно сложный, так что давайте просто напечатать аргумент, переданный. Кстати, что вы имеете в виду, что должно test содержать? testэто просто аргумент -a.
Сент-Антарио
1
@ St.Antario Ох, ладно, понятно. Я думал, testдолжен был быть файл. Я не совсем уверен, что делать. Если вы пытаетесь что-то сложное, может быть лучше просто сохранить его в файле. Возможно, стоит задать отдельный вопрос, чтобы вы могли предоставить более подробную информацию. Вероятно, это был бы также хороший вопрос для Unix и Linux
DJMcMayhem
4

Сценарий: вы работаете в оболочке bash. Во-первых, убедитесь, что режим локального редактирования имеет вид vi:

$ set -o vi

Теперь, когда вы обнаружите, что работаете над длинной командой, подобной следующей, нажмите Esc+ v.

$ fjhwfq this is my long command

Это загрузит вашу команду во временную viсессию. Теперь вы можете редактировать его по своему усмотрению и даже добавить еще одну команду ...

fjhwfq some long command
ls -l

Когда вы закончите редактирование, введите Esc :wqи команда (ы) будут выполнены, например:

$ fjhwfq some long command
fjhwfq some long command
bash: fjhwfq: command not found
ls -l
total 44
-rw-r--r-- 1 ropata Domain Users 24073 Nov 10 14:17 _viminfo
drwxr-xr-x 1 ropata Domain Users     0 Jul 15 13:57 bin/
-rw-r--r-- 1 ropata Domain Users   956 Nov  7 10:43 custom_env
roblogic
источник
3
может не работать, если у вас новый macbook без Escключа;)
roblogic
1
Новые MacBook не имеют Escключей !? Как они могут использовать Vim тогда?
Hubro
1
Теперь я попробовал, новый MacBook сенсорной панели штуковина делает показать Escключ при запуске Vim в терминале.
roblogic