подавить дополнительные скобки в электрическом режиме Emacs - PullRequest
2 голосов
/ 19 ноября 2009

Я начал использовать режим ruby-electric. Мне это нравится, за исключением того, что я сам привык закрывать открытые скобки (другое соединение по-прежнему полезно для меня). Как я могу заставить emacs подавлять дополнительные скобки, когда сам набираю закрывающие скобки? Теперь я каждый раз вручную удаляю автоматически вставляемую скобку.

Спасибо заранее, Рагу.

Ответы [ 3 ]

3 голосов
/ 19 ноября 2009

Звучит так, будто вы хотите, чтобы } либо перешел на (уже вставленный) } , либо просто вставил } и удалил } , который был вставлен ранее в электрическом режиме.

Этот код должен делать то, что вы хотите, выбор того, что делать на } , переключается переменной 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)
2 голосов
/ 19 ноября 2009

Это «настраиваемый» параметр. Запустите M-x customize-variable ( ESC x , если у вас нет мета-ключа) и настройте ruby-electric-expand-delimiters-list.

Снимите флажок «Все» и отметьте только те, которые вы хотите автоматически вставить. Не забудьте также «Сохранить для будущих сессий».

Если вы решили, что вам больше всего нравятся автоматические вставки, но есть места, где вы хотите отключить его для одного нажатия клавиши, тогда используйте C-q ( Control - q ) перед открытым паренем / скобкой / фигурной скобкой / кавычкой для подавления автоматической вставки закрывающей метки.

0 голосов
/ 13 мая 2018

столкнулся с той же проблемой. Я нашел решение:

  • Используйте 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, чтобы этот фрагмент работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...