Edição em bloco * ao vivo * no Emacs ou Vim

9

O jEdit suporta edição de blocos, mas o Emacs e o Vim parecem ter sérios problemas de usabilidade no mesmo assunto. Se alguém pudesse preencher as incógnitas aqui, seria muito mais suportável usar qualquer um dos editores:

  • Seleção retangular real : onde a seleção na tela é um retângulo, não uma seleção linear que é usada para calcular uma região como o Emacs parece limitado.
    • jEditar: Mantenha pressionado Ctrle selecione.
    • Vim: Clique Ctrl-ve selecione.
    • Emacs: Desconhecido ; parece que um plugin com mais de 400 linhas é necessário.
  • Edição retangular ao vivo : veja como será o resultado em todas as linhas enquanto você edita após uma seleção de bloco.
    • jEdit: Basta começar a digitar e você verá o resultado final à medida que avança.
    • Vim: Clique Shift-ie digite. Só mostrará o resultado final na primeira linha até você pressionar Escpara sair do modo de inserção. Desconhecido se existe alguma maneira de ver o resultado em todas as linhas imediatamente.
    • Emacs: Desconhecido ; parece ser a única maneira C-x r te definir o texto a ser preenchido após pressionar Ret.
  • Iniciar e finalizar a seleção em posições fora do texto : por exemplo, eu gostaria de remover os N primeiros caracteres de cada linha, mas a primeira e a última linhas contêm menos de N caracteres.
  • Colar bloco inline : cole o bloco copiado como se estivesse colando várias linhas, como em, empurre o texto que já está lá embaixo , não está certo.
    • jEdit: O padrão. Para colar um bloco como um bloco, você precisa primeiro fazer outra seleção de blocos.
    • Vim: OEscVp.
    • Emacs: Desconhecido .

A funcionalidade geral de seleção de blocos do Emacs pode ser encontrada no cua-modeplugin .

l0b0
fonte
Aparentemente, o modo de edição de colunas do Emacs pode fazer algum tipo de edição de retângulos ao vivo: youtube.com/watch?v=k-6BVjlBSVo
Tom
Apenas uma observação sobre o emacs 400+ linhas "plugin". Um complemento um tanto semelhante para o gedit, chamado multi-edit, possui mais de 1000 linhas de código python. Para mim, o pugin é tão útil (como eu sobrevivi sem ele), o tamanho é acadêmico ... e se o emacs funcionar como anunciado, eu ficaria mais do que feliz em usá-lo, mas recebi um erro de carregamento quando eu o executei "comando-normalize-file-name: Args fora do intervalo:" ", 1" :( ... É exatamente o que eu estava procurando também ...
Peter.O
4
Para aqueles que não usaram o jEdit, explique sua terminologia. Não entendo o que significa "ao vivo" aqui, o que é "edição retangular ao vivo" ou o que significa "colar bloco em linha".
Gilles 'SO- stop be evil'

Respostas:

7

Eu posso responder pelo Vim, mas não pelo Emacs.

Iniciar e terminar a seleção em posições fora do texto:

:set virtualedit=blockpermitirá o comportamento desejado. Você pode soltar os dois pontos iniciais e adicioná-lo ao seu .vimrc, se quiser. Para mais informações, :help 'virtualedit'no Vim.

Colar bloco inline:

Se você apenas pressionar pno modo de comando, o Vim inserirá o bloco, pressionando caracteres para a direita em cada linha. Se você selecionar outro bloco e pressionar p, o Vim substituirá esse bloco pelo bloco colado.

Você pode colar um bloco "em linha" com a sequência de teclas no modo de comando OEscVp. Isso insere uma linha acima da linha atual ( O Esc), a seleciona na linha ( V) e cola sobre ela ( p). Você pode encurtar isso para (por exemplo) ypcom um mapeamento como :nmap yp O<Esc>Vp- digite literalmente; use cinco pressionamentos de tecla em <Esc>vez de pressionar a tecla Escape.

Jander
fonte
Boa dica sobre virtualedit; tem que tentar isso. Sobre a colar embutido, consulte a pergunta atualizada para obter uma descrição da funcionalidade esperada.
L0b0 15/10
Atualizei minha resposta com um método para colar blocos na linha.
Jander
5

Por exemplo, eu gostaria de remover os N primeiros caracteres de cada linha, mas a primeira e a última linhas contêm menos de N caracteres.

Emacs: inicie a seleção na primeira linha e simplesmente adicione o número de caracteres ausentes (por exemplo, espaços) à última linha e use o retângulo kill

Como alternativa, consulte artist-modeou picture-modequais permitem que você se mova livremente na janela, independentemente do comprimento da linha.

Colar bloco inline

Emacs: Primeiro salve o bloco com kill-retangle ou salvando-o em um registro, depois vá para o ponto de inserção, use delete-retangle e insira o retângulo salvo.

parece que é necessário um plug-in de mais de 400 linhas

No caso do Emacs, por que isso é um problema? Um plug-in pode ser compilado e a filosofia do emacs é que você não coloca tudo no núcleo, mas usa plug-ins para estender o editor.

Tom
fonte
4

Existe o 'cua-mode' que vem com o Emacsen 22.1 e posterior, ou siga o link para fazer o download das versões anteriores do Emacs. Há um pequeno vídeo que apresenta a funcionalidade.

Para comandos gerais retângulo, tente ler o manual , que fornece uma introdução fácil.

Trey Jackson
fonte
emacs cua-modeparece ser bom! +1 .. eu não poderia encontrar o vídeo que você mencionou, ver de Tom link nos comentários imediatamente abaixo da pergunta, para um link para uma informação de vídeo (diferente?) ...
Peter.O
@fered Opa, erro de cortar / colar, corrigido.
Trey Jackson
0

No vim, a maneira típica de excluir os primeiros n caracteres é fazer algo parecido :%s/.\{0,6\}//.

%fará o documento inteiro; você pode substituí-lo por uma seleção ou pelas linhas reais de seu interesse. O scomando é para "substituto". Ele substituirá uma expressão regular pelo que você especificar e corresponderá apenas uma vez em cada linha, a menos que você adicione uma opção específica. O /é um delimitador - pode ser qualquer caractere, mas /geralmente é usado, a menos que seja vantajoso usar outra coisa (para que você não precise escapar /no restante do comando). O argumento após o primeiro delimitador é uma expressão regular que será usada para encontrar cadeias correspondentes na sua seleção. O argumento após o segundo delimitador é o que a correspondência será substituída.

Portanto, este comando diz para encontrar de 0 a 6 instâncias de qualquer caractere e substituí-las por nada.

Shawn J. Goff
fonte
Não é o que eu pedi.
L0b0 15/10
Mas você acha que não é útil para outras pessoas que encontram essa pergunta? Eu acho que é, e é por isso que eu coloquei aqui.
Shawn J. Goff