Paredit modunda formu yukarı ve aşağı taşıma


13

Cursive'ın Yapısal Düzenleme (Intellij ve Cursive için paredit benzeri bir mod) kullanıyorum ve orada hareket formu (ve aşağı) adı verilen güzel bir komut buldum.

Formu yukarı taşı bunu yapar ( |nokta budur):

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

ve Formu aşağı taşı:

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

Bunu Emacs paredit modunda yapmak mümkün mü? Bence temel paredit setinde değil (en azından bu hile sayfasında açıklanmadı)


Güzel. Şimdi bu kendimi gördüğüm bir operasyon.
PythonNut

2
FWIW, en azından gösterdiğiniz iki örnek için, düz C-M-taynı şeyi yapıyor. Ama kastettiğiniz şey, aynı formun bir sonraki sexps çiftine geçiş yapmak yerine taşınmaya devam ettiği.
Drew

Yanıtlar:


13

@Drew'un önerdiği gibi, C-M-tistediğinizi yapar. Kural şöyledir:

  • İki sexps ortasında nokta koymak.
  • C-M-t(Çalışan transpose-sexp) tuşuna basın .
  • Sol sexp noktasında her zaman birlikte sağa taşınır. Bu çok önemlidir , aksi takdirde hiç bitmeyeceksiniz.

Ya da, bunun transpozisyon olmadığını, sadece ilerlemek için, taşımak istediğiniz sexp'den sonra bir noktaya yerleştirmeniz gerektiğini düşünebilirsiniz.

Ancak, uygun bir şey var, sol sexp'i geriye doğru aktarmak istediğinizde, aynısını kullanıyorsunuz, C-M-tancak negatif bir önek argümanı ile sağlanıyor ve bu rahatsız edici. Başka bir mesele, noktanın geriye doğru transpoze edilen sol sexp'i takip etmemesi . Bu sorunu çözmek için aşağıdakilerin ters bir sürümünü oluşturuyoruz 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))

Ardından, varsayılan Emacs'ın C-M-yyanındaki C-M-tve ücretsiz olanı bağlayın.

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

İşte bir demo; (MY-SEXP1)her zaman ileri / geri hareket etmek için solda olduğunu göreceksiniz :

resim açıklamasını buraya girin


5

Bunu gelişmiş bir biçimi olan lispy ile yapmak mümkündür paredit-mode.

Kullanım durumunuz için:

  • w yukarı taşır
  • s aşağı taşır

Tek şey, imlecin örnekte olduğu paren'de olması gerektiğidir:

(+ 1 |(+ 2 3) 4)

Ayrıca, birkaç bölgeyi aynı anda wve sbir bölgeyle işaretlerseniz birlikte taşıyabilirsiniz . Daha fazla bilgi için belgelere bakın .


;; Sadece bu iki komutu kullanmanın bir yolu var mı? ;; Bunu yaparken "M-left" ve "M-right" komutlarını kaybediyorum: `(add-hook 'clojure-mode-hook (lambda () (lispy-mode 1) (local-set-key (kbd" M) - <up> ") 'lispy-move-up) (yerel ayar tuşu (kbd" M- <down> ")' lispy-move-down)))` `
nha

1

İşte misc-cmds.elhemen hemen istediğinizi yapan başka bir komut (kütüphaneden ). Sadece tek bir tuşa ( C-M-tya da her neyse) bağlayın. Bir sexp'i tekrar tekrar ileri ve geri hareket ettirmek için kullanın.

Negatif önek arg, geriye doğru, örneğin transpose-sexp, geriye doğru bir başka transpozisyon yapmaya hazır bırakır. Ve tekrarlarken, negatif önek arg sadece yönü çevirir.

Eğer komutu bağlamak Yani diyelim ki C-o, o zaman o bir kez sağa, sonra iki kere sola, sağa üç kez noktanın sol etmektir sexp taşır.C-o C-o C-o C-- C-o C-o C-- C-o

Sayısal bir önek argümanı yalnızca ilk kullanım için bir etkiye sahiptir, yani tekrarlarken değil - tekrarlarken, hareket her zaman bir seksptir.

(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)))

(Not: transpose-sexps24.4'te değişen davranış , dolayısıyla sürüm testi burada. 24.4'ten önce nokta devam etmek için doğru yerde sona erdi (örn. Tekrar). 24.4'ten başlayarak nokta bunun için yanlış yerde. bir regresyon veya yararlı bir özellik ekler veya muhtemelen başka bir hata giderir seyircinin gözündedir. ;-) Bunun için şimdi sadece Emacs hata # 20698 dosyaladım .)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.