LINUX.ORG.RU

[emacs] autopair: пробелы между скобками

 


0

1

Как сделать, чтобы при набирании ( отображалось не (|), а ( | ). Желательно, чтобы при пустых скобках пробелы автоматически исчезали. При переформатировании региона, соответственно, тоже добавлялись пробелы в не пустые скобки.

elisp-ом владеешь? Я этот autopair в первый раз в глаза вижу. Взглянул.

Если вкратце, то нужно написать свою функцию по вставке пробелов. Нужно написать две функции: autopair-my-handle-wrap-action для враппинга выделенного региона и autopair-my-handle-action. Эти функции повесить на хуки autopair-handle-wrap-action-fns и autopair-handle-action-fns соответсвенно. Мне реально некогда, но я быстренько очень наклепал вариант для враппинга региона (окружение скобками выделенной области):

(defun autopair-my-handle-wrap-action (action pair pos-before region-before)
  (let ((delete-active-region nil))
    (cond
     ((eq 'opening (first autopair-action))
      (goto-char (1+ (car region-before)))
      (insert " ")
      (goto-char (+ (cdr region-before) 2))
      (insert " " pair)
      (autopair-blink)
      (goto-char (1+ (car region-before))))
     ((eq 'closing (first autopair-action))
      (delete-backward-char 1)
      (insert pair " ")
      (goto-char (+ (cdr region-before) 2))
      (insert " " autopair-inserted))
     ((eq 'insert-quote (first autopair-action))
      (goto-char (1+ (cdr region-before)))
      (insert pair)
      (autopair-blink))
     (t
      (delete-backward-char 1)
      (goto-char (cdr region-before))
      (insert autopair-inserted)))
    (setq autopair-action nil))))

В хуке для нужного тебе режима добавляешь эту функцию вместо умолчательной в autopair-handle-wrap-action-fns. Например, для python:

(add-hook 'python-mode-hook
	  #'(lambda ()
	      (setq autopair-handle-wrap-action-fns
		    (list #'autopair-my-handle-wrap-action))))

Вот для того, что ты хочешь, можно написать функцию для хука autopair-my-handle-action-fns. Кустомизируется этот autopair тяжело. Такие вещи пока там, по-моему, не предусмотрены. Вот только через такие хуки можно сделать. В принципе, это документирвано в комментариях.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Получилось сделать вставку пробелов, но боюсь, для пустых скобок ( чтобы при нажатии, например, С-e в пустых скобках пробелы исчезали ) необходимо изменять какие-то другие функции. С elisp практически не знаком, если не считать поверхностного знания scheme.

Изменённый кусок, дальше всё стандартное:

(defun autopair-my-handle-action (action pair pos-before)
  (cond (;; automatically insert closing delimiter
	 (and (eq 'opening action)
	      (not (eq pair (char-before))))
	 (insert "  " pair)
	 (autopair-blink)
	 (backward-char 2))

anonymous
()
Ответ на: комментарий от anonymous

>Получилось сделать вставку пробелов, но боюсь, для пустых скобок ( чтобы при нажатии, например, С-e в пустых скобках пробелы исчезали ) необходимо изменять какие-то другие функции.

Не, это надо просто написать такую функцию дополнительно. Подобный функционал вообще в этом модуле не заложен. Функция убирания пробелов вокруг скобочек не такая уж и сложная.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

То, что она не сложная это, конечно, понятно, но что мне совершенно непонятно, так это кто и откуда её будет вызывать.

anonymous
()
Ответ на: комментарий от anonymous

>То, что она не сложная это, конечно, понятно, но что мне совершенно непонятно, так это кто и откуда её будет вызывать.

Но ты же сам написал, что хочешь по комбинации:

но боюсь, для пустых скобок ( чтобы при нажатии, например, С-e в пустых скобках пробелы исчезали ) необходимо изменять какие-то другие функции.

Вот и прикрутить функцию на комбинацию. Но я сначала понял, что ты хотел так: ты находишься (курсор находится) внутри пустых скобок с пробелами, ты нажимаешь свою комбинацию и у этих скобок пробелы схлопываются. Или не так?

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Я имел ввиду не совсем это. Привёл как пример потому что не знаю возможно-ли как-то иначе. Мне хотелось чтобы это цеплялось не на какую-то определённую комбинацию, а просто выход за скобки ( C-e, C-a, M-<, итд. ).

То, что сообразил для клавиши:

(defun my-forward-list ()
  (interactive)
  (save-restriction
    (save-match-data
      (search-backward "(" nil t)
      (if (looking-at "([[:blank:]]+)")
	  (progn
	    (re-search-forward "[[:blank:]]+" nil t)
	    (replace-match "" nil nil))
	(goto-char (or (scan-lists (point) 1 0) buffer-end arg))))))

(global-set-key [f4] 'my-forward-list)
dimorphus
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.