открыть vim из скрипта bash - PullRequest
10 голосов
/ 12 мая 2011

Мне нужна оболочка bash, которая выполняет следующие действия:

  1. открывает файл с помощью vim
  2. , что-то записывает в файл
  3. сохраняет и выходит из файла

    bashpromt# cat mybash.sh
      echo "about to open a file"
      vim file.txt #I need to use vim application to open a file
      #now write something into file.txt 
      #close the that file.
      echo "done."
    

Возможно ли это?Я нашел что-то вроде скрипта vim, но не уверен, как его использовать.Или что-то вроде «ЗДЕСЬ» документ может быть использован для этого?

РЕДАКТИРОВАТЬ: Мне нужно убедиться, что редактор vim работает нормально в нашей файловой системе. Поэтому мне нужно написать скрипт, который вызывает vim и выполняет некоторые команды изакрой его.Мое требование не подходит для таких вещей, как "echo" что-то "> file.txt".Я должен открыть файл с помощью vim.

Ответы [ 5 ]

16 голосов
/ 12 мая 2011

ex - версия командной строки для vi, и ее гораздо проще использовать в сценариях.

ex $yourfile <<EOEX
  :%s/$string_to_replace/$string_to_replace_it_with/g
  :x
EOEX
10 голосов
/ 12 мая 2011

Vim имеет несколько опций:

  • -c => передавать команды ex.Пример: vim myfile.txt -c 'wq' для принудительного завершения последней строки файла для завершения новой строки (если binary не установлен каким-либо образом сценарием)
  • -s => воспроизвести сценарий, записанный с помощью -W.Например, если ваш файл содержит ZZ, то vim myfile.txt -s the_file_containing_ZZ будет делать то же, что и ранее.

Также обратите внимание, что при вызове ex vim будет запускаться в режиме ex;Вы можете попробовать ex my_file.txt <<< wq

5 голосов
/ 03 октября 2016

Вы спросили, как записать "что-то" в текстовый файл через vim, и ни один ответ еще не охватил это.

Для вставки текста:

ex $yourfile <<EOEX
  :i
  my text to insert
  .
  :x
EOEX

:i входит во вставкуРежим.Все последующие строки вставляются в текст до тех пор, пока . не появится само по себе в отдельной строке.

Вот как искать и вставлять.Вы можете сделать что-то, например:

ex $yourfile <<EOEX
  :/my search query\zs
  :a
  my text to insert
  .
  :x
EOEX

Это найдет первый выбор, который соответствует регулярному выражению, указанному :/, поместит курсор в положение, указанное \zs, и войдет в режим вставки после курсора,

Вы можете перемещаться \zs для достижения разных результатов.Например:

ex $yourfile <<EOEX
  :/start of match \zs end of match
  :a
  my text to insert 
  .
  :x
EOEX

Это изменит первое вхождение слова «начало матча, конец матча» на «начало матча, мой текст для вставки конца матча».

Если вы хотитечтобы разрешить любое количество пробелов в поиске между ключевыми словами, используйте \_s*.Например, поиск функции, которая возвращает 0: :/\_s*return\_s*0}

1 голос
/ 12 мая 2011

Недавно я ответил на аналогичный вопрос " Автоматическое редактирование нескольких files". Может быть, решение, которое я здесь опишу, удовлетворит ваши потребности.

1 голос
/ 12 мая 2011

Если вы хотите видеть работу, выполняемую внутри vim или gvim, вы можете использовать --remote-send

gvim --servername SHELL_DRIVER
bashpromt# cat mybash.sh
#!/bin/bash
echo "about to open $1"
gvim --servername SHELL_DRIVER $1 #I need to use vim application to open a file
#now write something into file.txt and close it
gvim --servername SHELL_DRIVER --remote-send '<ESC>i something to the file<ESC>:wq<CR>'
echo "done."

Это будет медленно, но будет делать то, что вы хотите.
Сначала мы открываем gvim, в котором мы можем открыть все наши файлы (для эффективности)
В первой строке gvim мы открываем файл в ранее открытом gvim.
Во второй строке gvim мы отправляем командуранее открытый экземпляр gvim (с открытым желаемым файлом).
Команда выглядит следующим образом:
<ESC> - выйти из любого режима, в котором gvim мог быть
i something to the file - войти ввставьте режим и введите «что-то в файл»
<ESC> - выйдите из режима вставки
:wq - запишите файл и выйдите из vim

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...