Cygwin:轻松从 CD 到 Windows 路径

Cygwin:轻松从 CD 到 Windows 路径

在 Windows 中,路径很长(不合理),因此通常将某些链接拖放到终端或从文件管理器复制并粘贴路径。可以在 shell 初始化文件中放入类似的函数

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

现在我们有 Windows 版本的cd.假设“C:\Program Files”位于您的剪辑中,您可以键入:

cdwCTRL+ 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

$IFS如果 dir 路径不包含任何字符(默认情况下为空格、制表符、换行符和 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

我不知道我是否误解了这个问题,但在最坏的情况下,我认为这可以帮助其他人。不需要1创建类似于cdwWindowscd路径的函数。Cygwincd已经接受它们,只要您将它们用引号括起来即可。

例如,cd 'C:\Program Files'C改变你的D目录到/cygdrive/c/Program Files.


1:我故意使用“需要”这个词。仍可能存在合法合理的情况欲望创造cdw

相关内容