Предотвратите VIM отменить% с именем файла

Вы можете очень хорошо использовать echo для этой цели.

$ cat new
echo 1
$ number=$(./new)
$ echo $number
1

Я думаю, что это служит цели. Также обратите внимание, что новый выше - это сценарий, который вы собираетесь написать.

прокомментируйте ниже, если я что-то неправильно предположил

1
29.01.2019, 16:44
3 ответа

Вы должны либо использовать две обратные косые черты, либо использовать одинарные кавычки:

execute "! printf '=\\%.0s' {1..10}"

execute '! printf "=\%.0s" {1..10}'

Это необходимо, потому что при разборе строк в двойных кавычках("...")vim удалит все символы обратной косой черты, которые не начинают escape-последовательности, о которых он знает (, например. \nили \x0a), поэтому строка, передаваемая команде execute, в конечном итоге будет ! printf '=%.0s' {1..10}, а %будет заменена текущим именем файла.

1
27.01.2020, 23:15

Как уже правильно ответили другие, %необходимо экранировать, чтобы Vim не заменял его текущим именем файла (в соответствии с :help cmdline-special), а внутри строки с двойными кавычками -обратную косую черту нужно удвоить.

Тем не менее, Vim предлагает:help shellescape()функцию, которая делает всю работу за вас (и учитывает все специальные символы!):

execute "! printf ". shellescape("=%.0s",1). " {1..10}"

Здесь вам нужно экранировать каждый аргумент отдельно ; для голого printfв этом нет необходимости, и {1..10}не нужно заключать в кавычки в оболочке, чтобы его можно было расширить.

Обратите внимание, что нет необходимости раскошелиться только на printf; В Vim встроеноprintf()-дюймов

.
0
27.01.2020, 23:15

Поскольку непонятно, что вы пытаетесь сделать:

  1. Заполнить текущую строку =до столбца 80

    map _= :execute 'normal A'. repeat("=", (80-col("$")+1))<cr>
    
  2. Подчеркнуть текущую строку:

    map _= :co.<cr>Vr=
    
  3. Добавить разделитель (80 символов)

    map _= :call append(line('.'), repeat("=", 80))<cr>
    
0
27.01.2020, 23:15

Теги

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