LINUX.ORG.RU

mcabber + vim


0

1
Здравствуйте!

Возможно ли набрать текст в vim(не в строке ввода) и отослать собеседнику?

Заранее благодарен.
★
Еще хочу спросить. Есть ли вообще консольные jabber клиенты которые могут передавать сообщения внешним программам и принимать от них сообщения?
Devix ★
() автор топика
Ответ на: комментарий от Devix
>Есть ли вообще консольные jabber клиенты которые могут передавать сообщения внешним программам и принимать от них сообщения?

Тот же mcabber
sdio ★★★★★
()
Ответ на: комментарий от Devix
для подробностей читай доку

# External command for events
# You can specify a script or process to be launched when an event occurs.
#
# If 'event_log_files' is set, a file is created and contains the body of
# the message (incoming messages only); the file name is the last parameter.
# If you enable this, you can specify the directory mcabber will use to
# create these messages with the 'event_log_dir' variable (default is the
# system temp dir, or MCABBERTMPDIR environment variable).  Please note
# that mcabber won't delete these files, it's your script's job.
#
# The command is called the following way:
#   $events_command MSG IN jabber@id [file] (when receiving a message)
#   $events_command MSG OUT jabber@id       (when sending a message)
#   $events_command MSG MUC room_id [file]  (when receiving a MUC message)
#   $events_command STATUS X jabber@id      (new buddy status is X)
# See sample script in contrib/ directory.
#set events_command = /home/mikael/.mcabber/eventcmd
#
#set event_log_files = 0
#set event_log_dir = /home/mikael/.mcabber/event_files
sdio ★★★★★
()
Ответ на: комментарий от sdio
Немного не то.

Хотелось бы что то такого:

"/cmd_say vim" - здесь запускается vim с временным файлом для редактирования и после сохранения посылается собеседнику(как в mutt).
Devix ★
() автор топика
Ответ на: комментарий от Devix
И вообше как вы действуете если нужно послать собеседнику кусок текста из какого либо файла?
Devix ★
() автор топика
Ответ на: комментарий от dGhost
>переходим в multi-line mode потом действует закон копипасты

Что еще за закон копипасты? Это который в x или при помощи gpm?
Devix ★
() автор топика
Ответ на: комментарий от Devix
Вот я чегото не пойму почему консольные программы делают такими изолированными от внешнего мира, ведь неудобно же когда охота часть присланного сообщения сохранить(отдать другой программе) или часть какогото файла нужно переслать?
Devix ★
() автор топика
Ответ на: комментарий от Devix
может доку почитаешь, а?

# FIFO
# mcabber can create a FIFO named pipe and listen to this pipe for commands.
# Default: disabled.
# Set 'fifo_hide_commands' to 1 if you don't want to see the FIFO commands
# in the log window (they will still be written to the tracelog file).
# When FIFO is configured, you can turn it off and on in real time with
# the 'fifo_ignore' option (default: 0). When set to 1, the FIFO input is
# still read but it is discarded.

set fifo_name = ~/.mcabber/mcabber.fifo
set fifo_hide_commands = 0
set fifo_ignore = 0


Теперь можно:
echo "command ..." > ~/.mcabber/mcabber.fifo
sdio ★★★★★
()
Ответ на: комментарий от sdio
>echo "command ..." > ~/.mcabber/mcabber.fifo

И тебе не кажется это извратом?

Кстати так же можно и из входящих сообщения выдрать кусок нужно только покопаться в history или сделать event скрипт который будет складывать все сообщения куда то, но это изврат.

А хотелось бы что нить наподобии mutt где для редактирования писма вызывается внешняя программа и входящие письма тоже можно передать внешнему редактору(программе).

PS: Если конечно это все есть то глубоко извиняюсь.
Devix ★
() автор топика
Ответ на: комментарий от Devix
>>echo "command ..." > ~/.mcabber/mcabber.fifo

>И тебе не кажется это извратом?


Нет. Удобно отправлять уведомления из скрипта.
sdio ★★★★★
()
Ответ на: комментарий от sdio
>Ну напиши патч, исходники открыты
>Или ты только критиковать можешь?


