在适用于 Linux 的 Windows 子系统中使用 Ranger 打开文件行为

在适用于 Linux 的 Windows 子系统中使用 Ranger 打开文件行为

我正在使用适用于 Linux 的 Microsoft Windows([版本 10.0.15063])子系统,并在 bash 中使用 Ranger 文件管理器打开文件时观察到意外行为。

例如,我将 ~/.config/rifle.conf 设置为在 Sublime Text 3 中打开 .txt 扩展名:

ext txt = "/mnt/c/Program Files/Sublime Text 3/sublime_text.exe" "$@"

当我按 Enter 打开包含数据的现有文本文件时,Sublime 确实打开该文件,但 Sublime 中显示的文件中没有实际的文本/数据。我可以关闭该文件并使用 Windows 文件资源管理器打开该文件,文本就在那里。

有趣的是,Sublime 看到的路径是“C\mnt\c\path\to\my\file.txt”。

这是 Windows 无法看到 /mnt 的问题吗?我希望能够在 WSL 上使用 Ranger 作为我的文件管理器,有没有人看到过这种行为并可能发现了修复方法?谢谢大家!

答案1

正如 laktak 所解释的,WSL 不会将文件路径从 Unix 路径转换为 ​​Windows 路径。我刚刚写了一个要旨关于我如何处理这个问题,转载如下:

确保您拥有安装了 Windows 10 Fall Creators Update 的 WSL。 Ranger 用作rifle文件处理程序,您需要它的配置文件rifle.conf.如果您没有(应该在 中~/.config/ranger/rifle.conf),请运行命令ranger --copy-config=rifle,然后编辑生成的文件。

要从 Ranger 运行 Windows 应用程序,我们将使用cmd.exe /C start "" <file>,它在秋季创意者更新之后运行。我们将通过使用sed翻译路径来解决路径问题。

将以下代码添加到您的文件中rifle.conf,您将能够运行所选文件扩展名的 Windows 应用程序。

ext docx?|xlsx?|pptx?|pdf = echo "$@" | sed -e 's;/mnt/\(.\);\1:;' -e 's/.*/"&"/' -e 's:/:\\:g' | xargs cmd.exe /C start ""

start应该能够隐式运行与文件扩展名关联的应用程序,但如果由于某种原因它不起作用,您也可以显式地告诉start要运行哪个可执行文件。只需删除并添加、、、等""之一 。请注意,在这种情况下,每个应用程序都需要一行。举个例子:excelwinwordpowerpntAcroRd32.exerifle.conf

ext docx? = echo "$@" | sed -e 's;/mnt/\(.\);\1:;' -e 's/.*/"&"/' -e 's:/:\\:g' | xargs cmd.exe /C start winword
ext xlsx? = echo "$@" | sed -e 's;/mnt/\(.\);\1:;' -e 's/.*/"&"/' -e 's:/:\\:g' | xargs cmd.exe /C start excel

补充阅读

答案2

WSL 不处理绝对路径转换 AFAIK

你可以

  • 自己翻译路径(例如使用 bash 函数替换/mnt/c/c:\
  • 或使用相对路径

答案3

要将 Linux 路径转换/mnt/c/Users/myusername/Desktop
为 ​​Windows 路径,C:\Users\myusername\Desktop
必须执行三个步骤:

步骤1:在路径的开头和结尾附加双引号(对于空格来说是必需的):

sed -e 's;.*;"&";'
#   s … substitute
#   ; … delimiter character (can by any character)
#   .* … any character `.` occurring any number of times `*` will be replaced by:
#   " … at the beginning and " at the end.

第2步:替换/mnt/c/C:

sed -e 's;/mnt/c/;C:;'
#   s … substitute field 1 `/mnt/c/` by field 2 `C:`

步骤3:将所有斜杠替换/为反斜杠\

sed -e 's;/;\\;g'
#   s … substitute field 1 `/` by field 2 `\`
#   Note that there is a second `\` for escaping.

在 Linux 终端中测试所有三个部分:

echo '/mnt/c/Users/myusername/Desktop' | sed -e 's;.*;"&";' -e 's;/mnt/c/;C:;' -e 's;/;\\;g'
"C:Users\myusername\Desktop"

游骑兵使用步枪作为文件开启器。在我的本机 Linux 发行版上,我rifle.conf只包含一行用于使用其默认应用程序启动所有文件类型:

else X, flag f = xdg-open "$@"

如果是 WSL,则如下所示:

cat << EOT >> ~/.config/ranger/rifle.conf
else X, flag f = echo "\$@" | sed -e 's;.*;"&";' -e 's;/mnt/c/;C:;' -e 's;/;\\\;g' | xargs cmd.exe /C start ""
EOT

相关内容