2010-04-09 6 views
6

Я пытаюсь написать псевдоним для cd !!: 1, который берет второе слово предыдущей команды и меняет каталог этого имени. Например, если я напечатаюМогу ли я получить псевдоним оболочки для команды замены истории?

rails new_project 
cd !!:1 

Вторая строка будет записана в каталог "new_project".

Поскольку !!: 1 неудобно печатать (хотя оно короткое, для его использования требуются три клавиши SHIFT, на противоположных сторонах клавиатуры, а затем версия НЕВОЗМОЖЕННОЙ клавиши, которая была напечатана дважды SHIFT), я хочу просто введите что-то вроде

cd- 

, но так как !!: 1 оценивается в командной строке, я (ОЧЕВИДНО) не может просто сделать

alias cd-=!!:1 

или я бы экономить псевдоним который содержал «новый_проект», жестко закодированный в нем. Так что я попытался

alias cd-='!!:1' 

Проблема с этим состоит в том, что !!: 1 НИКОГДА не оценили, и я получаю сообщение, что каталог не по имени !!: 1 существует. Как я могу создать псевдоним, в котором оценивается замещение истории. В то время, когда я задаю команду Алиаса, а не когда я определяю псевдоним, а не никогда?

(Я попытался это как в Баш и ЗШ, и получить те же результаты в обоих.)

+0

Возможна установка в Unix: http://unix.stackexchange.com/questions/85352/how-can-i-alias-sudo/85354 –

ответ

6

Для Zsh:

alias cd-='cd ${${(z)$(fc -l -1)}[3]}' 

Как это работает:

  1. $(fc -l -1) оценивается. fc -l {start} [{end}] означает «команды истории истории от {start} до {end} или last, если {end} нет».
  2. ${(z)...} должен разбивать ... на массив, аналогичный оболочке (см. «Флаги расширения параметров» в man zshexpn), но на самом деле он разбивается на пробелы. Может быть, это только моя ошибка.
  3. ${...[3]} берет третье значение из массива. Первое значение - это номер команды, второй - команда, а третий - и аргументы.
+0

Я только что сделал что-то подобное и закончил с 'fc ... | cut -d '' -f4-', который удаляет ведущее количество команд. –

9

Для Баш:

alias cd-='cd $(history -p !!:1)' 
+0

Очень приятно в bash: спасибо! К сожалению, он не работает в zsh. История и история человека - помогите, бесполезны, и я не смог найти что-либо через Googling ... любые идеи? – iconoclast

+1

'history' - встроенная команда zsh. Используйте 'man zshbuiltins'. – ZyX

+0

Я думал, что есть способ сделать это, используя обратные кавычки. например 'alias cd - = 'cd \' !!: 1 \ '' '. Что было бы более кратким (если бы я мог заставить его работать!) –

8

Другой способ сделать то же самое :

Для последнего аргумента:

cdAlt - .

или

cdEsc.

Для первого аргумента:

cdAlt - Ctrl - у

или

cdEscCtrl - у

 Смежные вопросы

  • Нет связанных вопросов^_^