Если ничего путного не найду и будет время то напишу.
Devix ★
() автор топика
Ответ на: комментарий от sdio
>Нет. Удобно отправлять уведомления из скрипта.

Для автоматизации удобно но для работы "чловек - машина" неудобно.
Devix ★
() автор топика
Ответ на: комментарий от Devix
Вот патч добавляющий 2 функции esay и esay_to аналоги say и say_to только текст сообщения редактируется редактором прописанным в переменной окружения EDITOR:

diff -Naur mcabber-0.9.9.orig/src/commands.c mcabber-0.9.9/src/commands.c
--- mcabber-0.9.9.orig/src/commands.c	2008-12-31 16:33:12.000000000 +0300
+++ mcabber-0.9.9/src/commands.c	2008-12-31 16:31:09.000000000 +0300
@@ -23,6 +23,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <glib/gstdio.h>
 
 #include "commands.h"
 #include "help.h"
@@ -60,6 +61,8 @@
 static void do_say(char *arg);
 static void do_msay(char *arg);
 static void do_say_to(char *arg);
+static void do_esay(char *arg);
+static void do_esay_to(char *arg);
 static void do_buffer(char *arg);
 static void do_clear(char *arg);
 static void do_info(char *arg);
@@ -156,6 +159,9 @@
   cmd_add("say", "Say something to the selected buddy", 0, 0, &do_say);
   cmd_add("say_to", "Say something to a specific buddy", COMPL_JID, 0,
           &do_say_to);
+  cmd_add("esay", "External editor say something to the selected buddy", 0, 0, &do_esay);
+  cmd_add("esay_to", "External editor say something to a specific buddy", COMPL_JID, 0,
+          &do_esay_to);
   cmd_add("screen_refresh", "Redraw mcabber screen", 0, 0, &do_screen_refresh);
   //cmd_add("search");
   cmd_add("set", "Set/query an option value", 0, 0, &do_set);
@@ -1239,6 +1245,79 @@
   do_say_internal(arg, 1);
 }
 
