나는 % 레지스터에 현재 버퍼의 전체 경로가 포함되어 있다는 것을 알고 있습니다. 하지만 다른 버퍼의 전체 경로를 해당 번호로 얻는 방법은 무엇입니까?
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: