Annuler <CR> en mode insertion

21

Parfois, en mode insertion, je frappe <CR>par erreur et je dois appuyer plusieurs fois sur le retour arrière (en fonction de l'indentation) pour revenir où j'étais.

par exemple

<div>
  <p> This is some text []</p>
</div>

Le curseur est []et je frappe <CR>:

<div>
  <p> This is some text 
  []</p>
</div>

Maintenant, je dois frapper deux fois en arrière pour revenir à la ligne précédente (ce cas n'est pas si mauvais mais il n'a pas beaucoup d'indentation).

Connaissez-vous une meilleure façon de procéder?

nobe4
la source
1
ctrl+wdeux fois semble fonctionner et être assez facile
reergymerej

Réponses:

10

Que diriez-vous:

inoremap <C-\> <C-o>:left 0<Cr><BS>

<C-o>exécutera une commande en mode normal ( :left 0), qui supprimera tout retrait, cela placera également votre curseur au début de la ligne. <BS>vous ramènera à la dernière ligne.

C'est un peu comme un "en arrière J".

Malheureusement, le mappage Shift + Entrée ou Ctrl + Entrée ne semble pas possible, donc je choisis <C-\>, comme étant "près de l'entrée".

Martin Tournoij
la source
"Près de l'entrée" dépend de votre clavier: ceux du Royaume-Uni ont `` à côté du décalage à gauche :-)
TripeHound
2
Pourquoi ne pas utiliser à la <C-u>place de <C-o>:left 0<CR>?
jamessan
@jamessan Cela fonctionne comme un "en arrière J": foo<CR>bar<C-\>vous laissera donc avec foobar. À mon humble avis, il est plus utile, mais YMMV.
Martin Tournoij
C'est vrai, mais ce que je dis, c'est que <C-u>(ie, i_CTRL-U ) devrait être le même que <C-o>:left 0<CR>.
jamessan
1
@jamessan Eh bien, cela dépend de la position du curseur. La saisie foo<CR>bar<C-u>vous laissera avec foo<CR>(+ tout retrait automatique que Vim peut avoir ajouté). <C-o>:left 0<CR>se comportera toujours de la même manière quelle que soit la position du curseur.
Martin Tournoij
21

J'ai ceci dans mon vimrc, la deuxième partie est pertinente:

inoremap <expr> <silent> <cr> pumvisible() ? "<c-y>" : "<c-g>u<cr>"

Ce que cela fait: chaque fois que vous frappez Enteren mode insertion, cela "interrompra la séquence d'annulation, commencera une nouvelle modification" (voir h: i_CTRL-G_u). Cela signifie que si vous frappez Enterpar erreur, vous pouvez maintenant annuler votre modification sans supprimer les lignes insérées précédentes, soit avec ESC u a, soit avec Ctrl-o u, comme Statox l'a proposé. Fondamentalement, chaque ligne peut être annulée séparément.

la source

EDIT / UPDATE: S'il vous arrive d'utiliser l'émulation Vim dans Emacs, alias evil-mode , vous pouvez utiliser ce package pour un effet similaire.

VanLaser
la source
Maintenant, je suis curieux de savoir la première partie et la <c-y>relation avec le menu contextuel.
8bittree
2
Voir cette réponse: vi.stackexchange.com/a/3844/1800 . Ctrl-yen mode insertion complètera la sélection de popup actuelle, et le mappage ci-dessus permettra Enterde terminer aussi.
VanLaser
Joli tour. Cependant, je remplacerais probablement la dernière partie "<c-g>u<cr>"par &paste ? "<cr>" : "<c-g>u<cr>", sinon la prochaine fois que vous collerez par erreur 200 lignes de HTML, vous aurez beaucoup de plaisir à la défaire. :)
lcd047
2
... et l'explication: lorsqu'il pasteest activé, les mappages du mode Insertion sont désactivés (selon l'aide de Vim)
VanLaser
1
J'aime mieux cette solution car les autres solutions reposant sur Backspace, Ctrl-W et Ctrl-U peuvent ne pas fonctionner selon la façon dont l' backspaceoption est définie.
doubleDown
4

La façon dont je le fais est Ctrl-wBackspace.

Ctrl-wsupprimer le dernier mot (j'ai oublié s'il s'agit de vim standard ou non), et comme ce ne sont que des espaces cela me ramènera au début de la ligne. Puis Backspaceme ramènera à la ligne précédente où je me trouvais.

Juan Enrique Muñoz Zolotoochin
la source
Doux, je ne connaissais pas l' Ctrl-wutilisation en mode insertion. Mais le Carpetsmoker ♦ est encore plus rapide. Ainsi, la liaison par défaut de `Ctrl- \` ne semble pas utile.
nobe4
1
Ctrl + w est "standard Vim" ;-) Voir: :help i_CTRL-W. Et appuyer deux fois semble faire l'affaire aussi?
Martin Tournoij
1
Je viens de voir sur la page d'aide qui <C-u>peut être plus utile car elle supprime tous les caractères de la nouvelle ligne
nobe4
1

Mon moyen de sortir de cela est (du mode insertion) UpCtrl-oJDel. Ce n'est peut-être pas la combinaison la plus efficace, mais c'est ce que je fais sans avoir à y penser.

lcd047
la source