Mouvements Grok Vim et modifications simples


8

Je reviens à Vim après avoir utilisé Emacs pendant quelques années. J'essaie de comprendre Vim en lisant et en regardant des didacticiels, ainsi qu'en l'utilisant quotidiennement.

Lors de l'édition de texte, je trouve les commandes Emacs Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D et Alt-Backspace très utiles et intuitives, permettant des modifications locales rapides et faciles tout en travaillant avec texte (mots / code).

Quelle est la méthode Vim pour implémenter des fonctionnalités similaires? Revenir en NORMALmode pour émettre un seul mouvement, uniquement pour revenir en INSERTmode n'est pas optimal.

Exemple 1: En INSERTmode pour insérer un (au début d'une expression, comment dois-je passer à la fin de l'expression ou à la ligne pour insérer le correspondant )dans Vim?

Exemple 2: Lors de la modification de texte, on peut souvent vouloir supprimer un mot vers l'avant ou vers l'arrière lors de l'écriture ou de la modification d'une phrase ou d'un code. Il serait inhabituel d'avoir une phrase / un code parfaitement formé dans l'esprit, prêt à taper "une fois" à l'avance; souvent une phrase change lorsque l'on travaille avec le texte. Les restrictions de INSERTmode rendent ce type d'édition difficile pour moi dans Vim. Je me sens incapable de manipuler efficacement le texte en mode insertion, me retrouvant toujours obligé de revenir en NORMALmode pour des mouvements simples ou pour supprimer des mots.

PS: Alt-F et -B déplacent le curseur vers l'avant ou vers l'arrière d'un mot. Ctrl-a et -e déplacent le curseur au début ou à la fin de la ligne. Alt-F supprime le mot sous le curseur. Alt-Backspace supprime le mot avant le curseur.


1
La manière Vim pourrait être d'utiliser un plugin comme algorithm.com.au/code/vimacs . : P Pouvez-vous inclure une explication de ce que font ces commandes dans emacs? Une liste de Ctrl / Alt / Meta-foo / bar n'a aucun sens pour quiconque n'utilise pas emacs. Et Ctrl-W supprime le mot avant le curseur. De plus, j'ai l'impression que c'est un peu trop large.
muru

1
Si nous allons dans le sens du plugin, vous devriez consulter github.com/tpope/vim-rsi
dkns

3
Lors du passage du langage de programmation "A" à "B". Il est préférable de ne pas écrire "B" dans le style de "A" mais plutôt d'apprendre les idiomes standard de "B" (c'est une dure leçon pour la plupart des développeurs). La même règle s'applique aux éditeurs. N'essayez pas d'appliquer le flux de travail standard de l'éditeur "A" à votre nouvel éditeur "B". Préférez apprendre les idiomes de l'utilisation directe de "B". Courbe d'apprentissage plus grande mais beaucoup plus productive à long terme. Lors de l' vimédition, vous passez la plupart de votre temps en mode normal et non en mode insertion.
Martin York

Réponses:


6

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:ccharn'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"]

|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 Epour 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 dbou amis.

Quelques chapitres d'aide à regarder de plus près

  • :help <C-o>
  • :help Insert
  • :help fet les sections suivantes ( F, t, T, ;et ,)
  • :help word-motions

5
L'écriture n'est PAS linéaire. Quiconque peut écrire de la prose (ou du code) du début à la fin sans effectuer une sorte d'édition est soit fou, soit a le pouvoir d'un Dieu. Pour le reste d'entre nous, nous faisons plus d'édition que d'écriture et donc pensons à votre éditeur comme exécutant les commandes d'édition (mode NORMAL) en premier et l'écriture (mode INSERT) en second est plus efficace. Et c'est le véritable nœud de la raison pour laquelle les éditeurs comme Emacs, MS Word, le bloc-notes, etc. sont à l'envers dans leur approche. Il est regrettable que le concept sans mode existe mais il doit y avoir un plus petit dénominateur commun.
Sukima

12

Lors de l'édition de texte, je trouve les commandes Emacs Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D et Alt-Backspace très utiles et intuitives, permettant des modifications locales rapides et faciles tout en travaillant avec texte (mots / code).

Pour répondre à votre question sur les modifications locales: si vous êtes en mode insertion et appuyez sur, ctrl-Ovous exécuterez la commande suivante en mode insertion. Cela peut être pratique si vous décidez d'effacer la ligne. Il existe quelques autres commandes en mode insertion pour les petites choses, comme le collage à partir du registre et la saisie automatique des mots. Vous pouvez tous les lire avec :h ins-special-keys.

Exemple 1: En mode INSERT pour insérer un (au début d'une expression, comment dois-je passer à la fin de l'expression ou à la ligne pour insérer le correspondant) dans Vim?

