aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c57
1 files changed, 54 insertions, 3 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index c2a46ed206..b826ddcc50 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -6488,8 +6488,9 @@ static struct fst {
{"isdirectory", 1, 1, f_isdirectory},
{"islocked", 1, 1, f_islocked},
{"items", 1, 1, f_items},
+ {"jobresize", 3, 3, f_jobresize},
{"jobsend", 2, 2, f_jobsend},
- {"jobstart", 2, 3, f_jobstart},
+ {"jobstart", 2, 4, f_jobstart},
{"jobstop", 1, 1, f_jobstop},
{"join", 1, 2, f_join},
{"keys", 1, 1, f_keys},
@@ -10665,6 +10666,39 @@ static void f_jobsend(typval_T *argvars, typval_T *rettv)
rettv->vval.v_number = job_write(job, buf);
}
+// "jobresize()" function
+static void f_jobresize(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_NUMBER
+ || argvars[2].v_type != VAR_NUMBER) {
+ // job id, width, height
+ EMSG(_(e_invarg));
+ return;
+ }
+
+ Job *job = job_find(argvars[0].vval.v_number);
+
+ if (!job) {
+ // Probably an invalid job id
+ EMSG(_(e_invjob));
+ return;
+ }
+
+ if (!job_resize(job, argvars[1].vval.v_number, argvars[2].vval.v_number)) {
+ EMSG(_(e_jobnotpty));
+ return;
+ }
+
+ rettv->vval.v_number = 1;
+}
+
// "jobstart()" function
static void f_jobstart(typval_T *argvars, typval_T *rettv)
{
@@ -10682,8 +10716,7 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv)
if (argvars[0].v_type != VAR_STRING
|| argvars[1].v_type != VAR_STRING
- || (argvars[2].v_type != VAR_LIST
- && argvars[2].v_type != VAR_UNKNOWN)) {
+ || (argvars[2].v_type != VAR_LIST && argvars[2].v_type != VAR_UNKNOWN)) {
// Wrong argument types
EMSG(_(e_invarg));
return;
@@ -10731,6 +10764,24 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv)
opts.stdout_cb = on_job_stdout;
opts.stderr_cb = on_job_stderr;
opts.exit_cb = on_job_exit;
+
+ if (args && argvars[3].v_type == VAR_DICT) {
+ dict_T *job_opts = argvars[3].vval.v_dict;
+ opts.pty = true;
+ uint16_t width = get_dict_number(job_opts, (uint8_t *)"width");
+ if (width > 0) {
+ opts.width = width;
+ }
+ uint16_t height = get_dict_number(job_opts, (uint8_t *)"height");
+ if (height > 0) {
+ opts.height = height;
+ }
+ char *term = (char *)get_dict_string(job_opts, (uint8_t *)"TERM", true);
+ if (term) {
+ opts.term_name = term;
+ }
+ }
+
job_start(opts, &rettv->vval.v_number);
if (rettv->vval.v_number <= 0) {