【发布时间】:2012-10-16 09:01:00
【问题描述】:
我对 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)
【问题讨论】:
-
要将反斜杠加倍,请让 Emacs 将其读入 minibuffer 中的字符串,而不是将其直接粘贴到 Emacs 中。如果不以某种方式加倍反斜杠,就无法将
C:\users转换为文字字符串(\u在 Emacs 字符串中具有特殊含义;它是 Unicode 序列的开头)。