No se acepta el uso de "dd" en Vi (eliminar varias líneas) si el número de líneas > longitud del archivo

No se acepta el uso de "dd" en Vi (eliminar varias líneas) si el número de líneas > longitud del archivo

A menudo edito un archivo localmente, luego lo corto y lo pego en una sesión ssh remota dentro de una sesión vi.

El primer paso es eliminar todo el contenido haciendo algo como

 9999dd

Lo que eliminará hasta 9999 líneas del archivo.

Ahora, de alguna manera, la versión de vi en cierta máquina Ubuntu que ejecuta 14.04 LTS se comporta de manera diferente: no permite el comando anterior si el archivo en realidad no contiene al menos 9999 filas.

¿Cómo puedo volver a habilitar el comportamiento anterior/familiar, en el que todas las líneas del archivo completo se borrarían si N (9999 en este caso) excede el recuento de líneas del archivo?

ACTUALIZAR Agradezco las respuestas que llegan paraalternativamétodos para lograrlo. Sin embargo, eso no explica por qué/cómo/cuándo cambió el comportamiento (he usado Ndd con éxito durante años. Quizás no sea la forma óptima de hacerlo. Pero funciona, incluso en ubuntu, en varias versiones, centos, os/x).

Otra actualización Se eliminó el ":" al frente: estamos en modo normal. TODAVÍA NO FUNCIONA en esta instancia particular de editor/vi, mientras que funciona con, por ejemplo, 99dd (ya que el archivo tiene> 99 líneas) y también funciona la misma acción, 9999dd, en otras instancias.

Respuesta1

@javadba, prueba:set nocompatible

La diferencia entre estos dos comportamientos parece depender de si tengo :set nocompatibleen mi ~/.vimrco en /etc/vim/vimrco donde sea el global.

Si :set nocompatibleentonces puedo usar :9999en lugar de :$saltar al final de un archivo pequeño, puedo salirme con la mía con cosas como 9999dd. Si tengono :set nocompatibleentonces no pasa nada cuando lo intento 9999ddy aparece un error E16: Invalid range cuando intento :9999saltar al final del archivo.

Respuesta2

Lo que está intentando (usar un rango no válido en modo comando) nunca puede haber funcionado. No funciona en 7.2.445 (Debian 6), 7.2.411 (CentOS 6.6), 7.3.429 (Ubuntu 12.04), 7.4.683 (Ubuntu 14.04, PPA).

Creo que lo has confundido con 99999dd, que es válido en modo normal porque N aquí no es un número de línea, sino el número de veces que se repite la acción; ten en cuenta la ausencia de :.

De hecho, la documentación dice lo mismo:

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).

Si desea eliminar todas las líneas y desea utilizar el modo comando para hacerlo, entonces:

:%d

O, usandorangos:

:0,$d

Si no desea utilizar el modo de comando:

ggdG

En ningún caso deberías utilizar un número extraño para un rango.

información relacionada