我是Lisp的新手 - 尤其是Elisp--我遇到字符串处理问题:
我想将Windows样式路径转换为Unix样式路径 - 尤其是我需要转换 我从Visual Studio到Cygwin路径的路径,因为我希望能够从中打开文件 Emacs中的Visual Studio(我希望使用emacsclient --eval):
Visual Studio路径具有以下格式:
C:\Users\name\documents\visual studio 2010\projects\test
我想将其更改为适当的Cygwin路径,即:
/cygdrive/c/Users/name/documents/visual studio 2010/projects/test
但是,在临时缓冲区中尝试以下操作已经失败:
(replace-regexp-in-string "\\" "\/" "C:\users\someone")
(subst-char-in-string ?\ ?/ "C:\users\someone")
>> Debugger entered--Lisp error: (error "Non-hex digit used for Unicode escape")
有没有办法让Elisp 不转义每个字符串中的反斜杠?
编辑:
以下是我通过外部工具从Visual Studio调用emacs的方法:
emacsclient -d 127.0.0.1:0.0 --eval '(convert-win-to-cygwin-path $(ItemPath))'
$(ItemPath)将替换为我无法影响的C:\Users\asf
- 因此它会将带有单个反斜杠的String传递给我需要在emacs中修改的emacs。
我可以制作emacs知道它需要从单个反斜杠中制作双反斜杠吗?
编辑2:解决方案
我通过实际调用将启动emacs的shell脚本来改变我尝试启动emacs的方式 - 这样我就可以确保emacs获得正确的路径:
#!/bin/bash
export PATH="/usr/bin/:/bin/:$PATH"
filename=$1
line=$2
column=$3
cyged_path=$(cygpath "$filename")
echo "Cyged path: $cyged_path"
emacsclient -d 127.0.0.1:0.0 -n +$line:$column "$cyged_path"
我在Visual Studio中使用以下参数在外部工具窗口中调用它:
Path: <path_to_cygwin>\bin\bash.exe
Arguments: <path_to_script> $(ItemPath) $(CurLine) $(CurCol)
答案 0 :(得分:3)
您无需执行任何操作。
Cygwin提供了一个专门用于将Windows路径转换为Cygwin路径的命令,因此您无需为这类事情烦恼。
cmd> C:\cygwin\bin\cygpath.exe "C:\Users\name\documents\visual studio 2010\projects\test"
/cygdrive/c/Users/name/documents/visual studio 2010/projects/test
编辑:我很好奇Windows shell等效的反引号,并找到了Batch equivalent of Bash backticks,这表明你可以用这个单行完成所有操作吗?
cmd> for /f "usebackq tokens=*" %a in (`C:\cygwin\bin\cygpath.exe "$(ItemPath)"`) do emacsclient -d 127.0.0.1:0.0 "%a"
答案 1 :(得分:1)
另一种查看问题的方法是,emacsclient -d 127.0.0.1:0.0 --eval '(convert-win-to-cygwin-path $(ItemPath))'
将文件名传递给Elisp字符串,这就是反斜杠被视为转义的原因。因此,解决方案是将其作为数据传递,如emacsclient -d 127.0.0.1:0.0 $(ItemPath)
中所示。下一个问题是让您的Emacs了解这些文件名。如果你使用Emacs的普通Windows版本,它可以在不做任何特殊操作的情况下工作,但是如果你使用Cygwin构建,你需要做类似(但相反)的cygwin-mout.el。
答案 2 :(得分:0)
需要转义反斜杠。这可行:
ELISP> (subst-char-in-string ?\\ ?/ "C:\\users\\someone")
"C:/users/someone"
答案 3 :(得分:0)
你确定Windows没有发送预装反斜杠吗?如果不这样做会很奇怪。
请参阅此wiki page了解其他人如何解决此问题。
答案 4 :(得分:0)
这是emacs lisp中的答案,尽管我喜欢Phils的答案。此函数将预期包含驱动器的完整Windows文件路径的区域转换为cygwin路径。
例如:
C:\Users\name\documents\visual studio 2010\projects\test
...变为
/cygdrive/C/Users/name/documents/visual studio 2010/projects/test
以下是代码:
(defun win32-to-cygwin-path()
"Converts a win32 path into a cygwin happy one"
(interactive)
(save-excursion
(save-restriction
(narrow-to-region (point) (mark))
(goto-char (point-min))
(insert "/cygdrive/")
(goto-char (point-min))
(while (search-forward ":" nil t)
(replace-match "" nil t))
(while (search-forward "\\" nil t)
(replace-match "/" nil t)))))
答案 5 :(得分:0)
这些解决方案都不适用于我(emacs 24.3.1),无论如何,一个简单的.bat脚本都可以:
@ECHO OFF
c:\cygwin64\bin\cygpath.exe %1 > tmp.txt
set /p FILE_TO_EDIT= < tmp.txt
del tmp.txt
C:\cygwin64\bin\cygstart.exe -- /bin/emacs-w32.exe %FILE_TO_EDIT%
将其保存在file.bat中并将要编辑的文件作为参数发送,对于WinSCP,将如下所示: C:\ Users \ xxxxx \ Desktop \ open.bat!。!