web-dev-qa-db-fra.com

L'utilisation de "dd" dans Vi (suppression de plusieurs lignes) n'est pas acceptée si le nombre de lignes> la longueur du fichier

J'édite souvent un fichier localement, puis je le coupe et le colle dans une session ssh distante dans une session vi.

La première étape consiste à supprimer tout le contenu en faisant quelque chose comme:

 9999dd

Ce qui supprimera jusqu'à 9999 lignes du fichier.

Maintenant, d’une manière ou d’une autre, la version de vi sur une certaine machine Ubuntu exécutant 14.04 LTS se comporte différemment: la commande ci-dessus n’autorise pas la commande ci-dessus si le fichier ne contient pas au moins 9999 lignes.

Comment réactiver le comportement précédent/familier - dans lequel toutes les lignes du fichier entier seraient effacées si N (9999 dans ce cas) dépassait le nombre de lignes du fichier?

UPDATE J'apprécie les réponses fournies pour des méthodes alternatives pour y parvenir. Cependant, cela n'explique pas pourquoi/comment/quand le comportement a changé (j'utilise Ndd avec succès depuis des années. Ce n'est peut-être pas la meilleure façon de le faire. Mais cela fonctionne - y compris sur Ubuntu - différentes versions, centos, os/x).

ne autre mise à jour Le ":" devant a été supprimé: nous sommes en mode normal. TOUJOURS NE FONCTIONNE PAS dans cette instance particulière de editor/vi - alors que cela fonctionne avec par exemple 99dd (puisque le fichier a> 99 lignes) et que la même action fonctionne, 9999dd fonctionne dans d'autres instances.

2
javadba

@javadba, essayez :set nocompatible

La différence entre ces deux comportements semble dépendre du fait que j'ai :set nocompatible dans mon ~/.vimrc ou dans /etc/vim/vimrc ou à l'endroit où se trouve le comportement global.

Si je :set nocompatible, je peux utiliser :9999 plutôt que :$ pour accéder au bas d'un petit fichier. Je peux m'en tirer avec des éléments tels que 9999dd. Si j'ai pas:set nocompatible alors rien ne se passe lorsque j'essaie 9999dd, et j'obtiens une erreur E16: Invalid range lorsque j'essaie :9999 de passer au fin du fichier.

3
Nathan Grube

Ce que vous essayez (d’utiliser une plage non valide en mode commande) n’a jamais fonctionné. Cela ne fonctionne pas dans 7.2.445 (Debian 6), 7.2.411 (CentOS 6.6), 7.3.429 (Ubuntu 12.04), 7.4.683 (Ubuntu 14.04, PPA).

Je pense que vous avez confondu cela avec 99999dd, qui est valide en mode normal car N ici n’est pas un numéro de ligne, mais le nombre de fois que l’action est répétée - notez l’absence de :.

En effet, la documentation en dit autant:

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 vous voulez supprimer toutes les lignes et que vous voulez utiliser le mode commande pour le faire, alors:

:%d

Ou, en utilisant gammes :

:0,$d

Si vous ne souhaitez pas utiliser le mode de commande:

ggdG

Dans les deux cas, vous devez utiliser un nombre étrange pour une plage.

1
muru