Я хотел бы запустить команду
foo --bar=baz <16 zeroes>
Как мне эффективно ввести 16 нулей *? Если я удерживаю Altи нажимаю, 1 6 0то повторю следующую вещь 160 раз, а это не то, чего я хочу. В emacs я могу использовать Alt-[number]или Ctrl-u 1 6 Ctrl-u 0, но в bash Ctrl-uубивает текущую набираемую строку, а следующий ноль просто добавляет 0 к строке.
Если я сделаю
foo --bar=baz $(printf '0%.0s' {1..16})
Тогда history
показывает именно выше, а не foo --bar=baz 0000000000000000
; то есть bash не ведет себя так, как я хочу. ( Изменить : точка, я хочу ввести некоторое количество нулей без использования $(...)
подстановки команд)
(*) Я предполагаю, что техническое определение «эффективно» - это «с O (log n) нажатий клавиш», предпочтительно количество нажатий клавиш, равное количеству цифр в 16 (для всех значений 16) плюс, возможно, константа; пример emacs квалифицируется как эффективный по этому определению.
источник
know what you want to do
. В сложной вложенной команде как bash узнает, какие части вы хотите видеть в результате выполнения в истории, а не в самой команде? Как насчет переменных? Короче говоря, bash всегда будет иметьcode
в истории, а не результат выполнения кода.Alt
само по себе не отправляет никаких символов, поэтому нажатие и отпускание alt не окажут никакого влияния наbash
это.history
что я хотел бы вводить цифры без использования подстановки команд.Ответы:
Пытаться
Это 6 нажатий клавиш (при условии, что клавиатура QWERTY в США и Великобритании установлена минимум) для вставки этих 16 нулей (вы можете удерживать Altкак 1, так и 6).
Вы также можете использовать стандартный
vi
режим (set -o vi
) и введите:(также 6 клавиш).
emacs
Эквивалентный режим и который может быть использован для повторения более одного символа ( ) работает , но не в .echo 0Ctrl+WAlt+1Alt+6Ctrl+Y
zsh
bash
Все они также будут работать
zsh
(иtcsh
откуда это). С помощьюzsh
вы также можете использовать флаги расширения переменных заполнения и расширять их с помощью Tab:(Гораздо больше нажатий клавиш, очевидно).
С
bash
, вы также можетеbash
расширить$(printf '0%.0s' {1..16})
с Ctrl+Alt+E. Обратите внимание, что это расширит все (но не глобусы) в строке.Чтобы играть в игру с наименьшим количеством нажатий клавиш, вы можете привязать к некоторому ключу виджет, который увеличивается
<some-number>X
доX
повторяющихся<some-number>
времен. И есть<some-number>
в базе 36, чтобы еще больше уменьшить его.С
zsh
(связан F8):Затем для 16 нулей вы набираете:
(3 нажатия клавиш), где
g
находится16
в базе 36.Теперь мы можем еще больше сократить его до одного ключа, который вставляет эти 16 нулей, хотя это будет обманом. Мы можем связать F2два
0
с (или два$STRING
, 0 по умолчанию), F3до 30
с, F1F6до 160
с ... до 19 ... возможности бесконечны, когда вы можете определить произвольные виджеты.Возможно, я должен упомянуть, что если вы нажмете и удержите 0клавишу, вы можете вставить столько нулей, сколько захотите, всего одним нажатием клавиши :-)
источник
vi
и других!Предполагая, что ваш эмулятор терминала не использует нажатие клавиш (например, для переключения вкладок) - работает xterm - вы можете нажать Alt-1 6 Ctrl-V 0. Контроль-V нужен там, чтобы разбить число и символ для повторения (если вы повторяли букву, вам это не понадобилось бы).
(Это функция readline, известная как
digit-argument
, так что вы должны иметь возможность использоватьbind
для изменения используемых клавиш-модификаторов)источник
В Emacs я обычно использовал бы C-qдля отделения префиксного аргумента от ввода цифр.
Bash использует Ctrl+vвместо C-q, чтобы избежать проблем с управлением потоком XON / XOFF.
Так что вы можете использовать Alt+1 Alt+6 Ctrl+v 0.
источник
Другой вариант - ввести четыре ноля, а затем с помощью мыши скопировать и вставить его еще три раза. дважды щелкните, чтобы выбрать, средний щелчок x 3, чтобы вставить.
источник
Играя с макросами:
Привязать функциональную клавишу, F8чтобы умножить на два последние слова (до предыдущего пробела) (код клавиши F8, найденный с помощью
Ctrl-V F8
):Это можно сделать постоянным, отправив тот же текст на
~/.inputrc
затем введите:
чтобы получить 2 ^ 4 раза больше нуля. (еще 5 нажатий клавиш).
или введите:
чтобы получить 2 ^ 3 книжных слова.
Еще быстрее:
Умножьте на 4:
3 нажатия.
Умножьте на 8 (тот же номер, что и у функциональной клавиши)
Еще 3 клавиши.
Чит?
Обман, умножение на 16.
Всего 2 нажатия. (и все же полезная простая функция)
^^^^^^^^^^^^^^^^ (база 36? Ха!) :-P
Просто обманывает
Просто 1 (да: одно ) нажатие клавиши.
Изменение привязки для ctrl+U:
Отправить это по адресу
~/.inputrc
:Перечитайте
~/.inputrc
файл:сделайте это как обычно в Emacs (как вы хотели):
7 клавиш (после «настройки»).
Немного короче:
Используйте значение по умолчанию «умножить на 4» для «универсального аргумента» и завершить
Всего 5 ключей.
Использование alt+nдоступа к (arg: n)
Это 6 ключей, чтобы получить 16 нулей.
Не меняя сочетания клавиш:
Если в вашем bash у вас есть
bash C-u kills the currently-being-typed line
.Это потому, что
"\C-u":
связано сunix-line-discard
.Но это также может помочь:
когда то, что находится перед удалением курсора, оно также помещается в «кольцо уничтожения».
Так
ctrl+u
стирает иctrl+y
возвращает обратно то, что было стерто.На чистой линии:
00
напечатайте erase it и дважды потяните его назад, чтобы сделать это0000
.Повторите, чтобы получить
00000000
(8 нулей), наконец введите команду и дерните назад дважды.Первый набор (7 клавиш удерживаются в ctrlнажатом состоянии):
Второй набор (5 ключей)
Это даст восемь нулей в стереть кольцо, затем введите то, что вы хотите:
получить:
После того, как вы поймете идею, вы также можете набрать то, что вам нужно, перейти к началу строки ( ctrl-Y), сделать, как указано выше (до восьми нулей), перейти к концу ( ctrl-E) и дважды нажать.
Это 15 клавиш (кроме самой команды).
Не коротко, я знаю, но это работает только с тем, что было доступно.
Это немного короче:
Это 11 ключей
источник
F<n>
дублируете последнее слово<n>
раз.^[[19~
). Смотрите,"$(tput kf8)"
чтобы получить информацию из базы данных terminfo (или$terminfo
хэшаzsh
).ctrl-v F8
В качестве варианта ответа cas введите
а затем используйте мышь, чтобы скопировать и вставить его (один раз). Возможно, это O (log n), но, поскольку это (len (str (n)) + 20), вы можете считать его неэффективным. Но обратите внимание:%.s
похоже, ведет себя так же, как%.0s
.0000000000000000
в качестве аргумента, вам нужно сделать это только один раз.Glenn Джекман баллов из что (где число положительное целое число) будет печатать строку числа нулей (и перевод строки), как звездочка в формате говорит взять ширину поля из аргументов. В частности, будет напечатано 16 нулей. Но это особый случай, который обрабатывает только . распечатает , а распечатает и сообщение об ошибке. Напротив, другие команды в этом ответе будут производить строки, подобные или (и см. Ниже для ).
printf "%0*d\n" number 0
printf
printf "%0*d" 16 0
0
printf "%0*d" 16 12345
0000000000012345
printf "%0*d" 16 foo
0000000000000000
123451234512345…
foofoofoo…
7%7%7%...
Если вы собираетесь делать это часто, вы можете упростить это, определив функцию оболочки:
Примечания:
$(seq 1 "$2")
вместо того,(1.."$2"}
потому что последний не будет работать - посмотрите это , это , это и это . Обратите внимание, что некоторые ответы на эти вопросы предлагают использоватьeval
, но это, как правило, не рекомендуется.$1%.0s
) должен быть в двойных кавычках (а не в одинарных), потому что он содержит параметр ($1
).--
Является защита от$1
значений , начиная с-
."%.0s$1"
вместо"$1%.0s"
.$1
содержащее значение%
вызовет удушье.Если вам нужно , чтобы быть в состоянии обрабатывать
$1
значения , содержащие%
, сделатьКроме того, как только вы определили такую функцию, вы можете делать такие вещи, как
что немного меньше, чем печатать
"$(printf '0%.0s' {1..16})"
.источник
printf "%0*d" 16 0
будет печатать 16 нулей. Звездочка в формате будет принимать ширину поля от аргументов