LINUX.ORG.RU

«Лесенки» в mcedit...


1

2

есть такой вариант решить проблему со вставкой лесенки отступов в редакторе: заменить опцию [x] Автоотступ «Вводом» на [x] Автоотступ клавишей «Return» которая будет делать автоотступ через другое сочетание, например через ctrl-enter или alt-enter. и дополнительно ещё добавить в «обучении» кнопку Return чтобы можно было обучить Return например сочетанию C-Enter или A-Enter. т.е. условно разделить Enter и Return где Enter это просто Enter а Return это модификатор + Enter...

прошу принять участие в обсуждении такого решения...

★★★★

Неплохо было бы упомянутую опцию оставить только для ручного ввода, а для копипасты добавить опцию игнорирования отступов в процессе копипасты.

blexey ★★★★★
()

Если я правильно понял, ТС предлагает на Enter повесить обычный перевод строки, а на Alt-Enter — перевод строки с автоотступом?

Неплохо бы еще предусмотреть хоткей для переключения этих вариантов местами.

geekless ★★
()
Ответ на: комментарий от geekless

>Если я правильно понял, ТС предлагает на Enter повесить обычный перевод строки, а на Alt-Enter — перевод строки с автоотступом?

именно так...

Неплохо бы еще предусмотреть хоткей для переключения этих вариантов местами.

но тогда опять же будет проблема с лесенкой.

angel_il ★★★★
() автор топика
Ответ на: комментарий от geekless

> сочетанию C-Enter

Такого быть не может.

чегойта, xterm - Ctrl-Enter и Alt-Enter различает. putty знает только alt-enter.

angel_il ★★★★
() автор топика
Ответ на: комментарий от angel_il

> > Неплохо бы еще предусмотреть хоткей для переключения этих вариантов местами.

но тогда опять же будет проблема с лесенкой.

Для кого-то удобнее использовать предложенный вариант. Тогда проблем с лесенкой нет.

А для кого-то удобнее использовать автоотступ на Enter. Для них надо предесмотреть хоткей для временного отключения автоотступа по Enter.

geekless ★★
()

да, я за A+Enter, и опция вернуть все взад с лесенкой для гурманов

Turbid ★★★★★
()
Ответ на: комментарий от geekless

Но в принципе да, Ctrl-Enter эмулятором терминала может маппиться на некую escape sequence.

geekless ★★
()
Ответ на: комментарий от angel_il

А если попытается догадаться по скорости поступления данных? Звучит, конечно, дико, но может это реализуемо?

blexey ★★★★★
()
Ответ на: комментарий от blexey

да, думал над этим уже, но это не очень хороший костыль... когда mc будет переделываться на gMainLoop оно или сломается или будет мешать...

angel_il ★★★★
() автор топика
Ответ на: комментарий от geekless

>>> Неплохо бы еще предусмотреть хоткей для переключения этих вариантов местами.

но тогда опять же будет проблема с лесенкой.

Для кого-то удобнее использовать предложенный вариант. Тогда проблем с лесенкой нет.

А для кого-то удобнее использовать автоотступ на Enter. Для них надо предесмотреть хоткей для временного отключения автоотступа по Enter.

ну тогда возможно добавлю еще один вариант и получится:

[х] Автоотступ «Вводом»

[ ] Автоотступ клавишей Ruturn

если кому то надо будет через Alt-Enter тот поставит галку в «Автоотступ клавишей Ruturn», кому ентером тот в «Автоотступ „Вводом“»...

angel_il ★★★★
() автор топика

я против - в слове «автоотступ» есть слово «авто», поэтому делать его не на ентере глупо - так можно дойти, что автоотступ будем делать пробелами на нужное количество )

и отключать автоотступ временно вручную тоже не решение - чтож мне теперь щёлкать туда сюда при редактировании и вставке ?

проблемы со вставкой надо решать не этими предложенными костылями

разве mc не знает что нажат shift-ins ?

x905 ★★★★★
()
Ответ на: комментарий от anonymous

это очень плохо и неправильно это
приложение должно знать какие кнопки нажимает пользователь

x905 ★★★★★
()

а как mc узнает, что нажата клавиша или сочетание клавиш ?
какие «события» происходят при вставке?

x905 ★★★★★
()
Ответ на: комментарий от x905

> это очень плохо и неправильно это

Это реальность, данная нам в ощущении.

приложение должно знать какие кнопки нажимает пользователь

Если эти нажатия до программы не доходят, как она узнает? Через libastral?

anonymous
()
Ответ на: комментарий от x905

> а как mc узнает, что нажата клавиша или сочетание клавиш ?

Он читает с помощью экранной библиотеки из входного буфера esc-последовательности, которые у разных терминалов могут быть разные (а так оно и есть). При нажатии на ctrl-ins терминал посылает на stdin mc содержимое своего буфера. Сама комбинация ctrl-ins, очевидно, не посылается.

какие «события» происходят при вставке?


Очевидно, mc обрабатывает приходящие на stdin символы.

