Adicionando e removendo texto do mesmo lugar em todas as linhas de um buffer do emacs

3

Isso está na mesma linha da minha pergunta anterior: Removendo os últimos n caracteres de cada linha em um buffer do emacs . Os comentários feitos lá aplicam-se aqui.

Suponha que eu queira

insira a mesma string de texto em cada linha de um buffer do emacs no mesmo lugar (k caracteres do começo)

ou

remova n caracteres de cada linha de um buffer do emacs começando no mesmo lugar (k caracteres desde o começo)

eu poderia fazer isso usando replace-regex e, em caso afirmativo, como? Se não, existe alguma outra maneira?

EDIT: Para ser claro, eu gostaria de uma solução que usa ponto e marca para definir o local de inserção, bem como aquele que usa um n específico.

EDIT 2: Obrigado à alexis por uma resposta baseada em replace-regex . Gilles apontou que se poderia usar os comandos do retângulo, por exemplo %código%. Embora eu use esses comandos regularmente, não me ocorreu usá-lo aqui. Mudo de mim.

    
por Faheem Mitha 11.01.2014 / 17:57

3 respostas

3

A maneira mais fácil de fazer isso é com os comandos de retângulo .

Vá para a primeira linha do buffer (ou mais geralmente a primeira linha onde deseja inserir o texto) e vá para a coluna onde deseja inserir o texto. Vá para a última linha e vá para a mesma coluna (não há uma maneira interna de fazer isso). Digite C-x r t ( string-rectangle ) e digite a string que você deseja inserir.

Você pode usar a seguinte função para mover o cursor para a mesma coluna que a marca:

(defun move-to-mark-column ()
  (interactive "@")
  (move-to-column (save-excursion
                    (goto-char (mark))
                    (current-column))))

Se você deseja mudar para uma coluna por número, há move-to-column : C-u 42 M-x move-to-column RET . A menos que você vincule isso a uma chave, é mais curto passar para o início da linha e depois pela contagem de caracteres ( Home C-u 42 Right ), mas isso pode ir para a próxima linha se a contagem for muito alta, enquanto move-to-column deixa você no final da linha, neste caso. Além disso, move-to-column se comportará de maneira diferente se houver guias ou linhas divididas.

Se o ponto e a marca não estiverem na mesma coluna, eles são o canto oposto de um retângulo. O comando retângulo afeta todos os caracteres dentro desse retângulo. string-rectangle apaga o retângulo e coloca o texto especificado em cada linha. C-x r d apaga o retângulo. Você também pode copiar e colar ( C-x r M-w , C-x r k , C-x r y para copiar / eliminar / copiar) e inserir ou preencher com retângulos ( C-x r o , C-x r c para abrir / limpar com espaços) e muito mais.

    
por 12.01.2014 / 01:16
3

Fazer isso com replace-regexp é fácil:

Para inserir HELLO após o caractere 15, substitua ^.\{15\} por \&HELLO .

Isso procura 15 caracteres arbitrários, começando no início da linha. Ele os substitui por si mesmo ( \& ) seguido por HELLO .

Você poderia escrever uma macro que consulta a coluna atual no ponto e a usa para construir um regexp, mas eu não me incomodaria.

Para remover o texto, siga a mesma abordagem, mas use um grupo para os caracteres que serão mantidos.

Por exemplo, para remover caracteres 11-15: Substitua ^\(.\{10\}\).\{5\} por

    
por 11.01.2014 / 21:12
1

Usando a marca e o ponto com retângulos:

Para inserção, o comando retângulo mais fácil é string-insert-rectangle . Vá para a coluna de inserção na primeira linha que você deseja modificar, defina ( C-space ), mova para a última linha que deseja modificar e mova seu ponto para a coluna de inserção ou maior. Em seguida, use M-x string-insert-rectangle para inserir sua sequência nos locais desejados.

Isso é um pouco mais simples que o comando retângulo string-rectangle ( C-x rt ), como é semelhante, mas substitui o retângulo selecionado, enquanto string-insert-rectangle será inserido APENAS na extremidade esquerda das duas colunas. Assim, string-insert-rectangle permite que você seja mais desleixado (mais rápido, mais simples) sobre a seleção da coluna.

Para a exclusão, marque um retângulo definindo a marca em um canto, movendo o ponto para o outro e, em seguida, emitindo C-x r k para executar o kill-retangle. (Isso permitiria que você colasse depois com C-x r y ).

Veja mais sobre retângulos na seção de retângulos manuais do Emacs ou consulte o arquivo rect.el no seu sistema. ( C-h k C-x r t exibirá ajuda para o retângulo de string com um link para rect.el.)

Usando o regex - veja a resposta de alexis '

    
por 13.01.2014 / 22:12