我是 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
- 因此它会将带有单个反斜杠的字符串传递给我的 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)
最佳答案
您不需要执行任何操作。
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"
关于string - elisp 中的转义字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12911053/