diff --git a/CHANGES b/CHANGES index 8c88b156..064eefe6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +15 December 2008 + +* New command, source-file (alias source), to load a configuration + file. Written by Tiago Cunha, many thanks. + 13 December 2008 * Work around lack of dch. On Linux, the rxvt termcap doesn't have it (it is @@ -779,7 +784,7 @@ (including mutt, emacs). No status bar yet and no key remapping or other customisation. -$Id: CHANGES,v 1.173 2008-12-13 17:41:49 nicm Exp $ +$Id: CHANGES,v 1.174 2008-12-15 21:21:56 nicm Exp $ LocalWords: showw utf UTF fulvio ciriaco joshe OSC APC gettime abc DEF OA clr LocalWords: rivo nurges lscm Erdely eol smysession mysession ek dstname RB diff --git a/GNUmakefile b/GNUmakefile index 178e243f..42e3bc1a 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.45 2008-12-13 17:40:30 nicm Exp $ +# $Id: GNUmakefile,v 1.46 2008-12-15 21:21:56 nicm Exp $ .PHONY: clean @@ -31,7 +31,7 @@ SRCS= tmux.c server.c server-msg.c server-fn.c buffer.c buffer-poll.c status.c \ cmd-show-window-options.c cmd-command-prompt.c cmd-set-buffer.c \ cmd-show-buffer.c cmd-list-buffers.c cmd-delete-buffer.c \ cmd-list-commands.c cmd-move-window.c cmd-select-prompt.c \ - cmd-respawn-window.c \ + cmd-respawn-window.c cmd-source-file.c \ window-scroll.c window-more.c window-copy.c options.c paste.c \ tty.c tty-keys.c tty-write.c colour.c utf8.c options-cmd.c diff --git a/Makefile b/Makefile index 26b0cc97..96f9f633 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.80 2008-12-10 20:25:41 nicm Exp $ +# $Id: Makefile,v 1.81 2008-12-15 21:21:56 nicm Exp $ .SUFFIXES: .c .o .y .h .PHONY: clean update-index.html upload-index.html @@ -35,7 +35,7 @@ SRCS= tmux.c server.c server-msg.c server-fn.c buffer.c buffer-poll.c status.c \ cmd-show-window-options.c cmd-command-prompt.c cmd-set-buffer.c \ cmd-show-buffer.c cmd-list-buffers.c cmd-delete-buffer.c \ cmd-list-commands.c cmd-move-window.c cmd-select-prompt.c \ - cmd-respawn-window.c \ + cmd-respawn-window.c cmd-source-file.c \ window-scroll.c window-more.c window-copy.c options.c paste.c \ tty.c tty-keys.c tty-write.c colour.c utf8.c options-cmd.c diff --git a/cmd-source-file.c b/cmd-source-file.c new file mode 100644 index 00000000..b7e0fd25 --- /dev/null +++ b/cmd-source-file.c @@ -0,0 +1,146 @@ +/* $Id: cmd-source-file.c,v 1.1 2008-12-15 21:21:56 nicm Exp $ */ + +/* + * Copyright (c) 2008 Tiago Cunha + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include "tmux.h" + +/* + * Sources a configuration file. + */ + +int cmd_source_file_parse(struct cmd *, int, char **, char **); +void cmd_source_file_exec(struct cmd *, struct cmd_ctx *); +void cmd_source_file_send(struct cmd *, struct buffer *); +void cmd_source_file_recv(struct cmd *, struct buffer *); +void cmd_source_file_free(struct cmd *); +void cmd_source_file_init(struct cmd *, int); +void cmd_source_file_print(struct cmd *, char *, size_t); + +struct cmd_source_file_data { + char *path; +}; + +const struct cmd_entry cmd_source_file_entry = { + "source-file", "source", + "path", + CMD_ONEARG, + cmd_source_file_init, + cmd_source_file_parse, + cmd_source_file_exec, + cmd_source_file_send, + cmd_source_file_recv, + cmd_source_file_free, + cmd_source_file_print +}; + +void +cmd_source_file_init(struct cmd *self, unused int arg) +{ + struct cmd_source_file_data *data; + + self->data = data = xmalloc(sizeof *data); + data->path = NULL; +} + +int +cmd_source_file_parse(struct cmd *self, int argc, char **argv, char **cause) +{ + struct cmd_source_file_data *data; + int opt; + + self->entry->init(self, 0); + data = self->data; + + while ((opt = getopt(argc, argv, "")) != -1) { + switch (opt) { + default: + goto usage; + } + } + argc -= optind; + argv += optind; + if (argc != 1) + goto usage; + + data->path = xstrdup(argv[0]); + return (0); + +usage: + xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage); + + self->entry->free(self); + return (-1); +} + +void +cmd_source_file_exec(struct cmd *self, struct cmd_ctx *ctx) +{ + char *cause; + struct cmd_source_file_data *data = self->data; + + if (load_cfg(data->path, &cause) != 0) { + ctx->error(ctx, "%s", cause); + return; + } + + if (ctx->cmdclient != NULL) + server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0); +} + +void +cmd_source_file_send(struct cmd *self, struct buffer *b) +{ + struct cmd_source_file_data *data = self->data; + + buffer_write(b, data, sizeof *data); + cmd_send_string(b, data->path); +} + +void +cmd_source_file_recv(struct cmd *self, struct buffer *b) +{ + struct cmd_source_file_data *data; + + self->data = data = xmalloc(sizeof *data); + buffer_read(b, data, sizeof *data); + data->path = cmd_recv_string(b); +} + +void +cmd_source_file_free(struct cmd *self) +{ + struct cmd_source_file_data *data = self->data; + + if (data->path != NULL) + xfree(data->path); + xfree(data); +} + +void +cmd_source_file_print(struct cmd *self, char *buf, size_t len) +{ + struct cmd_source_file_data *data = self->data; + size_t off = 0; + + off += xsnprintf(buf, len, "%s", self->entry->name); + if (data == NULL) + return; + if (off < len && data->path != NULL) + off += xsnprintf(buf + off, len - off, " %s", data->path); +} diff --git a/cmd.c b/cmd.c index 00560933..4f4cf631 100644 --- a/cmd.c +++ b/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.66 2008-12-10 20:25:41 nicm Exp $ */ +/* $Id: cmd.c,v 1.67 2008-12-15 21:21:56 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -65,6 +65,7 @@ const struct cmd_entry *cmd_table[] = { &cmd_show_buffer_entry, &cmd_show_options_entry, &cmd_show_window_options_entry, + &cmd_source_file_entry, &cmd_start_server_entry, &cmd_swap_window_entry, &cmd_switch_client_entry, diff --git a/tmux.1 b/tmux.1 index cfa92fcc..d0713816 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1,4 +1,4 @@ -.\" $Id: tmux.1,v 1.51 2008-11-17 17:41:35 nicm Exp $ +.\" $Id: tmux.1,v 1.52 2008-12-15 21:21:56 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -804,6 +804,12 @@ options are listed. .Xc .D1 (alias: Ic showw ) List the current options for the given window. +.It Xo Ic source-file +.Ar path +.Xc +.D1 (alias: Ic source ) +Execute commands from +.Ar path . .It Xo Ic start-server .Xc Start the diff --git a/tmux.h b/tmux.h index 0f386772..9d79d571 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.203 2008-12-13 17:41:49 nicm Exp $ */ +/* $Id: tmux.h,v 1.204 2008-12-15 21:21:56 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1055,6 +1055,7 @@ extern const struct cmd_entry cmd_set_window_option_entry; extern const struct cmd_entry cmd_show_buffer_entry; extern const struct cmd_entry cmd_show_options_entry; extern const struct cmd_entry cmd_show_window_options_entry; +extern const struct cmd_entry cmd_source_file_entry; extern const struct cmd_entry cmd_start_server_entry; extern const struct cmd_entry cmd_swap_window_entry; extern const struct cmd_entry cmd_switch_client_entry;