Я пытаюсь записать псевдоним для CD!!:1, который берет 2-е слово предыдущей команды и изменяется на каталог того имени. Например, если я ввожу
rails new_project
cd !!:1
вторая строка будет CD в "new_project" каталог.
С тех пор!!:1 является неудобным ввести (даже при том, что это коротко, требуется три Клавиши одновременно с "SHIFT", на противоположных сторонах клавиатуры и затем unSHIFTed версии ключа, который был введен дважды СМЕЩЕННЫЙ), я хочу просто ввести что-то как
cd-
но начиная с!!:1 оценен на командной строке, я (ОЧЕВИДНО), не могу просто сделать
alias cd-=!!:1
или я сохранил бы псевдоним, который содержал "new_project", трудно кодированный в него. Таким образом, я попробовал
alias cd-='!!:1'
Проблема с этим состоит в том что!!:1 никогда не оценивается, и я получаю сообщение, что никакой каталог не назвал!!:1 существует. Как я могу сделать псевдоним, где замена истории оценена В ТО ВРЕМЯ, КОГДА я ДАЮ КОМАНДУ ПСЕВДОНИМА, не, когда я определяю псевдоним, и не никогда?
(Я попробовал это и в ударе и в zsh, и получаю те же результаты в обоих.)
Для zsh:
alias cd-='cd ${${(z)$(fc -l -1)}[3]}'
Как это работает: вычисляется
$ (fc -l -1)
. fc -l {start} [{end}]
означает «список команд истории от {start} до {end} или последний, если {end} отсутствует». $ {(z) ...}
должен разбить ...
на массив, как это делает оболочка (см. «Флаги расширения параметров» в man zshexpn
), но на самом деле он разбивается на пробелы. Может это только моя ошибка. $ {... [3]}
берет третье значение из массива. Первое значение - это номер команды, второе - это команда, а третье и последующие - аргументы. Другой способ сделать то же самое:
Для последнего аргумента:
cd
Alt - .
или
cd
Esc .
Для первого аргумента:
cd
Alt - Ctrl - y
или
cd
Esc Ctrl ] - y