Cygwin:轻松从 CD 到 Windows 路径

ant*_*nio 5 zsh cygwin

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

cdw() { cd "`cygpath -u $1`"  }
Run Code Online (Sandbox Code Playgroud)

现在我们有 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"
}
Run Code Online (Sandbox Code Playgroud)

它有效,但似乎太复杂了。我想知道你是否能找到比我更优雅的解决方案。

Gil*_*il' 5

历史黑客是解决这个问题的一种非常奇怪的方法,而且它非常脆弱。它不适用于 Windows 文件名中的某些有效字符,例如括号。

有一种更简单的方法可以使用粘贴的 Windows 路径。不要将其粘贴到行编辑器中,而是调用该getclip实用程序(位于最新版本的 Cygwincygutils-extra)。

cdw () {
  cd -- "$(getclip)"
}
cd -- "`getclip`"/../foo
Run Code Online (Sandbox Code Playgroud)

如果 dir 路径不包含任何字符$IFS(默认情况下为空格、制表符、换行符和 NUL),则无需使用双引号即可。

如果您希望能够编辑路径,请将键绑定到expand-or-complete-prefix,例如键入"`getclip`"并按Esc Tab

bindkey '\e\t' expand-or-complete-prefix
Run Code Online (Sandbox Code Playgroud)

另一种方法是绑定一个键来插入剪贴板引用的内容。

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