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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.