2011-07-22 8 views
1

this answerでは、正規表現の検索/置換を使用して、1つのタイプのrubyブロックを別のタイプに変換します。ただし、機能ruby-flip-containing-block-typeが完了すると、その機能の周囲にsave-excursionがあるにもかかわらず、置き換えられたテキストの先頭にポイントが移動します。replace-match後にsave-excursionでカーソル位置が失われる

私はさらにポイントをレジスタに保存して、フリップの後にジャンプしてみました。保存されたポイントは、変更の始めに再配置されます。いくつかのGoogleの検索の後、私は問題は、置換マッチコールが元のポイントでバッファ内容を更新するという事実にあると思う。

このような状況でポイントの元の場所を保存/復元する方法については、

答えて

4

テキストを置き換えると、古いテキストが削除され、新しいテキストが挿入されます。それでは、-!-は、点の位置を示しているバッファは、次のようになりましょう:

abcdefghijklm-!-nopqrstuvwxyz 

あなたはjlkMnopjklmnopを置き換えるとします。

abcdefghi-!-qrstuvwxyz 

をして、jlkMnopが挿入されています:まずjklmnopは削除され

abcdefghi-!-jklMnopqrstuvwxyz 

あなたはポイントが移動されたかのような効果があることがわかります。

ポイントを保存する方法は、テキストを置き換える方法についてははるかに注意することです。大きなブロック(ポイントを含む可能性が高い)を置き換える代わりに、実際に変更される小さなセクションだけを置き換えます。あなたがリンクしている答えでは、でdo\(.*\)endを置き換える代わりに、do{に、end}にそれぞれ置き換えて置き換えてください。


これは醜い必要はありません。おそらく、このような何か、replace-matchに第五(subexp)引数を使用して:

(when (re-search-forward "\\(do\\).*\\(?:\n.*\\)\\(end\\)" nil t) 
    (replace-match "}" t t nil 2) 
    (replace-match "{" t t nil 1)) 
+0

私はそれを試しましたが、機能が醜い状態になってしまったときに諦めました。私が他の解決策を見つけることができない場合、私はそれを行うか、カーソルを動かして生きていきます。 – vhallac

+0

それを行うためのかなりきちんとした方法についての改訂された答えを見てください。 –

+0

ああ、改訂情報ありがとう。私はそれを使ってあまり恐ろしい機能を得ることができるかどうかを見ていきます。 – vhallac

1

私は同様の問題がありました。私の場合、(point)を変数pに保存して置き換えてから、関数の最後に(goto-char p)を呼び出して解決されたようです。

+0

それに接近する目覚しい方法。唯一の問題は、置き換えによってカーソルの前にある文字の数が変更される可能性があることです(do - > {)。pから1を引く必要があるかもしれません。最後にも同様のロジックが存在するはずです。もう一方の方向にも。 – vhallac

0
あなたはむしろ前 に滞在するよりも、後に何かがその位置に挿入されたとき、それはに移動する性質を持つ新しいテキストを指すポインタを保持しますた、(コピー・マーカー(ポイント)t)を使用することができます

新しいテキスト

関連する問題