Costumo editar um arquivo localmente, depois recortá-lo e colá-lo em uma sessão ssh remota dentro de uma sessão vi.
O primeiro passo é excluir todo o conteúdo fazendo algo como
9999dd
O que excluirá até 9.999 linhas do arquivo.
Agora, de alguma forma, a versão do vi em uma determinada máquina Ubuntu rodando 14.04 LTS está se comportando de maneira diferente: não está permitindo o comando acima se o arquivo não contiver pelo menos 9.999 linhas.
Como reativo o comportamento anterior/familiar - no qual todas as linhas do arquivo inteiro seriam apagadas se N (9999 neste caso) excedesse a contagem de linhas do arquivo?
ATUALIZAR Eu aprecio as respostas que chegam paraalternativamétodos para conseguir isso. No entanto, isso não explica por que/como/quando o comportamento mudou (eu uso o Ndd com sucesso há anos. Talvez não seja a maneira ideal de fazer isso. Mas funciona - inclusive no Ubuntu - várias versões, centos, os/x).
Outra atualização O ":" da frente foi removido: estamos no modo normal. AINDA NÃO FUNCIONA nesta instância específica do editor/vi - embora funcione com, digamos, 99dd (já que o arquivo tem> 99 linhas) e também executando a mesma ação 9999dd funciona em outras instâncias.
Responder1
@javadba, tente:set nocompatible
A diferença entre esses dois comportamentos parece depender se eu tenho :set nocompatible
no meu ~/.vimrc
ou no /etc/vim/vimrc
ou onde quer que esteja o global.
Se eu :set nocompatible
puder, :9999
em vez de :$
pular para o final de um arquivo pequeno, posso usar coisas como 9999dd
. Se eu tivernão :set nocompatible
então nada acontece quando tento 9999dd
e recebo um erro E16: Invalid range
quando tento :9999
pular para o final do arquivo.
Responder2
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).
Acho que você confundiu com 99999dd
, que é válido no modo normal porque N aqui não é um número de linha, mas sim o número de vezes que a ação é repetida - observe a ausência de :
.
Na verdade, a documentação diz o mesmo:
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ê deseja excluir todas as linhas e deseja usar o modo de comando para fazer isso, então:
:%d
Ou, usandogamas:
:0,$d
Se você não quiser usar o modo de comando:
ggdG
Em nenhum dos casos você deve usar um número estranho para um intervalo.