2011년 4월 18일 월요일

[Emacs] anything-for-files 의 문제

이전 anything-for-files를 C-x C-f에 바인드 시켜서 파일을 열 때 사용할 수 있는 예제를 적었던 적이 있다. 그런데 이 방법으로 파일을 열 때 간혹 에러가 표시되는 문제가 있다. (미리 언급하는데 이 글은 이 문제를 해결한 기록이 아님을 밝힌다.)

문제의 에러는 window-live-p 가 void variable 이라는 오류다. 이 코드는 anything.el에서 사용되고 있다.

GNU Emacs 상의 공식 매뉴얼에서는 window-live-p 는 현재 윈도우가 살아있는지 죽어있는지를 돌려주는 함수라고 알려주고 있다. 공식 API인데 왜 void-variable인 것인가.

이와 관련해서 비슷한 경험을 한 유저의 일기(?)를 발견할 수 있었다.

http://d.hatena.ne.jp/alfaladio/20101101/1288539625

일본어 페이지라 읽기 좀 부담되겠지만, 어쨌든 문제를 일으키는 곳은 anything-for-files 라는 부분에서 동일한 증상이라는 것을 알 수 있었다.

문제가 발생하는 원인을 추측해보자면 updatedb/locate 라는 외부 유틸리티를 사용하는 과정에서 발생하는 것 같다. 왜냐하면 anything-for-files 는 이 locate를 활용해 파일 경로를 알아낼 수 있고, 이 외의 anything 함수들은 딱히 문제를 일으키지 않는 것 같기 때문이다. 아마도 locate가 동작하는 특정 순간에 윈도우가 이미 사라져 버렸다 라고 가정하는 수 밖에... (void-variable이란 nil이 리턴되었다는 것을 의미할 수도 있겠지. 그렇다면 윈도우가 사라졌다는 의미가 되겠고...)

문제는 어떻게 해결 할 수 있을까. 아직 명확한 해법은 아직 없다. 증상이 100% 나타난다면 우회케이스를 만들 수 있겠지만 현재로썬 정확한 원인 파악이 힘들기 때문에다.

이에 대해 anything의 메인테이너인 rubykitch 님의 글에서는 anything-filelist+ 를 활용하는 방법을 제시하고 있다. (역시 일본어 페이지다)

http://d.hatena.ne.jp/rubikitch/20100915

anything-filelist는 특정 파일 내에 적혀있는 파일 리스트 내에서 파일 이름을 검색하는 기능을 제공한다. anything-filelist+는 여기에 몇 가지 추가기능이 붙어있는 기능을 제공한다.

파일 리스트를 만들어서 anything-filelist+ 를 사용하면 되겠다. 이게 locate를 사용할 때 비하면 훨씬 빠를 테니깐.

이 삽잘기는 여기서 끝. 현재 구축 중인 환경을 좀 더 다듬어서 안정적으로 동작할 때 소개를 해야 할 것 같다. -_-;;

댓글 없음 :