2012-04-24 1 views
8

inotifywait을 사용하여 특정 폴더를 모니터링하고 필요한 경우 다시 컴파일하려고합니다. 문제는 내가 많이 정력을 사용하고 있다는 것입니다, 나는 정력에 편집있을 때 실제로 수정 된 모든 파일은 같은 일부 '중복'이벤트를 트리거 :vim에서 편집하는 동안 너무 많은 inotify 이벤트가 발생했습니다.

:w 
sass/somefolder/ CREATE 4913 
sass/somefolder/ CREATE some 
sass/somefolder/ MODIFY some 

그것은 실현하기 위해 좀 시간이 걸렸를 실제로 모든 것을 inotifywait은 정상입니다. nano을 사용하려고 시도했지만 모든 것이 예상대로 작동했지만 "수정"만 실행됩니다.

필자는 이클립스와 함께 이맥스에 문제가있다. (테스트 용으로 열심히 판단하지는 않는다.) Ctrl-X + Ctrl + S를 3 번씩 누른다. .

질문은 vim에서 불필요한 이벤트와 관련된 문제를 어떻게 해결할 수 있습니까?

그런데 .vimrcdirectorybackupdir이 모니터링되는 폴더에 없습니다.

UPD : This link explains 실제로 어떻게 일이 벌어지는가?하지만이 문제를 해결하는 방법은 아직 모릅니다. 음, 물론 내가 문자열이 포함 된 4913 무시할 수 있지만,이 경우에도)))

UPD를 SASS를 컴파일 할 inotify를 사용하려고 하나 너무 미봉책입니다 : VIM 버전하면 경우 7.3.429

답변

7

입니다 파일을 편집 한 후 코드 재 컴파일과 같은 작업을 트리거하려는 경우 보통 IN_CLOSE_WRITE 이벤트를보고 다른 모든 작업은 무시하고 싶습니다.

절대적으로 은 파일을 편집하는 동안 발견 된 것처럼 여러 번 트리거 될 수 있으므로 IN_MODIFY 이벤트를 모니터링하려고합니다.

그래서 :

inotifywait -e close_write ... 
+0

이 답변에 감사드립니다. '-e close_write' 옵션은 분명히 더 좋지만, 여러 개의 수정으로 만 문제를 해결할 수 있지만 신비한'sass/somefolder/CLOSE_WRITE, CLOSE_WRITE, CLOSE_ 4913' 이벤트는 해결하지 않습니다. – shabunc

+0

디렉토리의 이벤트를 무시할 수 있습니다 ...'inotifywait'가 경로를 출력 할 때까지 스크립트가 디렉토리인지 확인하고 ('[-d ...]'), 파일이 수정 된 경우에만 액션을 트리거 할 수 있습니다. – larsks

+1

기본적으로 vim은 파일을 저장하면 새로운 파일을 만들고 그 파일에 쓰기 작업을 수행하며, 파일이 성공적으로 작성되면 vim은 이전 파일을 삭제하고 새 파일의 이름을 바꿉니다. 이것은 일부 가짜 이벤트의 원인 일 수 있습니다. 'set nowritebackup'을 사용하여 이것을 끌 수 있습니다. ': help backup-table'과 친구들을보십시오. –

2

더 나은 편집자는 그것을 원 자성을 적용 할 그 길을한다. 다른 말로하면, 권력이 잘못된 순간에 죽으면 반쯤 쓰여진 파일로 끝나지 않을 것입니다.

하나의 옵션은 autocmd BufWritePost을 사용하여 다시 컴파일하는 것입니다.

그러나 vim 외부에서 다른 변경을 수행하면 여러 알림을 기다렸다가 일정 기간 (예 : 0.5 초) 동안 아무 일도 일어나지 않으면 컴파일을 수행하는 것이 좋습니다. 그것은 예를 들어 소스 제어 풀 (pull)을하는 것과 같은 다른 우발적 인 사건을 다룰 것입니다.

+0

+1 지능형 스크립트 동작 제안 –

1

대부분의 편집자는 커밋하고 저장하기 전에 임시 파일을 사용하여 실행 취소 정보 또는 파일 편집을 작성합니다. 또한 대부분의 편집자는 하위 쉘 및 스크립트와 대화하기 위해 임시 파일에 작성해야합니다. 4913 파일이 vim 설정의 한 요소이거나 숫자로 된 사용자 ID의 함수가되어 파일을 고유하게 만들 수 있습니다.

파일을 업데이트 할 때 vim을 스트레칭하여 양쪽에서 어떤 일이 발생하는지 확인할 수 있습니다 (예 : fork + exec 또는 다른 파일을 건드려 어떤 매크로 또는 시설이이를 유발하는지 알 수 있습니다.