diff --git a/src/gmnlm.c b/src/gmnlm.c

index bf18d69514d3406b726264200178ead9ee5def45..700448e8c87510ab371c8c6f8438f2e088376475 100644

--- a/src/gmnlm.c

+++ b/src/gmnlm.c

@@ -102,9 +102,8 @@ "s\t\tSearch via geminispace.info\n"

"l\t\tSearch backlinks to current URI via geminispace.info\n"

"/<text>\t\tSearch for text (POSIX regular expression)\n"

"n\t\tJump to next search match\n"

- "d [path>\tDownload page to path, uses pwd & filename if path is omitted\n"

- "|<prog>\t\tPipe page into program\n"

- "[N]|<prog>\tPipe content of Nth link into program\n"

+ "d[N] [path]\tDownload page, or Nth link, to path\n"

+ "[N]|<prog>\tPipe page, or Nth link, into program\n"

"a\t\tToggle usage of alt text instead of preformatted text\n"

"q\t\tQuit\n"

"\n"

@@ -804,22 +803,42 @@ ? strchr(browser->meta, ';') : NULL);

result = PROMPT_AGAIN;

goto exit;

case 'd':

- if (in[1] != '\0' && !isspace(in[1])) break;

- struct gemini_response resp;

- strncpy(&url[0], browser->plain_url, sizeof(url)-1);

- // XXX: may affect history, do we care?

- enum gemini_result res = do_requests(browser, &resp);

- if (res != GEMINI_OK) {

- fprintf(stderr, "Error: %s\n",

- gemini_strerr(res, &resp));

- result = PROMPT_AGAIN;

- goto exit;

+ endptr = &in[1];

+ char *d_url = browser->plain_url;

+ if (in[1] != '\0' && !isspace(in[1])) {

+ struct link *link = browser->links;

+ int linksel = (int)strtol(in+1, &endptr, 10);

+ while (linksel > 0 && link) {

+ link = link->next;

+ --linksel;

+ }

+

+ if (!link) {

+ fprintf(stderr, "Error: no such link.\n");

+ break;

+ } else {

+ d_url = link->url;

+ }

}

+ struct gemini_response resp;

+ char url[1024] = {0}, old_url[1024] = {0};

+ strncpy(&old_url[0], browser->plain_url, sizeof(url)-1);

+ strncpy(&url[0], d_url, sizeof(url)-1);

+ // XXX: may affect history, do we care?

set_url(browser, url, NULL);

- download_resp(browser->tty, resp, trim_ws(&in[1]), url);

- gemini_response_finish(&resp);

- result = PROMPT_AGAIN;

- goto exit;

+ enum gemini_result res = do_requests(browser, &resp);

+ if (res != GEMINI_OK) {

+ fprintf(stderr, "Error: %s\n",

+ gemini_strerr(res, &resp));

+ result = PROMPT_AGAIN;

+ set_url(browser, old_url, NULL);

+ goto exit;

+ }

+ download_resp(browser->tty, resp, trim_ws(endptr), url);

+ gemini_response_finish(&resp);

+ result = PROMPT_AGAIN;

+ set_url(browser, old_url, NULL);

+ goto exit;

case '|':

strncpy(&url[0], browser->plain_url, sizeof(url)-1);

res = do_requests(browser, &resp);