이전 명령을 기반으로 별칭을 만들려고 합니다.
내가 달린다고 해
ag foo
목록을 보니 그 결과를 vim에서 활용하고 싶어서 그렇게 했습니다.
vim -q<(!! --vimgrep)
내가 원하는 별칭은
alias edit-last='vim -q<(!! --vimgrep)'
!!
하지만 내 별칭으로는 작동 하지 않는 것 같습니다 . !!
기본 제공 별칭에 대한 정보를 찾는 데 문제가 있습니다.
답변1
!!
예역사적 확장. !
역사 확장을 시작하는 첫 번째 것은 !!
다음과 같습니다 .이벤트 표시기이전 명령을 의미합니다.
다음을 통해 명령 기록에 액세스할 수 있습니다.fc
그리고history
내장 함수 및 전달됨history
바꾸다.
--vimgrep
에 대해서만 의미가 있으므로 마지막 명령 ag
에 별칭을 적용하면 ag
더 유용합니다 . ag
다음과 같이 이전 명령을 찾을 수 있습니다 .
${${(M)history:#ag *}[1]}
--vimgrep
또한 명령에 삽입해야 합니다 .
alias edit-last='vim -q<(eval "${${(M)history:#ag *}[1]} --vimgrep")'
현재 디렉터리를 변경하면 마지막 ag
명령은 더 이상 의미가 없습니다. 이는 감지하기 어렵습니다. 허용되는 명령을 화이트리스트에 추가할 수도 있습니다. 물론 이것은 완벽한 테스트는 아닙니다.
edit-last () {
local cmd
setopt local_options extended_glob
for cmd in $history; do
case $cmd in
((ls|(cvs|git|hg|svn) status)(| *)) :;;
("ag "*) vim -q<(eval "$cmd --vimgrep"); return;;
(edit-last) :;;
(*) echo >&2 "The previous ag command is too old."; return 125;;
esac
done
}