mirror of
https://github.com/tmux/tmux.git
synced 2025-04-10 19:18:48 +00:00
Expand leading tilde on commands which expect a filename.
This commit is contained in:
parent
6db6df882c
commit
280619a4e8
1
TODO
1
TODO
@ -91,7 +91,6 @@
|
|||||||
- status-active-fg/bg/attr would be nice to highlight active window, as would options to set
|
- status-active-fg/bg/attr would be nice to highlight active window, as would options to set
|
||||||
the highlight stuff
|
the highlight stuff
|
||||||
- XXX once env stuff is in, default-path and VISUAL/EDITOR should be picked up when session is started
|
- XXX once env stuff is in, default-path and VISUAL/EDITOR should be picked up when session is started
|
||||||
- expand leading ~ in source-file save-buffer etc
|
|
||||||
- the copy mode next-word behaviour is emacs style (end of word) rather than vi style (start of word) even in vi keys mode,
|
- the copy mode next-word behaviour is emacs style (end of word) rather than vi style (start of word) even in vi keys mode,
|
||||||
- when moving up from a blank line in copy mode it always assumes you were at the end of the line so it can be a bit funny. should remember last non-blank x position and use that
|
- when moving up from a blank line in copy mode it always assumes you were at the end of the line so it can be a bit funny. should remember last non-blank x position and use that
|
||||||
- paste-buffer etc should be able to handle \0, so needs a size member and no more strlen
|
- paste-buffer etc should be able to handle \0, so needs a size member and no more strlen
|
||||||
|
44
cmd-string.c
44
cmd-string.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: cmd-string.c,v 1.18 2009-07-09 18:03:28 nicm Exp $ */
|
/* $Id: cmd-string.c,v 1.19 2009-07-13 18:03:18 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -19,9 +19,11 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <pwd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "tmux.h"
|
#include "tmux.h"
|
||||||
|
|
||||||
@ -33,6 +35,7 @@ int cmd_string_getc(const char *, size_t *);
|
|||||||
void cmd_string_ungetc(const char *, size_t *);
|
void cmd_string_ungetc(const char *, size_t *);
|
||||||
char *cmd_string_string(const char *, size_t *, char, int);
|
char *cmd_string_string(const char *, size_t *, char, int);
|
||||||
char *cmd_string_variable(const char *, size_t *);
|
char *cmd_string_variable(const char *, size_t *);
|
||||||
|
char *cmd_string_expand_tilde(const char *, size_t *);
|
||||||
|
|
||||||
int
|
int
|
||||||
cmd_string_getc(const char *s, size_t *p)
|
cmd_string_getc(const char *s, size_t *p)
|
||||||
@ -154,6 +157,17 @@ cmd_string_parse(const char *s, struct cmd_list **cmdlist, char **cause)
|
|||||||
|
|
||||||
rval = 0;
|
rval = 0;
|
||||||
goto out;
|
goto out;
|
||||||
|
case '~':
|
||||||
|
if (have_arg == 0) {
|
||||||
|
if ((t = cmd_string_expand_tilde(s, &p)) == NULL)
|
||||||
|
goto error;
|
||||||
|
buf = xrealloc(buf, 1, len + strlen(t) + 1);
|
||||||
|
strlcpy(buf + len, t, strlen(t) + 1);
|
||||||
|
len += strlen(t);
|
||||||
|
xfree(t);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* FALLTHROUGH */
|
||||||
default:
|
default:
|
||||||
if (len >= SIZE_MAX - 2)
|
if (len >= SIZE_MAX - 2)
|
||||||
goto error;
|
goto error;
|
||||||
@ -309,3 +323,31 @@ error:
|
|||||||
xfree(buf);
|
xfree(buf);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
cmd_string_expand_tilde(const char *s, size_t *p)
|
||||||
|
{
|
||||||
|
struct passwd *pw;
|
||||||
|
char *home, *path, *username;
|
||||||
|
|
||||||
|
home = NULL;
|
||||||
|
if (cmd_string_getc(s, p) == '/') {
|
||||||
|
if ((home = getenv("HOME")) == NULL) {
|
||||||
|
if ((pw = getpwuid(getuid())) != NULL)
|
||||||
|
home = pw->pw_dir;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cmd_string_ungetc(s, p);
|
||||||
|
if ((username = cmd_string_string(s, p, '/', 0)) == NULL)
|
||||||
|
return (NULL);
|
||||||
|
if ((pw = getpwnam(username)) != NULL)
|
||||||
|
home = pw->pw_dir;
|
||||||
|
if (username != NULL)
|
||||||
|
xfree(username);
|
||||||
|
}
|
||||||
|
if (home == NULL)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
xasprintf(&path, "%s/", home);
|
||||||
|
return (path);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user