paredit 모드에서 양식을 위아래로 이동


13

나는 필기체의 구조 편집 (Intellij 및 Cursive의 paredit-like 모드)을 사용하고 있으며 move form-up (and down)이라는 멋진 명령을 발견했습니다.

폼을 위로 이동하면 이것이 |핵심입니다.

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

아래로 이동 양식은 유사합니다.

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

Emacs paredit-mode에서 이것을 할 수 있습니까? 기본 패러디 세트에 있지 않다고 생각합니다 (적어도이 치트 시트 에는 설명 되어 있지 않습니다)


좋은. 이제는 내가하는 일을 볼 수 있습니다.
PythonNut

2
FWIW, 적어도 당신이 보여주는 두 가지 예에서 plain C-M-t은 거의 같은 일을합니다. 그러나 나는 당신이 의미하는 바가 다음 포셉 쌍으로 진보를 바꾸지 않고 같은 형태가 계속 움직인다는 것입니다.
Drew

답변:


13

@Drew가 제안했듯이 C-M-t원하는 것을 수행합니다. 규칙은 다음과 같습니다.

  • 두 sexps의 중간에 포인트를 넣어.
  • C-M-t(실행 transpose-sexp)을 누릅니다 .
  • 왼쪽 sexp은 항상 포인트와 함께 오른쪽으로 이동합니다. 이것은 매우 중요합니다 . 그렇지 않으면 끝이 혼동되지 않습니다.

또는 단순히 이것이 전치가 아니라 단순히 전진한다고 생각할 수 있습니다. 이동할 sexp 뒤에 포인트를 두어야합니다.

그러나 왼쪽 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))

그런 C-M-y다음 C-M-t기본 Emacs 옆에 있고 비어있는 곳에 바인딩하십시오 .

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

여기 데모가 있습니다. 당신은 (MY-SEXP1)항상 앞으로 / 뒤로 이동할 왼쪽에 있습니다.

여기에 이미지 설명을 입력하십시오


5

고급 형식의 lispy 로 수행 할 수 있습니다 paredit-mode.

사용 사례 :

  • w 위로 이동
  • s 아래로 이동

커서가 paren에 있어야한다는 것이 유일한 예입니다.

(+ 1 |(+ 2 3) 4)

ws로 지역을 표시 한 경우과으로 여러 육포를 한 번에 이동할 수도 있습니다 . 자세한 내용 은 설명서 를 참조하십시오.


;; 이 두 명령 만 사용하는 방법이 있습니까? ;; 그렇게 할 때 "M-left"와 "M-right"를 느슨하게하는 것 같습니다 :`(add-hook 'clojure-mode-hook (lambda () (lispy-mode 1)) (로컬 세트 키 -<up> ") 'lispy-move-up) (로컬 세트 키 (kbd"M- <down> ")'lispy-move-down)))`
nha

1

다음은 misc-cmds.el요청한 것을 수행하는 다른 명령 (library )입니다. 단일 키 ( C-M-t또는 무엇이든)에 바인딩하십시오 . 이를 사용하여 sexp를 앞뒤로 반복해서 이동할 수 있습니다.

음의 접두사 arg는과 같이 거꾸로 전치 transpose-sexp되지만, 다른 거꾸로 조옮김을 할 준비가됩니다. 그리고 반복 할 때, 음의 접두사 arg는 방향을 뒤집습니다.

당신이에 명령을 결합한다면 말, C-o다음, 다음 번 오른쪽으로, 다음 번 왼쪽에있는 오른쪽 세 번 지점의 왼쪽에있는 sexp 이동합니다.C-o C-o C-o C-- C-o C-o C-- C-o

숫자 접두사 arg는 처음 사용하는 경우에만 효과가 있습니다. 즉, 반복 할 때가 아니라 반복 할 때의 움직임은 항상 한 번에 하나의 sexp입니다.

(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부터 포인트가 잘못된 위치에 있습니다. ;-) 나는 지금 이맥스 버그 # 20698 을 제출했다 .)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.