$_
내가 배운 기존의 것과 유사하게 !-1:$
에 대한 별칭을 만들고 싶습니다 $__
. $___
이에 대해서는 두 번째 또는 세 번째 -last 명령을 참조합니다. 나는 추가를 시도했다
alias "$__"='!-2:$'
내 .zshrc.local
. 가능하다면 밑줄의 양에 따라 마지막 n번째 명령의 첫 번째 인수를 반환하는 zsh 함수를 작성하고 싶습니다.
arch linux kernel 5.1.4-arch
zsh 5.7.1 (x86_64-pc-linux-gnu)
답변1
이 기능은 이미 존재합니다.
이전 명령의 마지막 단어에 액세스하는 데 복잡한 것은 필요하지 않습니다. ESC-.
(즉 Alt+ .) 또는 ESC-_
(즉 Alt+ ) 를 누르기만 하면 됩니다 _. 그러면 편집기 명령이 호출됩니다.insert-last-word
, 이전 명령줄의 마지막 단어를 삽입합니다. 그 이전의 명령줄에서 마지막 단어를 가져오려면 키를 다시 누르십시오. ESC-.
너무 많이 누른 경우에는 C-_
(실행 취소)를 사용하여 직전에 읽은 단어로 돌아갑니다.
이 명령은 vi 모드에서 기본적으로 키에 바인딩되지 않지만 bindkey
.
숫자 인수를 전달하여 다른 단어를 얻을 수 있습니다. 오른쪽에서 시작하려면 양수(1은 마지막 단어), 왼쪽에서 시작하려면 0 또는 음수(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 \$__=…
둘째, 별칭은 명령 위치에서만 확장됩니다. 즉, 명령의 첫 번째 단어(선행 변수 할당 및 리디렉션 이후)로만 확장됩니다. 이 별칭을 유용하게 사용하려면 다음과 같아야 합니다.전역 별칭: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