vim: Как вставить вывод команды оболочки в строку?

Похоже, что что-то разделило файл. Когда вы пытаетесь распаковать tar файл .a, не прерывается ли он раньше времени? Это намек на то, что он разделен. Файл .a имеет размер 4 ГБ? Это еще один намек. Попробуйте объединить файлы на машине, которая может работать с большими файлами...

cp myfile.tar.a myfile_full.tar
cat myfile.tar.b >> myfile_full.tar
tar xvf myfile_full.tar
2
25.03.2019, 08:49
3 ответа

Я поэкспериментировал, и это не совсем так, как вы хотите, поскольку :r всегда будет переходить на новую строку. Но он должен делать то, что вы хотите для результата.

:.!UUID=`uuidgen` ; echo "<uuid>$UUID</uuid>"

Он помещает стандартный вывод в текущую строку (не в курсор)-интеллектуальные операции выполняются с помощью вызываемой команды.

3
27.01.2020, 22:02

: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>); для еще большего удобства вы можете определить сопоставление для всего этого.

3
27.01.2020, 22:02
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 в каретку.

Конечно, вы можете использовать другую привязку вместо "!.

1
27.01.2020, 22:02

Теги

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