Установить регион, чтобы включить в него круглые скобки

9

Начиная с точки или активной области, как быстро (одним нажатием клавиши / командой) «развернуть», чтобы включить следующий набор заключающих скобок?

Если я начну с: ( |означает точку)

(defn foo [x] (+ x |42))

Или, если я начну с: ( <и >выделите выбранный регион)

(defn foo [x] (+ x <42>|))

Я хочу закончить с

(defn foo [x] <(+ x 42)>|)
Дэвид Дж.
источник

Ответы:

10

Используйте expand-region.el :

Расширение региона увеличивает выделенный регион на семантические единицы. Просто продолжайте нажимать клавишу, пока она не выберет то, что вы хотите.

Пример:

(setq alphabet-start "abc def")

Когда курсор находится в точке c, он начинает с маркировки всего слова abc, затем раскрывается до содержимого кавычек abc def, затем до всей цитаты «abc def», затем до содержимого sexp setq alphabet-start «abc». def "и, наконец, на весь sexp.

Вы можете настроить его так:

(require 'expand-region)
(global-set-key (kbd "C-=") 'er/expand-region)

Вы можете снова заключить регион с отрицательным префиксом, если расширяться слишком далеко.

Дэвид Дж.
источник
1
Для справки, expand-regionвызывается специальная функция для отметки списка er/mark-outside-pairs.
няня
4

Я согласен, что вы должны попробовать, expand-regionкак предложено в другом ответе (за что я голосую).

Но на тот случай, если вы не знакомы с соответствующими встроенными командами:

C-M-u, backward-up-list
C-M-SPC, mark-sexp

В вашем первом примере, где нет региона, вы могли бы использовать, C-M-u C-M-SPCчтобы отметить список включения. Если выбранный регион уже существует, эти команды расширяют его. Таким образом, если 42выбрано и вы нажмете, C-M-uэто расширит выделение назад к началу списка, но не будет включать закрывающую скобку.

Таким образом, в случае отсутствия чего-то подобного, expand-regionя ударил бы, C-gчтобы отменить любой текущий выбор, затем C-M-uвернуться назад столько паренов, сколько вы хотите, затем C-M-SPCотметить

glucas
источник
3

В случае с активным регионом, hв lispy будет делать то, что вы хотите. Смотрите мой недавний вступительный пост .

В первом случае вам нужно M-m h.

обновление: все опции, которые у вас есть lispy

Начиная с:

(defn foo [x] (+ x ~42|))

Здесь ~обозначает |точку ( начало области) и обозначает точку (конец области).

  1. С hвами получается:

    (defn foo [x] |(+ x 42)~)
    
  2. С lвами получается:

    (defn foo [x] ~(+ x 42)|)
    
  3. С kвами получается (отменяется с j):

    (defn foo [x] (+ ~x| 42))
    
  4. С 2kили kkвы получаете:

    (defn foo [x] (~+| x 42))
    
  5. С dвами получается:

    (defn foo [x] (+ x |42~))
    
  6. С d>вами получается (отменяется с <):

    (defn foo [x] (+ |x 42~))
    
  7. С d2>или d>>вы получаете:

    (defn foo [x] (|+ x 42~))
    
  8. С mвами получается:

    (defn foo [x] (+ x 42|))
    

Просто суммировать, когда область активна, h, j, k, l являются стрелки , которые двигают область. >увеличивает область на одну семантическую единицу в направлении точки. <сжимает область на одну семантическую единицу в направлении точки. mдеактивирует знак. iвыбирает первый элемент региона и dобменивается точкой и отметкой.

Або-або
источник