`find-file-noselect`의 문제점은 무엇입니까?


11

최근에 대답 하여 lunaryorn , 그는 말했다 :

그러나 의견에 이미 언급 된 이유로 인해 조직의 다른 대부분의 부분에 대해 권장합니다. 구식이며 오래된 레거시 및 유해한 관행으로 가득합니다 (예 : find-file-nointeractively 파일을 읽으려면 noselect).

누구든지 find-file-noselectElisp 프로그램에서 파일을 읽는 것이 좋지 않은 이유를 설명 할 수 있습니까 ? 더 좋은 방법이 있습니까? 내 프로젝트 중 하나에서 사용하려고 생각했기 때문에 묻습니다.


겉보기에는 good-practices이전에 태그 가 없었습니다 . 그것을 사용하는 것이 좋습니다?
mbork

나는 생각 good-practices한다 "메타 태그"의 범주에 속하는 것이다 눈살을 찌푸리게 SE에 의해.
nispio

1
@nispio 유효한 태그라고 생각하지만 물론 메타로 가져올 수 있습니다.
Malabarba

1
@ nsipio : 그 기사를 훑어 보았지만 동의하지 않습니다. 그러나 내가 결정하는 것은 내가 아닙니다. ;-)
mbork

답변:


14

TL; DR : 실제 상황에 대한 제어 권한find-file-noselect없으므로 사용자가에서 활성화 한 내용에 따라 버퍼에서 임의의 마이너 모드가 활성화 될 수 init.el있습니다. 또한 정리가 어렵습니다.

사용 with-temp-buffer하고 insert-file-contents대신. 버퍼에 특정 주요 또는 부 모드가 필요한 경우 명시 적으로 활성화하십시오 . 파일을 쓰려면 with-temp-file대신 이름을 사용하더라도 임의의 파일에 쓸 수 있습니다.

부작용

find-file-noselect다음을 포함 하여 많은 부작용이 있습니다

  • 대화식으로 질문하기 (비 대화식 사용에서는 그 자체만으로는 불가능합니다),
  • 읽기 전용 파일에 대한보기 모드 자동 활성화
  • 그렇지 않으면 일반 모드로 들어가고
  • 그리고 달리기 find-file-hook.

일반 모드 자체

  • 현재 버퍼에 적합한 메이저 모드를 자동으로 선택합니다.
  • 해당하는 모든 주 모드 및 부 모드 후크를 실행합니다.
  • 현재 버퍼에 대한 모든 로컬 변수, 즉 파일 변수 및 디렉토리 변수를 읽습니다.이 변수는 안전하지 않은 로컬 변수에 대한 대화식 질문을 다시 요청할 수 있습니다.

모든 후크가 실행되기 때문에, 당신은 얻을 모든 사소한 모드와 후크 기능 은 사용자가 자신의 활성화 init.el사용자가 기대를 후크 기능을 추가 한 경우 (주요 혼란에 약간의 불편 (바람직하지 않은 사소한 모드가 활성화 된 경우)에서 모두 발생할 수 있습니다, 대화 형 컨텍스트에서 호출됩니다.

예제는 https://github.com/flycheck/flycheck/issues/366 을 참조 하십시오 . 의 사용 find-file-noselect인한 데이터 파일 구문 확인 Flycheck가 될 수 있습니다, 그것은 이맥스에서 무슨 일이 벌어지고 있기 때문에 셧다운 제대로 뒤에 임시 파일을 떠나, 다시 정리 할 시간이 없었다.

대청소

으로 find-file-noselect당신이 추가주의해야 다시 버퍼를 죽일. find-file-noselect당신을 위해 그렇게하지 않습니다.

어떤 위치에서 버퍼를 기억해야하며, unwind-protect로컬이 아닌 종료의 경우에도 버퍼가 종료되도록 신중하게 사용해야 합니다.

대안

파일 사용을 읽으려면 with-temp-bufferinsert-file-contents전용 예를 들어, 시스템 변환 코딩 가장 기본적인 일을, 않지만, 후크, 또는 설치 지역 변수를 활성화 질문을하지 않는 :

(with-temp-buffer
  (insert-file-contents (locate-user-emacs-file "foo.el"))
  ;; Enter the major mode explicitly
  (emacs-lisp-mode)
  ;; …
  )

with-temp-buffer 본문 끝에서 임시 버퍼를 올바르게 종료하도록주의합니다.

파일을 쓰려면을 사용 with-temp-file하여 임시 버퍼를 만들고 본문 끝의 지정된 파일 이름에 내용을 씁니다.

(with-temp-file  (locate-user-emacs-file "foo.el")
  (prin1 (list 'my 'data) (current-buffer)))

10

Elisp 매뉴얼의 섹션 24.3에서 :

파일의 내용을 버퍼에 복사하려면 함수를 사용하십시오 insert-file-contents. insert-fileLisp 프로그램에서 명령 을 사용하지 마십시오 . 마크가 설정됩니다.

Elisp 문서를 검색하면 find-file-noselect파일을 버퍼로 읽는 것 이상의 기능을 수행 할 수 있습니다. 이 기능을 사용하는 것이 좋지 않다고 생각하는 사람들은 아마도 원치 않는 부작용에 대해 생각하고 있습니까? 나는 그것이 당신이 달성하고자하는 것에 달려 있다고 생각합니다. 가능한 깨끗하고 손대지 않은 버퍼 내용을 원한다면, 구식 with-temp-buffer+ 신뢰 + insert-file-contents조합 을 사용하는 것이 좋습니다 . 이 버퍼의 내용이 무엇인지에 가까운 수 있도록하려면 find-file생산, 아마 당신은 않습니다 사용할 find-file-noselect? 또는 아마도 그는 생각하고 있었다 find-file;)


3
비 대화식으로 무언가가 수행되면 "버퍼 내용이 find-file이 생성하는 것에 가깝도록" 하려는 시나리오를 볼 수 없습니다 . find-file은 모든 종류의 후크를 포함하여 많은 불필요한 것들을 수행하기 때문에 느립니다. 원하는 find-file의 유일한 "기능"은 주 모드이지만 직접 활성화해야합니다. find-file이 원하는 모드를 켤 수는 없습니다.
Malabarba

Malabarba : 버퍼를 사용자가 편집 할 수있게하려면 find-file프로세스 를 모방하는 것이 좋습니다.
phils
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.