1
Vous pouvez réaliser ces mappages de commandes ou mieux (pinky) très rapidement. Je ne recommande pas cette solution, mais à titre d'exemple, si vous souhaitez déplacer le curseur au début de la ligne avec, <C-a>
vous pouvez exécuter la ligne suivante après avoir :
quitté le mode normal (ou ajouter la ligne à votre vimrc)
inoremap <C-a> <C-o>0
ou, si le début de la ligne signifie le premier caractère non vide de la ligne
inoremap <C-a> <C-o>^
Chose curieuse, je viens de tester ces mappages dans le tampon dans lequel j'écris cette réponse, et j'ai été confus pendant un moment car ils ne fonctionnaient pas. Puis j'ai réalisé que j'avais oublié de passer en mode insertion. Vous semblez avoir du mal à quitter le mode insertion pour exécuter des commandes en mode normal. Vous constaterez peut-être après avoir utilisé Vim pendant un certain temps que c'est l'inverse - que vous vous attardez en mode normal pendant que vous réfléchissez et ne faites des excursions vers le mode d'insertion que pour des occasions particulières. Vim ne vaut probablement (ou surtout) la peine d'apprendre que si vous constatez que vous faites plus d' édition que d' écrire du texte.
Ainsi, une partie de la réponse à votre question sur l'exécution rapide des commandes en mode normal à partir du mode insertion est <C-o>
, qui vous permet de quitter temporairement le mode insertion pour exécuter une commande en mode normal, puis de ressaisir. Lisez à ce sujet sur :help i_Ctrl-o
. Ceci est utile pour les commodités ponctuelles. Un itinéraire plus durable consiste probablement à adopter le mode normal par défaut pour la navigation et l'édition, et à n'entrer en mode d'insertion que lorsque vous souhaitez réellement insérer de nouveaux caractères à la main dans le tampon.
2
Vos exemples sont très généraux, il est donc difficile de donner des réponses spécifiques. Je vais inventer un exemple spécifique dans l'espoir qu'il s'adapte ou soit traduisible à quelque chose que vous rencontrez. Pour votre numéro 1, cela dépend de la façon dont vous savez où la parenthèse fermante est censée aller. disons que j'ai une ligne comme
let cchar = s:cchar["atx"]
Ceci est censé être une ligne de VimL, le langage de script de vim, et il (ou quelque chose comme ça) se produit dans un fichier de syntaxe Vim avec lequel je suis actuellement en désaccord. Disons que je veux changer la partie droite de cette expression en un appel de fonction, peut-être parce que la fonction fournit des valeurs par défaut lorsque le dictionnaire s:cchar
n'a pas encore reçu de valeur pour la "atx"
clé. Avec mon curseur (en mode normal) sur le premier caractère, «l», je pourrais taper
f=wcf[MyFunction(<Esc>$r)
En bref, cela dit
f=
- transmettre à '=' (j'aurais pu dire fs
, mais je ne m'arrêterais probablement pas assez longtemps pour voir que le 's' que je veux atteindre est le premier s sur la ligne, donc j'irais pour le caractère qui est évidemment unique, et continuez à partir de là)
w
- mot suivant, maintenant mon curseur est sur le 's' de 's: cchar'
cf[
- changer pour transmettre à «[»
à ce stade, la ligne ressemble
let cchar = |"atx"]
où |
est le curseur, et je suis en mode insertion. Je tape ensuite MyFunction(
et quitte le mode d'insertion ( <Esc>
).
$
- déplacer le curseur à la fin de la ligne. J'aurais pu utiliser E
pour la fin d'un grand mot ou f]
pour la transmission vers ''] 'ou une autre motion, mais $
je me suis d'abord dit.
r)
- remplacer le caractère sous le curseur par un ')'
Maintenant, j'ai changé l'expression d'affectation de l'attribution d'un dictionnaire script-local à l'utilisation de la valeur de retour d'une fonction, et ce faisant, j'ai introduit des parenthèses. Je ne sais pas à quoi ressemble votre besoin particulier de parenthèses, c'est peut-être très différent, auquel cas il y aura une chaîne de commandes différente pour y parvenir. Si je m'arrêtais pour réfléchir plus longtemps à mon exemple inventé, je trouverais peut-être des moyens plus efficaces d'y parvenir aussi, mais qui a le temps de faire une pause et de réfléchir.
(Essayez-le, copiez-collez (désolé, mettez-y) le texte et la commande dans un tampon, et avec votre curseur sur le premier caractère, 'f', de la commande frappée y$
. La commande est maintenant dans votre registre sans nom. Passez au début de la première ligne et appuyez :normal <C-r>"
sur a) entrez en mode ligne de commande, b) commencez à exécuter une commande en mode normal à partir de la ligne de commande, et c) collez ( atchoo put) le registre sans nom dans la ligne de commande comme la normale commande de mode à exécuter. La seule chose que vous devez changer dans la commande est de remplacer la fausse <Esc>
série de caractères (parce que vous avez copié atchoo depuis votre navigateur) avec le code de touche d'échappement réel, supprimez-le et appuyez sur <C-v>
puis sur votre touche Échap. Cela ressemblera à^[
. Maintenant, appuyez sur Retour pour exécuter la commande. Ou ... tapez simplement la chaîne de touches pour tester les commandes, je voulais juste vous montrer que vous pouvez également interagir avec le mode normal à partir du mode cmdline, et <C-v>
, et <C-r>
, et toutes les autres gloires du pays des merveilles. Voir aussi :help Cmdline-mode
.)
3
Pour supprimer un mot en arrière, vous pouvez utiliser le mappage standard <C-w>
(voir :help i_Ctrl-w
). Je ne sais pas s'il existe un mappage par défaut pour supprimer un mot vers l'avant, mais je suppose que vous pouvez en créer un avec
inoremap <C-S-w> <C-o>dw
Encore une fois, <C-o>
vous sortira du mode d'insertion pour une commande unique et dw
"supprimera" le mouvement "mot". Voir :help d
, :help w
. Si les mots vers l'avant que vous supprimez ne sont pas des mots réels mais des noms class.function #, vous pouvez utiliser W
(voir :help W
). Si vous êtes déjà principalement en mode normal, vous n'avez pas besoin de ces mappages, faites dw
-le db
ou amis.
Quelques chapitres d'aide à regarder de plus près
:help <C-o>
:help Insert
:help f
et les sections suivantes ( F
, t
, T
, ;
et ,
)
:help word-motions