Ctrl+Стрелка влево и Стрелка влево не различимы в терминале

Изменить содержимое файлов с помощью регулярных выражений;

perl -pi -e 's/_[^_\.]+(\.)/$1/g' *

Старый ответ до изменения вопроса; Измените имена файлов с помощью регулярных выражений;

rename 's/_[^_\.]+(\.)/$1/g' *

Он написан на Perl, поэтому является переносимым.

http://man7.org/linux/man-pages/man1/rename.1.html

1
01.03.2020, 04:59
2 ответа

Вы переписываете программу эмулятора терминала, встроенную в Linux, добавляя эту функциональность.

Встроенный -эмулятор терминала просто не включает информацию о модификаторах ни в какие управляющие последовательности . В частности, он не включает информацию о модификаторах в управляющие последовательности для клавиатуры курсора, как это делают некоторые эмуляторы терминала с графическим интерфейсом.

Вы обнаружите, что есть много вещей, которые программы-эмуляторы терминала, встроенные в ядра операционных систем, таких как ядра Linux и BSD, не делают по сравнению с эмуляторами терминалов с графическим интерфейсом и реальными терминалами. (В руководстве пользователя NetBSD и OpenBSD для wsconsприводится подробный список того, что настоящий DEC VT делает, но не делает. Документ для Linux не так полезен.)

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

Существует несколько эмуляторов пользовательского -пространства терминала, которым не требуется X. Я не могу говорить за других, не проверяя их, но мой определенно предоставляет информацию о модификаторах в управляющих последовательностях.Вот что происходит с упомянутыми вами аккордами:

% cat -v
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B
% console-decode-ecma48 --input
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B
CUB
CUF
CUU
CUD
Control+CUB 1
Control+CUF 1
Control+CUU 1
Control+CUD 1
LF
% setterm --appcursorkeys on ; console-decode-ecma48 --input
^[OD^[OC^[OA^[OB^[[1;5D^[[1;5C^[[1;5A^[[1;5B
SS3 'D'
SS3 'C'
SS3 'A'
SS3 'B'
Control+CUB 1
Control+CUF 1
Control+CUU 1
Control+CUD 1
LF
% 

Дополнительная литература

0
28.04.2021, 23:21

Я получаю ^[[Dсо стрелкой влево.

Ctrl -влево дает ^[[151в Linux VC и ^[[1;5Dв xterm


man keymapsесть:

 Which  of  the actions bound to a given key is taken when it is pressed depends on what
   modifiers are in effect at that moment.  The  keyboard  driver  supports  9  modifiers.
   These  modifiers  are  labeled  (completely  arbitrarily)  Shift,  AltGr, Control, Alt,
   ShiftL, ShiftR, CtrlL, CtrlR and CapsShift.  Each of these modifiers has an  associated
   weight of power of two according to the following table:

          modifier            weight

          Shift                  1
          AltGr                  2
          Control                4
          Alt                    8
          ShiftL                16
          ShiftR                32
          CtrlL                 64
          CtrlR                128
          CapsShift            256

Я изменил его, чтобы обе клавиши «Alt» работали одинаково, как Shift и Control:

Пример :Раскладки клавиш -файл дляloadkeys:

# three modifiers -> 8 cols. (AltGr missing):
#
keymaps 0-1,4-5,8-9,12-13

, а затем:

# left modifiers
keycode  42 = Shift
keycode  29 = Control
keycode  56 = Alt
keycode  58 = Caps_Lock
# right side...just Alt
keycode  54 = Shift
keycode  97 = Control
keycode 100 = Alt

Обычно это 100=AltGr.

Затем я добавляю два дополнительных действия за стандартное «Влево»:

keycode 105 = Left F150 F151
  string F150 = "\033[150"
  string F151 = "\033[151"

это должно быть в два шага..."F150" — это просто метка для соединения измененного ключа со строкой.

Теперь у меня есть клавиша со стрелкой (105 ), производящая «Влево», как и раньше, но Shift и Control производят выбранные управляющие последовательности.

, а затем в~/.inputrc:

# Moving - modif. L+R Arrows in linux VC
# ascii codes in X / evdev / xterm
#
"\e[150":  backward-word
"\e[1;2D": backward-word
"\e[154":   forward-word
"\e[1;2C":  forward-word

"\e[151":  shell-backward-word
"\e[1;5D": shell-backward-word
"\e[155":   shell-forward-word
"\e[1;5C":  shell-forward-word

Оглядываясь назад, я должен был выбрать 1;2D, который производит X. Это сэкономило бы несколько строк inputrc -. Но эти escape-последовательности показались мне немного непрозрачными, поэтому я определил свои собственные.


Чтобы проиллюстрировать отображение модификатора:

# "Print Screen Sys Rq" is Nr 99
#
keycode 99 =  F91 F92 F93 nul F95 F96
 string F91 = " --help\n"
 string F92 = " |less"
 string F93 = " |grep "
 string F95 = "()\033[D"
 string F96 = "echo \'\033[4~\'"

Теперь я могу нажать ранее не использовавшуюся клавишу «Печать», чтобы написать --helpплюс Enter. Это работает только в Linux VC, потому что X также игнорирует мою клавишу «Печать», и я не нашел, как ее активировать в XKB.

Запись "nul" - это место для "Shift+Control", которое по весу предшествует "Alt".

keymaps 0-1,4-5,8-9,12-13:Подсчет "0,1,4,5,8" ставит вес "8" на пятое место, где стоит "F95". «8» определяется как «Alt». Недостающие 2,3,6,7 потому что я хотел пропустить AltGr -вес значения 2.


Комбинируя, скажем, 10 клавиш F -с 8 комбинациями только Shift, Control и Alt (без левой и правой ), вы можете получить 80 различных функций клавиш -, если хотите. Но кто хочет, чтобы Shift+Control -F6 делало одно, а Control+Alt -F9 другое?

0
28.04.2021, 23:21

Теги

Похожие вопросы