+static void do_external_say(char *arg, void (*say)(char *arg))
+{
+	GError *err = NULL;
+	gchar *argv[] = { NULL, NULL };
+
+	argv[0] = (gchar*)g_getenv("EDITOR");
+	if (argv[0] == NULL)
+	{
+		scr_LogPrint(LPRINT_NORMAL, "Environment variable \"EDITOR\" don't setted");
+		 return;
+	}
+
+	gint file = g_file_open_tmp("mcabber-XXXXXXX", &(argv[1]), &err);
+	if (file == -1)
+	{
+		scr_LogPrint(LPRINT_NORMAL, err->message);
+		return;
+	}
+	close(file);
+
+	gint exit_status = 0;
+	if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, NULL, NULL, &exit_status, &err))
+		scr_LogPrint(LPRINT_NORMAL, err->message);
+	else if (WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == EXIT_SUCCESS)
+	{
+		GMappedFile *mfile = g_mapped_file_new(argv[1], FALSE, &err);
+
+		if (mfile == NULL)
+			scr_LogPrint(LPRINT_NORMAL, err->message);
+		else
+		{
+			gint mfile_size = g_mapped_file_get_length(mfile);
+
+			if (mfile_size == 0)
+				scr_LogPrint(LPRINT_NORMAL, "Message is empty and don't sended.");
+			else
+			{
+				gint arg_len = strlen(arg);
+				gint mess_len = arg_len + mfile_size + 2;
+				gchar *mess = g_new0(gchar, mess_len);
+
+				g_memmove(mess, arg, arg_len);
+				mess[arg_len] = ' ';
+				g_memmove(mess+arg_len+1, g_mapped_file_get_contents(mfile), mfile_size);
+				mess[mess_len-1] = '\0';
+
+				say(mess);
+
+				g_free(mess);
+			}
+
+			g_mapped_file_free (mfile);
+		}
+	}
+	else
+		scr_LogPrint(LPRINT_NORMAL, "External editor don't normal exited(%d).", WEXITSTATUS(exit_status));
+
+	do_screen_refresh(NULL);
+
+	g_unlink(argv[1]);
+	g_free(argv[1]);
+}
+
+static void do_esay(char *arg)
+{
+	do_external_say(arg, do_say);
+}
+
+static void do_esay_to(char *arg)
+{
+	do_external_say(arg, do_say_to);
+}
+
 static void do_msay(char *arg)
 {
   /* Parameters: begin verbatim abort send send_to */
Devix ★
() автор топика
Ответ на: комментарий от Devix
О! хотя оно мне и не надо (пока), но респект и уважуха тебе!
sdio ★★★★★
()
Ответ на: комментарий от Devix
Маленькие исправления:

diff -Naur mcabber-0.9.9.orig/src/commands.c mcabber-0.9.9/src/commands.c
--- mcabber-0.9.9.orig/src/commands.c	2008-12-31 17:01:03.000000000 +0300
+++ mcabber-0.9.9/src/commands.c	2008-12-31 16:59:09.000000000 +0300
@@ -23,6 +23,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <glib/gstdio.h>
 
 #include "commands.h"
 #include "help.h"
@@ -60,6 +61,8 @@
 static void do_say(char *arg);
 static void do_msay(char *arg);
 static void do_say_to(char *arg);
+static void do_esay(char *arg);
+static void do_esay_to(char *arg);
 static void do_buffer(char *arg);
 static void do_clear(char *arg);
 static void do_info(char *arg);
@@ -156,6 +159,9 @@
   cmd_add("say", "Say something to the selected buddy", 0, 0, &do_say);
   cmd_add("say_to", "Say something to a specific buddy", COMPL_JID, 0,
           &do_say_to);
+  cmd_add("esay", "External editor say something to the selected buddy", 0, 0, &do_esay);
+  cmd_add("esay_to", "External editor say something to a specific buddy", COMPL_JID, 0,
+          &do_esay_to);
   cmd_add("screen_refresh", "Redraw mcabber screen", 0, 0, &do_screen_refresh);
   //cmd_add("search");
   cmd_add("set", "Set/query an option value", 0, 0, &do_set);
@@ -1239,6 +1245,82 @@
   do_say_internal(arg, 1);
 }
 
