vim: 쉘 명령의 출력을 어떻게 삽입하나요?

vim: 쉘 명령의 출력을 어떻게 삽입하나요?

새 libvirt XML 파일을 편집하고 싶다고 가정해 보겠습니다.

virsh dumpxml machine1 > machine2.xml

그런 다음 다음을 사용하여 파일을 엽니다 vim.

vim machine2.xml

그런 다음 UUID를 변경하고 싶습니다. 이제 이 작업을 수행하기 위해 다음을 사용합니다.

:r ! uuidgen

그러나 새 UUID는 현재 줄 아래에 삽입됩니다.

<uuid>6r123ttz-6t01-356t-1y7h-g7oe196c8u3m</uuid>
e67baf90-751b-4aea-a14b-aca1b881542b

uuidgen명령 출력을 삽입하는 방법입력하다현재 행이 있으므로

<uuid></uuid>

(커서는 사이에 있음 ><), 실행하면 다음을 uuidgen얻습니다.

<uuid>e67baf90-751b-4aea-a14b-aca1b881542b</uuid>

문제는 :r새로운 줄을 추가하지 않고도 vim 명령을 사용할 수 있느냐는 것입니다.

답변1

:read이전 명령;불행히도 이것들은 항상 작동합니다완전한 라인. 먼저 분할한 다음 이전 및 다음 줄을 결합하거나 다른 명령을 사용하여 문제를 해결해야 합니다.

이것:help i_CTRL-R명령은 임의의 레지스터 내용을 삽입할 수 있습니다. 특별한 것이 있습니다표현식 레지스터(:help quote=) Vimscript 표현식을 실행하고 그 결과를 사용합니다. 마침내,system()함수는 외부 명령을 실행하고 해당 출력을 반환합니다.

따라서 (삽입 모드에서) <C-R>=system('uuidgen')<CR>명령의 출력은 현재 위치에 삽입됩니다. 불행하게도 출력에는 줄 바꿈이 있으며 이는 보존되므로 </uuid>다음 줄로 이동됩니다. 이를 방지하려면 system('uuidgen')[0:-2]또는 표현식으로 substitute(system('uuidgen'), '\n$', '', '')출력을 자를 수 있습니다.

반복 삽입의 경우,역사를 표현하다마지막 표현식을 호출하는 데 사용할 수 있습니다(누르기 <Up>). 전체에 대한 매핑을 정의하면 더 편안해집니다.

답변2

나는 조금 놀았지만 :r이 항상 개행 문자를 입력하기 때문에 정확히 원하는 것을 수행하지 않습니다. 하지만 원하는 결과가 나와야 합니다.

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

현재 행(커서가 아닌)에 표준 출력을 배치합니다. 지능은 호출되는 명령으로 수행됩니다.

답변3

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가 삽입됩니다.

물론 다른 바인딩을 대신 사용할 수도 있습니다 "!.

답변4

를 사용하지 않고도 XML을 직접 편집할 수도 있습니다 vim.

예를 들어 <uuid></uuid>파일의 일부로 제공되면 값을 삽입하거나 업데이트할 수 있습니다.

echo '<uuid></uuid>' |
    xmlstarlet edit --update '//uuid' -v "$(uuidgen)"

산출

<?xml version="1.0"?>
<uuid>79cc09da-a256-46d5-9974-9073cf9d7a9a</uuid>

이를 통해 가상 머신 정의를 템플릿화하고 프로그래밍 방식으로 사용자 정의할 수 있습니다.

관련 정보