vim показывает странное поведение в bashscript

У меня возникла эта проблема после обновления Fedora с 22 до 27. Она была вызвана новой группой; вы должны быть членом группы audio, чтобы получить доступ к устройствам snd;

~ > ll /dev/snd/controlC*
crw-rw----. 1 root audio 116, 2 Mar 31 08:27 /dev/snd/controlC0
crw-rw----. 1 root audio 116, 9 Mar 31 08:27 /dev/snd/controlC1

Проверьте свои группы с помощью id. Я добавил с помощью usermod -G audio,... <myuser>, но могут быть и другие способы.

1
27.03.2020, 18:40
1 ответ

Здесь происходит следующее: экранная команда stuffпомещает символы во входной буфер панели, но они просто остаются там до тех пор, пока не появится программа, которая их обработает.

Поскольку вы запускаете этот сценарий на панели #0 и выполняете команду xdotool key Ctrl+a barна этой панели #0, то, когда сценарий завершится и вы вернетесь в оболочку, оболочка примет это и интерпретировать его как обычную команду оболочки.

На самом деле вы можете видеть, что на первом снимке экрана вы видите символы в отдельной строке (так же, как вы вводили некоторые символы ), которые затем становятся ожидающими ввода. Когда сценарий завершается и вы возвращаетесь в оболочку, он потребляет эти символы и в конечном итоге повторяет команду. Результат выглядит так:

xdotool key Ctrl+a bar
devanshu@...:~/env/bin/cp_c++$ xdotool key Ctrl+a bar
devanshu@...:~/env/bin/cp_c++$

Если вы запускаете Vim вместо выхода из сценария, Vim будет использовать тот же ввод и интерпретировать его как команды Vim. Затем он видит эту последовательность команд:

  • x:Удалить символ под курсором. Буфер пустой, поэтому просто пищит и ничего не делает.
  • do:Получить diff из другого буфера (удобно в режиме vimdiff. )Здесь это бесполезно, но опять же, в данном контексте это просто ничего не делает.
  • to:Переход к следующему символу oв этой строке. Строка пуста, так что опять ничего не происходит.
  • o:Войдите в режим вставки в строке ниже текущей строки.

Таким образом, последняя команда переходит в режим вставки, что означает, что оставшаяся часть строки(l key Ctrl+a bar)и «Enter» вводятся в буфер во второй строке. Vim остается в начале третьей строки, все еще в режиме вставки.

Так что это прекрасно объясняет.

Проще всего воспроизвести это, запустив такую ​​команду, как:

$ sleep 30; vim

Затем, пока работает sleep,введите эту строку выше:

xdotool key Ctrl+a bar

Поскольку sleepне потребляет свой вывод, этот ввод будет доступен для Vim при каждом его запуске после завершения сна. Вы увидите, что он ведет себя так же, как описано выше, включая звуковой сигнал, если он включен в вашем терминале.

0
19.03.2021, 02:31

Теги

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