zsh (및 bash)에서는 일부 히스토리 단어 확장을 사용하여 이전 명령의 인수를 표시 할 수 있습니다.
이 예제는 !:#
확장 히스토리의 이전 명령에서 두 번째 매개 변수를 가져 오는 것을 보여줍니다 .
% echo foo bar baz
foo bar baz
% echo !:2
echo bar
bar
나는 종종 특정 인수가 무엇인지 정확히 잊어 버리고 입력하는 !:#
것이 항상 어떤 인수인지 기억할 때 빠르지는 않습니다. 내가 알고 meta-.
마지막 인자를 교체하지만, 가끔은 내가 원하는 것을 마지막 인수하지 않습니다.
zsh에 입력하는 명령을 완료하기 위해 제안으로 이전 명령의 인수를 추가하고 싶습니다.
마지막 명령에서 인수 배열 (0..N)을 만들어 특정 명령에 바인딩 할 수있는 셸 함수를 만드는 방법을 알아낼 수있었습니다.
_last_command_args() {
last_command=$history[$[HISTCMD-1]]
last_command_array=("${(s/ /)last_command}")
_sep_parts last_command_array
}
# trying to get last_command_args to be suggested for any command, this just works for foo
compdef _last_command_args foo
이것은 탭 키를 눌렀을 때 foo를 완성하는 모습입니다 <TAB>
.
% echo bar baz qux
bar baz qux
% foo <TAB>
bar baz echo qux
이것은 "foo"명령을 완성하는 데는 효과적이지만, 내가 수행하는 모든 zsh 확장에서 옵션이되기를 바랍니다. zstyle completer와 관련이 있다고 생각하지만 몇 시간 동안 해킹을 한 후에는 내가 깊이 빠져 있음을 깨달았습니다.
zsh의 명령에 대한 제안 완료로 이전 명령에서 인수를 어떻게 얻을 수 있습니까?
그것이 도움이된다면 전체 zshrc compinstall 파일 을 bitbucket에서 공유했습니다. 그것의 많은 것은 다양한 소스에서 움켜 쥐고 있으며 그중 일부는 내가 직접 해킹했습니다.
최신 정보:
@Julien Nicoulaud의 답변이 제게 가까이갔습니다. 필요한 곳으로 받아 들였습니다.
내 특정 구성으로 제안 된 것을 사용하십시오.
zstyle ':completion:*' completer _last_command_args _complete
탭 완성이 마지막 명령의 인수 목록 만 표시하기 때문에 실제로 작동하지 않았습니다 (실제로 파일 이름으로도 완료되었지만 표시하지는 않음). 순서를 _complete _last_command_args
반대로 변경했습니다 . 일반적인 파일 이름을 표시하지만 last_command_args는 표시하지 않습니다.
나는 이것이 완전한 작동 방식과 관련이 있다고 생각합니다. 성공적으로 리턴하는 첫 번째 메소드의 출력 만 표시한다고 생각하지만 zsh 소스를 구문 분석하여 진행 상황을 완전히 이해하는 데 문제가 있습니다. _complete
마지막 인수 명령과 일반 자동 완성 기능을 모두 표시하도록 호출을 포함하도록 메서드를 조정할 수있었습니다 . 별거는 아니지만 나에게 충분히 잘 작동합니다.
내가 가지고있는 다른 zstyle과 함께 사용한 전체 기능은 다음과 같습니다.
# adds the arguments from the last commadn to the autocomplete list
# I wasn't able to get this to work standalone and still print out both regular
# completion plus the last args, but this works well enough.
_complete_plus_last_command_args() {
last_command=$history[$[HISTCMD-1]]
last_command_array=("${(s/ /)last_command}")
_sep_parts last_command_array
_complete
}
_force_rehash() {
(( CURRENT == 1 )) && rehash
return 1 # Because we didn't really complete anything
}
zstyle ':completion:::::' completer _force_rehash _complete_plus_last_command_args _approximate
내가 가지고있는 다른 zstyle 라인은 이것이 작동하는 데 필요하지 않지만 이것이 왜 작동하는지에 영향을 줄 수 있습니다.
zstyle -e ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX + $#SUFFIX) / 3 )) )'
zstyle ':completion:*:descriptions' format "- %d -"
zstyle ':completion:*:corrections' format "- %d - (errors %e})"
zstyle ':completion:*:default' list-prompt '%S%M matches%s'
zstyle ':completion:*' group-name ''
zstyle ':completion:*:manuals' separate-sections true
zstyle ':completion:*' menu select
zstyle ':completion:*' verbose yes
이제 file1.txt
and 가있는 디렉토리에 있고 file2.txt
마지막 명령 echo foo bar baz
이 인 경우 자동 완성을 위해 이것을 얻었습니다.
% ls
bar baz echo foo
- files -
file1.txt file2.txt
^[ .
( insert-last-word
) 를 보충하기 위해 ,에 copy-earlier-word
도달하는 줄의 단어 사이를 순환합니다 insert-last-word
. 귀하의 경우 .zshrc
:autoload copy-earlier-word && zle -N copy-earlier-word && bindkey '^[,' copy-earlier-word