pareditモードでフォームを上下に移動する


13

私は筆記体の構造編集(IntellijとCursiveのパーエディットのようなモード)を使用しており、フォームアップ(およびダウン)移動と呼ばれる素敵なコマンドを見つけました。

フォームを上に移動する|と、これが実行されます(ポイントです)。

(+ 1 |(+ 2 3) 4) => (+ (+ 2 3) 1 4)

フォームを下に移動することも同様です。

(+ 1 |(+ 2 3) 4) => (+ 1 4 (+ 2 3))

Emacs paredit-modeでこれを行うことは可能ですか?基本的な編集セットには含まれていないと思います(少なくともこのチートシートには記載されていません


いいね 今、それは私自身がやっているのを見ることができる手術です。
PythonNut

2
FWIWは、少なくともあなたが示す2つの例C-M-tについては、プレーンは同じことをしています。しかし、私はあなたが言っていることは、同じフォームが次のSexpのペアにスワッピング進行するのではなく、移動し続けるということだと思います。
ドリュー

回答:


13

@Drewが示唆C-M-tしたように、あなたが望むことをします。ルールは次のとおりです。

  • 2つのsexpsの中央にポイントを置きます。
  • C-M-t(実行transpose-sexp)を押します。
  • 左のS式は常にポイントと一緒に右に移動します。これは非常に重要です。さもないと、終わりがありません。

または、これは移調ではなく単に前進するだけであると単純に考えることができます。移動したいsexpの後にポイントを配置する必要があります。

しかし、便利な方法が1つあります。左のsexpを後方に転置したい場合、同じものを使用しますC-M-tが、負のプレフィックス引数が指定されているため、不便です。別の問題は、ポイントが後方に転置された左sexpに追従しないことです。この問題を解決するために、逆バージョンを作成しますtranspose-sexps

(defun reverse-transpose-sexps (arg)
  (interactive "*p")
  (transpose-sexps (- arg))
  ;; when transpose-sexps can no longer transpose, it throws an error and code
  ;; below this line won't be executed. So, we don't have to worry about side
  ;; effects of backward-sexp and forward-sexp.
  (backward-sexp (1+ arg))
  (forward-sexp 1))

次に、デフォルトのEmacsのC-M-y隣にC-M-tあり、フリーであるバインドします。

(global-set-key (kbd "C-M-y") 'reverse-tranpose-sexps)

これがデモです。(MY-SEXP1)常に左にあることに注意してください。

ここに画像の説明を入力してください


5

の高度な形式であるlispyを使用して実行できparedit-modeます。

ユースケースの場合:

  • w 上に移動します
  • s 下に移動します

唯一のものは、カーソルが括弧にある必要があることです。これはあなたの例では:

(+ 1 |(+ 2 3) 4)

また、リージョンでマークを付けた場合、wとで一度に複数のsexpsを移動することもできsます。詳細については、ドキュメントを参照しください。


;; これらの2つのコマンドのみを使用する方法はありますか?;; そうすると、「M-left」と「M-right」を失うように見えます: `(add-hook 'clojure-mode-hook(lambda()(lispy-mode 1)(local-set-key(kbd" M - <アップ> ") 'Lispyの-移動アップ)(ローカル・セット・キー(KBD "M- <下>")' Lispyの-移動ダウン)))`
ニャチャン

1

これは、(libraryからのmisc-cmds.el)別のコマンドであり、ほとんど要求することを行います。単一のキー(C-M-tまたは何でも)にバインドするだけです。これを使用して、sexpを前後に繰り返し移動します。

負の接頭辞argはのようtranspose-sexpに後方に転置しますが、ポイントを別の後方転置の準備ができたままにします。繰り返しの場合、負の接頭辞argは方向を反転させるだけです。

あなたは、にコマンドをバインドする場合はそう言って、C-oし、その後、いったん右に、2回左に、右に3回に点の左にあるS式を移動します。C-o C-o C-o C-- C-o C-o C-- C-o

数値の接頭辞argは、最初の使用にのみ効果があります。つまり、繰り返しの場合は効果がありません-繰り返しの場合、動きは常に一度に1セックスです。

(defun reversible-transpose-sexps (arg)
  "Reversible and repeatable `transpose-sexp'.
Like `transpose-sexps', but:
 1. Leaves point after the moved sexp.
 2. When repeated, a negative prefix arg flips the direction."
  (interactive "p")
  (when (eq last-command 'rev-transp-sexps-back) (setq arg  (- arg)))
  (transpose-sexps arg)
  (unless (natnump arg)
    (when (or (> emacs-major-version 24)
              (and (= emacs-major-version 24)  (> emacs-minor-version 3)))
      (backward-sexp (abs arg)) (skip-syntax-backward " ."))
    (setq this-command  'rev-transp-sexps-back)))

(注:transpose-sexps24.4 で変更された動作、したがってここでのバージョンテスト。24.4より前では、ポイントは適切な場所(たとえば、繰り返し)で終了していました。24.4以降、ポイントは間違った場所にあります。リグレッションや有用な機能の追加、または他のバグの修正は、おそらく見る人の目にあります。;-) 今、このためにEmacs バグ#20698を提出しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.