LINUX.ORG.RU

Переход по скобкам в Emacs


0

0

Есть ли в Emacs аналог команды Vim "%", переходящей на скобку, составляющую с этой пару?
Пример:

(delete-region from (point))

Наводим на первую скобку, вызываем команду - она переходит на последнюю.
Наводим на предпоследнюю, вызываем команду - переходит на вторую.
Важно, чтобы учитывались также формы скобок, т. е. если команда вызвана на скобке "(", она не перейдет на скобку "}" и т. д.

anonymous

This is one vi feature I am addicted to and which made the change to emacs tough because emacs does not have a direct way to do this even under it's various programming modes. Below is some emacs lisp code that I picked off from the Internet that will map the % key to do exactly what vi does. A big thanks to whoever wrote this. (Thanks to Eric Pement (Sed FAQ) for pointing out that this is from the Emacs FAQ). What you need to do is open the file .emacs under your home directory and stick the following lines as is in the file. Close and re-open emacs and, presto, you can use the % like you do in vi. Note that I have not tested this extensively, but it seems to work.

(global-set-key "%" 'match-paren)

(defun match-paren (arg)
"Go to the matching paren if on a paren; otherwise insert %."
(interactive "p")
(cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
((looking-at "\\s\)") (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))

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

Выражение может не вмещаться в 1 екране. Один из удобных способов перейти в начало, посмотреть, и вернуться.

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

>Жалко, для фигурных скобок так просто не получиться... (мне оно и для С++ нужно)

Пардон муа, но этот старый метод работает и для фигурных скобок, и для квадратных скобок. Проверь сам.

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

>Сейчас посмотрел, в 21.4.2 тоже есть (forward-sexp и backward-sexp), только они к хоткеям не привязанны.

Почему не привязаны? C-M-f, C-M-b (emacs 21.4.1)

Zubok ★★★★★
()

Спасибо всем!

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

>Пардон муа, но этот старый метод работает и для фигурных скобок, и для квадратных скобок. Проверь сам. У нее есть небольшой недостаток - если установить курсор не на саму скобку, а рядом возле нее, то команда вставляет в текст "^M".

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

>У нее есть небольшой недостаток - если установить курсор не на саму скобку, а рядом возле нее, то команда вставляет в текст "^M".

Вставляется, как и положено, знак %. Никаких ^M не замечалось. Это что-то у тебя не так.

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

Все, дошло. :0) Это я функцию вызывал по M-x match-paren ret, вот она и вставляла line return.(думал повесить потом на другую комбинацию) Непонятно только, почему Emacs вместо перевода строки вводил ^M. Ведь система у меня linux, а не Mac.

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

>наверное файл был на маке создан... Или ты случйно переключил на маковский end of line

Нет, это действие (self-insert-command...). Она получает символ ^M, после ввода команды (нажатие RET), если функция вызывается вручную. Попробуй ее выполнить -- и ^M выползет.

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

>Это я функцию вызывал по M-x match-paren ret, вот она и вставляла line return.

Ты можешь вообще убрать self-insert-command, если ты вешаешь функцию на непечатный символ. Она используется как раз для случая '%', так как это символ печатный, и он должен отображаться, если ты не на открывающей, и не на закрывающей скобочке находишься, что в (cond ...) и отображено. Тогда у тебя и ^M не будет попадать при ручном вводе. Но я бы оставил на всякий случай, так как мало ли на что повесить захочешь. Для общности -- это хорошо. А ввод вручную вряд ли эффективен.

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

По-моему это лучше. Оно лучше с show-paren-style 'mixed согласуется.

(global-set-key "%" 'match-paren)

(defun match-paren (arg)
  "Go to the matching paren if on a paren; otherwise insert %."
  (interactive "p")
  (let ((prev-char (char-to-string (preceding-char)))
        (next-char (char-to-string (following-char))))
    (cond ((string-match "[[{(<]" next-char) (forward-sexp 1))
          ((string-match "[\]})>]" prev-char) (backward-sexp 1))
          (t (self-insert-command (or arg 1))))))

vtVitus ★★★★★
()

А вот как в Vim подсвечивать парные кавычки (с различение ", ', `) и переходить по ним?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.