Emacs'de seçilen bölgeyi veya çizgiyi (seçim yoksa) yukarı veya aşağı hareket ettirmenin en kolay yolu nedir? Tutulmadakiyle aynı işlevselliği arıyorum (M-yukarı, M-aşağı ile sınırlı).
Emacs'de seçilen bölgeyi veya çizgiyi (seçim yoksa) yukarı veya aşağı hareket ettirmenin en kolay yolu nedir? Tutulmadakiyle aynı işlevselliği arıyorum (M-yukarı, M-aşağı ile sınırlı).
Yanıtlar:
Bir çizgi, bağlı transpoze hatları kullanılarak taşınabilir C-x C-t. Yine de bölgeler hakkında Dunno.
Bağlamaları değiştirmeniz gerekmesi dışında, istediğiniz şeyi yapan bu elisp parçacığını buldum .
(defun move-text-internal (arg)
(cond
((and mark-active transient-mark-mode)
(if (> (point) (mark))
(exchange-point-and-mark))
(let ((column (current-column))
(text (delete-and-extract-region (point) (mark))))
(forward-line arg)
(move-to-column column t)
(set-mark (point))
(insert text)
(exchange-point-and-mark)
(setq deactivate-mark nil)))
(t
(beginning-of-line)
(when (or (> arg 0) (not (bobp)))
(forward-line)
(when (or (< arg 0) (not (eobp)))
(transpose-lines arg))
(forward-line -1)))))
(defun move-text-down (arg)
"Move region (transient-mark-mode active) or current line
arg lines down."
(interactive "*p")
(move-text-internal arg))
(defun move-text-up (arg)
"Move region (transient-mark-mode active) or current line
arg lines up."
(interactive "*p")
(move-text-internal (- arg)))
(global-set-key [\M-\S-up] 'move-text-up)
(global-set-key [\M-\S-down] 'move-text-down)
Güncelleme: Aşağıdaki kodu almak için move-textpaketi Marmalade veya MELPA'dan yükleyin .
Hem bölgelerde hem de ayrı hatlarda çalışan kullandığım şey:
(defun move-text-internal (arg)
(cond
((and mark-active transient-mark-mode)
(if (> (point) (mark))
(exchange-point-and-mark))
(let ((column (current-column))
(text (delete-and-extract-region (point) (mark))))
(forward-line arg)
(move-to-column column t)
(set-mark (point))
(insert text)
(exchange-point-and-mark)
(setq deactivate-mark nil)))
(t
(let ((column (current-column)))
(beginning-of-line)
(when (or (> arg 0) (not (bobp)))
(forward-line)
(when (or (< arg 0) (not (eobp)))
(transpose-lines arg)
(when (and (eval-when-compile
'(and (>= emacs-major-version 24)
(>= emacs-minor-version 3)))
(< arg 0))
(forward-line -1)))
(forward-line -1))
(move-to-column column t)))))
(defun move-text-down (arg)
"Move region (transient-mark-mode active) or current line
arg lines down."
(interactive "*p")
(move-text-internal arg))
(defun move-text-up (arg)
"Move region (transient-mark-mode active) or current line
arg lines up."
(interactive "*p")
(move-text-internal (- arg)))
(global-set-key [M-S-up] 'move-text-up)
(global-set-key [M-S-down] 'move-text-down)
Denemelisin drag-stuff!
Tam olarak eclipse Alt+ Up/ gibi Downtek hatlar için ve ayrıca seçilen bölge hatları için çalışır!
Buna ek olarak, kelimeleri Alt+ Left/ ile taşımanıza izin verir. Right
Tam olarak aradığınız şey budur! Ve ELPA depolarından bile edinilebilir !
Diğer çözümler benim için hiç işe yaramadı. Bazıları buggydi (sıralarını değiştirirken hatları aktarıyorlar, wtf?) Ve bazıları tam olarak seçilmiş bölgeyi hareket ettiriyor, hatların seçilmemiş kısımlarını konumlarında bırakıyorlardı. Ama drag-stuffaynen tutulmadaki gibi çalışıyor!
Ve daha fazlası! Bir bölge seçmeyi ve Alt+ Left/ kullanmayı deneyebilirsiniz Right! Bu, seçilen bölgeyi bir karakter sola veya sağa transpoze eder. İnanılmaz!
Global olarak etkinleştirmek için şunu çalıştırın:
(drag-stuff-global-mode)
Satırları yukarı / aşağı hareket ettirmek için birkaç etkileşimli işlev yazdım:
;; move line up
(defun move-line-up ()
(interactive)
(transpose-lines 1)
(previous-line 2))
(global-set-key [(control shift up)] 'move-line-up)
;; move line down
(defun move-line-down ()
(interactive)
(next-line 1)
(transpose-lines 1)
(previous-line 1))
(global-set-key [(control shift down)] 'move-line-down)
Tuş atamaları IntelliJ IDEA stilidir, ancak istediğiniz her şeyi kullanabilirsiniz. Muhtemelen bölgelerde de işleyen bazı işlevleri uygulamalıyım.
İşte benim pasajım mevcut satırı veya aktif bölge tarafından yayılan çizgileri hareket ettirmek için. İmleç konumuna ve vurgulanan bölgeye saygı duyar. Ve bölge, çizgi sınırlarında başlamadığında / bitmediğinde satırları kırmayacaktır. (Tutulmadan esinlenmiştir; tutulma yolunu 'transpoze çizgilerinden' daha uygun buldum.)
;; move the line(s) spanned by the active region up/down (line transposing)
;; {{{
(defun move-lines (n)
(let ((beg) (end) (keep))
(if mark-active
(save-excursion
(setq keep t)
(setq beg (region-beginning)
end (region-end))
(goto-char beg)
(setq beg (line-beginning-position))
(goto-char end)
(setq end (line-beginning-position 2)))
(setq beg (line-beginning-position)
end (line-beginning-position 2)))
(let ((offset (if (and (mark t)
(and (>= (mark t) beg)
(< (mark t) end)))
(- (point) (mark t))))
(rewind (- end (point))))
(goto-char (if (< n 0) beg end))
(forward-line n)
(insert (delete-and-extract-region beg end))
(backward-char rewind)
(if offset (set-mark (- (point) offset))))
(if keep
(setq mark-active t
deactivate-mark nil))))
(defun move-lines-up (n)
"move the line(s) spanned by the active region up by N lines."
(interactive "*p")
(move-lines (- (or n 1))))
(defun move-lines-down (n)
"move the line(s) spanned by the active region down by N lines."
(interactive "*p")
(move-lines (or n 1)))
Emacs wiki'de sadece bunun için bir giriş var:
http://www.emacswiki.org/emacs/MoveLine
Hareketli bölgeler için:
Yerleşik yok. Transpoze satırları (Cx Ct) kullanabilirsiniz, ancak tekrar tekrar kullanamazsınız. Http://www.schuerig.de/michael/blog/index.php/2009/01/16/line-movement-for-emacs/ adresindeki işlevlere bakın .
Bunu bölgelere uyarlamak da kolay olmalı.
transpose-paragraphFonksiyon sana yardım edebilir.
Emacs kılavuzundaki transpoze bölümüne de göz atmak isteyebilirsiniz . Esasen:
C-t
Transpose two characters (transpose-chars).
M-t
Transpose two words (transpose-words).
C-M-t
Transpose two balanced expressions (transpose-sexps).
C-x C-t
Transpose two lines (transpose-lines).
Bunun için smart-shift paketini (Melpa'da) kullanıyorum. Varsayılan olarak, C-C <arrow>bir çizgiyi veya bölgeyi hareket ettirmek için yeniden bağlanır . Bir majör moda özgü miktarda yatay olarak hareket eder (örn. C-temel-ofset veya python-indent-offset). Bölgeler üzerinde de çalışır.
;; binds C-C <arrows>
(when (require 'smart-shift nil 'noerror)
(global-smart-shift-mode 1))