Quitter le mode d'insertion de bloc avec Ctrl-C

8

Dans vim, si vous êtes en mode d'insertion de bloc ( Ctrl-V, Shift-I) et quittez avec Ctrl-C(au lieu de Esc), il annule la modification de bloc (et ne modifie que la première ligne).

Pourquoi est-ce? Dans presque tous les autres contextes, Ctrl-Cet Escsont synonymes. (Et idéalement, il existe un moyen de résoudre ce problème - je me suis maintenant habitué à le faire Ctrl-Cet ce serait dommage si je devais réapprendre…)

Sophie Alpert
la source

Réponses:

9

Ctrl-cet Escne sont pas garantis d'être synonymes et diffèrent souvent. Par exemple, en mode Insertion , Escdéclenchera les abréviations et passera en mode Normal , tandis que Ctrl-cne déclenchera pas les abréviations ni la commande InsertLeaveautomatique et ne passera directement au mode Normal . Un autre exemple est dans l'ancien vimode de ligne de commande, Escexécuterait réellement la commande comme si vous aviez frappé Enter. Vim délibérément changé parce que le comportement a été jugé unintuitive et surprenante, mais vous pouvez toujours activer en ajoutant xà 'cpoptions'.

Comme pour les opérateurs visuels par blocs, la blockwise-operatorsbalise d'aide a la documentation suivante:

Visual-block Insert                     *v_b_I*
With a blockwise selection, I{string}<ESC> will insert {string} at the start
of block on every line of the block, provided that the line extends into the
block.  Thus lines that are short will remain unmodified.  TABs are split to
retain visual columns.

Notez que seul Escest mentionné, non Ctrl-c.

Donc, non, Ctrl-cet Escne sont pas équivalents. Il n'est jamais dommage de se désabuser d'une idée fausse. Une fois que vous avez réalisé cela, vous pouvez décider quoi faire ensuite. Les options immédiatement évidentes sont d'apprendre les différences et d'utiliser la bonne clé, ou de décider que vous n'avez pas besoin de la fonctionnalité de l'une des clés et de la remapper pour qu'elle corresponde à l'autre.

jw013
la source
4
Je t'ai eu. Pour l'instant, je vais vnoremap <C-c> <Esc>garder à l'esprit ce que vous avez dit.
Sophie Alpert
@BenAlpert: vous avez réellement besoin de nnoremap et d'un inoremap avec les mêmes valeurs pour basculer complètement vers ctrl-c comme Esc. Je l'utilise comme ça depuis des années maintenant et cela fonctionne parfaitement pour moi. Il est dommage que d'autres variantes de vi, comme vile ou nvi, ne permettent pas cette solution de contournement, donc je manque des fonctionnalités abbr là-bas.
Alex
0

Essayez :map ^C escoù "^ C" est entré via CTRL+ vpuis CTRL+ c.

avec succès
la source
Pouvez-vous expliquer pourquoi cela est nécessaire? Quels autres effets secondaires pourrait-il avoir?
Sophie Alpert
Ils remplissent des fonctions légèrement différentes. CTRL + C signifie classiquement "annuler cette action" (dans un contexte de type Unix). Annuler l'action dans votre contexte vim signifie "arrêter ce qui se passe et revenir en mode normal". Échapper dans vim signifie "J'ai fini de revenir en mode normal".
donothingsuccess
Quant aux effets secondaires, je n'en ai pas remarqué. CTRL-C après :!catsemble toujours avoir l'effet souhaité après la carte. Si vous rencontrez des problèmes, vous pouvez essayer, par exemple stty intr \^kà l'invite du shell, de changer le caractère d'interruption du terminal en CTRL-k.
donothingsuccess