*/
#ifndef VERSION
-#define VERSION "tig-0.3"
+#define VERSION "tig-0.4.git"
#endif
#ifndef DEBUG
{ "Down", KEY_DOWN },
{ "Insert", KEY_IC },
{ "Delete", KEY_DC },
+ { "Hash", '#' },
{ "Home", KEY_HOME },
{ "End", KEY_END },
{ "PageUp", KEY_PPAGE },
return ERR;
}
- if (set_color(&info->fg, argv[1]) == ERR) {
- config_msg = "Unknown color";
- return ERR;
- }
-
- if (set_color(&info->bg, argv[2]) == ERR) {
+ if (set_color(&info->fg, argv[1]) == ERR ||
+ set_color(&info->bg, argv[2]) == ERR) {
config_msg = "Unknown color";
return ERR;
}
return OK;
}
- if (!strcmp(argv[0], "encoding")) {
- string_copy(opt_encoding, argv[2]);
- return OK;
+ if (!strcmp(argv[0], "commit-encoding")) {
+ char *arg = argv[2];
+ int delimiter = *arg;
+ int i;
+
+ switch (delimiter) {
+ case '"':
+ case '\'':
+ for (arg++, i = 0; arg[i]; i++)
+ if (arg[i] == delimiter) {
+ arg[i] = 0;
+ break;
+ }
+ default:
+ string_copy(opt_encoding, arg);
+ return OK;
+ }
}
+ config_msg = "Unknown variable name";
return ERR;
}
if (!strcmp(opt, "bind"))
return option_bind_command(argc, argv);
+ config_msg = "Unknown option command";
return ERR;
}
static int
read_option(char *opt, int optlen, char *value, int valuelen)
{
+ int status = OK;
+
config_lineno++;
config_msg = "Internal error";
- optlen = strcspn(opt, "#;");
- if (optlen == 0) {
- /* The whole line is a commend or empty. */
+ /* Check for comment markers, since read_properties() will
+ * only ensure opt and value are split at first " \t". */
+ optlen = strcspn(opt, "#");
+ if (optlen == 0)
return OK;
- } else if (opt[optlen] != 0) {
- /* Part of the option name is a comment, so the value part
- * should be ignored. */
- valuelen = 0;
- opt[optlen] = value[valuelen] = 0;
- } else {
- /* Else look for comment endings in the value. */
- valuelen = strcspn(value, "#;");
- value[valuelen] = 0;
+ if (opt[optlen] != 0) {
+ config_msg = "No option value";
+ status = ERR;
+
+ } else {
+ /* Look for comment endings in the value. */
+ int len = strcspn(value, "#");
+
+ if (len < valuelen) {
+ valuelen = len;
+ value[valuelen] = 0;
+ }
+
+ status = set_option(opt, value);
}
- if (set_option(opt, value) == ERR) {
- fprintf(stderr, "Error on line %d, near '%.*s' option: %s\n",
+ if (status == ERR) {
+ fprintf(stderr, "Error on line %d, near '%.*s': %s\n",
config_lineno, optlen, opt, config_msg);
config_errors = TRUE;
}
wbkgdset(status_win, get_line_attr(LINE_STATUS));
}
+static int
+read_prompt(void)
+{
+ enum { READING, STOP, CANCEL } status = READING;
+ char buf[sizeof(opt_cmd) - STRING_SIZE("git \0")];
+ int pos = 0;
+
+ while (status == READING) {
+ struct view *view;
+ int i, key;
+
+ foreach_view (view, i)
+ update_view(view);
+
+ report(":%.*s", pos, buf);
+ /* Refresh, accept single keystroke of input */
+ key = wgetch(status_win);
+ switch (key) {
+ case KEY_RETURN:
+ case KEY_ENTER:
+ case '\n':
+ status = pos ? STOP : CANCEL;
+ break;
+
+ case KEY_BACKSPACE:
+ if (pos > 0)
+ pos--;
+ else
+ status = CANCEL;
+ break;
+
+ case KEY_ESC:
+ status = CANCEL;
+ break;
+
+ case ERR:
+ break;
+
+ default:
+ if (pos >= sizeof(buf)) {
+ report("Input string too long");
+ return ERR;
+ }
+
+ if (isprint(key))
+ buf[pos++] = (char) key;
+ }
+ }
+
+ if (status == CANCEL) {
+ /* Clear the status window */
+ report("");
+ return ERR;
+ }
+
+ buf[pos++] = 0;
+ if (!string_format(opt_cmd, "git %s", buf))
+ return ERR;
+ opt_request = REQ_VIEW_PAGER;
+
+ return OK;
+}
/*
* Repository references
* status_win restricted. */
switch (request) {
case REQ_PROMPT:
- report(":");
- /* Temporarily switch to line-oriented and echoed
- * input. */
- nocbreak();
- echo();
-
- if (wgetnstr(status_win, opt_cmd + 4, sizeof(opt_cmd) - 4) == OK) {
- memcpy(opt_cmd, "git ", 4);
- opt_request = REQ_VIEW_PAGER;
- } else {
- report("Prompt interrupted by loading view, "
- "press 'z' to stop loading views");
+ if (read_prompt() == ERR)
request = REQ_SCREEN_UPDATE;
- }
-
- noecho();
- cbreak();
break;
case REQ_SCREEN_RESIZE: