Может ли zsh или bash расширить выражения истории, ссылающиеся на каталоги? - PullRequest
2 голосов
/ 13 августа 2011

Например, давайте предположим, что я просто скопировал что-то:

mv foo_file.txt ~/to/some/long/path/that/i/do/not/want/to/retype

и я хотел бы использовать подстановку истории следующим образом:

mv bar_file.txt !!:2

Я удивлен, что zshне расширяю !!:2 для меня, когда я нажимаю [tab].В более сложной ссылке на исторический аргумент я мог бы действительно захотеть раскрытие до того, как нажал return, просто чтобы я точно знал, что ссылался на правильный аргумент.Есть ли способ заставить это сделать это?(Я ожидаю, что это будет поведение по умолчанию. Это поведение по умолчанию, которое я каким-то образом случайно отключил или сломал?)

Если zsh не может этого сделать, может bash?

ОБНОВЛЕНИЕ : zsh развернет выражение истории, если оно ссылается на файл, но не каталог:

mv foo_file.txt foo_bar_file.txt
mv bar_file.txt !!:2[TAB]

Расширит его, если это просто произвольная строка:

echo one two three four
echo !!:1[TAB]

Но нет, если вы пытаетесь что-то переместить в каталог.Все больше и больше похоже, что это должно быть ошибкой.

Ответы [ 5 ]

2 голосов
/ 27 сентября 2011

Я использую Zsh в Cygwin:

$ zsh --version
zsh 4.3.12 (i686-pc-cygwin)

$ setopt
interactive
monitor
shinstdin
zle

Я только что попробовал следующее:

$ touch foo_file.txt bar_file.txt
$ mkdir -p ~/to/some/long/path/that/i/do/not/want/to/retype
$ mv foo_file.txt ~/to/some/long/path/that/i/do/not/want/to/retype

Затем я попробовал завершить вкладку, упомянутую выше:

$ mv bar_file.txt !!:2[TAB]

и все работало нормально, последний аргумент был расширен следующим образом:

$ mv bar_file.txt ~/to/some/long/path/that/i/do/not/want/to/retype
1 голос
/ 31 августа 2012

Прекрасно работает для меня с zsh 4.3.17.Похоже, у вас возможно есть ошибка, о которой стоит сообщить в списке рассылки zsh-пользователя .Однако есть по крайней мере пять других комбинаций клавиш, которые должны выполнять то, что вы хотите: C-x *, который по умолчанию связан с expand-word, и Esc Space или Meta - Space или Esc ! или Meta - !, которые все связаны с expand-history по умолчанию.(Meta означает для многих людей клавишу Alt, хотя это зависит от настроек вашего терминала.)

Сказав это, Esc . (или Meta - . или Alt-.)это лучший способ получить последнее слово из предыдущей строки в истории, поскольку он обеспечивает мгновенную визуальную обратную связь.Вы также можете выбрать последнее слово из более старых строк, несколько раз нажав сочетание клавиш, или даже n -ое последнее слово в предыдущей строке, указав префикс для Alt - n (или Meta - n или Esc n ).Так, например, чтобы извлечь предпоследнее слово из 3-й новейшей строки истории, последовательность будет иметь вид:

  • Meta - . (возвращает одну строку истории, выбирая последнее слово изэта строка)
  • Meta - . (возвращается другое, снова выбирая последнее слово)
  • Meta - 2 Meta - . (возвращаетсядругой, но на этот раз выбирает предпоследнее слово из этой строки)
1 голос
/ 13 августа 2011

Вы можете псевдо-взломать его в bash:

$ shopt -s histreedit
$ shopt -s histverify

Затем, чтобы на самом деле попробовать расширение:

$ echo !!:2 [now hit enter]
$ echo histverify

Теперь вы не можете выполнять расширение вкладок в bash.Однозначно нет.Это из-за порядка, в котором обрабатывается расширение bash.

0 голосов
/ 28 октября 2011

В Баш, Alt-.обычно привязан к yank-last-arg, что даст вам то, что вы хотите.

Здесь приведена ссылка на весь список команд, связанных с историей, которые могут быть связаны с нажатиями клавиш http://www.gnu.org/software/bash/manual/bashref.html#Commands-For-History

Например,

ls /etc/passwd /etc/group
cat 
# press Alt+. (Alt dot) here, bash adds /etc/group
cat /etc/group
# press space, then press Alt+1 Alt+.
# bash adds the first argument of the previous command /etc/passwd
cat /etc/group /etc/passwd
0 голосов
/ 13 августа 2011

Я попробовал то, что вы описали, и я не думаю, что bash это тоже поддерживает.

...