2013-03-13 3 views
34

/home/.bashrc에 심볼릭 링크가 있는데 실제로는 .bashrc 파일을 가리키며 다른 곳에서는 /some/other/path/.bashrc이라는 자식 저장소가 있습니다. 내가 실제 파일을 편집 할 때부터 보통, y을 입력이맥스와 심볼릭 링크

Symbolic link to Git-controlled source file; follow link? (y or n) 

: 내가 이맥스에 /home/.bashrc를 열면

, 그것은 저를 묻는 메시지가 나타납니다. 그러나 나중에, 내가 할 경우 buffer-file-name 이멕스는 /some/other/path/.bashrc을 반환하고 /home/.bashrc을 반환하지 않습니다.

이맥스에 을 쓰고 싶습니다.은이 파일에 액세스하는 방법이 심볼릭 링크를 통해 이루어 졌음을 기억합니다.

다른 말로하면, 저는 심볼 링크가 이맥스에게 투명 해지기를 바랍니다. 그 이유 중 하나는 현재 파일의 경로에 의존하는 여러 Emacs 매크로가 있고 /some/other/path에 있고 /home/이 아닌 파일로 작업하고 있다고 생각하기 때문입니다.

어떻게하면됩니까?

답변

38

그것은

Symbolic link to Git-controlled source file; follow link? (y or n) 

유형 n로하라는 메시지가 나타나면. symlink를 따르고 symlink가 가리키는 파일을 직접 여는 대신, emacs는 원하는대로 symlink 자체를 사용합니다.

경고 :이 기능을 사용하면 대상에서 저장소를 검색하고 해당 저장소와 상호 작용할 수 없습니다 (예 : 이맥스 버전 제어 기능).

기본 동작을 변경하려면 vc-follow-symlinks 맞춤 변수의 설명서를 확인하십시오. (C-h v vc-follow-symlinks)

+1

'아니오'라고 대답하고 링크를 통해 파일을 편집하면 git status가 파일이 수정되었음을 올바르게 나타내고 올바른 diff를 보여줍니다. 이것이 "버전 제어 시스템을 우회하는"무엇입니까? – raychi

+2

Emacs VC 지원을 사용할 수 없다는 것을 의미합니다 : 상태, 버전, 사용 가능한 동작/바로 가기 같은 특정 정보. –

30

그냥 완전성에 대한 질문에 대한

Symbolic link to Git-controlled source file; follow link? (y or n)

을 가지고 있지만 반드시 영업 이익은 원하는 것을하지 않는 사람에 대한이 내 이맥스 버전으로 C-h v vc-follow-symlinks에서 문서 (이다 -) 자세한 내용은 자신의 이맥스를 조회 :

vc-follow-symlinksvc-hooks.el에 정의 된 변수입니다. 그 값은 다음과 같습니다.

문서 : 버전 제어로 파일에 대한 심볼릭 링크를 방문 할 경우 수행 할 작업. 링크를 통해 이러한 파일을 편집하면 버전 제어 시스템 인 을 우회하여 위험하고 아마도 사용자가 원하지 않는 것일 수 있습니다.

이 변수가 t이면 VC는 링크를 따라 실제 파일 인 에코 영역에서 을 방문합니다. 'ask'인 경우 VC는 확인 링크가 링크를 따라야하는지 확인합니다. nil 인 경우 링크는 이며 경고가 표시됩니다.

이 변수를 사용자 정의 할 수 있습니다.

결론적으로 당신은 당신의 .emacs 세트 중 하나

(setq vc-follow-symlinks t) 

항상 심볼릭 링크를 따라 (직접 파일 "실제"를 편집), 또는

에, 그 때마다 메시지가 표시되지 않도록 할 수있다
(setq vc-follow-symlinks nil) 

symlink 자체에있는 것처럼 파일을 항상 편집해야합니다 (이 작업은 정상적으로 작동합니다 - 심볼릭 링크 또는 다른 것을 삭제하지는 않지만 파일에서 버전 제어 관련 항목을 사용할 수 없습니다).). 나는 (OP와는 달리) 전자를 선호한다.

4

요청한 바로 가기 키가있는 특정 파일에만 액세스하려는 유스 케이스가있는 경우 파일의 모든 심볼 링크를 해결하는 file-truename 함수를 사용하면 변경하지 않고 성가신 질문을 방지 할 수 있습니다 그 외 모든 것에 대한 기본값.

(global-set-key (kbd "<f7>") (lambda() (interactive) 
    (find-file (file-truename user-init-file)))) 
+0

그냥'let'-bind'find-file-visit-truename'을 왜 바인딩하지 않습니까? –

+0

''((find-file-visit-truename t)) (find-file user-init-file))''을 사용 하시겠습니까? 세 가지 이유가 있습니다. 첫째, elisp의 동적 범위 지정 규칙을 사용합니다 (필자는이 기능이 마음에 들지 않으므로 가능한 경우 피하고 싶습니다). ''(find-file (file-truename user-init-file))''적어도 let bind만큼 간단합니다. 그리고 마지막으로, 필자는''find-file-sisit-truename''에 대해서 알지 못했습니다. – Arne

+0

이것들은 모두 합당한 이유입니다. 그러나 동적 범위 지정을 피해야한다고 생각하지 않습니다. 이와 같은 사용 사례가 동적 범위 지정이 유용한 이유입니다. 참고로, 어휘 범위 지정을 사용하더라도 선언 된 변수는 여전히 동적 범위로 지정되므로 단점도없이 동적 범위 지정의 모든 이점을 얻을 수 있습니다. –

3

당신이 알고하거나 완전히 vc뿐만 아니라 심볼릭 링크를 따라 약이 성가신 메시지를 비활성화

(setq vc-handled-backends nil) 

할, 이맥스 'vc 패키지에 대해 걱정하지 마십시오.

그러면 symlinks를 따르는 파일을 찾을 것인지 말 것인지에 따라 find-file-visit-truename을 사용자 정의 할 수 있습니다.