Supprimer la nouvelle ligne dans Vim


271

Existe-t-il un moyen de supprimer la nouvelle ligne à la fin d'une ligne dans Vim, afin que la ligne suivante soit ajoutée à la ligne actuelle?

Par exemple:

Evaluator<T>():
    _bestPos(){
}

Je voudrais mettre tout cela sur une seule ligne sans copier les lignes et les coller dans la précédente. Il semble que je devrais pouvoir placer mon curseur à la fin de chaque ligne, appuyer sur une touche et faire passer la ligne suivante sur la même que celle sur laquelle se trouve le curseur.

Résultat final:

Evaluator<T>(): _bestPos(){ }

Est-ce possible à Vim?


Del à la fin de la ligne en mode d'insertion de vim fonctionnait pour moi. Mais pas dans tous les terminaux.
Victor Sergienko

Réponses:


584

Si vous êtes sur la première ligne, appuyez sur (majuscules) Jpour joindre cette ligne et la ligne suivante, en supprimant la nouvelle ligne. Vous pouvez également combiner cela avec un nombre, donc appuyer sur 3Jcombinera les 3 lignes ensemble.


29
Comme indiqué dans une autre réponse, gJévite d'ajouter des espaces que Vim peut choisir d'ajouter lors de l'utilisation J.
Michael Mior

5
Vous pouvez également sélectionner toutes les lignes que vous souhaitez joindre à l'aide de V(Visual Line Mode) puis appuyez sur JougJ
Sbu

Si vous souhaitez conserver la position du curseur, utilisez :joinet :join!cela joindra les lignes en conservant la position du curseur et ne gardera aucun espace au point de jonction. vous pouvez également le mapper comme: nnoremap <Leader>j :joing<cr>et nnoremap <Leader>gj :join!<cr>.
SergioAraujo

83

Certainement. Vim reconnaît le caractère \ n comme une nouvelle ligne, vous pouvez donc simplement rechercher et remplacer. En mode commande, tapez:

:%s/\n/

1
Merci, mais je ne veux pas de recherche globale et de remplacement.
derekerdmann

16
supprimer le% s'occupe de cela. Ensuite, cela ne se produira que sur la ligne sur laquelle se trouve le curseur. Vous pouvez également spécifier une plage telle que: 11,15s / \ n / (lignes 11-15) ou:, + 7s / \ n / (cette ligne et les sept suivantes) ou: -3, s / \ n / (trois lignes précédentes et celle-ci) ... vous avez l'idée
Tristan

1
Ou vous pouvez sélectionner un Vbloc visuel et le remplacer par-dessus.
Victor Sergienko

51

Sur la ligne supérieure en mode normal, appuyez sur Shift+ j.

Vous pouvez également ajouter un décompte, de sorte que 3Jla première ligne joindrait toutes ces lignes.


34

Comme d'autres réponses l'ont mentionné, (majuscules) Jet search + replace for \npeuvent généralement être utilisés pour supprimer les caractères de nouvelle ligne et pour concaténer les lignes.

Mais pour se débarrasser du caractère de fin de ligne dans la dernière ligne , vous devez le faire dans Vim:

:set noendofline binary
:w

1
La question est de concaténer deux lignes au milieu d'un fichier - cette réponse supprime la nouvelle ligne à la fin du fichier, ce qui n'est pas ce que j'ai demandé.
derekerdmann

3
Cela a fonctionné pour moi. J'essayais de me débarrasser d'une nouvelle ligne à la fin d'un fichier d'une seule ligne avec vim.
Locane

Pourquoi :set noendoflinene fonctionne pas sans binary?
DARW

32

Jsupprime l'espacement supplémentaire (le cas échéant), joignant les lignes avec un seul espace. (À quelques exceptions près: après /[.!?]$/, deux espaces peuvent être insérés; avant /^\s*)/, aucun espace n'est inséré.)

Si vous ne voulez pas ce comportement, gJsupprimez simplement la nouvelle ligne et ne faites rien d'intelligent avec les espaces.


10

Tous les éléments suivants supposent que votre curseur se trouve sur la première ligne:

Utilisation de mappages normaux:

3Shift+J

Utilisation des commandes Ex:

:,+2j

Qui est une abréviation de

:.,.+2 join

Qui peut également être saisi par le raccourci suivant:

3:j

Une commande Ex encore plus courte:

:j3

2
Sans espaces entre eux:j!3
SergioAraujo

10
set backspace=indent,eol,start

dans votre .vimrc vous permettra d'utiliser backspaceet deletesur \n(nouvelle ligne) en mode insertion.

set whichwrap+=<,>,h,l,[,]

vous permettra de supprimer le LF précédent en mode normal avec X(en col 1).


2

Cela dépend probablement de vos paramètres, mais je le fais généralement avec A<delete>

Aest ajouté à la fin de la ligne. Cela nécessite probablement le nocompatiblemode :)


3
"Je fais habituellement ça avec A <delete>" Ouais c'est pourquoi je suis venu ici; pour trouver un meilleur moyen;). Le point de vim entier n'est pas de déplacer vos mains de la ligne de départ.
Luc

2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

curseur en première ligne

MAINTENANT, en MODE NORMAL

shift+v
2j
shift+j

ou

V2jJ

: V2jJ normal


1

Je voudrais simplement appuyer sur A (ajouter à la fin de la ligne, vous met en mode insertion) sur la ligne où vous souhaitez supprimer la nouvelle ligne, puis appuyez sur Supprimer.


Malheureusement, cela ne semble pas fonctionner pour moi; c'est peut-être un paramètre PuTTY que j'ai manqué.
derekerdmann

2
probablement l'option de retour arrière vi::help 'backspace'
glenn jackman

1

si cela ne vous dérange pas d'utiliser d'autres outils shell,

tr -d "\n" < file >t && mv -f t file

sed -i.bak -e :a -e 'N;s/\n//;ba' file

awk '{printf "%s",$0 }' file >t && mv -f t file

7
C'est un peu exagéré, tu ne crois pas?
derekerdmann

non ce n'est pas. pourquoi pensez-vous que c'est exagéré? Le faire à l'intérieur de Vim est manuel. Cela dépend si vous voulez le faire manuellement à la main à chaque fois, ou simplement exécuter ces lignes pour le faire en un tournemain. Vim est un éditeur. Et tous les outils qui peuvent traiter des fichiers sont essentiellement des "éditeurs" déguisés.
ghostdog74

5
Encore plus facile d'ouvrir simplement le fichier dans vim et de l'utiliser ggVGJ.
trop de php

bien sûr, si vous trouvez plus facile de le faire à la main chaque fois que vous avez besoin de données modifiées de cette façon. Aller de l'avant. Essayez également de le faire sur un gros fichier.
ghostdog74

Je ne traite pas un tas de fichiers; Je travaille juste à condenser quelques lignes de code.
derekerdmann

1

Le problème est que les multiples caractères 0A (\ n) qui sont invisibles peuvent s'accumuler. Supposons que vous souhaitiez nettoyer de la ligne 100 à la fin:

Taper ESC et: (commandant de terminal)

:110,$s/^\n//

Dans un script vim:

execute '110,$s/^\n//'

Explication: de 110 jusqu'à la fin, recherchez les lignes commençant par une nouvelle ligne (vides) et supprimez-les

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.