Похоже, что что-то разделило файл. Когда вы пытаетесь распаковать tar
файл .a
, не прерывается ли он раньше времени? Это намек на то, что он разделен. Файл .a
имеет размер 4 ГБ? Это еще один намек. Попробуйте объединить файлы на машине, которая может работать с большими файлами...
cp myfile.tar.a myfile_full.tar
cat myfile.tar.b >> myfile_full.tar
tar xvf myfile_full.tar
Я поэкспериментировал, и это не совсем так, как вы хотите, поскольку :r всегда будет переходить на новую строку. Но он должен делать то, что вы хотите для результата.
:.!UUID=`uuidgen` ; echo "<uuid>$UUID</uuid>"
Он помещает стандартный вывод в текущую строку (не в курсор)-интеллектуальные операции выполняются с помощью вызываемой команды.
:read
является командой Ex ; к сожалению, они всегда работают с полными строками .Вам либо нужно обойти это, сначала разделив, а затем соединив с предыдущей и последующей строками, либо вы используете другую команду.
Команда:help i_CTRL-R
может вставить любое содержимое регистра. Существует специальный регистр выражений (:help quote=
), который выполняет любое выражение Vimscript и использует его результат. Наконец, функцияsystem()
выполняет внешнюю команду и возвращает результат.
Итак, (в режиме вставки)<C-R>=system('uuidgen')<CR>
вставит вывод команды в текущую позицию. К сожалению, вывод имеет завершающую новую строку, и она сохраняется, поэтому </uuid>
перемещается на следующую строку. Чтобы избежать этого, вы можете обрезать вывод либо через system('uuidgen')[0:-2]
, либо через substitute(system('uuidgen'), '\n$', '', '')
в качестве выражения.
Для повторяющихся вставок можно использовать историю выражений для вызова последнего выражения (, нажав<Up>
); для еще большего удобства вы можете определить сопоставление для всего этого.
fu! SetBang(v) range
if a:v == 1
normal gv
endif
let l:t = &shellredir
let &shellredir = ">%s\ 2>/dev/tty"
let @" = join(systemlist(input("\"!"))," ")
let &shellredir = l:t
endf
nnoremap "! :cal SetBang(0)<cr>
xnoremap "! :cal SetBang(1)<cr>
Каждый раз, когда вы нажимаете "!
, пользователю будет предложено ввести команду, и «безымянный» регистр "
будет заполнен ею. Затем вы можете вставить его, как обычно, с помощью P
в обычном или визуальном режиме, с помощью Ctrl-R"
в режиме вставки и т. д.
Например, если текст (отображается с помощью|
):
<uuid>|</uuid>
и нажатие "!uuidgen<Enter>P
вставит новый uuid в каретку.
Конечно, вы можете использовать другую привязку вместо "!
.