aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2015-03-28 11:40:25 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2015-03-29 20:35:44 -0300
commitb8b9e5ebade4d88840177154338cb99db5c7fbab (patch)
treee9e886394d5dbc260135df4b41b770fddb4e5b6a /src/nvim/eval.c
parent028f6d7d3f822dd620873a2a51c2d68ab1ef0b95 (diff)
downloadrneovim-b8b9e5ebade4d88840177154338cb99db5c7fbab.tar.gz
rneovim-b8b9e5ebade4d88840177154338cb99db5c7fbab.tar.bz2
rneovim-b8b9e5ebade4d88840177154338cb99db5c7fbab.zip
eval: Implement `jobclose()` vimscript function
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index e4acaa0c53..4baca21116 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -445,6 +445,7 @@ typedef struct {
Job *job;
Terminal *term;
bool exited;
+ bool stdin_closed;
int refcount;
ufunc_T *on_stdout, *on_stderr, *on_exit;
dict_T *self;
@@ -6535,6 +6536,7 @@ static struct fst {
{"isdirectory", 1, 1, f_isdirectory},
{"islocked", 1, 1, f_islocked},
{"items", 1, 1, f_items},
+ {"jobclose", 1, 2, f_jobclose},
{"jobresize", 3, 3, f_jobresize},
{"jobsend", 2, 2, f_jobsend},
{"jobstart", 1, 2, f_jobstart},
@@ -10658,6 +10660,48 @@ static void f_items(typval_T *argvars, typval_T *rettv)
dict_list(argvars, rettv, 2);
}
+// "jobclose(id[, stream])" function
+static void f_jobclose(typval_T *argvars, typval_T *rettv)
+{
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = 0;
+
+ if (check_restricted() || check_secure()) {
+ return;
+ }
+
+ if (argvars[0].v_type != VAR_NUMBER || (argvars[1].v_type != VAR_STRING
+ && argvars[1].v_type != VAR_UNKNOWN)) {
+ EMSG(_(e_invarg));
+ return;
+ }
+
+ Job *job = job_find(argvars[0].vval.v_number);
+
+ if (!is_user_job(job)) {
+ // Invalid job id
+ EMSG(_(e_invjob));
+ return;
+ }
+
+ if (argvars[1].v_type == VAR_STRING) {
+ char *stream = (char *)argvars[1].vval.v_string;
+ if (!strcmp(stream, "stdin")) {
+ job_close_in(job);
+ ((TerminalJobData *)job_data(job))->stdin_closed = true;
+ } else if (!strcmp(stream, "stdout")) {
+ job_close_out(job);
+ } else if (!strcmp(stream, "stderr")) {
+ job_close_err(job);
+ } else {
+ EMSG2(_("Invalid job stream \"%s\""), stream);
+ }
+ } else {
+ ((TerminalJobData *)job_data(job))->stdin_closed = true;
+ job_close_streams(job);
+ }
+}
+
// "jobsend()" function
static void f_jobsend(typval_T *argvars, typval_T *rettv)
{
@@ -10683,6 +10727,11 @@ static void f_jobsend(typval_T *argvars, typval_T *rettv)
return;
}
+ if (((TerminalJobData *)job_data(job))->stdin_closed) {
+ EMSG(_("Can't send data to the job: stdin is closed"));
+ return;
+ }
+
ssize_t input_len;
char *input = (char *) save_tv_as_string(&argvars[1], &input_len, false);
if (!input) {