Alt+число+точка и Alt+запятая в Zsh и Bash

В Bash мы можем использовать Alt+число+. для выбора nго аргумента предыдущих команд, и Alt+, для выбора предыдущих команд. Они прокручивают историю.

Например:

$ ls 1 2
$ echo 10 20

Теперь нажмите и удерживайте Alt, нажмите 0, затем точку, появится «эхо». Не отпуская Alt, снова нажмите ., появится "ls". Использование 1 в той же операции покажет 10 и 1 и т. д. Нажатие Alt и запятая показывает всю командную строку в истории. Также Alt и . показывают последний аргумент команд в истории.

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

Я использую Zsh и последний пакет Oh-My-Zsh, но поведение отличается:

  • В Zsh есть Alt+, для отображения последнего аргумента команд.

  • Alt+0+. — это то же самое, что и Bash (показывает команду), но Alt+число+. показывает последний nй аргумент, т. е. Alt+1+< kbd>. в приведенном выше случае показывает 20 и 2.

  • Alt+, не отображает все команды в истории.

Как сделать то же самое в Zsh? Спасибо.


person user2847598    schedule 02.01.2016    source источник
comment
Насколько мне известно, по умолчанию Alt-запятая ни к чему не привязана. Привязка по умолчанию для последней команды из истории — ctrl-p (а ctrl-n — следующая команда в истории, если вы зашли слишком далеко назад и т. д.). (См. Команды для истории в bash руководство например.) Что bind -q previous-history выводит для вас? (Я получаю previous-history can be invoked via "\C-p", "\eOA", "\e[A".)   -  person Etan Reisner    schedule 03.01.2016
comment
Ctrl-p и Ctrl-n работают так же, как Bash. Они просто заменяют текущую командную строку последней/следующей командой из истории. Думаю, мне нужно выучить zle и bindkey. Просто удивился, что не было этих полезных ярлыков.   -  person user2847598    schedule 03.01.2016


Ответы (1)


В поисках этой функции я наткнулся на это сообщение в блоге Кристиана Нойкирхена:

1. Вы, наверное, знаете М-. чтобы вставить последний аргумент предыдущей строки. Иногда вы хотите вставить другой аргумент. Есть несколько вариантов: Использовать расширение истории, например. !:-2 для третьего слова в предыдущей строке (используйте TAB, чтобы расширить его, если вы не уверены), или используйте M-. с префиксным аргументом: M-2 M-.

Однако гораздо приятнее:

autoload -Uz copy-earlier-word
zle -N copy-earlier-word
bindkey "^[m" copy-earlier-word

Затем M-m скопирует последнее слово текущей строки, затем предпоследнее слово и т. д. Но с M-. Вы можете вернуться в линии тоже! Таким образом:

% echo a b c
% echo 1 2 3
% echo <M-.><M-.><M-m>
% echo b

Блин, если бы я знал это раньше!

В этом тексте M относится к клавише Meta, также известной как Alt. Так что теоретически это должно работать из коробки, как говорит Кристиан. Итак, я попробовал это, и да, это действительно работало из коробки.

За это поведение отвечают zle-виджеты insert-last-wordALT+.─ и digit-argumentALT+Number.

Вот соответствующий вывод bindkey:

$ bindkey -L | grep '\^\[[.0-9]'
bindkey "^[." insert-last-word
bindkey "^[0" digit-argument
bindkey "^[1" digit-argument
bindkey "^[2" digit-argument
bindkey "^[3" digit-argument
bindkey "^[4" digit-argument
bindkey "^[5" digit-argument
bindkey "^[6" digit-argument
bindkey "^[7" digit-argument
bindkey "^[8" digit-argument
bindkey "^[9" digit-argument

поэтому убедитесь, что они появляются, и повторите попытку. Вы можете дополнить исходный вопрос выводом показанной команды bindkey, чтобы сузить круг проблемы, или открыть его непосредственно в oh-my-zsh с подробностями.

person Marc Cornellà    schedule 18.01.2016