
문제
저는 oh-my-zsh와 Antigen을 사용하여 Zsh를 관리하고 있습니다.
가끔 Zsh에 실수로 잘못된/실패한 명령을 입력하는 경우가 있는데,zsh-autosuggestions 플러그인이 명령을 던집니다.
gut status
예 를 들어, 내가
git status
.
이제 올바른 명령을 다시 입력하려고 시도할 때 를 입력하면 최근 기록에서 가장 가까운 일치 항목인 g
자동 제안 플러그인이 표시됩니다 . gut status
그러나 그것은 실패한 명령이다!
내가 무엇을내가 하고 싶은 일은 실패한 명령이 내 기록을 "오염"시키지 않도록 하는 것입니다.따라서 자동 제안 플러그인은 이를 제안하지 않습니다.
내가 뭘 한거지
나는 이것을 검색했고 기록에서 항목을 유지하는 것과 가장 가까운 일치는 HIST_IGNORE_SPACE를 설정하거나 특정 명령을 무시하거나 명령을 입력한 후 수동으로 삭제하는 방법입니다. 보다이것그리고이것. 그러나 @Adaephon 52가 언급했듯이 이런 일이 발생합니다.~ 후에그 행위는 끝났습니다.
내가 무엇을 하려고 고려하고 있는지
지금 염두에 두고 있는 것은 실패한 명령이 Zsh에 입력될 때마다 실행되어 기록에서 최신 항목을 삭제하는 함수를 작성하는 것입니다. 그러나 저는 이러한 종류의 트리거가 존재하는지 또는 이를 수행하는 방법을 알 수 있을 만큼 Zsh에 익숙하지 않습니다.
허용되는 솔루션에 대한 참고 사항
이 문제에 관심이 있는 사람들을 위해 허용된 솔루션은 실패한 명령이 기록 파일에 저장되지 않는다는 의미에서 작동합니다. fc -l
또는 history
이를 확인합니다.
그러나 zsh-autosuggestions 플러그인이 자체적으로 수행하는 것 같습니다.현지의일종의 캐싱(또는 다른 메커니즘을 사용하여 제안을 생성하는 중)이므로 여전히 실패한 명령을 제안하지만세션이 끝나지 않은 경우에만. 사용자가 셸의 새 인스턴스를 시작할 때 플러그인이 캐시된 기록을 로드해야 할 때 더 이상 실패한 명령을 제안하지 않습니다(물론 다시 입력하지 않는 한).
제안된 솔루션은 Zsh가 실패한 명령을 저장하는 것을 중지하는 답변만 필요하고 허용된 솔루션은 이를 수행하는 방식으로 내 질문을 (실수로) 구성했기 때문에 기술적으로 정확합니다(제한된 방식이지만, 솔루션의 링크 참조). 세부).
쉘 스크립팅에 익숙하고(저는 그렇지 않습니다) 동기가 충분한 사람이라면 누구든지 이 내용을 확인할 수 있습니다.zsh-자동 제안 스크립트.
답변1
바트 쉐퍼다음과 같은 접근법을 제안했습니다같은 질문에zsh 사용자메일링 리스트:
zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }
이 함수는 명령줄이 기록에 기록되기 전에 실행됩니다. 1을 반환하면 현재 명령줄은 기록 파일이나 로컬 기록 스택에 추가되지 않습니다. 그러나 명령이명령어를 찾을수 없음오류는 단순한 경우에만 적용됩니다. 예를 들어 다음 줄은 기록에 표시됩니다.
echo foo; echooo bar
하지만 귀하의 예에서는 잘 작동합니다
gut status
잘못된 명령이 표시되지만 UP-ARROW
(수정할 수 있도록!) 기록 스택에는 없습니다. 으로 확인하세요 fc -l
.
이 기본 기능의 가능한 확장 중 하나는 명령줄에서 환경 변수 설정을 설명하는 것입니다(예: DEBUG=1 ./some_prog
. 여기서 함수는 명령줄의 단어에 등호가 포함되어 있는지 확인하고, 그렇다면 다음 단어에서 유효한 명령인지 확인합니다.
zshaddhistory() {
local j=1
while ([[ ${${(z)1}[$j]} == *=* ]]) {
((j++))
}
whence ${${(z)1}[$j]} >| /dev/null || return 1
}
답변2
내장 fc
명령은 기록 편집을 지원합니다. 예를 들어 이전 명령을 잘못 입력한 경우 다음을 입력할 수 있습니다.
$ fc -e nano -1
nano
원하는 편집기의 명령으로 바꿀 수 있습니다 . 또한 EDITOR
zsh 구성에서 변수(매개변수)를 설정할 수 있습니다 . (SO 페이지 참조 참조)
파일(fc에서 시스템 임시 폴더에 생성한 파일)을 저장해야 합니다. 그 후에는 편집된 줄로 끝날 것입니다. Enter
실행하거나 를 눌러 Ctrl+C
편집을 마칠 수 있습니다.
자세한 내용은 zsh 문서를 참조하세요.Zsh: 편집 기록
전체 기록을 편집하고 싶은 경우
$ fc -W; nano "$HISTFILE"; fc -R
...원하는 경우 nano를 다시 교체하세요.
캐시를 포함하여 기록을 기록한 다음 편집기로 파일을 엽니다.
점에 유의하시기 바랍니다zsh세 가지 유형의 역사를 알고 있습니다.
- 내부: 로그인 이후 입력한 명령어
- 현지의: 활성 쉘 내에서 사용 가능한 것 - [HISTFILE + 내부]
- "글로벌": 의존하지만 HISTFILE에 설정된 파일이라고 가정하겠습니다.
기록 파일이 공유되는 경우(SHARE_HISTORY
) 문제의 사용자로 열린 zsh 쉘이 두 개 이상인 경우 fc -W
먼저 해당 쉘에서 명령을 실행하는 것이 좋습니다. 편집이 끝나면 를 실행하십시오 fc -R
. 그렇지 않으면 해당 셸 내에 입력된 명령이 저장되지 않고 HISTFILE
.
답변3
omz가 어떻게 실행하는지 잘 모르겠지만 bash와 일반 zsh 접두사에 공백이 있으면 .history에서 제외되고 이후에는 자동 완성/제안에서도 제외됩니다.
즉
<space>ll -ahZ /home/%USER