从在 Wine 上运行的 WinSCP 在 Sublime 中打开文件

Per*_*erS 2 wine sublime-text 16.04

我最近为 Ubuntu 更改了 Windows 操作系统。作为开发人员,我真的很喜欢 Windows 上的 WinSCP,但我在 Linux 上找不到任何其他合适的程序。

但是,在 Wine 上运行的 WinSCP 一切正常,只是我无法简单地双击文件并在 Sublime Text Editor 中打开它。

在首选项 -> 编辑器中,我尝试将 /usr/bin/subl 和 /opt/sublime_text/sublime_text 设置为默认编辑器,但这两个都不适合我。

当我在远程服务器上打开一个文件时,Sublime 被打开但它是空的,里面没有内容。或者,如果右键单击并从菜单中选择“打开”,我会收到“没有配置 Windows 程序来打开此类文件”。

有谁知道如何设置 WinSCP 以使用本地编辑器打开文件?

小智 6

我遇到了完全相同的问题 ( Ubuntu + Wine + WinSCP + Sublime),一旦我尝试使用 Sublime 进行编辑,它就会给我空白页。谷歌搜索没有给我任何东西,所以我为此制定了自己的解决方案(已测试Ubuntu 14.04 Trusty

这是我的解决方案研究

解决方案

解决方案测试,并与工作Ubuntu 14.04 Trusty+ Sublime 3+ Wine-1.6.2。我认为它也适用于 Debian(尚未测试)。

我已将解决方案拆分为 2 个脚本,以拥有两个通用工具而不是一个特定工具。

解决方案是添加一个脚本来修复路径,然后才能到达 Sublime:

  1. 第一个脚本wine2unix-path会将 Wine 的“windows 路径”转换为真实的文件系统路径并修复它的格式(引号和双反斜杠\\
  2. 第二个脚本sublime.exe将使用固定的真实文件路径wine2unix-path,并将其传递给 Sublime。

我将第一个脚本命名为“sublime.exe”,否则当我更新编辑器路径时,Wine 拒绝在“编辑器”设置中看到它。

操作步骤:

  1. 创建 /usr/local/bin/wine2unix-path
  2. 创建 /usr/local/bin/sublime.exe
  3. 更新编辑器路径 WinScp

步骤 1. wine2unix-path

示例用法:wine2unix-path c:\\Program files\\WinScp\\Log.txt返回/home/YOUR_CURRENT_LINUX_USER/.wine/drive_c/Program files/WinScp/Log.txt

  1. 创建文件 sudo touch /usr/local/bin/wine2unix-path
  2. 使可执行 sudo chmod +x /usr/local/bin/wine2unix-path

将以下脚本放入其中:


#!/bin/bash

# Trim quotes
FILE=$(echo "$@" | sed -e "s#\(^['\"]*\)\|\(['\"]*$\)##g")
USER_NAME=$(id -u -n)
DRIVE_LETTER="`echo $FILE | sed -e "s/^\([a-Z]\):.*/\1/" | awk '{print tolower($0)}'`"

echo "$FILE" | sed \
    -e 's#\\#\/#g' \
    -e "s#^[a-Z]:#/home/${USER_NAME}/.wine/drive\_${DRIVE_LETTER}#"

exit 0
Run Code Online (Sandbox Code Playgroud)

这个脚本的作用:

  1. FILE- 获取文件路径并修剪"'引号(如果有)
  2. USER_NAME- 获取当前用户名/home/USER
  3. DRIVE_LETTER- 从文件路径(第一个字符)获取驱动器号。它可能是不同的,指的C:\.wine/drive_cD:\指的是.wine/drive_d等等。
  4. 更新文件路径
    1. C:\wine 文件夹的完整路径替换根路径。C:\变成/home/USER/.wine/drive_c
    2. 替代对象\\(逃脱的窗口方式反斜线)用\,否则C:\\users\\files成为C:usersfiles当它通过升华。
  5. 输出结果文件路径(真实文件路径)

步骤 2. sublime.exe

  1. 创建文件 sudo touch /usr/local/bin/sublime.exe
  2. 使可执行 sudo chmod +x /usr/local/bin/sublime.exe
  3. 放在那里提供以下
  4. /opt/sublime_text/sublime_text使用您的崇高路径更改下面(最后一行)脚本中的路径。

Sublime version 3103的位于/opt/sublime_text/sublime_text


#!/bin/bash

# Wrapper script to open sublime from Wine
# 
# File path passed as a first argument should be "quoted" and "escaped"
# other wise spaces will split path into two
# 
# For example: sublime.exe "c:\\Program files\\WinScp\\Log.txt"
# 

# wine2unix-path is a help script to convert "Wine windows paths"
# to real paths in linux so sublime can access it
# 
# For for example:
#     ./sublime.exe "c:\\Program files\\WinScp\\Log.txt"
# Will result:
#     /home/YOUR_CURRENT_LINUX_USER/.wine/drive_c/Program files/WinScp/Log.txt

unixpath="`wine2unix-path $1`"

/opt/sublime_text/sublime_text "$unixpath"
Run Code Online (Sandbox Code Playgroud)

这个脚本的作用:

  1. 将 Wine 文件路径转换为实际文件路径。
  2. 将此引用的路径(以避免被空格分割路径)传递到崇高。

步骤 3. 在 WinScp 中更新编辑器路径

  1. 打开 WinScp
  2. Options > Preferences > Editors
  3. 如果您已经在编辑器中安装了 Sublime:
    1. 选择线条与崇高
    2. 单击Edit按钮
    3. 为“外部编辑器”设置以下路径 Z:\usr\local\bin\sublime.exe \"!.!\"
    4. 单击Ok。完毕
  4. 如果您在编辑器中没有 Sublime:
    1. 单击Add(以添加 sublime 编辑器并将其分配给文件类型)。
    2. 为“外部编辑器”设置以下路径 Z:\usr\local\bin\sublime.exe \"!.!\"
    3. 在“将此编辑器用于以下文件”中设置要使用它编辑的文件类型列表。我将它用于 PHP 文件和一些配置*.ini; *.txt; *.php; *.tpl*.*所有文件类型
  5. 确保 Sublime 行位于Editor preferences. 它将优先考虑您为 Sublime 选择的文件类型。

图片:WinScp 中的 Sublime 设置

问题研究

问题出现在 Wine 传递给 Sublime 的文件路径中:

  • 路径没有被引用"'当它传递给崇高
  • 路径反斜杠被双重转义 \\

一个例子:

  1. 要编辑的文件 /server/user/www/my project/some other file.php
  2. Wine 调用崇高Z:\opt\sublime_text\sublime_text /home/CURRENT_USER/.wine/drive_c/Program files/WinScp/server/user/www/my project/some file.php(路径未引用或转义)
  3. 系统将其作为/opt/sublime_text/sublime_text /home/CURRENT_USER/.wine/drive_c/Program files/WinScp/server/user/www/my project/some file.php.
  4. 所以命令被解释为:
    1. 命令 /opt/sublime_text/sublime_text
    2. 争论 /home/CURRENT_USER/.wine/drive_c/Program
    3. 争论 files/WinScp/server/user/www/my
    4. 争论 project/some
    5. 争论 file.php

由于缺少引号,结果路径被空格分割。正如我后来发现的那样,\\路径中的双重转义也存在问题