Comment supprimer la ligne au-dessus / en dessous du curseur, mais pas la ligne actuelle?

11

Existe-t-il une commande pour supprimer la ligne (ou n lignes) au-dessus de la ligne actuelle? Ci-dessus = courant non inclus.

C'est-à-dire, existe-t-il une alternative à dklaquelle ne supprime pas la ligne actuelle? Similaire à la façon dont o/ Oet p/ Pfonctionne, mais avec suppression.

Actuellement, je fais kdd, ce qui déplace le curseur d'une ligne vers le haut et le supprime. Je pourrais faire nnoremap <Leader>d kddet nnoremap <Leader>D jdd-, mais avoir une alternative qui ne déplace pas le curseur semble être une meilleure option. Y en a-t-il?

Martin Tóth
la source
Si votre problème est que vos mappages déplacent le curseur, pourquoi ne le faites-vous pas nnoremap <Leader>d kddjet nnoremap <Leader>D jddk?
statox
L'utilisation de l'un kddjou de l' autre jddk, la position des colonnes n'est pas conservée. Je ne dis pas que c'est un gros problème, mais c'est ennuyeux. Pour l'enregistrement, kddjdéplace le curseur d'une ligne sous sa position d'origine. Et jdd-semble être une meilleure alternative jddkcar au moins je reviens au premier caractère non blanc. Si la ligne en dessous de celle que je souhaite supprimer est vide, je reste au début de la ligne.
Martin Tóth
Que diriez-vous d'utiliser makdd`a pour votre carte? Définit une marque et y revient ensuite ... vous voudrez peut-être le changer en un caractère moins utilisé.
PhilippFrank
@PhilippFrank Ou je peux utiliser `` pour récupérer le curseur et ne pas occuper un registre (pas que j'en utilise :)).
Martin Tóth
Non, cela ne fonctionne pas, k n'est pas un saut, vous ne pouvez donc pas revenir en arrière en utilisant ``.
PhilippFrank

Réponses:

30
:-d

coupe la ligne au-dessus de la ligne actuelle.


:-5d

coupe la 5ème ligne au-dessus de la ligne actuelle (mais déplace le curseur).


:-5,-d

coupe les 5 lignes au-dessus de la ligne actuelle.


:+,+5d

coupe les 5 lignes sous la ligne actuelle.

romainl
la source
2
Cela déplace toujours le curseur.
PhilippFrank
1
Vous ne pouvez pas éviter de déplacer le curseur. Le mieux que vous puissiez faire est de déplacer le curseur et de le reculer .
romainl
Je vous remercie! Ce genre de "façon vim" était ce que je cherchais. Je vais l'utiliser en combinaison avec `` pour ramener le curseur où il était.
Martin Tóth
5

EDIT Je ne connaissais pas les fonctionnalités intégrées suggérées par @Romainl dans sa réponse: bien sûr, la méthode -det +ddevrait être préférée car elle est beaucoup plus simple que d'ajouter des fonctions à votre.vimrc

Peut-être que l'ajout de quelque chose comme ça .vimrcpourrait être ce que vous voulez:

function! DeleteOver()
   let save_cursor = getpos(".")
   normal k
   normal dd
   call setpos(".", save_cursor)
   normal k
endfunction

function! DeleteUnder()
   let save_cursor = getpos(".")
   normal j
   normal dd
   call setpos(".", save_cursor)
endfunction

Ces fonctions suppriment la ligne sous ou la ligne au-dessus de la ligne actuelle et reviennent à la position avant la suppression.

Pour la fonction, DeleteOver()nous devons remonter d'une ligne normal kaprès la suppression, car la suppression modifie le numéro de la ligne d'origine qui ne correspond pas àDeleteUnder()

Vous pouvez également l'ajouter à votre .vimrc

nnoremap <Leader>d :call DeleteOver()<CR>
nnoremap <Leader>D :call DeleteUnder()<CR>

Pour créer les mappages appelant les fonctions.

statox
la source
Une alternative à la sauvegarde / restauration de la position du curseur est de désactiver / restaurer l' nostartoflineoption.
Rich
5

Si nous utilisons le petit registre de suppression "-, nous pouvons restaurer la position du curseur après avoir supprimé au-dessus de n lignes.

Par exemple, d0dgk"-Psupprime au-dessus d'une ligne et restaure le curseur où il était.

  1. d0supprime les caractères du curseur au premier caractère de la ligne. Puisqu'il 0s'agit d'un mouvement exclusif, le caractère sous le curseur n'est pas supprimé. Et les caractères supprimés sont placés dans le petit enregistreur de suppression "-.

  2. dgksupprime au-dessus de 1 ligne. Cela laissera la ligne actuelle, car elle gkn'est pas linéaire et exclusive.

  3. "-P place le texte du petit registre de suppression "-.

C'est une sorte de hack. Mais si vous recherchez des commandes non ex, envisagez de les utiliser.

MS.Kim
la source
Bonne solution! Bien que je pense que tu "-Pne veux pas "-p. Ce dernier gâche un peu le texte.
James
@DJMcMayhem Vous avez raison. J'ai corrigé la réponse. Merci de l'avoir signalé.
MS.Kim
2

Vous améliorerez peut-être votre flux de travail si vous n'avez pas peur de ... sauter :)

Exemple:

This is where cursor initially is: _.

[Some other stuff you want to keep/skip ...]

I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.

Vos actions (mode normal, le curseur est _): /I want Enter 5dd Ctrl-o. C'est ça.

Bien sûr, la réponse romainl est la meilleure si tout ce que vous voulez supprimer des lignes entières, et vous pouvez facilement compter leur décalage (en utilisant des linumbers relatifs par exemple). Ce qui précède est une façon plus générique "d'agir": allez-y, en utilisant quelque chose qui compte comme un saut: cela signifie que vous pouvez toujours revenir en arrière, après avoir modifié le texte.

Par exemple, si vous utilisez des numéros de ligne absolus, vous pouvez remplacer le /I want Enterpar quelque chose comme 78ggou 78Gpour sauter directement à ce numéro de ligne.

VanLaser
la source
0

Sur la base de la solution ms-kim , j'ai développé une variation légèrement différente qui enregistre la position de col.

function! DeleteLineAbove()
    if line('.') == 1
        echom "You are at the first line!"
        return
    endif
    let l:colsave = col(".")
    exec  "normal! kdd"
    call cursor(line("."), l:colsave)
endfunction
nnoremap <Leader>k :call DeleteLineAbove()<CR>

OBS: J'ai également utilisé ce poste comme référence.

SergioAraujo
la source
Voulez-vous dire @statox plutôt que @ MS.Kim?
Rich
-1

Si vous souhaitez supprimer les lignes en double dans tout le fichier, procédez comme suit:

:g/any part of the string/d

Exemple:

En mode commande

:g/I want to delete/d

Si vous voulez juste une liste de la chaîne (s) initialement:

:g/I want to delete/p
user11509
la source
3
Je ne sais pas vraiment comment cela répond à la question posée?
Martin Tournoij