Emacs close paren переходит к уже существующему close paren при редактировании кода clojure
Если этот фрагмент кода находится в буфере emacs:
(if (> x 5
true
false))
Когда я пытаюсь отредактировать его, чтобы исправить скобки, происходит что-то очень раздражающее! Когда я пытаюсь добавить закрывающую скобку в условие if, emacs заставляет курсор перейти на закрывающую скобку после 'false' вместо добавления новой скобки после 5
,
Это часть какого-то режима, может быть, clojure-mode? Вы знаете, как я могу это исправить? Для чего это нужно?
3 ответа
Похоже, вы используете paredit. Вы установили его как рекомендовано на странице проекта?
Что для чего это хорошо? Это хорошо для редактирования списков. Но вы должны купить целую систему, иначе вы действительно запутаетесь. Смотрите вики- страницу.
У вас есть этот раздел в вашем ~/.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)
Да, паредит "другой". Это всегда обеспечит баланс в скобках. См. http://www.emacswiki.org/emacs/PareditCheatsheet.
Для вашего кода поместите курсор под первой закрывающей скобкой и нажмите C-влево. Повторите упражнение, и оно переместится туда, куда вы хотите.
Cut & paste (kill & yank in emacs lingo) также позволяет вам вручную завинчивать сбалансированные скобки, поэтому, пока вы не привыкнете к паредиту, его будет проще использовать. Удачи!
как проверить, что паредит является преступником
Вы можете напечатать C-h k )
в то время как в вашем буфере Lisp, чтобы увидеть, что )
связан с. Если это связано с paredit-close-round
тогда да паредит это преступник.
как отключить паредит, когда вы не знаете, что его вызывает
Попробуйте ответ Аурамо в другой ветке
или, если это не сработает, попробуйте это:
(eval-after-load 'paredit
'(defalias 'paredit-mode 'ignore))
Если вам интересно, что запускает режим Paredit в вашем 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)))
Вы спросили "Для чего это полезно?" с помощью которого вы можете спросить две вещи:
- Почему
paredit-close-round
полезно?
- Почему
- Почему Паредит должен связывать
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
делает.
Почему это нормально, что паредит связывает )
к команде, которая делает что-то кроме простой вставки близких парен? Потому что вы не должны вставлять закрывающую скобку самостоятельно. Всякий раз, когда вы вставляете открытое объединение, закрытое объединение также вставляется автоматически. Всякий раз, когда вы хотите изменить (blah) (blah)
в ((blah) (blah))
Вы просто выбираете две формы и нажимаете (
,