대체 버퍼가없는 경우 : bd #가 현재 버퍼를 삭제하는 이유는 무엇입니까?


9

다음은 관찰중인 동작을 재현하는 방법입니다.

먼저 다음 명령을 입력하십시오.

echo aaaaa > a
vim a

Vim에서 다음 명령을 입력합니다.

:ls
:e #
:echo bufname('#')

위 세 명령의 출력은 다음과 같습니다.

:ls
  1 %a   "a"                            line 1

:e #
E194: No alternate file name to substitute for '#'

:echo bufname('#')

bufname('#')명령은 출력을 생성하지 않습니다.

이제이 명령을 입력하십시오 :

:bd #

현재 버퍼가 삭제되고 "[이름 없음]"버퍼로 바뀝니다.

:ls
  2 %a   "[No Name]"                    line 1

나는 E194실행 오류가 발생할 것으로 기대했다 :bd #. 왜 현재 버퍼를 삭제 했습니까?

사용하고 VIM - Vi IMproved 8.0있습니다.


1
흥미로운 점입니다. 귀하의 질문에 이것이의 경우라고 언급 할 수 있습니다 NVIM v0.3.0-dev.
클라우스

@LoneLearner 현상금으로 인해 실제로 답변하지 않았지만 당신이 하나를 제공 할 경우 가치있는 답변에 수여하면 좋을 것입니다 ... alas, 거의 로그인하지 않았습니다. 주와 현상금 기간이 끝났습니다 ...
B Layer

1
@BLayer 죄송합니다. 현상금을 수여하는 것을 잊었습니다. 당신은 환상적인 답변을 작성했습니다. 이 Stack Exchange 사이트에 포인트가 충분하면이 질문에 대해 다른 현상금을 시작하고 현상금을 귀하에게 수여합니다. 내 실수가 해결되기를 바랍니다. 당신이 쓴 큰 답변에 감사드립니다.
고독한 학습자

@LoneLearner 안녕하세요, 걱정하지 않아도됩니다. 귀하의 의견에 감사드립니다. 현상금에 대해 걱정하지 마십시오. 내가 말했듯이 그것은 요점에 관한 것이 아닙니다. 다음에 현상금을 낼 때 머리를 내밀고 싶었습니다. 여기에서 그쪽으로 포인트를 넣으십시오. 건배!
B 레이어

답변:


7

증거

대체 파일이 없기 때문에 실제로는 일반 ol '을 실행 중입니다 :bd. 현재 버퍼를 삭제하고 ...없이 시도 #하면 결과가 동일합니다. 비슷한 일이 함께 발생 :buffer, :sbuffer적어도 동의를 몇 다른 명령 #인수로 : 그들은 자동으로 인수가 전달되지 않은 경우로 동작합니다.

같은 줄을 따라이 :bunload #오류가 발생하면 : E90: Cannot unload last buffer. :bunload인수없이 실행 하면 다시 한 번 동일한 결과를 얻을 수 있습니다.

문서

따라서 우리는 #"아무것도"(아마도 빈 문자열)로 대체되고 있다는 증거가 있습니다 . 여기서 어디로 가나 요? 이 동작에 대한 언급을 찾으려고 잠시 동안 도움말 파일을 둘러 보았습니다. 명시적인 것이 없었지만 :h cmdline-lines(한두 페이지 아래로 스크롤) ...

파일 이름이 예상되는 위치에 문자 '%'또는 '#'이 사용되면 현재 및 대체 파일 이름으로 확장됩니다.

Vim #expand()함수 (즉 expand('#')) 또는 적어도 동일한 기본 코드를 사용 했음을 읽었 습니다.

:h expand() 말한다 :

.. 특수 키워드를 확장하십시오. .. '%'또는 '#'을 사용할 때 현재 또는 대체 파일 이름이 정의되지 않은 경우 빈 문자열이 사용됩니다.

익숙한 것 같습니다.

코드

이제 위의 어느 것도 확실하지 않거나 이유에 대한 단서를 제공하지 않습니까? 그래서 코드를 파는 데 더 많은 시간을 보냈습니다 ... 내 C는 매우 녹슨 내가 어떤 좋은 도구가 설치되지 않은하지만 몇 가지 설정을하는 기능을 찾기 위해 관리 :bdelete라는를 do_bufdel(). 이를 통해 명령 줄 인수를 전송 buflist_findpat()하는 경우, 어떤 #, 반환 값을 발생한다 curwin->w_alt_fnum. 이것이 대체 버퍼의 "버퍼 번호"입니다.이 시나리오에서는 양수 값이 될 수 없습니다. (반환 값이 선택되기 전에 alt 파일이 유효한지 / 존재하는지 확인할 수 없습니다.)

do_bufdel()0보다 작은 버퍼 번호에 대한 반환 값에 대해 다시 체크 아웃됩니다 .이 경우 매개 변수 처리 루프가 중단됩니다. 그 결과 핵심 :bdelete코드에 매개 변수가 표시되지 않습니다 ... 이것은 이전의 직관과 일치합니다.

무엇 향후 계획?

명확한 버그처럼 보이는 것을 보지 못하도록 설계된 것처럼 작동하는 것으로 보입니다. 그러나 간과 될 수있는 죄책감이있을 수 있습니다. 그러나 이것을 작성한 개발자 만이 확실합니다. 따라서 마지막 단계는 입력을 얻는 것입니다. 으로 기독교 B.는 상기 Vim은-DEV리스트에 물어가는 방법이다.

(주 buflist_findpat()는 것을 가정하는 상상력의 스트레칭을 필요로하지 않을 수 있도록하는 유틸리티 함수입니다 :bunload, :buffer에 대한 공동의 행동을 설명 할 것 등을 사용하고, 너무 ... #.)


확장 된 버퍼가 있는지 확인하는 기능이 하나 더 있다고 생각합니다. 이것이 의도적으로 설계된 것입니까? 나는 이것이 버그로 나열되어야한다고 생각합니다.
클라우스

나는 당신의 연구가 맞다고 생각합니다. BTW : 나는 이것이 실제로 버그라고 생각하지 않습니다.
Christian Brabandt

방금 내 결론을 조금만 말하면 .... 딱딱한 버그처럼 보이지 않습니다. OTOH, 그것에 대해 생각하면 더 나은 처리가 필요하다고 결론 내릴 수 있습니다. 아마도 개발자 만 알고있을 것입니다.
B 레이어

예, vim-dev 목록에서 확인을 요청할 수 있습니다.
Christian Brabandt 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.