Эта проблема, кажется, решена после изменения моего Wi-Fi роутера с режима 11bgn на 11bg.
Вам не нужно ничего сложного, чтобы получить доступ к последнему слову предыдущих команд. Просто нажмите 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