Cygwin: CD에서 Windows 경로로 쉽게 이동

Cygwin: CD에서 Windows 경로로 쉽게 이동

Windows에서는 경로가 (불합리하게) 매우 길기 때문에 일부 링크를 터미널에 끌어서 놓거나 파일 관리자에서 경로를 복사하여 붙여넣는 것이 일반적입니다. 쉘 초기화 파일에 유사한 기능을 넣을 수 있습니다

cdw() { cd "`cygpath -u $1`"  }

이제 Windows 버전이 있습니다 cd. "C:\Program Files"가 클립에 있다고 가정하면 다음을 입력할 수 있습니다.

cdw" CTRL+ V"

그리고 거기에 CD가 있습니다. 나는 당신의 말에 동의합니다. 따옴표는 지루합니다. cdw CTRL+ V(큰따옴표 없이)는 킬러가 될 것입니다 cd. 표시된 것처럼
Bash에서 이 명령을 활용하는 것은 쉽습니다 .history여기. 하지만 저는 를 사용하고 있습니다 zsh. 여기서 실행하면 history마지막 명령(즉, history자체)이 반환되지 않습니다. 시행착오를 거쳐 다음과 같은 기능을 생각해냈습니다.

cdw(){
  print -s 
  set $(fc -l -1 | tail -2 | head  -1)
  shift 2
  p=`cygpath -u "$*"`
  cd "$p"
}

작동하지만 너무 복잡해 보입니다. 당신이 나보다 더 우아한 해결책을 찾을 수 있는지 궁금합니다.

답변1

히스토리 해킹은 이 문제를 해결하는 매우 이상한 방법이며 매우 취약합니다. 괄호와 같은 Windows 파일 이름의 특정 유효한 문자에는 작동하지 않습니다.

붙여넣은 Windows 경로를 사용하는 더 쉬운 방법이 있습니다. 이것을 라인 편집기에 붙여넣는 대신 getclip유틸리티를 호출하십시오(예:cygutils-extra최신 버전의 Cygwin 에서).

cdw () {
  cd -- "$(getclip)"
}
cd -- "`getclip`"/../foo

$IFSdir 경로에 문자(기본적으로 공백, 탭, 줄 바꿈 및 NUL)가 포함되어 있지 않으면 큰따옴표를 사용할 필요가 없습니다.

경로를 편집할 수 있으려면 키를 다음에 바인딩하십시오.expand-or-complete-prefix, 예를 들어 다음을 입력 "`getclip`"하고 누릅니다 Esc Tab.

bindkey '\e\t' expand-or-complete-prefix

또 다른 접근 방식은 키를 바인딩하여 클립보드의 참조 내용을 삽입하는 것입니다.

insert-quoted-clipboard-content () {
  LBUFFER+=${(q)$(getclip)}
}
zle -N insert-quoted-clipboard-content
bindkey '^X^V' insert-quoted-clipboard-content

답변2

자일스 답변질문은 Zsh에 관한 것이기 때문에 Zsh에 대한 것입니다. Google이 나를 이 페이지로 데려왔지만 나는 Bash를 사용하고 있습니다. 에 추가하면 .bashrc.

# Convert Windows paths to Cygwin paths and add " if necessary.  Then paste to the command buffer.
paste()
{
   local prefix=${READLINE_LINE:0:${READLINE_POINT}}
   local suffix=${READLINE_LINE:${READLINE_POINT}}
   local text=$(getclip)

   # Does the clipboard contents look like a Windows path (e.g., C:\Program Files)?
   if [[ ${text} =~ [A-Z]:\\.* ]]; then
      text=$(cygpath --mixed "${text}")

      # Add quotes if there are any spaces in the path
      if [[ ${text} == *" "* ]]; then
         text='"'${text}'"'
      fi
   fi

   # Insert the clipboard contents at the current cursor position
   READLINE_LINE=${prefix}${text}${suffix}

   # Move the cursor to the end of the inserted text
   ((READLINE_POINT += ${#text}))
}

# Remove Ctrl+V binding
stty lnext undef

# Change Control+v to execute paste()
bind -x '"\C-v":"paste"'

답변3

제가 질문을 잘못 이해한 것인지는 모르겠지만 최악의 경우에는 이것이 다른 사람들에게 도움이 될 수 있다고 생각했습니다. Windows 경로 와 유사한 기능을 만들 필요 가 없습니다 .cdwcdCygwin은 cd따옴표로 묶는 한 이미 이를 허용합니다.

예를 들어, cd 'C:\Program Files'변경너의 것을 바꿔라./cygdrive/c/Program Files


1 : 나는 의도적으로 "필요"라는 단어를 사용합니다. 여전히 합법적이고 합리적인 상황이 있을 수 있습니다.욕구만들다 cdw.

관련 정보