기록 확장 모드에 대한 별칭 설정

기록 확장 모드에 대한 별칭 설정

내가 이해하는 $_기존 대리인과 유사하게 두 번째 또는 세 번째 -last 명령을 참조하여 etc 등에 !-1:$대한 별칭을 만들고 싶습니다 . 추가해보았습니다$__$___

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-_(Undo)를 이용하여 이전 단어로 돌아가세요.

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:$'경로(=확장파일 이름 확장자의 일부). 라는 별칭을 정의하려면 이를 with 또는 같은 alias 명령에 $__전달해야 합니다 .$__alias '$__'=…alias \$__=…

둘째, 별칭은 명령 위치, 즉 명령의 첫 번째 단어(선행 변수 할당 및 리디렉션 후)에서만 확장됩니다. 이 별칭을 유용하게 사용하려면 다음과 같아야 합니다.전역 별칭:alias -g '$__'=…

셋째, 별칭 확장은 기록 확장 후에 발생하므로 이 별칭은 유용한 작업을 수행하지 않습니다.

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

$_"대표자"가 아닙니다 !-1:$. 일반적인 상황에서 동일한 정보에 액세스하는 두 가지 방법이 있습니다 $_. "is an alias" 또는 반대로 "is an alias" !-1:$라고 말할 수 있지만 이는 쉘 별칭의 기술적인 의미가 아닌 일반적인 영어 의미에서 "alias"를 사용하는 것이며 둘 다 항상 동일하지 않기 때문에 부정확합니다. 값. 는$_!-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보관 했어요 . _이 함수는 마지막 단어 기록 변수를 1씩 "이동"합니다.

darkstar% echo one
one
darkstar% echo two
two
darkstar% echo three
three
darkstar% echo $_ $__ $___
three two one

관련 정보