Defina a região para incluir parênteses

9

Começando com o ponto ou região ativa, como faço para expandir rapidamente (em um pressionamento de tecla / comando) para incluir o próximo conjunto de parênteses?

Se eu começar com: ( |significa ponto)

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

Ou se eu começar com: ( <e >coloque a região selecionada)

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

Eu quero acabar com

(defn foo [x] <(+ x 42)>|)
David J.
fonte

Respostas:

10

Use expand-region.el :

Expandir região aumenta a região selecionada por unidades semânticas. Continue pressionando a tecla até selecionar o que você deseja.

Um exemplo:

(setq alphabet-start "abc def")

Com o cursor em c, ele inicia marcando a palavra inteira abc, depois expande para o conteúdo das aspas abc def, depois para a citação inteira "abc def" e depois para o conteúdo do sexp setq alphabet-start "abc def "e, finalmente, para todo o sexp.

Você pode configurá-lo assim:

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

Você pode contratar a região novamente com um prefixo negativo, se expandir demais.

David J.
fonte
11
Para referência, a expand-regionfunção específica para marcar a lista imediatamente é chamada er/mark-outside-pairs.
Nanny
4

Concordo que você deve tentar expand-regionconforme sugerido em outra resposta (na qual estou votando).

Mas, caso você não esteja familiarizado com os comandos internos relevantes:

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

No seu primeiro exemplo, onde não há região, você poderia usar C-M-u C-M-SPCpara marcar a lista anexa. Se já existe uma região selecionada, esses comandos a estendem. Portanto, se 42for selecionado e você pressionar C-M-u, estenderá a seleção para trás até o início da lista, mas não incluirá o ponto final.

Portanto, na ausência de algo como expand-regioneu pressionaria C-gpara cancelar qualquer seleção atual, C-M-upara voltar quantas parênteses você quiser, C-M-SPCpara marcar

glucas
fonte
3

No caso da região ativa, hem lispy vai fazer o que quiser. Veja meu post de introdução recente .

No primeiro caso, você precisa M-m h.

update: todas as opções que você tem com lispy

Começando com:

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

Aqui, ~denota a marca (o início da região) e |denota o ponto (o fim da região).

  1. Com hvocê obtém:

    (defn foo [x] |(+ x 42)~)
    
  2. Com lvocê obtém:

    (defn foo [x] ~(+ x 42)|)
    
  3. Com kvocê obtém (desfazível com j):

    (defn foo [x] (+ ~x| 42))
    
  4. Com 2kou kkvocê obtém:

    (defn foo [x] (~+| x 42))
    
  5. Com dvocê obtém:

    (defn foo [x] (+ x |42~))
    
  6. Com d>você obtém (desfazível com <):

    (defn foo [x] (+ |x 42~))
    
  7. Com d2>ou d>>você obtém:

    (defn foo [x] (|+ x 42~))
    
  8. Com mvocê obtém:

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

Assim para resumir, quando a região é activa, h, j, k, l são as setas que se movem a região. >aumenta a região em uma unidade semântica na direção do ponto. <reduz a região por uma unidade semântica na direção do ponto. mdesativa a marca. iseleciona o primeiro elemento da região e dtroca ponto e marca.

abo-abo
fonte