Открыть vim из bash оболочки script

Я хочу, чтобы оболочка bash выполняла следующие

  • открыть файл с помощью vim
  • записать что-то в файл
  • сохранить и выйти из файла

    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 script, но не уверен, как его использовать. Или что-то вроде "ЗДЕСЬ" может быть использовано для этого?

EDIT: Мне нужно проверить, что редактор vim отлично работает над нашей файловой системой. Поэтому мне нужно написать script, который вызывает vim и выполняет некоторую команду и закрывает ее. Мое требование не вписывается в такие вещи, как "echo" something " > file.txt". Мне нужно открыть файл с помощью vim.

Ответ 1

У Vim есть несколько вариантов:

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

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

Ответ 2

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

ex $yourfile <<EOEX
  :%s/$string_to_replace/$string_to_replace_it_with/g
  :x
EOEX

Ответ 3

Вы спросили, как написать "что-то" в текстовый файл через 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}

Ответ 4

Если вы хотите видеть, что работа выполняется внутри 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