LINUX.ORG.RU

mcabber + vim


0

1

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

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

Заранее благодарен.


Re: mcabber + vim

Еще хочу спросить. Есть ли вообще консольные jabber клиенты которые могут передавать сообщения внешним программам и принимать от них сообщения?

Devix ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

>Есть ли вообще консольные jabber клиенты которые могут передавать сообщения внешним программам и принимать от них сообщения?

Тот же mcabber

sdio ★★★★★ ()
Ответ на: Re: mcabber + vim от sdio

Re: mcabber + vim

>Тот же mcabber

Не подскажешь как? Ато сегодня только поставил mcabber.

Devix ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

для подробностей читай доку

# 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 ★★★★★ ()
Ответ на: Re: mcabber + vim от sdio

Re: mcabber + vim

Немного не то.

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

"/cmd_say vim" - здесь запускается vim с временным файлом для редактирования и после сохранения посылается собеседнику(как в mutt).

Devix ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

И вообше как вы действуете если нужно послать собеседнику кусок текста из какого либо файла?

Devix ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

переходим в multi-line mode потом действует закон копипасты

dGhost ★★★ ()
Ответ на: Re: mcabber + vim от dGhost

Re: mcabber + vim

>переходим в multi-line mode потом действует закон копипасты

Что еще за закон копипасты? Это который в x или при помощи gpm?

Devix ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

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

Devix ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

может доку почитаешь, а?

# 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 ★★★★★ ()
Ответ на: Re: mcabber + vim от sdio

Re: mcabber + vim

>echo "command ..." > ~/.mcabber/mcabber.fifo

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

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

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

PS: Если конечно это все есть то глубоко извиняюсь.

Devix ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

Ну напиши патч, исходники открыты
Или ты только критиковать можешь?

sdio ★★★★★ ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

>>echo "command ..." > ~/.mcabber/mcabber.fifo

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


Нет. Удобно отправлять уведомления из скрипта.

sdio ★★★★★ ()
Ответ на: Re: mcabber + vim от sdio

Re: mcabber + vim

>Ну напиши патч, исходники открыты
>Или ты только критиковать можешь?


Если ничего путного не найду и будет время то напишу.

Devix ()
Ответ на: Re: mcabber + vim от sdio

Re: mcabber + vim

>Нет. Удобно отправлять уведомления из скрипта.

Для автоматизации удобно но для работы "чловек - машина" неудобно.

Devix ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

Вот патч добавляющий 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 ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

О! хотя оно мне и не надо (пока), но респект и уважуха тебе!

sdio ★★★★★ ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

Маленькие исправления:

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 ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

Изменил работу с временными файлами и добавил функцию "/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 ()
Ответ на: Re: mcabber + vim от Devix

Re: mcabber + vim

>добавил функцию "/buffer edit" которая передает текущую историю сообщений внешнему редактору.

А зачем это?

sdio ★★★★★ ()
Ответ на: Re: mcabber + vim от sdio

Re: mcabber + vim

Ну можно всю историю разговора в редактор переслать. А дальше редактировать и сохранять куда небуть.

PS: Просто я использую vim а у него безграничные возможности, вот и хотелось его задействовать.

Devix ()
Ответ на: Re: mcabber + vim от sdio

Re: mcabber + vim

>А зачем это?

У этой функции название не подходящее, надо подумать как по другому обозвать.

Devix ()
Ответ на: Re: mcabber + vim от sdio

Re: mcabber + vim

И кстати из vim можно не только сохранять но например передать файл urlview для просмотра ссылок в бразере.

Devix ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.