2009-08-27 8 views
1

Emacsで再ビルダーで正規表現を作成しました。私はそれをキルリングにコピーするためにC-c C-wを使います。Emacsでダブルバックスラッシュを単一のバックスラッシュに置き換えます。

キルリングが示しています

"\\(defun\\)"

まず、私は「」を取り除くためにコピー機能を変更しました。私の他の問題がある

\\(defun\\)

、キルリングでの正規表現のような機能のためにそれが使用できなくなる、二重のバックスラッシュが含まれていquery-replaceは-regexpに戻って、私はそれをヤンクしたいを、にキルリングから。

(replace-regexp-in-string "\\\\" "\\" "\\(defun\\)" nil t)

これらの関数は、だから私は、私はこれを行うことにより、キルリングにそれをコピーする前に「\」と「\\」に置き換えることができると思った

\(defun\)

のように、単一のバックスラッシュを期待します

この関数を実行すると、ミニバッファは "\(defun \)"の代わりに "\\(defun \\)"を表示します。

私は間違っていますか?

答えて

2

これが私の作品:

(defun my-reb-copy() 
    "Copy current RE into the kill ring without quotes and single 
backslashes for later insertion." 
    (interactive) 
    (reb-update-regexp) 
    (let* ((re (with-output-to-string 
       (print (reb-target-binding reb-regexp)))) 
     (str (substring re 2 (- (length re) 2)))) 
    (with-temp-buffer 
     (insert str) 
     (goto-char (point-min)) 
     (while (search-forward "\\\\" nil t) 
     (replace-match "\\" nil t)) 
     (kill-new (buffer-substring (point-min) (point-max)))) 
    (message "Regexp copied to kill-ring"))) 

(define-key reb-mode-map "\C-c\C-t" 'my-reb-copy) 
2

'insertまたは'princにあなたの文字列を渡すと、あなたの代わりになります。このような

(defun my-insert-kill() 
    "convoluted way to replace \\ in strings" 
    (interactive) 
    (princ (with-temp-buffer 
      (insert "(progn (princ ") 
      (insert (current-kill 0)) 
      (insert ") (insert \"\n\") nil)") 
      (eval-print-last-sexp) 
      (backward-sexp) (backward-char) 
      (let ((p (point))) 
      (goto-char (point-min)) 
      (forward-sexp) (forward-char) 
      (buffer-substring (point) p))) 
     (current-buffer))) 
+0

:次に

(set reb-re-syntax 'string) 

、交換に直接ジャンプする、あなたはthis defunを使用することができます-forward "\\\\" nil t)(replace-match "\\" nil t))、もちろんあなたのソリューションはずっと簡単ですが、何とかコマンドでそれを囲む必要があります。 – cschol

0

何か:

(princ "\\(defun\\)") 
-> 
\(defun\) 

私が直接これを行うには明白な方法が表示されないが、ここでは私のためのテスト文字列で動作しているようです本当に複雑な方法ですか?

(defun my-yank-unstring() 
    (interactive) 
    (insert (car (read-from-string (current-kill 0))))) 

(current-kill 0)ビット用Treyのおかげ。)

1

再ビルダー+ .EL再ビルダーするquery-replace-regexpによる再ビルダー及びreplace-regexp.

http://www.emacswiki.org/emacs/re-builder+.elを使用するための機能を提供するいくつかの拡張機能を有しています

0

一歩前進して、変数reb-re-syntaxをデフォルトのreadではなくstringに設定することができます。これにより、re-builderの動作がuse single backslashes instead of doubleに変更されます。

M-x customize-variable RET rev-re-syntax RET 

のまたはあなたに追加:カスタマイズ使用してこれを行うには

。Emacsのファイル:私は(検索(しばらくして同じことを行うことができます*スクラッチ*のようなバッファに評価し、はい

(defun reb-query-replace (to-string) 
    "Replace current RE from point with `query-replace-regexp'." 
    (interactive 
    (progn (barf-if-buffer-read-only) 
      (list (query-replace-read-to (reb-target-binding reb-regexp) 
             "Query replace" t)))) 
    (with-current-buffer reb-target-buffer 
    (query-replace-regexp (reb-target-binding reb-regexp) to-string))) 
関連する問題