设置区域以包含括号


9

从点或活动区域开始,如何快速(在一个按键/命令中)“扩展”以包括下一组封闭括号?

如果我以:(|指点)开头

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

或者,如果我从以下内容开始:(<并将>所选区域括起来)

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

我想结束

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

Answers:


10

使用expand-region.el

扩展区域以语义单位增加所选区域。只需按住键,直到选择所需的内容。

一个例子:

(setq alphabet-start "abc def")

将光标放在c上,首先标记整个单词abc,然后扩展到引号abc def的内容,然后扩展到整个引号“ abc def”,再扩展到sexp setq字母开头的内容“ 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返回所需的任意数量的parens,然后C-M-SPC标记


3

在活动区域​​的情况下,hlispy中将执行您想要的操作。请参阅我最近的介绍性帖子

在第一种情况下,您需要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. 随着2kkk您得到:

    (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|))
    

只是总结一下,当区域被激活,hjkl 是移动区域的箭头。>在点的方向上以一个语义单位扩大区域。<在点的方向上按一个语义单位缩小区域。m禁用标记。i选择区域的第一个元素,并d交换点和标记。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.