나는 % 레지스터에 현재 버퍼의 전체 경로가 포함되어 있다는 것을 알고 있습니다. 하지만 다른 버퍼의 전체 경로를 해당 번호로 얻는 방법은 무엇입니까?
VIM에 그러한 기능/명령이 있습니까?
제가 이 질문을 어떻게 생각해냈는지 설명하고 싶습니다.
2개의 버퍼가 열려 있습니다. 첫 번째는 왼쪽 창의 XML 파일이고 다른 하나는 오른쪽 창의 XSD 파일입니다. 나는 그것을 편집했습니다. 편집하는 동안 스키마에 대해 XML의 유효성을 검사하고 싶습니다.
그러나 주문은
!xmllint --schema /tmp/schema.xsd %
물론 이는 현재 버퍼가 XML을 포함하는 경우에만 작동합니다. 그래서 /tmp/schema.xsd
버퍼 번호로 전체 경로를 결정할 수 있는 일부 명령이나 함수 호출로 대체 할 수 있는지 궁금합니다 . 그것은 다음과 같습니다:
!xmllint --schema getBufferPath(3) %
답변1
expand()
통화를 이용하시면 됩니다 . 예를 들어
:echo expand("#2:p")
버퍼 #2에 있는 파일의 전체 경로를 인쇄합니다. 다음을 사용하여 모든 버퍼를 나열할 수 있습니다.:ls
다른 수식어와 다른 키워드를 사용할 수 있습니다(전체 정보는 페이지 참조 :help expand()
).
다음은 간략하게 발췌한 내용입니다.
When {expr} starts with '%', '#' or '<', the expansion is done like for the cmdline-special variables with their associated modifiers. Here is a short overview: % current file name # alternate file name #n alternate file name n <cfile> file name under the cursor <afile> autocmd file name <abuf> autocmd buffer number (as a String!) <amatch> autocmd matched name <sfile> sourced script file name <slnum> sourced script file line number <cword> word under the cursor <cWORD> WORD under the cursor <client> the {clientid} of the last received message server2client() Modifiers: :p expand to full path :h head (last path component removed) :t tail (last path component only) :r root (one extension removed) :e extension only Example: :let &tags = expand("%:p:h") . "/tags" Note that when expanding a string that starts with '%', '#' or '<', any following text is ignored. This does NOT work: :let doesntwork = expand("%:h.bak") Use this: