-
Notifications
You must be signed in to change notification settings - Fork 0
/
vim-livereload.vim
118 lines (99 loc) · 2.33 KB
/
vim-livereload.vim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
" Exit quickly when already loaded.
if exists("g:loaded_vim_livereload")
finish
endif
" Exit quicky if running in compatible mode
if &compatible
echohl ErrorMsg
echohl none
finish
endif
" Check for Ruby functionality.
if !has("ruby")
echohl ErrorMsg
echon "Sorry, Vim-Livereload requires ruby support."
finish
endif
let g:loaded_vim_livereload = "true"
function! Reload_Browser()
:ruby reload_browser()
endfunction
function! Startup()
:ruby startup
endfunction
function! Stop()
:ruby stop
endfunction
augroup livereload
autocmd BufWritePost * :call Reload_Browser()
autocmd VimEnter * :call Startup()
autocmd VimLeave * :call Stop()
augroup END
command Livereload :call Reload_Browser()
command StartLivereload :call Startup()
command StopLivereload :call Stop()
autocmd CursorHold * call Timer()
function! Timer()
:ruby timer
call feedkeys("f\e")
endfunction
ruby << EOF
dir = ::VIM::evaluate('&runtimepath').to_s.split(",").select{|s| s["livereload"]}.first + "/vendor"
Dir.foreach(dir){|x| $LOAD_PATH.unshift(dir + "/" + x + "/lib")}
require 'em/pure_ruby'
require 'json'
require 'em-websocket'
module Livereload
def self.web_sockets
@web_sockets ||= []
@web_sockets
end
end
def reload_browser
name = VIM::Buffer.current.name
data = ['refresh', {
:path => name.sub(".scss", ".css"),
:apply_js_live => @options[:apply_js_live],
:apply_css_live => @options[:apply_css_live]
}].to_json
Livereload.web_sockets.delete_if{|ws| ws.state == :closed}
Livereload.web_sockets.each do |ws|
ws.send(data) if ws.state == :connected
end
sleep 0.5
end
def startup
@options = {
:api_version => '1.6',
:host => '0.0.0.0',
:port => '35729',
:apply_js_live => true,
:apply_css_live => true,
:grace_period => 0
}
@@web_sockets = []
@thread = Thread.new do
EventMachine.run do
@server = EventMachine.start_server(@options[:host], @options[:port], EventMachine::WebSocket::Connection, {}) do |ws|
ws.onopen do
begin
ws.send "!!ver:#{@options[:api_version]}"
Livereload.web_sockets << ws
rescue
end
end
ws.onmessage do |msg|
end
ws.onclose do
Livereload.web_sockets.delete ws
end
end
end
end
end
def stop
@thread.kill
end
def timer
end
EOF