Выполните команду в Vim из командной строки

Есть ли в любом случае выполнение команды Vim в файле из командной строки?

Я знаю, что верно противоположное:

:!python %

Но что, если я хотел :retab сохранить файл без его открытия в Vim? Например:

> vim myfile.c
:retab | wq

Это откроет myfile.c, заменит вкладки пробелами, а затем сохранит и закроет. Я хотел бы как-то связать эту последовательность вместе с одной командой.

Это будет примерно так:

> vim myfile.c retab | wq

Ответ 1

Это сработало для меня:

gvim -c "set et|retab|wq" foo.txt

set et (= set expandtab) обеспечивает замену символов tab правильным количеством пробелов (иначе retab не будет работать).

Я обычно не использую его, но vim -c ... также работает

Ответ 2

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

  • -c "commands": будут воспроизводиться команды Ex, когда вы ввели их в командной строке.
     В вашем примере: vim myfile -c 'retab | wq'. Это то, что предложил ПервыйКрок.

  • -S "vim source file": будет источник, указанный vim script
    (например, запуск vim -c "source 'vim source file'"):

    Если у вас есть файл script.vim, содержащий:

    retab
    wq
    

    Затем вы можете использовать vim myfile.c -s script.vim (расширение не имеет большого значения)

  • -s "scriptin file": будет воспроизводиться содержимое файла, так как оно содержит команды обычного режима: если у вас есть script.txt, содержащий:

    :retab
    ZZ
    

    с концом строк, состоящим из одного символа ^M (например, вы сохранили script с помощью :set fileformat=mac | w), тогда вы можете запустить: vim myfile.c -S script.txt (ZZ - это еще один способ выхода из vim и сохранить текущий файл).
    Обратите внимание, что вы можете записывать эти сценарии с помощью vim my_file -W script.txt, но страдает от ошибки, если вы используете gvim (GUI).

Ответ 3

Не прямой ответ на ваш вопрос, но если вы хотите заменить вкладки пробелами (или сделать любой другой поиск/замену регулярных выражений) для списка файлов, вы можете просто использовать встроенный поиск/замену sed:

sed -i 's/\t/   /g' foo1.txt foo2.txt

или

ls *.txt | xargs sed -i 's/\t/   /g'

(В этом примере я заменяю каждый символ табуляции тремя пробелами.)


ПРИМЕЧАНИЕ: флаг -i означает работу на месте.

На странице sed man:

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if  extension
          supplied)