├── README.md ├── autoload └── filewatcher.vim └── filewatcher └── filewatcher.go /README.md: -------------------------------------------------------------------------------- 1 | # vim-filewatcher 2 | 3 | file watcher 4 | 5 | ## Usage 6 | 7 | start watch the change of directory. 8 | ``` 9 | let watcher = filewatcher#watch(".", {x,y->execute('echo y',0)}) 10 | ``` 11 | 12 | stop the watching. 13 | ``` 14 | call watcher.stop() 15 | ``` 16 | 17 | ## Requirements 18 | 19 | golang 20 | 21 | ## Installation 22 | 23 | ``` 24 | cd filewatcher && go get -d && go build 25 | ``` 26 | 27 | ## License 28 | 29 | MIT 30 | 31 | ## Author 32 | 33 | Yasuhiro Matsumoto (a.k.a. mattn) 34 | -------------------------------------------------------------------------------- /autoload/filewatcher.vim: -------------------------------------------------------------------------------- 1 | let s:cmd = expand(':h:h:gs!\\!/!') . '/filewatcher/filewatcher' . (has('win32') ? '.exe' : '') 2 | if !filereadable(s:cmd) 3 | finish 4 | endif 5 | 6 | let s:template = {} 7 | 8 | function! s:template.stop() 9 | call job_stop(self.job) 10 | endfunction 11 | 12 | function! filewatcher#watch(dir, cb) 13 | let ctx = copy(s:template) 14 | let ctx['dir'] = a:dir 15 | if has('nvim') 16 | let ctx['job'] = jobstart([s:cmd, a:dir], { 'out_cb': a:cb, 'out_mode': 'nl' }) 17 | else 18 | let ctx['job'] = job_start([s:cmd, a:dir], { 'out_cb': a:cb, 'out_mode': 'nl' }) 19 | endif 20 | return ctx 21 | endfunction 22 | -------------------------------------------------------------------------------- /filewatcher/filewatcher.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | "os" 7 | "path/filepath" 8 | 9 | "github.com/fsnotify/fsnotify" 10 | ) 11 | 12 | func main() { 13 | if len(os.Args) > 2 { 14 | log.Fatal("Usage: " + filepath.Base(os.Args[0]) + " [directory]") 15 | return 16 | } 17 | var dir string 18 | if len(os.Args) == 2 { 19 | dir = os.Args[1] 20 | } 21 | 22 | watcher, err := fsnotify.NewWatcher() 23 | if err != nil { 24 | log.Fatal(err) 25 | } 26 | defer watcher.Close() 27 | 28 | type Event struct { 29 | Type string `json:"type"` 30 | Name string `json:"name"` 31 | } 32 | enc := json.NewEncoder(os.Stdout) 33 | err = watcher.Add(dir) 34 | if err != nil { 35 | log.Fatal(err) 36 | } 37 | 38 | for { 39 | select { 40 | case event := <-watcher.Events: 41 | switch { 42 | case event.Op&fsnotify.Write == fsnotify.Write: 43 | enc.Encode(&Event{Type: "write", Name: event.Name}) 44 | case event.Op&fsnotify.Create == fsnotify.Create: 45 | enc.Encode(&Event{Type: "create", Name: event.Name}) 46 | case event.Op&fsnotify.Remove == fsnotify.Remove: 47 | enc.Encode(&Event{Type: "remove", Name: event.Name}) 48 | case event.Op&fsnotify.Rename == fsnotify.Rename: 49 | enc.Encode(&Event{Type: "rename", Name: event.Name}) 50 | case event.Op&fsnotify.Chmod == fsnotify.Chmod: 51 | enc.Encode(&Event{Type: "chmod", Name: event.Name}) 52 | } 53 | case err := <-watcher.Errors: 54 | log.Fatal("error: ", err) 55 | } 56 | } 57 | } 58 | --------------------------------------------------------------------------------