기록 확장 패턴에 대한 별칭 설정

기록 확장 패턴에 대한 별칭 설정

$_내가 배운 기존의 것과 유사하게 !-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

관련 정보