Позиция курсора в vi при открытии файла

Случай подобен этому: Добавление строки, содержащей символ ESC с sed

Я предлагаю тот же (адаптированный) ответ:

for file in "${filelist[@]}"; do
  sed -i "1i\\
$(echo -E "$prefix" | sed -e 's/\\/\\\\/g' | sed -e '$! s/$/\\/')" "$file" &&
  echo "$suffix" >> "$file"
done

sed команда i требует, чтобы каждая строка кроме последнего была завершена с обратной косой чертой (это отсутствовало в отнесенном ответе). Кроме того, обратные косые черты должны быть удвоены, таким образом, sed не попытается интерпретировать их. echo производит содержание переменной $prefix. Затем в конвейере, sed команда удваивает обратные косые черты. Второе sed команда добавляет обратные косые черты в конце каждой строки кроме последнего.

ОТРЕДАКТИРУЙТЕ Как sed программа $! s/$/\\/ работы:

Во-первых, адрес $ средства выполнить команду, которая следует последняя строка. $! инвертирует это, таким образом, команда будет выполняться на всех строках кроме последнего.

Затем s/// команда делает замену. Это заменит пустой строкой в конце строки, обозначенной $, с обратной косой чертой. Но обратная косая черта является специальным символом, таким образом, мы должны выйти из нее с другой обратной косой чертой для sed считать его правильно.

2
09.10.2015, 10:46
2 ответа

Используйте это:

vishex () 
{ 
    [ -e "$1" ] || echo -e '#!/bin/bash\n\n' > "$1";
    chmod +x "$1";
    vi "+normal G" +startinsert "$1"
}
  • [ -e "$1" ] проверяет, существует ли уже скрипт. Если да, то echo не отменит его.
  • -e в echo позволяет интерпретировать обратные косые черты, например \n для новой строки. Затем он вставляет 2 новые строки после строки shebang.
  • +normal G запускает команду ex G, которая переходит к последней строке в файле.
  • +startinsert переключает непосредственно в режим вставки (можно и оставить, так как в вопросе это не упоминается).

Итак, при выполнении vishex script это выглядит так:

#!/bin/bash

<- cursor is here
~
[...]
~
-- INSERT --                                                               3,1           All
3
27.01.2020, 22:05

Предполагая, что ваш vi на самом деле vim , из справочной страницы:

+[num]   For  the  first file the cursor will be positioned on line "num".
         If "num" is missing, the cursor will be positioned  on  the  last line.

Таким образом, используйте:

vi + "$1"
0
27.01.2020, 22:05

Теги

Похожие вопросы