mirror of
https://github.com/weechat/weechat.git
synced 2026-07-10 19:53:13 +02:00
core: add option weechat.look.buffer_auto_renumber
New option: weechat.look.buffer_auto_renumber, boolean which is on by
default, so the behavior is the same: no gap is allowed in numbers,
they start at number 1 and they are auto-renumbered after each command
like /buffer move, /buffer merge, ...
A new option "renumber" has been added in command /buffer, to renumber
a range of buffers (or all).
Changes when the option weechat.look.buffer_auto_renumber is off:
- command "/buffer move":
- the current number will be left free for use, and the
target number can be any number >= 1 (possibly higher than the
current last buffer number)
- the value can be "-" (which moves the buffer to number 1)
or "+" (which moves the buffer to the end, ie last number + 1)
- command "/buffer swap":
- now the buffers are swapped in the list without being "moved"
- comand "/buffer [+/-]N":
- it is now working with gaps in buffer numbers
- command "/buffer merge":
- it can now merge a group of merged buffers into another buffer
(or buffers merged themselves)
- layout can restore buffer numbers with gaps in numbers
This commit is contained in:
+148
-87
@@ -512,9 +512,9 @@ COMMAND_CALLBACK(buffer)
|
||||
{
|
||||
struct t_gui_buffer *ptr_buffer, *ptr_buffer2, *ptr_prev_buffer;
|
||||
struct t_gui_buffer *weechat_buffer;
|
||||
long number, number1, number2;
|
||||
long number, number1, number2, numbers[3];
|
||||
char *error, *value, *pos, *str_number1, *pos_number2;
|
||||
int i, target_buffer, error_main_buffer, num_buffers;
|
||||
int i, error_main_buffer, num_buffers, count, prev_number;
|
||||
|
||||
/* make C compiler happy */
|
||||
(void) data;
|
||||
@@ -553,42 +553,24 @@ COMMAND_CALLBACK(buffer)
|
||||
{
|
||||
if (string_strcasecmp (argv[2], "-all") == 0)
|
||||
gui_buffer_clear_all ();
|
||||
else if (string_strcasecmp (argv[2], "-merged") == 0)
|
||||
{
|
||||
for (ptr_buffer = gui_buffers; ptr_buffer;
|
||||
ptr_buffer = ptr_buffer->next_buffer)
|
||||
{
|
||||
if ((ptr_buffer->number == buffer->number)
|
||||
&& (ptr_buffer->type == GUI_BUFFER_TYPE_FORMATTED))
|
||||
{
|
||||
gui_buffer_clear (ptr_buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 2; i < argc; i++)
|
||||
{
|
||||
error = NULL;
|
||||
number = strtol (argv[i], &error, 10);
|
||||
if (error && !error[0])
|
||||
ptr_buffer = (string_strcasecmp (argv[i], "-merged") == 0) ?
|
||||
buffer : gui_buffer_search_by_number_or_name (argv[i]);
|
||||
if (ptr_buffer)
|
||||
{
|
||||
for (ptr_buffer = gui_buffers; ptr_buffer;
|
||||
ptr_buffer = ptr_buffer->next_buffer)
|
||||
for (ptr_buffer2 = gui_buffers; ptr_buffer2;
|
||||
ptr_buffer2 = ptr_buffer2->next_buffer)
|
||||
{
|
||||
if ((ptr_buffer->number == number)
|
||||
&& (ptr_buffer->type == GUI_BUFFER_TYPE_FORMATTED))
|
||||
if ((ptr_buffer2->number == ptr_buffer->number)
|
||||
&& (ptr_buffer2->type == GUI_BUFFER_TYPE_FORMATTED))
|
||||
{
|
||||
gui_buffer_clear (ptr_buffer);
|
||||
gui_buffer_clear (ptr_buffer2);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ptr_buffer = gui_buffer_search_by_full_name (argv[i]);
|
||||
if (ptr_buffer)
|
||||
gui_buffer_clear (ptr_buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -605,28 +587,39 @@ COMMAND_CALLBACK(buffer)
|
||||
if (string_strcasecmp (argv[1], "move") == 0)
|
||||
{
|
||||
COMMAND_MIN_ARGS(3, "buffer move");
|
||||
error = NULL;
|
||||
number = strtol (((argv[2][0] == '+') || (argv[2][0] == '-')) ?
|
||||
argv[2] + 1 : argv[2],
|
||||
&error, 10);
|
||||
if (error && !error[0])
|
||||
if (strcmp (argv[2], "-") == 0)
|
||||
{
|
||||
if (argv[2][0] == '+')
|
||||
gui_buffer_move_to_number (buffer,
|
||||
buffer->number + ((int) number));
|
||||
else if (argv[2][0] == '-')
|
||||
gui_buffer_move_to_number (buffer,
|
||||
buffer->number - ((int) number));
|
||||
else
|
||||
gui_buffer_move_to_number (buffer, (int) number);
|
||||
gui_buffer_move_to_number (buffer, 1);
|
||||
}
|
||||
else if (strcmp (argv[2], "+") == 0)
|
||||
{
|
||||
gui_buffer_move_to_number (buffer, last_gui_buffer->number + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* invalid number */
|
||||
gui_chat_printf (NULL,
|
||||
_("%sError: incorrect buffer number"),
|
||||
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
|
||||
return WEECHAT_RC_OK;
|
||||
error = NULL;
|
||||
number = strtol (((argv[2][0] == '+') || (argv[2][0] == '-')) ?
|
||||
argv[2] + 1 : argv[2],
|
||||
&error, 10);
|
||||
if (error && !error[0])
|
||||
{
|
||||
if (argv[2][0] == '+')
|
||||
gui_buffer_move_to_number (buffer,
|
||||
buffer->number + ((int) number));
|
||||
else if (argv[2][0] == '-')
|
||||
gui_buffer_move_to_number (buffer,
|
||||
buffer->number - ((int) number));
|
||||
else
|
||||
gui_buffer_move_to_number (buffer, (int) number);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* invalid number */
|
||||
gui_chat_printf (NULL,
|
||||
_("%sError: incorrect buffer number"),
|
||||
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
@@ -640,33 +633,10 @@ COMMAND_CALLBACK(buffer)
|
||||
ptr_buffer = NULL;
|
||||
ptr_buffer2 = NULL;
|
||||
|
||||
/* first buffer for swap */
|
||||
number = strtol (argv[2], &error, 10);
|
||||
if (error && !error[0])
|
||||
ptr_buffer = gui_buffer_search_by_number (number);
|
||||
else
|
||||
{
|
||||
ptr_buffer = gui_buffer_search_by_full_name (argv[2]);
|
||||
if (!ptr_buffer)
|
||||
ptr_buffer = gui_buffer_search_by_partial_name (NULL, argv[2]);
|
||||
}
|
||||
|
||||
/* second buffer for swap */
|
||||
if (argc > 3)
|
||||
{
|
||||
number = strtol (argv[3], &error, 10);
|
||||
if (error && !error[0])
|
||||
ptr_buffer2 = gui_buffer_search_by_number (number);
|
||||
else
|
||||
{
|
||||
ptr_buffer2 = gui_buffer_search_by_full_name (argv[3]);
|
||||
if (!ptr_buffer2)
|
||||
ptr_buffer2 = gui_buffer_search_by_partial_name (NULL, argv[3]);
|
||||
}
|
||||
}
|
||||
else
|
||||
ptr_buffer2 = buffer;
|
||||
|
||||
/* search buffers to swap */
|
||||
ptr_buffer = gui_buffer_search_by_number_or_name (argv[2]);
|
||||
ptr_buffer2 = (argc > 3) ?
|
||||
gui_buffer_search_by_number_or_name (argv[3]) : buffer;
|
||||
if (!ptr_buffer || !ptr_buffer2)
|
||||
{
|
||||
/* invalid buffer name/number */
|
||||
@@ -676,7 +646,7 @@ COMMAND_CALLBACK(buffer)
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
gui_buffer_swap (ptr_buffer, ptr_buffer2);
|
||||
gui_buffer_swap (ptr_buffer->number, ptr_buffer2->number);
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
@@ -730,11 +700,49 @@ COMMAND_CALLBACK(buffer)
|
||||
}
|
||||
}
|
||||
}
|
||||
gui_buffer_unmerge (buffer, (int) number);
|
||||
gui_buffer_unmerge (buffer, (int)number);
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/* renumber buffers */
|
||||
if (string_strcasecmp (argv[1], "renumber") == 0)
|
||||
{
|
||||
if (CONFIG_BOOLEAN(config_look_buffer_auto_renumber))
|
||||
{
|
||||
gui_chat_printf (NULL,
|
||||
_("%sError: renumbering is allowed only if option "
|
||||
"weechat.look.buffer_auto_renumber is off"),
|
||||
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
if (argc >= i + 3)
|
||||
{
|
||||
error = NULL;
|
||||
numbers[i] = strtol (argv[i + 2], &error, 10);
|
||||
if (!error || error[0])
|
||||
{
|
||||
/* invalid number */
|
||||
gui_chat_printf (NULL,
|
||||
_("%sError: incorrect buffer number"),
|
||||
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
}
|
||||
else
|
||||
numbers[i] = -1;
|
||||
}
|
||||
/*
|
||||
* renumber the buffers; if we are renumbering all buffers (no numbers
|
||||
* given), start at number 1
|
||||
*/
|
||||
gui_buffer_renumber (numbers[0], numbers[1],
|
||||
(argc == 2) ? 1 : numbers[2]);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/* close buffer */
|
||||
if (string_strcasecmp (argv[1], "close") == 0)
|
||||
{
|
||||
@@ -945,12 +953,35 @@ COMMAND_CALLBACK(buffer)
|
||||
number = strtol (argv[1] + 1, &error, 10);
|
||||
if (error && !error[0])
|
||||
{
|
||||
target_buffer = buffer->number - (int) number;
|
||||
if (target_buffer < 1)
|
||||
target_buffer = (last_gui_buffer) ?
|
||||
last_gui_buffer->number + target_buffer : 1;
|
||||
gui_buffer_switch_by_number (gui_current_window,
|
||||
target_buffer);
|
||||
if (number <= 0)
|
||||
return WEECHAT_RC_OK;
|
||||
count = 0;
|
||||
prev_number = gui_current_window->buffer->number;
|
||||
ptr_buffer = gui_current_window->buffer;
|
||||
while (1)
|
||||
{
|
||||
ptr_buffer = ptr_buffer->prev_buffer;
|
||||
if (!ptr_buffer)
|
||||
ptr_buffer = last_gui_buffer;
|
||||
|
||||
/* if we have looped on all buffers, exit the loop */
|
||||
if (ptr_buffer == gui_current_window->buffer)
|
||||
break;
|
||||
|
||||
if ((ptr_buffer->number != gui_current_window->buffer->number)
|
||||
&& (ptr_buffer->number != prev_number))
|
||||
{
|
||||
/* increase count each time we discover a different number */
|
||||
count++;
|
||||
if (count == number)
|
||||
{
|
||||
gui_buffer_switch_by_number (gui_current_window,
|
||||
ptr_buffer->number);
|
||||
break;
|
||||
}
|
||||
}
|
||||
prev_number = ptr_buffer->number;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -971,11 +1002,35 @@ COMMAND_CALLBACK(buffer)
|
||||
number = strtol (argv[1] + 1, &error, 10);
|
||||
if (error && !error[0])
|
||||
{
|
||||
target_buffer = buffer->number + (int) number;
|
||||
if (last_gui_buffer && target_buffer > last_gui_buffer->number)
|
||||
target_buffer -= last_gui_buffer->number;
|
||||
gui_buffer_switch_by_number (gui_current_window,
|
||||
target_buffer);
|
||||
if (number <= 0)
|
||||
return WEECHAT_RC_OK;
|
||||
count = 0;
|
||||
prev_number = gui_current_window->buffer->number;
|
||||
ptr_buffer = gui_current_window->buffer;
|
||||
while (1)
|
||||
{
|
||||
ptr_buffer = ptr_buffer->next_buffer;
|
||||
if (!ptr_buffer)
|
||||
ptr_buffer = gui_buffers;
|
||||
|
||||
/* if we have looped on all buffers, exit the loop */
|
||||
if (ptr_buffer == gui_current_window->buffer)
|
||||
break;
|
||||
|
||||
if ((ptr_buffer->number != gui_current_window->buffer->number)
|
||||
&& (ptr_buffer->number != prev_number))
|
||||
{
|
||||
/* increase count each time we discover a different number */
|
||||
count++;
|
||||
if (count == number)
|
||||
{
|
||||
gui_buffer_switch_by_number (gui_current_window,
|
||||
ptr_buffer->number);
|
||||
break;
|
||||
}
|
||||
}
|
||||
prev_number = ptr_buffer->number;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -6213,6 +6268,7 @@ command_init ()
|
||||
" || move|merge <number>"
|
||||
" || swap <number1>|<name1> [<number2>|<name2>]"
|
||||
" || unmerge [<number>|-all]"
|
||||
" || renumber [<number1> [<number2> [<start>]]]"
|
||||
" || close [<n1>[-<n2>]|<name>]"
|
||||
" || notify <level>"
|
||||
" || localvar"
|
||||
@@ -6234,6 +6290,8 @@ command_init ()
|
||||
"buffers)\n"
|
||||
" unmerge: unmerge buffer from other buffers which have "
|
||||
"same number\n"
|
||||
"renumber: renumber a range of buffers (works only if "
|
||||
"option weechat.look.buffer_auto_renumber is off)\n"
|
||||
" close: close buffer (number/range or name is optional)\n"
|
||||
" notify: set notify level for current buffer: this "
|
||||
"level determines whether buffer will be added to "
|
||||
@@ -6273,11 +6331,14 @@ command_init ()
|
||||
" /buffer #weechat\n"
|
||||
" jump to next buffer:\n"
|
||||
" /buffer +1"),
|
||||
"clear -merged|-all|%(buffers_numbers)|%(buffers_plugins_names)"
|
||||
"clear -merged|-all|%(buffers_numbers)|"
|
||||
"%(buffers_plugins_names)"
|
||||
" || move %(buffers_numbers)"
|
||||
" || swap %(buffers_numbers)"
|
||||
" || merge %(buffers_numbers)"
|
||||
" || unmerge %(buffers_numbers)|-all"
|
||||
" || renumber %(buffers_numbers) %(buffers_numbers) "
|
||||
"%(buffers_numbers)"
|
||||
" || close %(buffers_plugins_names)"
|
||||
" || list"
|
||||
" || notify reset|none|highlight|message|all"
|
||||
|
||||
Reference in New Issue
Block a user