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?

derekerdmann
la source
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.

Xhantar
la source
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/
TinkerTank
la source
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.

Alligator
la source
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
Néstor Waldyd
la source
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.

éphémère
la source
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
kzh
la source
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).

laktak
la source
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 :)

Wolph
la source
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

Ivan Lopes
la source
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.

David Watson
la source
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
ghostdog74
la source
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

Sergio Abreu
la source