Il existe souvent une meilleure façon de faire les choses en mode normal. Par exemple, supposons que vous souhaitiez entourer une expression de parenthèses. Certaines choses que vous pouvez faire sont i(<end>), i(<esc>A), c$()<esc>P. * Mon truc préféré implique d' avoir l' un des plugins vim « nécessaire », vim surround . Avec vim-surround, c'est juste ys$). Ce qui est génial avec tout cela, c'est qu'une fois que vous savez comment le faire dans une situation, vous pouvez le faire dans toutes les situations similaires. Et si au lieu d'ajouter des parenthèses à la fin de la ligne, ce n'était que trois mots? Vous pouvez utiliser c3w()<esc>Pou ys3w). Et toute la gamme? cc()<esc>Pou yss).

Exemple 2: Lors de la modification de texte, on peut souvent vouloir supprimer un mot vers l'avant ou vers l'arrière lors de l'écriture ou de la modification d'une phrase ou d'un code. Il serait inhabituel d'avoir une phrase / un code parfaitement formé dans l'esprit, prêt à taper "une fois" à l'avance; souvent une phrase change lorsque l'on travaille avec le texte. Les restrictions du mode INSERT rendent ce type d'édition difficile pour moi dans Vim. Je me sens incapable de manipuler efficacement le texte en mode insertion, me retrouvant toujours obligé de revenir en mode NORMAL pour des mouvements simples ou la suppression de mots.

Une chose qui aide beaucoup est d'ajouter inoremap jk <esc>à votre vimrc. Vous pouvez ensuite quitter le mode d'insertion en appuyant sur jk. Cela supprime la majeure partie des frais généraux liés à la sortie du mode d'insertion afin que vous puissiez jk<sequenceofcommands>ieffectuer des commandes sans perturber votre saisie.


En plus de :h ins-special-keys, consultez :h ins-special-specialpour plus de mappages.
Lithis

9

Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D et Alt-Backspace

Les commandes équivalentes en mode normal sont w, b, ^, $, dw, db. Notez la logique: dwsupprime ce qui est couvert wet dbsupprime ce qui est couvert par b. Quelle commande utiliseriez-vous pour supprimer ce qui est couvert par ^? Ou pour l'arracher?

Cette logique de type langage est tout l'intérêt de l'édition modale; cela peut prendre un certain temps pour s'y adapter, mais il n'y a pas de demi-tour.

Les commandes équivalentes en mode d'insertion sont: <C-Right>, <C-Left>, <Home>, <End>, <C-w>et ... rien que vous pouvez créer un mappage simple: inoremap <C-something> <C-o>dw.

Revenir en NORMALmode pour émettre un seul mouvement, uniquement pour revenir en INSERTmode n'est pas optimal.

En effet. La bonne approche consiste à passer en mode insertion pour insérer le moins de texte possible et revenir au mode normal dès que possible.

Exemple 1: En INSERTmode pour insérer un (au début d'une expression, comment dois-je passer à la fin de l'expression ou à la ligne pour insérer le correspondant )dans Vim?

Comme dans n'importe quel éditeur de texte ou IDE ou processeur de texte ou <textarea>:

<End>)

Exemple 2: Lors de la modification de texte, on peut souvent vouloir supprimer un mot vers l'avant ou vers l'arrière lors de l'écriture ou de la modification d'une phrase ou d'un code. Il serait inhabituel d'avoir une phrase / un code parfaitement formé dans l'esprit, prêt à taper "une fois" à l'avance; souvent une phrase change lorsque l'on travaille avec le texte. Les restrictions de INSERTmode rendent ce type d'édition difficile pour moi dans Vim. Je me sens incapable de manipuler efficacement le texte en mode insertion, me retrouvant toujours obligé de revenir en NORMALmode pour des mouvements simples ou pour supprimer des mots.

Encore une fois, le mode d'insertion sert à insérer du texte. La «manipulation de texte» et le déplacement sont censés se produire en mode normal.

Veuillez poser des questions plus précises.


L'utilisation de mouvements (tels que les Endtouches fléchées ou) en INSERTmode est OK?
SabreWolfy

4
Bien sûr, tout ce qui facilite votre travail.
romainl

3

Quelle est la méthode Vim pour implémenter des fonctionnalités similaires? Revenir en mode NORMAL pour émettre un seul mouvement, pour revenir en mode INSERT n'est pas optimal.

Eh bien, on peut dire que le Vim-way est de ne pas rester en mode INSERT. Le moment instructif de Vim survient lorsque vous réalisez que vous n'avez pas besoin de rester en mode INSERT. Il existe de nombreuses façons d'insérer du texte, et toutes commencent à partir du mode NORMAL.

Cela étant dit, je ne suis pas un vrai moi-même, et j'ai remappé les clés pour faire le travail (à la Windows):

nmap <C-BACKSPACE> dbi
nmap <C-DEL> dei
imap <C-BACKSPACE> <ESC>ldbi
imap <C-DEL> <ESC>ldei
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.