Чи можна передавати команди vim на vim?


18

Я хочу запустити наступну оболонку.

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. Оцінюються два типи відповідей:

  1. Як використовувати трубопроводи для досягнення цього бажаного результату.
  2. Інший метод, за допомогою якого я можу використовувати "команди Vim" (не команди ed або sed) для редагування текстового документа зі скрипту оболонки.

1
На |характер труби виведення однієї команди до іншої. wea-thisне є командою. Трубопроводи не можна використовувати для досягнення того, що ви хочете зробити; це призведе до того, що Vdin's stdin буде лівою програмою, а не клавіатурою. Якщо ви хочете , щоб отримати стандартний ввід в буфер в Vim, запустіть його з мінусом для імені файлу: echo Hello, world! | vim -.
dash-tom-bang

Відповіді:


15

Щоб вставити рядок "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) подобається це:

vim +'so myExCommands.vim' file

Редагувати

Я бачу, що ви відредагували своє запитання.
Я думаю, що попередня відповідь все ще застосовується, тому що ви можете виконати будь-яку звичайну команду з режиму Ex за допомогою команд Ex :normalі :execute.

Наприклад, скажімо, що ви хочете:

  • перемістіть курсор на перший рядок буфера ( 1G)
  • перемістіть курсор до першого символу без пробілів у рядку ( _)
  • перемістіть курсор одним словом вперед ( w)
  • перемістіть курсор на кінець нового слова ( e)
  • перейти в режим вставки після символу під курсором ( a)
  • вставити рядок hello
  • зберегти та вийти ( :x)

Для цього у файлі jвведіть з оболонки:

vim +"execute 'normal! 1G_weahello' | x" j

Для отримання додаткової інформації див:

:help +cmd
:help :normal
:help :execute

Мені не вдалося повністю прояснити свою мету. Я хочу мати можливість використовувати команди vims, такі як w, щоб рухати вперед слово тощо. Я відредагую своє питання, щоб виправити.
Джейсон Басанес

@JasonBasanese Я відредагував свою відповідь, виконайте команди Ex :normalі :executeзробіть те, що ви хочете?
saginaw

9

Ось спосіб ви можете використовувати команди звичайного режиму, а не просто колишні команди, щоб редагувати потік, представлений Vim від stdin. Це не дуже корисний приклад, але він ілюструє залучені методи. Це передбачає, що ваша оболонка - це удар.

echo "The brown fox jumped." | vim -s <(printf 'wcwred\e:wq! foo\n') -

В -кінці вказує Vim читати текст (не команди) з stdin. -sКаже Vim виконувати натискання клавіш із зазначеного файлу. У цьому випадку файл є результатом заміни процесу bash. <(...)Замінюється ім'ям іменованого каналу. Вихід труби - це вихід команди в дужках. У wcwred\eпереміщує курсор на одне слово і зміни , які в наступному слово red. :wq! foo\nЗберігає результат в файл , fooнавіть якщо цей файл вже існує. Кінцевим результатом є файл, названий fooтекстомThe red fox jumped.

Більше про деякі з цих тем див

:help -file
:help -s

Дивіться також Process Substitutionрозділ bash(1)чоловічої сторінки.


Додано в мій ~ / .zshrc: vimx () { vi -s <(echo "$1"':wq') "$2" &> /dev/null; }. Тепер я можу vimx 'iThe brow fox jumped.\e' foo; vimx 'wcwred\efjdwiclimbed\e' foo; cat foo. Акуратно!
Леонард Паулі

4

Я вважав, що метод прийняття результатів програми як перенаправлення з підкольору дуже простий:

vim <( program )

Приклад:

 vim <( grep -nH  hello  myFile.cpp )
 vim <( find . -name '*.cpp' -exec grep -nH code_expr {} \+ )

4

У мене було таке саме бажання, як і у вас: я хотів написати звичайні команди vim і редагувати потік конвеєра. Мене розчарувало труднощі використання звичайного vim таким чином (так багато прапорів!), Як це передбачено параметрами vim за замовчуванням.

Тому я написав невелику обгортку на vim, щоб це зробити: https://github.com/MilesCranmer/vim-stream/ . Це називається vims.

Серце обгортки - така команда:

vim - -nes "${vim_cmds[@]}" -c ':q!' | tail -n +2

Використовуючи це, з генерацією команд, яку я роблю, це виявляється досить стислим, і тому що vim - модальний редактор, я зробив vimsредактор модальних потоків. Є три основні режими, які корисні для менталітету редагування конвеєра:

[-t|--turn-off-mode] - (Default mode)
                       Every string is a vim command line, e.g., '%g/foo/d' deletes
                       all lines with foo.
[-e|--exe-mode] -      Translated to '%g/$1/exe "norm $2"', see examples below
[-s|--simple-mode] -   Like exe-mode, but runs on 1st line only

Дивитися це:

$ echo "Hello World" | vims -s "ea Beautiful"
Hello Beautiful World

Отже, eйде до кінця Hello, потім aпочинає додавати.

Щось фантазії в exe-режимі прокоментувати рядки, що містять my_bad_varі видалити попередній рядок.

cat my_script.cpp | vims -e 'my_bad_var' 'I//\<esc>kdd'

Що означає vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'- Iкоманда, яку слід починати вставляти на початку рядка, і //бути послідовністю коментарів. \<esc>kddнатискає клавішу втечі, рухається вгору по лінії, а потім видаляє лінію.

У мене є 11 загальних прикладів на репо, радимо перевірити їх. Знову ж таки, це працює поверх vim, це просто спосіб зробити vim більше схожим на sed для введення потоку (але зберігши всі ваші улюблені макроси vim!)


3

Це досить давнє запитання, але я вважав, що варто внести свій внесок у те, що якщо ваш доступний дистрибутив / ОС має доступ до нього moreutils, ви можете встановити його та просто використовувати vipeяк стандартне доповнення до vim:

echo foo | vipe # Now you can edit "foo" to be "bar"!

moreutilsце також дуже зручно для інших інструментів, і я дуже рекомендую їх, якщо ви серйозний користувач командного рядка! :) Перегляньте авторський вступ (попереднє посилання) для отримання більш детальної інформації.

moreutilsмає бути загальнодоступним для більшості * nix-подібних дистрибутивів через менеджер пакунків та через Homebrew на Mac . Наприклад...

# Arch Linux and MSYS2 (more below) as part of the `community` repo
pacman -Sy moreutils


# Mac OS and Homebrew
brew install moreutils

moreutilsтакож є частиною сховища пакетів MSYS2 , тому технічно його можна використовувати і в Windows. :)

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