Skip to content

Instantly share code, notes, and snippets.

@mattn
Created August 1, 2017 14:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattn/c5503e6f3263405b572f33ea1c60ee51 to your computer and use it in GitHub Desktop.
Save mattn/c5503e6f3263405b572f33ea1c60ee51 to your computer and use it in GitHub Desktop.
diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak
index 5b0719f7d..76269f351 100644
--- a/src/Make_cyg_ming.mak
+++ b/src/Make_cyg_ming.mak
@@ -766,6 +766,7 @@ OBJ += $(OUTDIR)/terminal.o \
$(OUTDIR)/term_state.o \
$(OUTDIR)/term_unicode.o \
$(OUTDIR)/term_vterm.o
+LIB += -lpsapi
endif
diff --git a/src/evalfunc.c b/src/evalfunc.c
index fc0e05dad..9ef54bba8 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -835,6 +835,7 @@ static struct fst
{"term_getcursor", 1, 1, f_term_getcursor},
{"term_getjob", 1, 1, f_term_getjob},
{"term_getline", 1, 2, f_term_getline},
+ {"term_getruncmd", 1, 1, f_term_getruncmd},
{"term_getsize", 1, 1, f_term_getsize},
{"term_getstatus", 1, 1, f_term_getstatus},
{"term_gettitle", 1, 1, f_term_gettitle},
diff --git a/src/proto/terminal.pro b/src/proto/terminal.pro
index 24789293d..e7697939f 100644
--- a/src/proto/terminal.pro
+++ b/src/proto/terminal.pro
@@ -19,6 +19,7 @@ void f_term_getattr(typval_T *argvars, typval_T *rettv);
void f_term_getcursor(typval_T *argvars, typval_T *rettv);
void f_term_getjob(typval_T *argvars, typval_T *rettv);
void f_term_getline(typval_T *argvars, typval_T *rettv);
+void f_term_getruncmd(typval_T *argvars, typval_T *rettv);
void f_term_getsize(typval_T *argvars, typval_T *rettv);
void f_term_getstatus(typval_T *argvars, typval_T *rettv);
void f_term_gettitle(typval_T *argvars, typval_T *rettv);
diff --git a/src/terminal.c b/src/terminal.c
index 1423c5f55..61925dbf6 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -75,6 +75,14 @@
#include "vim.h"
+#if defined(__APPLE__)
+# include <sys/types.h>
+# include <sys/sysctl.h>
+#endif
+#if defined(_WIN32)
+# include <psapi.h>
+#endif
+
#if defined(FEAT_TERMINAL) || defined(PROTO)
#ifdef WIN3264
@@ -1835,6 +1843,80 @@ f_term_getline(typval_T *argvars, typval_T *rettv)
}
/*
+ * "term_getruncmd(buf)" function
+ */
+ void
+f_term_getruncmd(typval_T *argvars, typval_T *rettv)
+{
+ buf_T *buf = term_get_buf(argvars);
+ channel_T *ch;
+ pid_t pgrp;
+
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
+ if (buf == NULL)
+ return;
+
+ if (buf->b_term->tl_job == NULL)
+ return;
+
+ ch = buf->b_term->tl_job->jv_channel;
+ if (ch == NULL || ch->CH_IN_FD == -1)
+ return;
+
+#ifdef _WIN32
+ pgrp = GetCurrentProcessId();
+#else
+ pgrp = tcgetpgrp(ch->CH_IN_FD);
+ if (pgrp <= 0)
+ return;
+#endif
+
+#if defined(__linux__)
+ {
+ char fname[MAXPATHL];
+ char cmdline[64];
+ FILE *fp;
+ size_t bytes_read;
+ size_t i;
+
+ vim_snprintf(fname, MAXPATHL, "/proc/%ld/cmdline", pgrp);
+ fp = mch_fopen(fname, "r");
+ if (fp == NULL)
+ return;
+
+ bytes_read = fread(cmdline, 1, sizeof(cmdline), fp);
+ fclose(fp);
+
+ for (i = 0; i < bytes_read; ++i)
+ if (cmdline[i] == NUL)
+ cmdline[i] = ' ';
+ cmdline[bytes_read - 1] = NUL;
+
+ rettv->vval.v_string = vim_strsave(cmdline);
+ }
+#elif defined(__APPLE__)
+ {
+ int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pgrp };
+ struct kinfo_proc kp;
+ size_t size = sizeof(kp);
+
+ if (sysctl(mib, 4, &kp, &size, NULL, 0) == -1)
+ return;
+
+ rettv->vval.v_string = vim_strsave((char_u *)kp.kp_proc.p_comm);
+ }
+#elif defined(_WIN32)
+ {
+ char fname[MAX_PATH];
+ HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pgrp);
+ if (h && GetModuleFileNameEx(h, NULL, fname, sizeof(fname)) != 0)
+ rettv->vval.v_string = vim_strsave((char_u *)fname);
+ }
+#endif
+}
+
+/*
* "term_getsize(buf)" function
*/
void
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment