A utilização de “dd” em Vi (excluir múltiplas linhas) não é aceita se o comprimento do arquivo for o número de linhas

2

Costumo editar um arquivo localmente e depois recortar e colá-lo em uma sessão ssh remota dentro de uma sessão do VI.

O primeiro passo é excluir todo o conteúdo fazendo algo como

 9999dd

Que excluirá até 9999 linhas do arquivo.

Agora, de alguma forma, a versão do vi em uma determinada máquina Ubuntu executando 14.04 LTS está se comportando de maneira diferente: ela não está permitindo o comando acima se o arquivo não contiver pelo menos 9999 linhas.

Como eu reabilito o comportamento antigo / familiar - no qual todas as linhas do arquivo inteiro seriam apagadas se N (9999, neste caso) exceder a contagem de linhas do arquivo?

UPDATE Aprecio as respostas que estão chegando para métodos alternativos para conseguir isso. No entanto, isso não explica por que / como / quando o comportamento mudou (eu usei o Ndd com sucesso há anos. Talvez não seja a melhor maneira de fazê-lo. Mas funciona - inclusive no ubuntu - várias versões, centos, os / x).

Outra atualização O ":" na frente foi removido: estamos no modo normal. AINDA NÃO FUNCIONA nesta instância específica do editor / vi - considerando que funciona com 99dd (já que o arquivo possui > 99 linhas) e também fazendo a mesma ação 9999dd funciona em outras instâncias.

    
por javadba 27.04.2015 / 22:27

2 respostas

3

@javadba, tente :set nocompatible

A diferença entre esses dois comportamentos parece depender de eu ter :set nocompatible em meu ~/.vimrc ou em /etc/vim/vimrc ou onde quer que o global esteja.

Se eu :set nocompatible , posso usar :9999 em vez de :$ para ir para o final de um arquivo pequeno, e posso usar coisas como 9999dd . Se eu tiver não :set nocompatible , nada acontece quando eu tento 9999dd , e eu recebo um erro E16: Invalid range quando tento :9999 pular para o final do arquivo.

    
por Nathan Grube 25.08.2015 / 07:58
1

O que você está tentando (usar um intervalo inválido no modo de comando) nunca pode ter funcionado. Não funciona em 7.2.445 (Debian 6), 7.2.411 (CentOS 6.6), 7.3.429 (Ubuntu 12.04), 7.4.683 (Ubuntu 14.04, PPA).

Eu acho que você confundiu com 99999dd , que é válido no modo normal porque N aqui não é um número de linha, mas o número de vezes que a ação é repetida - note a ausência de : .

De fato, a documentação diz isso:

Line numbers may be specified with:             :range E14 {address}
        {number}        an absolute line number

....
The {number} must be between 0 and the number of lines in the file.  When
using a 0 (zero) this is interpreted as a 1 by most commands.  Commands that
use it as a count do use it as a zero (:tag, :pop, etc).  Some commands
interpret the zero as "before the first line" (:read, search pattern, etc).

Se você quiser excluir todas as linhas e quiser usar o modo de comando para fazer isso, então:

:%d

Ou usando intervalos :

:0,$d

Se você não quiser usar o modo de comando:

ggdG

Em nenhum caso você deve usar um número estranho para um intervalo.

    
por muru 27.04.2015 / 22:34