我开始使用ruby-electric-mode。我喜欢它,除了我习惯于自己关闭开括号(其他配对对我来说仍然有用)。当我自己键入结束括号时,如何使emacs抑制其他括号?我现在每次都手动删除自动插入的支架。
提前致谢, Raghu。
答案 0 :(得分:3)
听起来你想要的是} 要么跳转到(已插入)} ,要么简单地插入} 并删除之前由电子模式插入的} 。
此代码应该按照您的意愿执行,对} 的操作选择由变量my-ruby-close-brace-goto-close
切换。
;; assuming
;; (require 'ruby)
;; (require 'ruby-electric)
(defvar my-ruby-close-brace-goto-close t
"Non-nill indicates to move point to the next }, otherwise insert }
and delete the following }.")
(defun my-ruby-close-brace ()
"replacement for ruby-electric-brace for the close brace"
(interactive)
(let ((p (point)))
(if my-ruby-close-brace-goto-close
(unless (search-forward "}" nil t)
(message "No close brace found")
(insert "}"))
(insert "}")
(save-excursion (if (search-forward "}" nil t)
(delete-char -1))))))
(define-key ruby-mode-map "}" 'my-ruby-close-brace)
答案 1 :(得分:2)
这是一个“可自定义”的设置。如果您没有Meta键,请运行M-x customize-variable
( ESC x )并自定义ruby-electric-expand-delimiters-list
。
取消选中“Everything”并仅检查您要自动插入的内容。一定要“为将来的会议保存”。
如果您认为自己最喜欢自动插入,但有些地方想要将其关闭以进行单次击键,那么请使用C-q
( Control - q )在打开paren / bracket / brace / quote之前抑制自动插入结束标记。
答案 2 :(得分:0)
陷入同样的问题。我找到的解决方案是:
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 board discussion):
(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
包才能生效。