Comment joindre des lignes sans créer d'espace?

73

La Jcommande standard pour joindre des lignes remplace le ou les caractères de nouvelle ligne par un espace. C'est utile lors de l'édition de 'littérature', mais cela peut être gênant si, par exemple, je modifie un vidage hexadécimal à la main si j'oublie de supprimer l'espace superflu.

Existe-t-il une méthode simple et rapide pour joindre deux lignes sans créer d'espace entre elles?

SF.
la source

Réponses:

87

La gJcombinaison fait ceci; de :help gJ:

Joindre [compter] lignes, avec un minimum de deux lignes. Ne pas insérer ou supprimer des espaces.

JSi vous souhaitez enregistrer une frappe, vous pouvez le réassocier :

:nnoremap J gJ

Notez que cela ne supprime aucun espace. Ainsi, si la ligne en cours se termine par un espace ou si la ligne suivante commence par un ou plusieurs espaces, elles seront laissées telles quelles .

Alors:

Hello
    world

Devient:

Hello    world

Nous pourrions utiliser Jxdans ce cas, alors ce sera le cas Helloworld, mais cela ne fonctionnera pas dans tous les cas; de l'aide:

Joignez les lignes en surbrillance, avec un minimum de deux lignes. Supprimer le retrait et insérer jusqu'à deux espaces

[...]

Ces commandes, sauf "gJ", insèrent un espace à la place de sauf s'il y a un espace blanc final ou que la ligne suivante commence par un ')'.

Ainsi, dans certains cas, plus d'un espace ou aucun espace n'est inséré. Autant que je sache, il n’ya pas de moyen facile de changer ce comportement; J'ai créé une fonction à modifier gJpour toujours rejoindre sans espaces:

" Like gJ, but always remove spaces
fun! JoinSpaceless()
    execute 'normal gJ'

    " Character under cursor is whitespace?
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~ '\s'
        " When remove it!
        execute 'normal dw'
    endif
endfun

" Map it to a key
nnoremap <Leader>J :call JoinSpaceless()<CR>

Voir aussi: :help J,:help 'joinspaces'

Martin Tournoij
la source
Est-il possible d'utiliser une fonction "Conserver" pour conserver la position du curseur lors de l'utilisation de cette fonction ou comment puis-je obtenir ce résultat?
SergioAraujo
8

Une autre astuce que vous pouvez essayer est d'utiliser remplacer. Parfois, cela peut être utile.

%s/$\n//g

Scénario: Supprimez le dernier caractère et joignez la ligne suivante:

%s/=$\n\(.\)/\1/g

Par exemple,

xxxx=
123

devient:

xxxx123
puissance intérieure
la source
3

Créez une macro et réutilisez-la:

qaJxq

Maintenant, rejouez la macro aen utilisant @aoù vous voulez joindre deux lignes sans espace.

@@répétera la macro précédente. Donc, vous pouvez simplement tenir @pour joindre plusieurs lignes.

pellucide
la source
1
Pourquoi tapez @aquand vous pouvez taper Jx? Même nombre de touches et de touches SHIFT!
Shahbaz
2
@Shahbaz Peut-être à cause de la dernière ligne: "tu peux tenir @"
muru
1
@muru, c'est vrai!
Shahbaz
4
Cela en fait également une commande répétable, ce qui vous permet 3@ade joindre 3 lignes, ce qui 3Jxpermettrait de joindre 3 lignes avec des espaces, puis de supprimer l’espace entre les deuxième et troisième lignes, en laissant des espaces entre les autres lignes.
Haegin
1

Pour toujours rejoindre avec un seul espace:

nmap J gJi <ESC>ciW <ESC>

Pour rejoindre sans espace du tout (supprime les espaces de fin et de début):

nmap <C-J> gJi <ESC>diW
phil
la source
1
Bienvenue sur ce site! Vos mappages me paraissent un peu trop élaborés. Il serait utile que vous ajoutiez un peu plus d’explications sur leur fonctionnement.
statox
1

Sélectionnez les lignes que vous souhaitez fusionner, entrez une commande Ex en tapant deux points :en mode normal. Puis tapez cette commande:

s/$\n\s*//gc

La commande entière devrait ressembler à ceci:

:'<,'>s/$\n\s*//gc

Il s'agit en fait d'une version modifiée de la commande @ insidepower qui remplace les indentations d'espace ainsi que les caractères de nouvelle ligne.

Explication:

  • '<,'> signifie que nous ne modifions que les lignes sélectionnées en mode visuel.

  • /$\n\s*est un motif de regex . Nous recherchons une correspondance qui se termine $par un nouveau caractère de ligne \net *par la suite un nombre non déterminé d'espaces .

  • s/pattern//gcest une commande de substitution permettant de rechercher chaque modèle et de le remplacer par un caractère vide lors de la confirmation.

Pour en savoir plus sur les indicateurs et les métacaractères pour les expressions régulières dans Vim, reportez-vous à ce chapitre de Référence de Vim.

ubique
la source
2
Bonjour, Bienvenue chez Vi et Vim ! Vous avez une réponse assez bien écrite ici; bravo pour ça. Mon seul nitpick est que les expressions régulières vim = / = les expressions régulières python, ce qui est parfois déroutant pour les utilisateurs. Peut-être un lien vers le document d'aide pour Vim regex à la place?
D. Ben Knoble
2
Deuxième réponse: la réponse que vous avez mentionnée a été écrite par @ insidepower et modifiée par Peter.
D. Ben Knoble