[emacs] emacs에서 줄 / 영역을 위아래로 이동

emacs에서 선택한 영역이나 선 (선택 사항이없는 경우)을 위아래로 이동하는 가장 쉬운 방법은 무엇입니까? 이클립스에서와 동일한 기능을 찾고 있습니다 (M-up, M-down으로 제한됨).



답변

에 바인딩 된 조바꿈 선을 사용하여 선을 이동할 수 있습니다 C-x C-t. 그러나 지역에 대해서는 Dunno.

바인딩을 변경해야하는 경우를 제외하고 원하는 작업을 수행하는 elisp 스 니펫을 찾았습니다 .

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


답변

업데이트 :move-text Marmalade 또는 MELPA 에서 패키지를 설치 하여 다음 코드를 얻습니다.

내가 사용하는 것은 지역과 개별 라인 모두에서 작동합니다.

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


답변

시도해야합니다 drag-stuff!

이클립스 Alt+ Up/ Down단일 라인과 선택된 영역 라인에 대해 정확히 작동합니다 !

그 외에도 Alt+ Left/ 로 단어를 이동할 수 있습니다. Right
이것은 정확히 당신이 찾고있는 것입니다! ELPA repos 에서도 사용할 수 있습니다 !

다른 솔루션은 저에게 효과가 없었습니다. 그들 중 일부는 버그가 있었으며 (순서를 바꾸는 동안 줄 바꿈, wtf?) 일부는 정확히 선택된 영역을 이동하여 선의 선택되지 않은 부분을 위치에 남겨 둡니다. 그러나 drag-stuff일식에서와 똑같이 작동합니다!

그리고 더! 지역을 선택하고 Alt+ Left/ Right! 이렇게하면 선택한 영역이 한 문자 씩 왼쪽 또는 오른쪽으로 바뀝니다. 놀랄 만한!

전역 적으로 활성화하려면 다음을 실행하십시오.

(drag-stuff-global-mode)


답변

줄을 위 / 아래로 이동하기위한 몇 가지 대화 형 함수를 작성했습니다.

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

키 바인딩은 IntelliJ IDEA 스타일이지만 원하는 것을 사용할 수 있습니다. 지역에서도 작동하는 일부 기능을 구현해야합니다.


답변

다음은 현재 줄 또는 활성 영역에 걸쳐있는 줄을 이동하는 스 니펫입니다. 커서 위치와 강조 표시된 영역을 고려합니다. 그리고 영역이 선 경계에서 시작 / 종료되지 않을 때 선을 끊지 않습니다. (일식에서 영감을 얻었습니다. 저는 이클립스 방식이 ‘전치 선’보다 더 편리하다는 것을 알았습니다.)

;; 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 위키에는 다음과 같은 항목이 있습니다.

http://www.emacswiki.org/emacs/MoveLine

이동 영역의 경우 :

http://www.emacswiki.org/emacs/MoveRegion


답변

내장이 없습니다. 조옮김 선 (Cx Ct)을 사용할 수 있지만 반복적으로 사용할 수는 없습니다. http://www.schuerig.de/michael/blog/index.php/2009/01/16/line-movement-for-emacs/ 의 함수를 살펴보세요 .

지역에도 쉽게 적용 할 수 있어야합니다.