내가 얼마 전에 했다고 가정해 cd /path/to/foo/bar
봅시다 evince file.pdf
. 이제 다시 열려면 file.pdf
이 두 단계를 다시 수행해야 합니다(기록 사용). 하지만 한 단계로 완료하겠습니다. 즉, 난 그걸 원해아니요 evince file.pdf
작성 되었지만 .zsh_history
. evince /path/to/foo/bar/file.pdf
예를 들어 내 것을 어떻게 수정합니까 .zshrc
? evince
이것은 단지 예일 뿐입니다. 어떤 명령과도 작동해야 합니다.
이 새로운 동작에 대해 고려해야 할 단점이 있습니까?
답변1
이는 임의의 쉘 코드로 수행할 수 있는 작업이 아닙니다. 왜냐하면 zsh는 코드의 어떤 단어가 현재 작업 디렉토리에 대한 상대 경로는 물론 파일 경로로 처리할 명령에 대한 실제로 인수인지 알 수 없기 때문입니다. 코드가 기록에 저장된 시간입니다.
예를 들어 가장 간단한 셸 코드 cmd with its literal arguments
와 미리 정의된 제한된 명령 집합의 경우 다음을 수행할 수 있습니다.
commands_with_expanded_paths=(evince okular)
zshaddhistory() {
local words=( ${(z)1%$'\n'} )
if (( $commands_with_expanded_paths[(Ie)$words[1]] )); then
local replaced_words=($words[1]) word
for word in $words[2,-1]; do
local decoded_word=${(Q)word}
if [[ $decoded_word = [^/]* && -e $decoded_word ]]; then
word=${(q+)decoded_word:P}
fi
replaced_words+=($word)
done
print -rs -- $replaced_words
fc -p
fi
}
첫 번째 단어가 주어진 목록의 명령 이름인 경우 나머지 인수가 기록에 저장된 텍스트에서 기존 파일에 대한 상대 경로인 것으로 확인되면 절대 경로로 대체됩니다.