Настройка псевдонимов для шаблона расширения истории

Эта проблема, кажется, решена после изменения моего Wi-Fi роутера с режима 11bgn на 11bg.

1
30.05.2019, 23:34
1 ответ

Эта функция уже существует

Вам не нужно ничего сложного, чтобы получить доступ к последнему слову предыдущих команд. Просто нажмите ESC-.(, то есть Alt + .)или ESC-_(, то есть Alt +_). Это вызывает команду редактора insert-last-word, которая вставляет последнее слово из предыдущей командной строки. Нажмите клавишу еще раз, чтобы получить последнее слово из командной строки перед этим, и так далее. Если вы нажмете ESC-.слишком много раз, используйтеC-_(отмену ), чтобы вернуться к слову, которое вы только что сказали.

Эта команда по умолчанию не привязана к клавише в режиме vi, но вы можете привязать ее с помощью bindkey.

Вы можете передать числовой аргумент, чтобы получить другое слово :положительное, чтобы начать справа (1 — последнее слово ), ноль или отрицательное, чтобы начать слева (0 — первое слово, которое обычно является именем команды, 1 — это слово после первого аргумента и т. д. ). Например, ESC. ESC - ESC 1 ESC.вставляет первый аргумент следующей от -до -последней команды.

Можно использовать множество вариаций этой команды, определяя собственный виджет вокруг zle insert-last-word. Zsh поставляется сcopy-earlier-wordи smart-insert-last-word, которые могут оказаться полезными для использования как есть или в качестве примеров кода.

Если вы действительно хотите, чтобы $__расширялось до последнего слова предыдущей -, но -одной команды, я приведу несколько решений ниже, но сначала мне нужно объяснить, что происходит.

Почему ваша попытка не работает

Во-первых, вы не определяете то, что, по вашему мнению, вы определяете. alias "$__"=…определяет псевдоним, имя которого является текущим значением переменной __во время выполнения определения псевдонима. Это, вероятно, пусто, поэтому вы выполняете alias ='!-2:$', который ищет команду с именем '!-2:$'в пути поиска (часть расширения=расширения имени файла ). Чтобы определить псевдоним с именем $__, вам нужно передать $__в команду псевдонима, например. с помощью alias '$__'=…или alias \$__=….

Во-вторых, псевдоним расширяется только в позиции команды, т. е. как первое слово команды (после любых назначений ведущих переменных и перенаправлений ). Чтобы этот псевдоним был полезен, он должен быть глобальным псевдонимом :alias -g '$__'=…

.

В-третьих, этот псевдоним не принесет никакой пользы, потому что расширение псевдонима происходит после расширения истории.

darkstar
darkstar% alias -g '$__'='!-2:$'
darkstar% echo $__
!-2:$

$_не «обозначает» !-1:$. $_и !-1:$— два способа доступа к одной и той же информации в общих случаях. Вы можете сказать, что $_«является псевдонимом» !-1:$или, наоборот, что !-1:$«является псевдонимом» $_, но это означает использование «псевдонима» в его общеанглийском смысле, а не в техническом смысле. псевдонимов оболочки, и это неточно, потому что они не всегда имеют одинаковое значение. !-1:$— это конструкция расширения истории (!), которая расширяется до последнего слова(:$)предыдущей командной строки(-1). $_— это parameter expansion, использующий параметр _, который оболочка устанавливает в качестве последнего аргумента предыдущей команды. Это имеет значение, если вы запускаете командные строки, которые не являются одной простой командой, например:

darkstar% for x in 1 2 3; do echo $x; done
1
2
3
darkstar% echo $_ is not !-1:$
echo $_ is not done
3 is not done
darkstar% echo $_ and !-1:$ are different; echo $_ and !-1:$ are different
echo $_ and done are different; echo $_ and done are different
done and done are different
different and done are different

Определение $__для каждой команды

Вы можете определить функцию-ловушку с именем TRAPDEBUG, которая запускается перед выполнением каждой команды. Запомните текущее значение$_(обратите внимание, что вы должны сделать это в первую очередь, потому что первая команда внутри ловушки перезапишет _), а затем «сдвинет» несколько переменных подчеркивания -.

darkstar% TRAPDEBUG () { _0=$_; ___=$__; __=$_1; _1=$_0; }
darkstar% echo one        
one
darkstar% echo two        
two
darkstar% echo three      
three
darkstar% echo $_,$__,$___
three,two,one

$_1не всегда будет таким же, как $_, потому что отладочная ловушка не запускается точно в тех же обстоятельствах, которые вызывают установку _, но это довольно близко.

Определение $__для командной строки

Вы можете зарегистрировать функцию ловушки для запуска до или после ввода командной строки. В этом случае либо precmd, либо preexec. Они запускаются до и после выполнения команды соответственно.

preexec_set_underscore_variables () {
  ___=$__
  __=$_1
  _1=$historywords[1]
}
preexec_functions+=(preexec_set_underscore_variables)

Я использую historywords, чтобы получить последнее слово из командной строки. Я храню его в _1, потому что _уже занят. А функция «сдвигает» последние -слова -переменных истории на единицу.

darkstar% echo one
one
darkstar% echo two
two
darkstar% echo three
three
darkstar% echo $_ $__ $___
three two one
1
28.01.2020, 00:10

Теги

Похожие вопросы