zsh가 자동으로 기록의 전체 경로를 쓰도록 강제하는 방법은 무엇입니까?

zsh가 자동으로 기록의 전체 경로를 쓰도록 강제하는 방법은 무엇입니까?

내가 얼마 전에 했다고 가정해 cd /path/to/foo/bar봅시다 evince file.pdf. 이제 다시 열려면 file.pdf이 두 단계를 다시 수행해야 합니다(기록 사용). 하지만 한 단계로 완료하겠습니다. 즉, 난 그걸 원해아니요 evince file.pdf작성 되었지만 .zsh_history. evince /path/to/foo/bar/file.pdf예를 들어 내 것을 어떻게 수정합니까 .zshrc? evince이것은 단지 예일 뿐입니다. 어떤 명령과도 작동해야 합니다.

이 새로운 동작에 대해 고려해야 할 단점이 있습니까?

참고: 현재 저는z역사 cdfzf일반 역사의 경우.

答え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
}

첫 번째 단어가 주어진 목록의 명령 이름인 경우 나머지 인수가 기록에 저장된 텍스트에서 기존 파일에 대한 상대 경로인 것으로 확인되면 절대 경로로 대체됩니다.

関連情報