在elisp中转义字符串

时间:2012-10-16 09:01:01

标签: string emacs lisp elisp

我是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)

6 个答案:

答案 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!。!