1
|
|
|
'use strict'; |
2
|
|
|
|
3
|
|
|
import Command from './command'; |
4
|
|
|
import CodeMirror from 'codemirror'; |
5
|
|
|
import 'codemirror/addon/dialog/dialog'; |
6
|
|
|
import 'codemirror/addon/search/searchcursor'; |
7
|
|
|
import 'codemirror/addon/mode/loadmode'; |
8
|
|
|
import 'codemirror/addon/edit/matchbrackets'; |
9
|
|
|
import 'codemirror/addon/display/fullscreen'; |
10
|
|
|
import 'codemirror/mode/clike/clike'; |
11
|
|
|
import 'codemirror/mode/meta'; |
12
|
|
|
import 'codemirror/keymap/vim'; |
13
|
|
|
import 'codemirror/mode/php/php'; |
14
|
|
|
import 'codemirror/mode/css/css'; |
15
|
|
|
import 'codemirror/mode/javascript/javascript'; |
16
|
|
|
import 'codemirror/mode/htmlmixed/htmlmixed'; |
17
|
|
|
import 'codemirror/mode/xml/xml'; |
18
|
|
|
|
19
|
|
|
export default class Vi extends Command { |
20
|
|
|
constructor(options) { |
21
|
|
|
super(options); |
22
|
|
|
let textarea = $('<textarea style="display: none;"></textarea>').appendTo(document.body).get(0); |
23
|
|
|
this.editor = CodeMirror.fromTextArea(textarea, { |
24
|
|
|
lineNumbers: true, |
25
|
|
|
matchBrackets: true, |
26
|
|
|
keyMap: 'vim', |
27
|
|
|
showCursorWhenSelecting: true, |
28
|
|
|
theme: 'monokai' |
29
|
|
|
}); |
30
|
|
|
this.editor.getWrapperElement().className += ' CodeMirror-fullscreen'; |
31
|
|
|
$(this.editor.getWrapperElement()).hide(); |
32
|
|
|
} |
33
|
|
|
|
34
|
|
|
match(name) { |
35
|
|
|
return name === 'vi'; |
36
|
|
|
} |
37
|
|
|
|
38
|
|
|
call(cmd) { |
39
|
|
|
this.api.$term.pause(); |
40
|
|
|
this.makeRequest(cmd.command).then((response) => { |
41
|
|
|
let path = cmd.rest; |
42
|
|
|
let editor = this.editor; |
43
|
|
|
let m, info, mode, spec; |
44
|
|
|
if (m = path.match(/.+\.([^.]+)$/)) { |
45
|
|
|
info = CodeMirror.findModeByExtension(m[1]); |
46
|
|
|
if (info) { |
47
|
|
|
mode = info.mode; |
48
|
|
|
spec = info.mime; |
49
|
|
|
} |
50
|
|
|
} else if (/\//.test(path)) { |
51
|
|
|
info = info = CodeMirror.findModeByMIME(path); |
|
|
|
|
52
|
|
|
if (info) { |
53
|
|
|
mode = info.mode; |
54
|
|
|
spec = info.mime; |
55
|
|
|
} |
56
|
|
|
}; |
57
|
|
|
|
58
|
|
|
if (['htmlmixed', 'css', 'javascript', 'php'].includes(mode) === false) { |
|
|
|
|
59
|
|
|
mode = 'php'; |
60
|
|
|
spec = 'application/x-httpd-php'; |
61
|
|
|
} |
62
|
|
|
|
63
|
|
|
if (mode) { |
64
|
|
|
editor.setOption("mode", spec); |
|
|
|
|
65
|
|
|
CodeMirror.autoLoadMode(editor, mode); |
66
|
|
|
} |
67
|
|
|
$(editor.getWrapperElement()).show(); |
68
|
|
|
let doc = editor.getDoc(); |
69
|
|
|
let cm = doc.cm; |
70
|
|
|
doc.setValue(response.result); |
71
|
|
|
doc.setCursor(0); |
72
|
|
|
editor.focus(); |
73
|
|
|
cm.focus(); |
74
|
|
|
let save = () => { |
75
|
|
|
let value = JSON.stringify(doc.getValue()); |
76
|
|
|
cmd.command += ` --text=${value}`; |
77
|
|
|
this.makeRequest(cmd.command).then(() => {}, () => {}); |
78
|
|
|
} |
79
|
|
|
let quit = () => { |
80
|
|
|
$(editor.getWrapperElement()).hide(); |
81
|
|
|
this.api.$term.resume(); |
82
|
|
|
this.api.$term.focus(); |
83
|
|
|
} |
84
|
|
|
CodeMirror.Vim.defineEx('q', 'q', function() { |
85
|
|
|
quit(); |
86
|
|
|
}); |
87
|
|
|
CodeMirror.Vim.defineEx('w', 'w', function() { |
88
|
|
|
save(); |
89
|
|
|
}); |
90
|
|
|
CodeMirror.Vim.defineEx('wq', 'wq', function() { |
91
|
|
|
save(); |
92
|
|
|
quit(); |
93
|
|
|
}); |
94
|
|
|
}, (response) => { |
95
|
|
|
this.api.loading.hide(); |
96
|
|
|
this.api.echo(response.result); |
97
|
|
|
this.api.serverInfo(); |
98
|
|
|
}); |
99
|
|
|
} |
100
|
|
|
} |
101
|
|
|
|