+static void do_external_say(char *arg, void (*say)(char *arg))
+{
+	GError *err = NULL;
+	gchar *argv[] = { NULL, NULL };
+
+	argv[0] = (gchar*)g_getenv("EDITOR");
+	if (argv[0] == NULL)
+	{
+		scr_LogPrint(LPRINT_NORMAL, "Environment variable \"EDITOR\" don't setted");
+		 return;
+	}
+
+	gint file = g_file_open_tmp("mcabber-XXXXXXX", &(argv[1]), &err);
+	if (file == -1)
+	{
+		scr_LogPrint(LPRINT_NORMAL, err->message);
+		return;
+	}
+	close(file);
+
+	gint exit_status = 0;
+	if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, NULL, NULL, &exit_status, &err))
+		scr_LogPrint(LPRINT_NORMAL, err->message);
+	else if (WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == EXIT_SUCCESS)
+	{
+		GMappedFile *mfile = g_mapped_file_new(argv[1], FALSE, &err);
+
+		if (mfile == NULL)
+			scr_LogPrint(LPRINT_NORMAL, err->message);
+		else
+		{
+			gint mfile_size = g_mapped_file_get_length(mfile);
+
+			if (mfile_size == 0)
+				scr_LogPrint(LPRINT_NORMAL, "Message is empty and don't sended.");
+			else
+			{
+				gint arg_len = strlen(arg);
+				gint mess_len = arg_len + mfile_size + 2;
+				gchar *mess = g_new0(gchar, mess_len);
+
+				g_memmove(mess, arg, arg_len);
+				mess[arg_len] = ' ';
+				g_memmove(mess+arg_len+1, g_mapped_file_get_contents(mfile), mfile_size);
+				mess[mess_len-1] = '\0';
+
+				if (arg_len == 0)
+					say(mess+1);
+				else
+					say(mess);
+
+				g_free(mess);
+			}
+
+			g_mapped_file_free (mfile);
+		}
+	}
+	else
+		scr_LogPrint(LPRINT_NORMAL, "External editor don't normal exited(%d).", WEXITSTATUS(exit_status));
+
+	do_screen_refresh(NULL);
+
+	g_unlink(argv[1]);
+	g_free(argv[1]);
+}
+
+static void do_esay(char *arg)
+{
+	do_external_say(arg, do_say);
+}
+
+static void do_esay_to(char *arg)
+{
+	do_external_say(arg, do_say_to);
+}
+
 static void do_msay(char *arg)
 {
   /* Parameters: begin verbatim abort send send_to */
Devix ★
() автор топика
Ответ на: комментарий от Devix
Изменил работу с временными файлами и добавил функцию "/buffer edit" которая передает текущую историю сообщений внешнему редактору. Осталось сделать чтобы патчи приняли и я буду счастлив. Всех с наступающим новым годом!!!!

diff -Naur mcabber-0.9.9.orig/src/commands.c mcabber-0.9.9/src/commands.c
--- mcabber-0.9.9.orig/src/commands.c	2008-12-31 20:30:41.000000000 +0300
+++ mcabber-0.9.9/src/commands.c	2008-12-31 20:25:59.000000000 +0300
@@ -23,6 +23,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <glib/gstdio.h>
 
 #include "commands.h"
 #include "help.h"
@@ -60,6 +61,8 @@
 static void do_say(char *arg);
 static void do_msay(char *arg);
 static void do_say_to(char *arg);
+static void do_esay(char *arg);
+static void do_esay_to(char *arg);
 static void do_buffer(char *arg);
 static void do_clear(char *arg);
 static void do_info(char *arg);
@@ -156,6 +159,9 @@
   cmd_add("say", "Say something to the selected buddy", 0, 0, &do_say);
   cmd_add("say_to", "Say something to a specific buddy", COMPL_JID, 0,
           &do_say_to);
+  cmd_add("esay", "External editor say something to the selected buddy", 0, 0, &do_esay);
+  cmd_add("esay_to", "External editor say something to a specific buddy", COMPL_JID, 0,
+          &do_esay_to);
   cmd_add("screen_refresh", "Redraw mcabber screen", 0, 0, &do_screen_refresh);
   //cmd_add("search");
   cmd_add("set", "Set/query an option value", 0, 0, &do_set);
@@ -217,6 +223,7 @@
   compl_add_category_word(COMPL_BUFFER, "scroll_toggle");
   compl_add_category_word(COMPL_BUFFER, "list");
   compl_add_category_word(COMPL_BUFFER, "save");
+  compl_add_category_word(COMPL_BUFFER, "edit");
 
   // Group category
   compl_add_category_word(COMPL_GROUP, "fold");
@@ -1239,6 +1246,90 @@
   do_say_internal(arg, 1);
 }
 
