2016-10-29 3 views
3

Я уже искал эту ошибку, но не нашел решения.Vim: ввод ошибки ввода

Я следую базовому руководству по подключению к миру Linux, и я пытаюсь создать файл .txt, добавив некоторые текстовые строки в Vim, используя этот скрипт. Он должен работать, но не в моем случае.

Вот мой простой скрипт (я использую zsh, если это может быть важная информация):

#!/bin/sh 

filename= test.txt 
vim $filename << COMMAND 
i 
Hello 
^[ 
:x 
COMMAND 

Сценарий завершается с сообщением: Vim: error reading input.

Где я ошибаюсь?

ответ

2

При задании filename есть опечатка (дополнительное пространство): filename= test.txt. Это выражение интерпретируется как , вызывающее команду test.txt с переменной окружения filename, которая установлена ​​в пустую строку. Поэтому вы должны удалить пробел после =.

Что касается чтения ошибки ввода сообщения, прочитайте документацию Vim: :help E208:

Vim: Error reading input, exiting... 

Это происходит, когда Vim не может читать вводимые символы в то время как требуется ввод. Вим застрял, единственное, что он может сделать, это выйти. Это может произойти, когда и stdin, и stderr перенаправляются и выполняются сценарий, который не выходит из Vim.

Так что Vim считает, что он читал сценарий, который не выходил из Вима. Ваш скрипт входит в режим вставки, вводит Hello, затем Esc и, наконец, вызывает команду :x. Все хорошо, и команда :x выходит из Vim, если она введена в области командной строки, конечно. Если вы ввели ^[ в Control - V, Esc, сценарий бы вышел из режима вставки и успешно выполнил команду :x. Поэтому вы ввели ^[ в виде двух символов.Таким образом, ваш реальный вклад был Hello^[:x (и сценарий не вышел Vim):

Vim: Warning: Input is not from a terminal 
Vim: Error reading input, exiting... 
Vim: preserving files... 
Vim: Finished. 

Теперь, если заменить два персонажей ^[ с фактическим экранирующим символом, и выполнить скрипт из того же каталога, что потерпит неудачу из-за файла подкачки:

Vim: Warning: Input is not from a terminal 
Vim: Error reading input, exiting... 

Vim: Finished. 

(вы можете прочитать длинное описание, запустив vim test.txt). Вы можете игнорировать файлы подкачки с опцией -n: vim -n "$filename". Теперь выход будет:

Vim: Warning: Input is not from a terminal 

Имеет смысл. Вам действительно не нужна интерактивная версия Vim. Таким образом, вы должны использовать ex mode (-e), или, скорее, улучшенный ex-режим (-E опция): vim -n -E "$filename".

Также рекомендуется обернуть значения в одинарных кавычках, если контент не предполагается интерпретировать, и в двойных кавычках, если строка содержит переменные оболочки: filename='test.txt'.

Фиксированный версия:

filename='test.txt' 
vim -n -E "$filename" << COMMAND 
i 
Hello 
^[ 
:x 
COMMAND 

(^[ вводится в Vim с помощью управления - v, Esc).

+0

Огромное вам спасибо, я вложу все это в голову: D –

0

Вы должны удалить пробел в filename= test.txt и убедиться, что у вас нет пробелов после последней строки с COMMAND. Когда вы хотите получить Hello в первой строке, удалите строку с именем после i: iHello^[.

Введите код: ^[ Адрес: CTRL-v ESC? Это должен быть один персонаж.

+0

Спасибо, человек! Я написал '^ [' используя 2 символа. Я должен лучше учиться командам Vim :) –

+0

Чем вы можете принять ответ. Я использовал здесь-конструкцию для редактирования файлов много, но я переключился на 'sed -i'. Для интерактивного редактирования я все еще использую vi (m). –

0

Вы можете сделать так:

#!/bin/sh 

filename=test.txt 

coms="iHello world^[:x ${filename}^M" 
vim -c "normal $coms" 

Как сказал Уолтер А, вы должны заменить ^[ и ^M, нажав соответственно Ctrl-V Esc и Ctrl-V Return внутри переменной coms.

См. man vim, а также в Vim :h :normal для получения дополнительной помощи.

Смежные вопросы