Я хочу запустить следующую оболочку.
wea-this is the end of the second word | vim j
exit 0
Я надеялся, что это будет w
направлять нажатия клавиш (двигаться вперед по слову), затем e
(конец слова), затем a
(добавлять), затем -this is the end of the second word
(текст) в документ Vim с именем, в j
котором уже есть слова.
Следующая ошибка произошла, когда я запустил скрипт оболочки.
/root/bin/tt.sh: line 1: wea-this: command not found
Vim: Warning: Input is not from a terminal
Я использую Ubuntu 14.04. Будут оценены два типа ответов:
- Как использовать трубопровод для достижения желаемого результата.
- Другой метод, с помощью которого я могу использовать «команды Vim» (не команды ed или sed) для редактирования текстового документа из сценария оболочки.
invocation
Джейсон Басанезе
источник
источник
|
характер трубы вывода одной команды к другой.wea-this
это не команда. Трубопровод не может быть использован для достижения того, что вы хотите сделать; это приведет к тому, что стандартный ввод Vim будет левой рукой, а не клавиатурой. Если вы хотите , чтобы получить стандартный ввод в буфер в Vim, запустите его с минусом для имени файла:echo Hello, world! | vim -
.Ответы:
Чтобы вставить строку
"hello"
в первую строку файлаj
, вы можете набрать в своей оболочке следующую команду:vim +"1 | put! ='hello'" j
:1
перемещает курсор на первую строку буфера:put! ='hello'
вставляет строку "привет" над текущей строкойЧтобы вставить строку,
"hello"
а затем сохранить и выйти из файла:vim +"1 | put! ='hello' | x" j
То же самое, что и раньше, мы только что добавили команду Ex,
:x
которая сохраняет и выходит.В более общем случае вы можете выполнить любую последовательность команд Ex для файла, из интерактивной оболочки или из сценария bash, например:
vim +'Ex command1 | Ex command2 | ...' file
Если у вас много Ex-команд, вы можете написать их все внутри выделенного файла (например
myExCommands.vim
, по одному), по одной команде на строку, а затем из оболочки или сценария вы можете получить его (с помощью команды Ex:source
или краткой версии).:so
) как это:редактировать
Я вижу, вы редактировали свой вопрос.
Я думаю, что предыдущий ответ все еще применим, потому что вы можете выполнить любую обычную команду из режима Ex с помощью команд Ex
:normal
и:execute
.Например, допустим, вы хотите:
1G
)_
)w
)e
)a
)hello
:x
)Чтобы сделать это в файле
j
, введите из оболочки:Для получения дополнительной информации см .:
источник
:normal
и:execute
делай что хочешь?Вот способ, которым вы можете использовать команды обычного режима, а не только команды ex, чтобы редактировать поток, представленный Vim из stdin. Это не очень полезный пример, но он иллюстрирует используемые методы. Предполагается, что ваша оболочка bash.
В
-
конце команда Vim сообщает текст (не команды) из стандартного ввода.-s
Говорит Vim выполнять нажатия клавиш из указанного файла. В этом случае файл является результатом подстановки процесса bash.<(...)
Заменяется именем именованного канала. Вывод канала является выводом команды в скобках. Вwcwred\e
перемещает курсор на одно слово и изменения , которые в следующем словоred
.:wq! foo\n
Сохраняет результат в файл ,foo
даже если этот файл уже существует. Конечным результатом является файл с именем,foo
содержащим текстThe red fox jumped.
Подробнее о некоторых из этих тем см.
Смотрите также
Process Substitution
разделbash(1)
справочной страницы.источник
vimx () { vi -s <(echo "$1"':wq') "$2" &> /dev/null; }
. Теперь я могуvimx 'iThe brow fox jumped.\e' foo; vimx 'wcwred\efjdwiclimbed\e' foo; cat foo
. Ухоженная!Я обнаружил, что способ получения выходных данных программы, перенаправленной из вложенной оболочки, очень прост:
Пример:
источник
У меня было то же самое желание, что и у вас: я хотел написать обычные команды vim, чтобы они редактировали поток конвейера. Я был разочарован трудностью использования обычного vim таким образом (так много флагов!), Как это предусмотрено параметрами vim по умолчанию.
Поэтому я написал небольшую оболочку для vim, чтобы сделать это: https://github.com/MilesCranmer/vim-stream/ . Это называется
vims
.Сердцем оболочки является следующая команда:
Используя это, с генерацией команд, которые я делаю, получается довольно лаконично, и поскольку vim является модальным редактором, я создал
vims
модальный потоковый редактор. Есть три основных режима, которые полезны для менталитета редактирования конвейера:Смотри:
Итак,
e
доходит до концаHello
, затемa
начинается добавление.Что-то более необычное в exe-режиме, чтобы закомментировать строки, содержащие
my_bad_var
, и удалить предыдущую строку.Что переводится как
vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'
-I
наличие команды на начало вставки в начале строки и//
последовательность комментариев.\<esc>kdd
нажимает клавишу escape, перемещается вверх по строке, затем удаляет строку.У меня есть всего 11 примеров по репо, я призываю вас проверить их. Опять же, это работает поверх vim, это просто способ сделать vim более похожим на sed для потокового ввода (но сохранив все ваши любимые макросы vim!)
источник
Это довольно старый вопрос, но я чувствовал, что стоит добавить, что если у вашего дистрибутива / ОС есть доступ
moreutils
, вы можете установить его и просто использоватьvipe
как стандартное дополнение кvim
:moreutils
очень удобен и для других инструментов, и я очень рекомендую их, если вы серьезный пользователь командной строки! :) Посмотрите на введение автора (предыдущая ссылка) для более подробной информации.moreutils
должен быть общедоступен для большинства * nix-подобных дистрибутивов через менеджер пакетов и через Homebrew на Mac . Например...moreutils
также является частью репозитория MSYS2 , так что вы можете технически использовать его и в Windows. :)источник