aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--format.c16
-rw-r--r--procname.c15
-rw-r--r--tmux.11
-rw-r--r--tmux.h1
4 files changed, 33 insertions, 0 deletions
diff --git a/format.c b/format.c
index 815be8da..6300b332 100644
--- a/format.c
+++ b/format.c
@@ -741,6 +741,21 @@ format_cb_current_command(struct format_tree *ft, struct format_entry *fe)
free(cmd);
}
+/* Callback for pane_current_path. */
+static void
+format_cb_current_path(struct format_tree *ft, struct format_entry *fe)
+{
+ struct window_pane *wp = ft->wp;
+ char *cwd;
+
+ if (wp == NULL)
+ return;
+
+ cwd = get_proc_cwd(wp->fd);
+ if (cwd != NULL)
+ fe->value = xstrdup(cwd);
+}
+
/* Callback for history_bytes. */
static void
format_cb_history_bytes(struct format_tree *ft, struct format_entry *fe)
@@ -2722,6 +2737,7 @@ format_defaults_pane(struct format_tree *ft, struct window_pane *wp)
format_add(ft, "pane_pid", "%ld", (long) wp->pid);
format_add_cb(ft, "pane_start_command", format_cb_start_command);
format_add_cb(ft, "pane_current_command", format_cb_current_command);
+ format_add_cb(ft, "pane_current_path", format_cb_current_path);
format_add(ft, "cursor_x", "%u", wp->base.cx);
format_add(ft, "cursor_y", "%u", wp->base.cy);
diff --git a/procname.c b/procname.c
index 07a8a56c..45e508ef 100644
--- a/procname.c
+++ b/procname.c
@@ -38,6 +38,7 @@
static struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
char *get_proc_name(int, char *);
+char *get_proc_cwd(int);
static struct kinfo_proc *
cmp_procs(struct kinfo_proc *p1, struct kinfo_proc *p2)
@@ -132,3 +133,17 @@ error:
free(buf);
return (NULL);
}
+
+char *
+get_proc_cwd(int fd)
+{
+ int name[] = { CTL_KERN, KERN_PROC_CWD, 0 };
+ static char path[MAXPATHLEN];
+ size_t pathlen = sizeof path;
+
+ if ((name[2] = tcgetpgrp(fd)) == -1)
+ return (NULL);
+ if (sysctl(name, 3, path, &pathlen, NULL, 0) != 0)
+ return (NULL);
+ return (path);
+}
diff --git a/tmux.1 b/tmux.1
index 00231c08..c62d543b 100644
--- a/tmux.1
+++ b/tmux.1
@@ -4409,6 +4409,7 @@ The following variables are available, where appropriate:
.It Li "pane_at_top" Ta "" Ta "1 if pane is at the top of window"
.It Li "pane_bottom" Ta "" Ta "Bottom of pane"
.It Li "pane_current_command" Ta "" Ta "Current command if available"
+.It Li "pane_current_path" Ta "" Ta "Current path if available"
.It Li "pane_dead" Ta "" Ta "1 if pane is dead"
.It Li "pane_dead_status" Ta "" Ta "Exit status of process in dead pane"
.It Li "pane_format" Ta "" Ta "1 if format is for a pane"
diff --git a/tmux.h b/tmux.h
index fbf10cf4..fd739974 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2743,6 +2743,7 @@ int utf8_cstrhas(const char *, const struct utf8_data *);
/* procname.c */
char *get_proc_name(int, char *);
+char *get_proc_cwd(int);
/* log.c */
void log_add_level(void);