4

私は 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 で変更する必要がある 1 つのバックスラッシュを含む文字列が emacs に渡されます。

1 つのバックスラッシュから 2 つのバックスラッシュを作成する必要があることを emacs に知らせることはできますか?

編集2:解決策

emacs を起動するシェル スクリプトを実際に呼び出すことで、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)
4

6 に答える 6

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

編集: backticks に相当する Windows シェルに興味があり、 Bash backticksに相当する Batch を見つけました。これは、このワンライナーですべてを実行できることを示唆していますか?

cmd> for /f "usebackq tokens=*" %a in (`C:\cygwin\bin\cygpath.exe "$(ItemPath)"`) do emacsclient -d 127.0.0.1:0.0 "%a"
于 2012-10-16T10:45:38.850 に答える
1

Philsの回答が好きですが、これがemacs lispの回答です。この関数は、ドライブを含む完全な 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)))))
于 2012-10-17T03:23:19.400 に答える
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 と同等の (ただし逆の) ことを行う必要があります。

于 2012-10-16T14:28:48.820 に答える
0

Windowsがエスケープされた円記号を送信していないことを確認しますか?そうしなかったら不思議だろう。

他の人がこの問題をどのように解決したかについては、このwikiページを参照してください。

于 2012-10-16T10:34:23.373 に答える
0

バックスラッシュをエスケープする必要があります。これはうまくいきます:

ELISP> (subst-char-in-string ?\\ ?/ "C:\\users\\someone")
"C:/users/someone"
于 2012-10-16T09:06:14.767 に答える