Created
August 1, 2017 14:15
-
-
Save mattn/c5503e6f3263405b572f33ea1c60ee51 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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