Emacs close paren переходит к уже существующему close paren при редактировании кода clojure - PullRequest
3 голосов
/ 10 марта 2012

Если этот фрагмент кода находится в буфере emacs:

(if (> x 5
    true
    false))

Когда я пытаюсь отредактировать его, чтобы исправить скобки, происходит что-то очень раздражающее! Когда я пытаюсь добавить закрывающую скобку в условие if, emacs заставляет курсор перейти на закрывающую скобку после 'false' вместо добавления новой скобки после 5.

Является ли это частью какого-то режима, может быть clojure-mode? Вы знаете, как я могу это исправить? Для чего это нужно?

Ответы [ 3 ]

4 голосов
/ 10 марта 2012

Звучит так, будто вы используете паредит. Вы установили его, как рекомендовано на странице проекта ?

А для чего это хорошо? Это хорошо для редактирования списков. Но вы должны купить во всю систему, или , вы в конечном итоге запутаетесь . Смотрите вики стр.

У вас есть этот раздел в вашем ~/.emacs.el? Просто удали его.

;; (require 'paredit) if you didn't install via package.el
(defun turn-on-paredit () (paredit-mode 1))
(add-hook 'clojure-mode-hook 'turn-on-paredit)
2 голосов
/ 10 марта 2012

Да, паредит "другой".Это всегда обеспечит баланс в скобках.См. http://www.emacswiki.org/emacs/PareditCheatsheet.

. Для своего кода поместите курсор под первой закрывающей скобкой и нажмите C-влево.Повторите упражнение, и оно переместится туда, куда вы хотите.

Вырезать и вставлять (убивать и дергать в emacs lingo) также позволяют вручную закрутить сбалансированные скобки, поэтому, пока вы не привыкнете к паредиту, это может бытьпроще в использовании.Удачи!

1 голос
/ 03 октября 2013

как проверить, что paredit является нарушителем

Вы можете набрать C-h k ), находясь в буфере Lisp, чтобы увидеть, с чем ) связан.Если он связан с paredit-close-round, тогда да paredit является нарушителем.

как отключить paredit, если вы не знаете, что его вызывает

Попробуйте ответ Аурамо в другой теме

или, если это не сработает, попробуйте следующее:

(eval-after-load 'paredit
  '(defalias 'paredit-mode 'ignore))

Если вам интересно, что вызывает режим паредита в вашем Emacs, используйте M-x debug-on-entry RET paredit-mode RET

научиться жить с паредитом

Но все же я должен призвать вас продолжать использовать паредит.Давайте продолжим использовать paredit и посмотрим решения проблем, которые вы поставили.Вы спросили: «Ты знаешь, как я могу это исправить?»Я просто предполагаю, что вы спрашиваете, как это исправить, если форма.Мариус Кьельдаль дал вам решение, которое использует paredit-forward-barf-sexp, теперь, в общем, если у вас есть какой-то код на Лиспе, где вы видите, что некоторые парены находятся в неправильных местах, и вы хотите это исправить, вы можете просто временно отключить режим paredit в этом буфере (набрав M-x paredit-mode), затем исправьте свой код и снова включите режим paredit (снова набрав M-x paredit-mode).Еще одна вещь, которую следует учитывать, это то, что Emacs отменил, поэтому, если вы достигнете (if (> x 5 true false)) с помощью какого-либо действия, вы можете отменить это действие и начать все сначала.Отмена связана с C-z, если вы используете режим CUA.

Тем не менее, вы можете найти странные привязки C-left, C-right, поэтому вы можете использовать следующую настройку:

(eval-after-load 'paredit
  '(progn
     ;; paredit-forward-barf-sexp is usually bound to <C-left>, C-}.
     ;; here we unbind it from <C-left>
     ;; so that one can continue to use <C-left> for movement.
     (define-key paredit-mode-map (kbd "<C-left>") nil)

     ;; paredit-forward-slurp-sexp is usually bound to <C-right>, C-).
     ;; here we unbind it from <C-right>
     ;; so that one can continue to use <C-right> for movement.
     (define-key paredit-mode-map (kbd "<C-right>") nil)

     ;; paredit-backward-kill-word is bound to M-DEL but not to <C-backspace>.
     ;; here we bind it to <C-backspace> as well
     ;; because most people prefer <C-backspace> to M-DEL.
     (define-key paredit-mode-map (kbd "<C-backspace>") 'paredit-backward-kill-word)))

Вы спросили "Для чего это полезно?"по которому вы можете задавать две вещи:

    1. Почему paredit-close-round полезно?
  • Почему paredit должен связывать paredit-close-round с ), когда он мог связать его с лучшими ключами?

Лучший способ думать о paredit-close-round - этодумать об этом как о коллеге C-M-u.Переместите точку к | в следующем коде и попробуйте нажать C-M-u несколько раз, чтобы посмотреть, что произойдет, а затем снова переместите точку к | и попробуйте нажать C-M-- C-M-u (то есть введите -u, когда включены Control и Alt) несколько раз, чтобы увидеть, что происходит.

(when t
  (when t
    (blah)
    (blah))
  (when t
    (blah | blah)
    (blah))
  (when t
    (blah)
    (blah)))

C-M-u полезно для выбора выражений;чтобы выбрать вложенную форму или формы, вы нажимаете C-M-u несколько раз, а затем C-M-SPC несколько раз.C-M-- C-M-u полезно для оценки вложенной формы;Вы нажимаете C-M-- C-M-u несколько раз, а затем C-x C-e, чтобы проверить вмещающую форму.

paredit-close-round в основном делает то, что делает C-M-- C-M-u.

Почему это нормально, что paredit связывает) команде, которая делает что-то кроме простой вставки близких парен?Потому что вы не должны вставлять закрывающую скобку самостоятельно.Всякий раз, когда вы вставляете открытое объединение, закрытое объединение также вставляется автоматически.Всякий раз, когда вы хотите изменить (blah) (blah) на ((blah) (blah)), вы просто выбираете две формы бла и нажимаете (.

...