From: Xavier Maillard <xma@gnu.org>
To: Christian Couder <chriscool@tuxfamily.org>
Cc: junkio@cox.net, pascal@obry.net, nanako3@bluebottle.com,
git@vger.kernel.org
Subject: Re: [PATCH 1/2] help: add "man.viewer" config var to use "woman" or "konqueror"
Date: Fri, 29 Feb 2008 03:00:02 +0100 [thread overview]
Message-ID: <200802290200.m1T2023x017992@localhost.localdomain> (raw)
In-Reply-To: <20080228051956.2f36edf0.chriscool@tuxfamily.org> (message from Christian Couder on Thu, 28 Feb 2008 05:19:56 +0100)
Hi,
Note that "emacsclient" is used with option "-e" to launch "woman"
on emacs and this works only on versions >= 22.
I tested and it did not want to work at first. I modified it a
little bit and now it works with GNU Emacs 23.0.60 (CVS TRUNK).
Dunno if emacsclient has changed between 22 and CVS but it seems
it is printing onto stdout now. I will have to check that.
I am just attaching the patch with my modifications. Please
comment it and feel free to adapt it with yours.
Notice the if(!&buffer) is there just for me. It could be removed
safely. Also note that I did not develop C for ages so apologize
for my approximations ;)
diff --git a/help.c b/help.c
index e57a50e..b939f8d 100644
--- a/help.c
+++ b/help.c
@@ -8,6 +8,9 @@
#include "exec_cmd.h"
#include "common-cmds.h"
#include "parse-options.h"
+#include "run-command.h"
+
+static const char *man_viewer;
enum help_format {
HELP_FORMAT_MAN,
@@ -50,6 +53,8 @@ static int git_help_config(const char *var, const char *value)
help_format = parse_help_format(value);
return 0;
}
+ if (!strcmp(var, "man.viewer"))
+ return git_config_string(&man_viewer, var, value);
return git_default_config(var, value);
}
@@ -345,11 +350,90 @@ static void setup_man_path(void)
strbuf_release(&new_path);
}
+static int check_emacsclient_version(void)
+{
+ struct strbuf buffer = STRBUF_INIT;
+ struct child_process ec_process;
+
+ const char *argv_ec[] = { "emacsclient", "--version", NULL };
+ int version;
+ size_t len;
+
+ /* emacsclient prints its version number on stderr */
+ memset(&ec_process, 0, sizeof(ec_process));
+ ec_process.argv = argv_ec;
+ ec_process.err = -1;
+ ec_process.out = -1;
+ ec_process.stdout_to_stderr = 0;
+
+ if (start_command(&ec_process))
+ return error("Failed to start emacsclient.");
+
+ len = strbuf_read(&buffer, ec_process.out, 20);
+ close(ec_process.out);
+
+ /*
+ * Don't bother checking return value, because "emacsclient --version"
+ * seems to always exits with code 1.
+ */
+ finish_command(&ec_process);
+
+ if (!&buffer)
+ return;
+
+ if (!len || len < 0 || prefixcmp(buffer.buf, "emacsclient")) {
+ strbuf_release(&buffer);
+ return error("Failed to parse emacsclient version.");
+ }
+
+ strbuf_remove(&buffer, 0, strlen("emacsclient"));
+ version = atoi(buffer.buf);
+
+ if (version < 22) {
+ fprintf(stderr,
+ "emacsclient version '%d' too old (< 22).\n",
+ version);
+ strbuf_release(&buffer);
+ return -1;
+ }
+
+ strbuf_release(&buffer);
+ return 0;
+}
+
+static void exec_woman_emacs(const char *page)
+{
+ if (!check_emacsclient_version()) {
+ /* This works only with emacsclient version >= 22. */
+ struct strbuf man_page = STRBUF_INIT;
+ strbuf_addf(&man_page, "(woman \"%s\")", page);
+ execlp("emacsclient", "emacsclient", "-e", man_page.buf, NULL);
+ } else
+ execlp("man", "man", page, NULL);
+}
+
+static void exec_man_konqueror(const char *page)
+{
+ const char *display = getenv("DISPLAY");
+ if (display && *display) {
+ struct strbuf man_page = STRBUF_INIT;
+ strbuf_addf(&man_page, "man:%s(1)", page);
+ execlp("kfmclient", "kfmclient", "newTab", man_page.buf, NULL);
+ } else
+ execlp("man", "man", page, NULL);
+}
+
static void show_man_page(const char *git_cmd)
{
const char *page = cmd_to_page(git_cmd);
setup_man_path();
- execlp("man", "man", page, NULL);
+ if (!man_viewer || !strcmp(man_viewer, "man"))
+ execlp("man", "man", page, NULL);
+ if (!strcmp(man_viewer, "woman"))
+ exec_woman_emacs(page);
+ if (!strcmp(man_viewer, "konqueror"))
+ exec_man_konqueror(page);
+ die("'%s': unsupported man viewer.", man_viewer);
}
static void show_info_page(const char *git_cmd)
Xavier
--
http://www.gnu.org
http://www.april.org
http://www.lolica.org
next prev parent reply other threads:[~2008-02-29 2:35 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-28 4:19 [PATCH 1/2] help: add "man.viewer" config var to use "woman" or "konqueror" Christian Couder
2008-02-29 2:00 ` Xavier Maillard [this message]
2008-02-29 7:14 ` Christian Couder
2008-02-29 7:46 ` Junio C Hamano
2008-03-01 1:00 ` Xavier Maillard
2008-03-03 7:20 ` Christian Couder
2008-03-01 1:00 ` [PATCH AMENDED] " Xavier Maillard
2008-03-01 2:14 ` Junio C Hamano
2008-03-03 7:38 ` Christian Couder
2008-03-03 7:42 ` Jakub Narebski
2008-03-03 19:07 ` Christian Couder
2008-02-29 2:00 ` [PATCH 1/2] " Xavier Maillard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200802290200.m1T2023x017992@localhost.localdomain \
--to=xma@gnu.org \
--cc=chriscool@tuxfamily.org \
--cc=git@vger.kernel.org \
--cc=junkio@cox.net \
--cc=nanako3@bluebottle.com \
--cc=pascal@obry.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).