이전 명령의 인수를 zsh 완성에 추가


21

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.txtand 가있는 디렉토리에 있고 file2.txt마지막 명령 echo foo bar baz이 인 경우 자동 완성을 위해 이것을 얻었습니다.

% ls
bar   baz   echo  foo 
- files -
file1.txt   file2.txt 

2
이것은 훌륭한 아이디어입니다
Michael Mrozek

2
^[ .( insert-last-word) 를 보충하기 위해 ,에 copy-earlier-word도달하는 줄의 단어 사이를 순환합니다 insert-last-word. 귀하의 경우 .zshrc:autoload copy-earlier-word && zle -N copy-earlier-word && bindkey '^[,' copy-earlier-word
질 'SO-정지 존재 악마'

@ 길스 감사합니다! 전체 자동 완성 기능을 사용할 수 없으면 기능에 더 가깝습니다. ~ 80 %의 시간, 마지막 인수가 아닌 경우, 내가 원하는 마지막 인수와 C-입니다. + C-는 꽤 좋습니다.
Ted Naleid

답변:


6

기본적으로 사용되는 완료 자 목록에 완료자를 추가 할 수 있습니다.

zstyle ':completion:*' completer _last_command_args _complete

1
_last_command_args완료 가 있으면 다른 표시되지 않습니다. 평범한 것들과 더불어 그것들을 어떻게 얻습니까?
Gilles 'SO- 악마 그만해'

1
답변 주셔서 감사합니다, 이것은 나를 위해 뭔가 일을 얻을 수 있도록 충분히 가까이있어서 동의합니다. 내가 다르게 한 것은 위의 질문에 대한 업데이트로 언급됩니다. 솔루션이 마지막 명령의 인수와 파일 등을 일반 완성 도구에서 모두 인쇄하지 않았습니다. 내가 _complete만든 함수 내부를 구성 했으며 원하는대로 작동합니다.
Ted Naleid

당신 말이 맞아 내 대답이 정확하지 않아
nicoulaj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.