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
118
119
120
121
122
123
124
125
126
|
# Open your $EDITOR to compose a message in weechat
#
# Usage:
# /edit
#
# Optional settings:
# /set plugins.var.python.edit.editor "vim -f"
# /set plugins.var.python.edit.terminal "xterm"
# /set plugins.var.python.edit.run_externally "false"
#
# History:
# 10-18-2015
# Version 1.0.2: Add the ability to run the editor in a external terminal
# Version 1.0.1: Add configurable editor key
# Version 1.0.0: initial release
import os
import os.path
import shlex
import subprocess
import weechat
def weechat_config_dir():
return os.path.expanduser(os.environ.get("WEECHAT_HOME", "~/.weechat/"))
PATH = os.path.join(weechat_config_dir(), "message.txt")
def editor_process_cb(data, command, return_code, out, err):
buf = data
if return_code != 0:
cleanup(PATH, buf)
weechat.prnt("", "{}: {}".format(
err.strip(),
return_code
))
return weechat.WEECHAT_RC_ERROR
if return_code == 0:
read_file(PATH, buf)
cleanup(PATH, buf)
return weechat.WEECHAT_RC_OK
def cleanup(path, buf):
try:
os.remove(path)
except (OSError, IOError):
pass
weechat.command(buf, "/window refresh")
def read_file(path, buf):
try:
with open(PATH) as f:
text = f.read()
weechat.buffer_set(buf, "input", text)
weechat.buffer_set(buf, "input_pos", str(len(text)))
except (OSError, IOError):
pass
weechat.command(buf, "/window refresh")
def hook_editor_process(terminal, editor, path, buf):
term_cmd = "{} -e".format(terminal)
editor_cmd = "{} {}".format(editor, path)
weechat.hook_process("{} \"{}\"".format(
term_cmd,
editor_cmd
), 0, "editor_process_cb", buf)
def run_blocking(editor, path, buf):
cmd = shlex.split(editor) + [path]
code = subprocess.Popen(cmd).wait()
if code != 0:
cleanup(path, buf)
read_file(path, buf)
def edit(data, buf, args):
editor = (weechat.config_get_plugin("editor")
or os.environ.get("EDITOR", "vim -f"))
terminal = (weechat.config_get_plugin("terminal")
or os.getenv("TERMCMD"))
terminal = terminal or "xterm"
run_externally = weechat.config_string_to_boolean(
weechat.config_get_plugin("run_externally")
)
run_externally = bool(run_externally)
with open(PATH, "w+") as f:
f.write(weechat.buffer_get_string(buf, "input"))
if run_externally:
hook_editor_process(terminal, editor, PATH, buf)
else:
run_blocking(editor, PATH, buf)
return weechat.WEECHAT_RC_OK
def main():
if not weechat.register("edit", "Keith Smiley", "1.0.0", "MIT",
"Open your $EDITOR to compose a message", "", ""):
return weechat.WEECHAT_RC_ERROR
weechat.hook_command("edit", "Open your $EDITOR to compose a message", "",
"", "", "edit", "")
if __name__ == "__main__":
main()
|