5

ポイントの下の文字列の周囲の引用符文字を切り替えるemacsコマンドを探しています。たとえば、文字列「バー」にカーソルを置き、キーを押して次のように変更します。

foo = 'bar'   <--->   foo = "bar"

ボーナスポイントの場合:

  • Python の三重引用符文字列の切り替えを処理します ( '''<---> """)

  • 必要に応じて、文字列内のバックスラッシュ エスケープを自動的に変更します。

例えば

foo = 'bar "quote"'   <--->   foo = "bar \"quote\""
4

4 に答える 4

6

これはもう少し堅牢になる可能性があります。

(defun toggle-quotes ()
  (interactive)
  (save-excursion
    (let ((start (nth 8 (syntax-ppss)))
          (quote-length 0) sub kind replacement)
      (goto-char start)
      (setq sub (buffer-substring start (progn (forward-sexp) (point)))
            kind (aref sub 0))
      (while (char-equal kind (aref sub 0))
        (setq sub (substring sub 1)
              quote-length (1+ quote-length)))
      (setq sub (substring sub 0 (- (length sub) quote-length)))
      (goto-char start)
      (delete-region start (+ start (* 2 quote-length) (length sub)))
      (setq kind (if (char-equal kind ?\") ?\' ?\"))
      (loop for i from 0
            for c across sub
            for slash = (char-equal c ?\\)
            then (if (and (not slash) (char-equal c ?\\)) t nil) do
            (unless slash
              (when (member c '(?\" ?\'))
                (aset sub i
                      (if (char-equal kind ?\") ?\' ?\")))))
      (setq replacement (make-string quote-length kind))
      (insert replacement sub replacement))))

バッファーからの構文情報を使用して、文字列の先頭にある引用符を見つけます (つまり、文字列が引用符で囲まれている場合)。また、バックスラッシュでエスケープされていない限り、文字列内の引用符を反転しようとします。よくあるケースかもしれません。

PS。三重引用符も見つけたいと思っていることに気付いたので、彼女は行きます。

于 2013-03-24T21:16:41.367 に答える
4

始めるための簡単なハックを次に示します。

(defun toggle-quotes ()
  "Toggle single quoted string to double or vice versa, and
  flip the internal quotes as well.  Best to run on the first
  character of the string."
  (interactive)
  (save-excursion
    (re-search-backward "[\"']")
    (let* ((start (point))
           (old-c (char-after start))
           new-c)
      (setq new-c 
            (case old-c
              (?\" "'")
              (?\' "\"")))
      (setq old-c (char-to-string old-c))
      (delete-char 1)
      (insert new-c)
      (re-search-forward old-c)
      (backward-char 1)
      (let ((end (point)))
        (delete-char 1)
        (insert new-c)
        (replace-string new-c old-c nil (1+ start) end)))))

この関数は、ボーナス 2 に近い反対側に内部引用符を交換します。

于 2013-03-22T23:18:39.980 に答える
-2

これは私が JavaScript 用に作成した関数です。

function swap_str(e, r, t) {
  return e = e.split(r).join("WHAK_a_SWAP"), e = e.split(t).join("WHAK_b_SWAP"), e = e.split("WHAK_a_SWAP").join(t), 
  e = e.split("WHAK_b_SWAP").join(r);
}
//test 1
var str = 'this is "test" of a \'test\' of swapping strings';
var manipulated = swap_str(str,"'",'"');
document.writeln(manipulated)
//test 2
manipulated = swap_str(manipulated,"'",'"');
document.writeln('<hr>'+manipulated)

于 2016-01-11T17:50:18.480 に答える