+void mcabber_mktemp(gchar *s)
+{
+	sprintf(s, "%s/mcabber-%s-%d-%d", g_get_tmp_dir(), g_get_host_name(), getuid(), getpid());
+	g_unlink(s);
+}
+
+static void do_external_say(char *arg, void (*say)(char *arg))
+{
+	GError *err = NULL;
+	gchar *argv[] = { NULL, NULL };
+
+	argv[0] = (gchar*)g_getenv("EDITOR");
+	if (argv[0] == NULL)
+	{
+		scr_LogPrint(LPRINT_NORMAL, "Environment variable \"EDITOR\" don't setted");
+		return;
+	}
+
+	gchar tmp_file[_POSIX_PATH_MAX];
+	mcabber_mktemp(tmp_file);
+	gint tfile = g_open(tmp_file, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
+	if (tfile == -1)
+	{
+		scr_LogPrint(LPRINT_NORMAL, "Cannot create tmp file \"%s\": %s.", tmp_file, strerror(errno));
+		return;
+	}
+	close(tfile);
+	argv[1] = tmp_file;
+
+	gint exit_status = 0;
+	if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, NULL, NULL, &exit_status, &err))
+		scr_LogPrint(LPRINT_NORMAL, err->message);
+	else if (WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == EXIT_SUCCESS)
+	{
+		GMappedFile *mfile = g_mapped_file_new(argv[1], FALSE, &err);
+
+		if (mfile == NULL)
+			scr_LogPrint(LPRINT_NORMAL, err->message);
+		else
+		{
+			gint mfile_size = g_mapped_file_get_length(mfile);
+
+			if (mfile_size == 0)
+				scr_LogPrint(LPRINT_NORMAL, "Message is empty and don't sended.");
+			else
+			{
+				gint arg_len = strlen(arg);
+				gint mess_len = arg_len + mfile_size + 2;
+				gchar *mess = g_new0(gchar, mess_len);
+
+				g_memmove(mess, arg, arg_len);
+				mess[arg_len] = ' ';
+				g_memmove(mess+arg_len+1, g_mapped_file_get_contents(mfile), mfile_size);
+				mess[mess_len-1] = '\0';
+
+				if (arg_len == 0)
+					say(mess+1);
+				else
+					say(mess);
+
+				g_free(mess);
+			}
+
+			g_mapped_file_free (mfile);
+		}
+	}
+	else
+		scr_LogPrint(LPRINT_NORMAL, "External editor don't normal exited(%d).", WEXITSTATUS(exit_status));
+
+	g_unlink(argv[1]);
+
+	do_screen_refresh(NULL);
+}
+
+static void do_esay(char *arg)
+{
+	do_external_say(arg, do_say);
+}
+
+static void do_esay_to(char *arg)
+{
+	do_external_say(arg, do_say_to);
+}
+
 static void do_msay(char *arg)
 {
   /* Parameters: begin verbatim abort send send_to */
@@ -1638,6 +1729,32 @@
     buffer_percent(subcmd+1, arg);
   } else if (!strcasecmp(subcmd, "save")) {
     scr_BufferDump(arg);
+  } else if (!strcasecmp(subcmd, "edit")) {
+	GError *err = NULL;
+	gchar *argv[] = { NULL, NULL };
+
+	argv[0] = (gchar*)g_getenv("EDITOR");
+	if (argv[0] == NULL)
+	{
+		scr_LogPrint(LPRINT_NORMAL, "Environment variable \"EDITOR\" don't setted");
+		return;
+	}
+
+	gchar tmp_file[_POSIX_PATH_MAX];
+	mcabber_mktemp(tmp_file);
+	argv[1] = tmp_file;
+
+    scr_BufferDump(argv[1]);
+
+	gint exit_status = 0;
+	if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, NULL, NULL, &exit_status, &err))
+		scr_LogPrint(LPRINT_NORMAL, err->message);
+	else if (!(WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == EXIT_SUCCESS))
+		scr_LogPrint(LPRINT_NORMAL, "External editor don't normal exited(%d).", WEXITSTATUS(exit_status));
+
+	do_screen_refresh(NULL);
+
+	g_unlink(argv[1]);
   } else if (!strcasecmp(subcmd, "list")) {
     scr_BufferList();
   } else {
Devix ★
() автор топика
Ответ на: комментарий от Devix
>добавил функцию "/buffer edit" которая передает текущую историю сообщений внешнему редактору.

А зачем это?
sdio ★★★★★
()
Ответ на: комментарий от sdio
Ну можно всю историю разговора в редактор переслать. А дальше редактировать и сохранять куда небуть.

PS: Просто я использую vim а у него безграничные возможности, вот и хотелось его задействовать.
Devix ★
() автор топика
Ответ на: комментарий от sdio
>А зачем это?

У этой функции название не подходящее, надо подумать как по другому обозвать.
Devix ★
() автор топика
Ответ на: комментарий от sdio
И кстати из vim можно не только сохранять но например передать файл urlview для просмотра ссылок в бразере.
Devix ★
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.