새 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>
이를 통해 가상 머신 정의를 템플릿화하고 프로그래밍 방식으로 사용자 정의할 수 있습니다.