столкнулся с той же проблемой. Я нашел решение:
- Используйте autopair , которая делает именно то, что вы хотите. Убедитесь, что вы установили его.
- Включить
ruby-electric-mode
, но только для |
, потому что об остальном уже позаботились.
Это приводит к следующему коду в вашем .emacs
файле:
(use-package autopair
:config (autopair-global-mode)
)
(use-package ruby-electric-mode
:init
(setq ruby-electric-expand-delimiters-list (quote (124)))
)
(add-hook 'ruby-mode-hook 'ruby-electric-mode)
В этом коде используется пакет use-package , убедитесь, что вы установили его (M-X list-packages
, затем найдите use-package
, затем i
в строке, затем x
и перезапустите emacs).
Кроме того, это может заинтересовать людей, посещающих эту ветку. Я добавил этот код, чтобы пропустить закрывающие разделители с TAB
, это помогает перепрыгивать через них. Закомментируйте строки while
(и настройте )
), чтобы один TAB
перепрыгнул через все закрывающие разделители (взято из обсуждение доски emacs ):
(use-package bind-key)
(defun special-tab ()
"Wrapper for tab key invocation.
If point is just before a close delimiter, skip forward until
there is no closed delimiter in front of point. Otherwise, invoke
normal tab command for current mode.
Must be bound to <tab> using bind-key* macro from bind-key package.
Note, this function will not be called if `override-global-mode' is
turned off."
(interactive)
(defun next-char-delims (delims)
(let ((char (and (not (equal (point) (point-max)))
(string (char-after (point))))))
(when char (member char delims))))
(let ((open '("'" "\"" ")" "]" "}" "|")))
(if (next-char-delims open)
(progn (forward-char 1))
;;(while (next-char-delims open)
;; (forward-char 1)))
(call-interactively (key-binding (kbd "TAB"))))))
(if (macrop 'bind-key*)
(bind-key* (kbd "<tab>") 'special-tab)
(user-error "Must have bind-key from use-package.el to use special-tab function"))
На этот раз вам нужен пакет bind-key
, чтобы этот фрагмент работал.