버퍼가 파일을 방문하고 있는지 확인하는 방법?


9

일부 (예 : 현재) 버퍼가 파일을 방문하고 있는지 확인하고 싶습니다. 나는 말할 수 있습니다 :

(if (buffer-file-name) ...)

그러나 그것은 매우 우아하지 않은 것 같습니다. 제가 관심있는 것은 실제 버퍼 이름 이 아닌 부울 값 입니다. buffer-file-name함수가 Elisp로 작성된 경우 소스를 조사하여 사용 내용을 찾을 수는 있지만 C로 작성되었으며 Emacs 소스를 설치할 수는 있지만 elisp 이름을 찾을 수 없습니다. 어쨌든 내가 무엇을하고 있는지 확인하는 기능.

내가 필요로하는 것은 현재 버퍼 파일의 이름을 기반으로 디렉토리를 만들고 싶습니다. 현재는이 작업을 다소 수행하고 있습니다.

(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))

그렇다면 이것을하는 Elisp- 아이디 오마 틱 방법은 무엇입니까?


2
buffer-file-name실제로 사용에 반대하는지 잘 모르는 경우 올바른 방법입니다 (정말 원한다면 t그렇게 (and (buffer-file-name) t)나쁘지 않은 IMO입니다). 구현은 filename버퍼 C 구조체 의 필드를 읽는 것인데, 이는 Elisp에서 직접 액세스 할 수 없습니다. 결국, 그것은 null이거나 아닌 포인터 일뿐입니다.
시그마

글쎄, 이것이 올바른 방법이라면 나에게 괜찮습니다. 내가 말했듯이-나는 C 구현을 몰랐고 상식에 따르면 중복이 있는지 여부 만 알고 싶을 때 파일 이름을 요구한다고 말합니다.
mbork

그리고 나는 그것이 (and (buffer-file-name) t)이상하게 보인다는 것에 동의합니다 .
mbork

그것이 (if (buffer-file-name) ... )우아 하지 않다고 생각한다면 , 오랫동안 아주 오랫동안 코딩하지 않았습니다. 여기서 만 추악 해집니다.
nispio

답변:


12

버퍼 이름은 그 자체로 완벽하게 적절한 부울 값이므로 사용 관용적 생략 이라고 주장합니다 . 매뉴얼 에서 인용 :

if 표현에서 진실 테스트에는 중요한 측면이 있습니다. 지금까지 우리는 술어 값이 마치 새로운 종류의 Emacs Lisp 객체 인 것처럼 '참'과 '거짓'을 언급했습니다. 사실 '거짓'은 우리의 오랜 친구 일뿐 nil입니다. 다른 것, 전혀없는 것이 사실이다.

더 자세히 알아 보려면 코드를 확인하십시오 clone-buffer. 다음을 보게 될 것입니다.

(interactive
 (progn
   (if buffer-file-name
       (error "Cannot clone a file-visiting buffer"))
...

이것은 buffer-file-name인수없이 함수를 호출하는 대신 변수 바인딩을 테스트하고 (buffer-file-name)있지만 항상 동일하게 작동해야합니다.


8

(buffer-file-name)(선택적 버퍼 인수와 함께) 또는 버퍼 로컬 buffer-file-name변수를 사용할 수 있습니다 . 주어진 버퍼에 대해 동일한 값으로 평가됩니다.

입니다 코드가 벌금 그래서하지만, Elisp에서이 작업을 수행 할 수있는 관용적 인 방법. 필사적으로 원한다면 buffer-has-file-p래퍼 기능을 항상 만들 수 있습니다.


감사. 함수 나 변수를 선택하는 데 큰 차이가 있습니까?
mbork

1
나는 그렇게 생각하지 않습니다. 버퍼 인수를 표시 해야하는 경우 (buffer-file-name BUFFER)확실히보다 낫습니다 (with-current-buffer BUFFER buffer-file-name). 그러나 사용하는 것이 중요하지 않다고 생각합니다 (함수가 C로 작성됨에 따라 성능에 큰 차이가 있음을 의심합니다).
phils

3

그냥 사용하십시오 buffer-file-name. Lisp에서는 종종 nil값 이 아닌 값을 사용하여 true 를 의미 합니다 .

이 기능을 사용하지 않으려는 경우는 비용이 많이 들거나 원하지 않는 부작용이있는 경우입니다.


내가 참조. 나는 사실이 아닌 nil것이 사실 이라는 것을 알고 있습니다. 나는 어떤 이름이 존재 하는지 여부 만 알고 싶을 때 그 이름을 붙잡는 것을 생각했습니다. "비용이 많이 드는"것 같습니다.
mbork

1

에서 은 "버퍼 목록"장 문서의 :

buffer-list에 의해 리턴 된리스트는 구체적으로 구성됩니다. 내부 Emacs 데이터 구조 가 아니며이를 수정해도 버퍼 순서에 영향을 미치지 않습니다.

따라서 라이브 버퍼 목록에서 검색하는 방법을 찾아야합니다. 여기 하나가 있습니다 :

  (if (string-match-p (regexp-quote "My buffer name") (format "%s" (buffer-list)))
      (message "Open")
    (message "Not open"))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.