anonymous
()
Ответ на: комментарий от x905

>а как mc узнает, что нажата клавиша или сочетание клавиш ? терминал сообщает какие ESC-последовательности получены.

angel_il ★★★★
() автор топика
Ответ на: комментарий от anonymous

Сама комбинация ctrl-ins

это настраивается, я себе в xterm сделал так

XTerm*VT100.Translations: #override \n\
    Meta   <Key>Insert: insert-selection(PRIMARY) \n\
    Ctrl   <Key>Tab:  string(0x1b) string("[z") \n\
    Meta   <Key>Tab:  string(0x1b) string("[Z") \n\
    Shift  <Key>Insert: string(0x1b) string("[2;2~") \n\
    <Btn1Up>: select-end(PRIMARY, CLIPBOARD, CUT_BUFFER0) \n\
    Meta   <Key>F9: fullscreen() \n

Ctrl-tab посылает \e[z, Alt-tab посылает \e[Z Shift-Insert посылает \e[2;2~

соответственно на \e[2;2~ повешен вызов xclip

angel_il ★★★★
() автор топика

Опции это слишком далеко. Надо как в виме — нужен всего лишь шоткат для переключения на режим вставки. Без всяких модификаторов.

baverman ★★★
()

а нельзя ли както сказать терминалу, чтобы он всётаки посылал в mc и саму эту комбинацию shift-Ins ?

если это совсем нельзя, то можно добавить ещё один параллельный шорткат на вставку, который дойдёт до mc (например alt-f5)

x905 ★★★★★
()
Ответ на: комментарий от baverman

вот не надо превращать нормальный редактор mcedit в vi
кому нужен vi пускай его ставит альтернативой

x905 ★★★★★
()
Ответ на: комментарий от x905

Глупости. :set paste, пожалуй, самое удобное решение для вставки (учитывая ограничения терминалов). При чем тут вим?

baverman ★★★
()
Ответ на: комментарий от baverman

неудобно переключаться в «режим вставки» и обратно
mc может|должен это сделать автоматически (по крайней мере для тех терминалов, которые не очень ограничены)

x905 ★★★★★
()
Ответ на: комментарий от x905

неудобно переключаться в «режим вставки» и обратно

Гм. Это делается очень (очень-очень) редко, при копипасте из внешних программ. Не вижу ни одной причины лепить кривые костыли.

baverman ★★★
()
Ответ на: комментарий от baverman

я частенько это делаю и делал бы еще чаще, если бы нормально копипаст работал

и да, кривые костыли лепить незачем - mc должен сам всё корректно отрабатывать

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

x905 ★★★★★
()
Ответ на: комментарий от x905

я частенько это делаю

Может ты что-то неправильно делаешь? Например, не пользуешься внутренним mc-шным копипастом?

baverman ★★★
()
Ответ на: комментарий от baverman

> Может ты что-то неправильно делаешь? Например, не пользуешься внутренним mc-шным копипастом?

внутренним копипастом извне не вставить
да и крив он - f3-f5 не нативны, ctrl-ins, shift-ins - намного удобнее

итого: нужна прозрачная поддержка выделения по shift-стрелки и копипаста по ctrl-ins - shift-ins - вот тогда будет хорошо (тотже фар работает прозрачно и пользоваться им было убодно, да и сейчас когда в венде нужно чтото сделать - все удобно т.е. редактирую как в обычном редакторе и не нужно помнить дополнительные клавиши для копипасты)

ссылаться на кривость терминалов можно, но редактировать от этого легче не становится, поэтому надо это как то преодолеть программными путями

x905 ★★★★★
()
Ответ на: комментарий от angel_il

хм, подзабыл я про xclip
пытаюсь вспомнить как оно настраивается - поставил xclip, добавил строки
clipboard_store=xclip -i
clipboard_paste=xclip -o
нажимаю f5 в редакторе и ничего не вставляется, что не так ?

под внутренним копипастом я имел в виду, что по f3 выделенный буфер из редакторе mc не попадает в x-буфер, а по f5 не вставляется из x-буфера

x905 ★★★★★
()
Ответ на: комментарий от x905

кроме F5 есть еще XCopy, Xpaste, XCut. клавиши по умолчанию не назначены, у меня эти экшены повешены на ctrl-c/ctrl-v/ctrl-x

angel_il ★★★★
() автор топика
Ответ на: комментарий от angel_il

опиши подробнее про XCopy, Xpaste, XCut

и все эти настройки делать на каждую инсталляцию mc (дома и на ещё 4 раза) приводит в уныние - почему нельзя сделать их сразу в коде и/или галкой в настройках (чтобы не ковыряться в ini) ?
что то типа "[X] Use X-Clipboard by default"

x905 ★★★★★
()

Наверное глупость скажу. Человек не может печатать со скоростью over 1024 символа в минуту. Все последние введённые символы с более высокой скоростью - копипаста! Остальное - ручной ввод.

backbone ★★★★★
()
Ответ на: комментарий от backbone

вот нажали вы букву «й» (утф8) она будет послана как 2 байта - 208, 185 с маленьким интервалом. это первый нюансик... второе это то что несовсем понятно в какой момент включать счётчик... мы всё таки не хотим делать из mc коматозящего тормозного монстра...

angel_il ★★★★
() автор топика
Ответ на: комментарий от angel_il

В utf-8 же могут быть символы >2 байт вроде, не подумал как-то... Счётчик - по нажатию, критерий проверки - наличие символов \n, \r. А вообще, глупость полная, согласен.
В Vim сколько пользуюсь F5, неудобств не замечено. Склоняюсь к hotkey, так как по настройкам лазить долго.

backbone ★★★★★
()

Ничего менять не надо, просто добавьте в MC такую логику: если две строки введены меньше, чем за 0,5 секунды, то отступ не ставим.

Ни один нормальный человек с такой скоростью вводить данные не сможет, зато вы сразу поймаете момент Paste из Buffer :)

juk4windows
()
Ответ на: комментарий от angel_il

Смотреть надо на интервалы не между байтами, а между цельными utf-символами. Т.е. смотреть на время ввода пары utf8-символ + перевод строки.

geekless ★★
()
Ответ на: комментарий от geekless

на коленке пока нарисовал вот такой вариант, работает но надо допиливать... добавлять настройти в окно настроек и код подчистить...

diff --git a/src/editor/edit.c b/src/editor/edit.c
index 0dfdfb6..c50da46 100644
--- a/src/editor/edit.c
+++ b/src/editor/edit.c
@@ -3777,7 +3777,7 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
         else
         {
             edit_insert (edit, '\n');
-            if (option_return_does_auto_indent)
+            if (option_return_does_auto_indent && !used_copypaste)
             {
                 edit_auto_indent (edit);
             }

diff --git a/lib/tty/key.c b/lib/tty/key.c
index 57c1caf..87b4073 100644
--- a/lib/tty/key.c
+++ b/lib/tty/key.c
@@ -79,6 +79,9 @@
 
 /*** global variables ****************************************************************************/
 
+int copypaste_speed = 50;
+gboolean used_copypaste = FALSE;
+int previous_pressed_char = 0;
 int mou_auto_repeat = 100;
 int double_click_speed = 250;
 int old_esc_mode = 0;
@@ -1881,6 +1884,7 @@ tty_get_event (struct Gpm_Event *event, gboolean redo_event, gboolean block)
     struct timeval time_out;
     struct timeval *time_addr = NULL;
     static int dirty = 3;
+    static struct timeval lastkeytime = { -1, -1 };
 
     if ((dirty == 3) || is_idle ())
     {
@@ -2004,7 +2008,18 @@ tty_get_event (struct Gpm_Event *event, gboolean redo_event, gboolean block)
     untouchwin (stdscr);
 #endif /* !HAVE_SLANG */
     c = block ? getch_with_delay () : get_key_code (1);
-
+    used_copypaste = FALSE;
+    if (previous_pressed_char != c)
+    {
+        struct timeval currt;
+
+        GET_TIME (currt);
+        if (lastkeytime.tv_sec && (DIF_TIME (lastkeytime, currt) < copypaste_speed))
+            used_copypaste = TRUE;
+        lastkeytime.tv_usec = currt.tv_usec;
+        lastkeytime.tv_sec = currt.tv_sec;
+        previous_pressed_char = c;
+    }
 #ifndef HAVE_SLANG
     if (flag > 0)
         tty_touch_screen ();

angel_il ★★★★
() автор топика
Ответ на: комментарий от juk4windows

>Ничего менять не надо, просто добавьте в MC такую логику: если две строки введены меньше, чем за 0,5 секунды, то отступ не ставим.

а если человек хочет добавить 20 строк, он зажимает enter и строки будут введены за секунду... так что так в лоб нельзя, но в патче выше это учтено...

angel_il ★★★★
() автор топика
Ответ на: комментарий от angel_il

забыл потч на хидер приложить

diff --git a/lib/tty/key.h b/lib/tty/key.h
index 0eba859..2bfd636 100644
--- a/lib/tty/key.h
+++ b/lib/tty/key.h
@@ -52,7 +52,8 @@ struct Gpm_Event;
 extern const key_code_name_t key_name_conv_tab[];
 
 extern int old_esc_mode_timeout;
-
+extern gboolean used_copypaste;
+extern int copypaste_speed;
 extern int double_click_speed;
 extern int old_esc_mode;
 extern int use_8th_bit_as_meta;

angel_il ★★★★
() автор топика

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

smalcom
()
Ответ на: комментарий от smalcom

>забить в коде такое поведение(измерение времени) не гут ни разу. ну естественно оно не будет захардкожено...

angel_il ★★★★
() автор топика

Если более красивых вариантов не просмартивается, то я за. Лесенки реально мешают.

hobbit ★★★★★
()
30 мая 2012 г.

Разве это не зависит от того, какой виртуальный терминал используется?

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