-
Notifications
You must be signed in to change notification settings - Fork 225
/
slime.vim
107 lines (84 loc) · 3.45 KB
/
slime.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
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Configuration
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if !exists('g:slime_send_key')
let g:slime_send_key = '<C-c><C-c>'
endif
if !exists('g:slime_config_key')
let g:slime_config_key = '<C-c>v'
endif
if !exists("g:slime_target")
let g:slime_target = "screen"
end
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Setup key bindings
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
execute 'vmap ' . g:slime_send_key . " \"ry:call <SID>SlimeSend(@r)<CR>"
execute 'nmap ' . g:slime_send_key . " vip" . g:slime_send_key
execute 'nmap ' . g:slime_config_key . " :call <SID>SlimeConfig()<CR>"
if exists('g:slime_loaded')
finish
endif
let g:slime_loaded = 1
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Screen
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:ScreenSend(config, text)
let escaped_text = s:_EscapeText(a:text)
call system("screen -S " . a:config["sessionname"] . " -p " . a:config["windowname"] . " -X stuff " . escaped_text)
endfunction
" Leave this function exposed as it's called outside the plugin context
function! ScreenSessionNames(A,L,P)
return system("screen -ls | awk '/Attached/ {print $1}'")
endfunction
function! s:ScreenConfig()
if !exists("b:slime_config")
let b:slime_config = {"sessionname": "", "windowname": "0"}
end
let b:slime_config["sessionname"] = input("screen session name: ", b:slime_config["sessionname"], "custom,ScreenSessionNames")
let b:slime_config["windowname"] = input("screen window name: ", b:slime_config["windowname"])
endfunction
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Tmux
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:TmuxSend(config, text)
let escaped_text = s:_EscapeText(a:text)
call system("tmux -L " . a:config["socket_name"] . " send-keys " . escaped_text)
endfunction
function! s:TmuxConfig()
if !exists("b:slime_config")
let b:slime_config = {"socket_name": "default"}
end
let b:slime_config["socket_name"] = input("tmux socket name: ", b:slime_config["socket_name"])
" TODO: allow more tmux options? like window #, pane #?
endfunction
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Helpers
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:_EscapeText(text)
let transformed_text = a:text
if exists("&filetype")
let custom_escape = "_EscapeText_" . &filetype
if exists("*" . custom_escape)
let transformed_text = call(custom_escape, [a:text])
end
end
return substitute(shellescape(transformed_text), "\\\\\\n", "\n", "g")
endfunction
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Public interface
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:SlimeSend(text)
if !exists("b:slime_config")
call s:SlimeDispatch('Config')
end
call s:SlimeDispatch('Send', b:slime_config, a:text)
endfunction
function! s:SlimeConfig()
call s:SlimeDispatch('Config')
endfunction
" delegation
function! s:SlimeDispatch(name, ...)
let target = substitute(tolower(g:slime_target), '\(.\)', '\u\1', '') " Capitalize
return call("s:" . target . a:name, a:000)
endfunction