VIM - Ce n'est pas seulement un éditeur, c'est une intégration avec tout votre environnement de travail

Pourquoi Vim / Neovim est- il particulièrement bon? Le fait que votre boîte à outils soit non seulement un éditeur (qui lui-même est très extensible avec des plugins et possède de riches fonctionnalités de base et est très flexible dans le domaine de la personnalisation), mais aussi votre environnement de travail dans son ensemble , avec toute la boîte à outils unix-way incluse à partir de gnu / coreutils et pas seulement. Vous pouvez prendre n'importe quel programme ou interprète sans quitter l'éditeur et l'utiliser directement dans l'éditeur.


Préface


Ce message a été écrit à la hâte pour un cercle privé de personnes, mais j'ai décidé qu'il était tout à fait possible de le publier sur Habr. Pour certains, cela peut être une source d'inspiration, quelqu'un aidera à mieux comprendre la philosophie de Vim et quelqu'un prendra quelques astuces pour lui-même. Au cas où, je ferais une réserve à laquelle je ne devrais pas m'attendre à ce que je commence à prouver quelque chose à quelqu'un dans les commentaires, par exemple, pour vous convaincre que vous devez absolument abandonner votre gros IDE et commencer à utiliser Vim, cela ne m'intéresse pas du tout.


Aux entreprises


Ici, par exemple, prenez un tel morceau de code (de la configuration du projet Haskell), une liste de dépendances de package (exemple dans le vide):


build-depends: X11 , base , directory , extra , GLFW-b , safe , aeson , containers , data-default , text , process , time , dbus 

Que voulons-nous?


  1. Trier les dépendances par ordre alphabétique
  2. Tri insensible à la casse ( X11 et GLFW-b ne doivent pas dépasser tout)
  3. Restaurer les virgules ( aeson ira tout en haut et il ne devrait plus avoir de virgule à gauche, mais X11 devrait avoir une virgule à gauche)
  4. Restaurer l'indentation (afin que vous puissiez également obtenir la commande de l'historique et la réutiliser dans une autre configuration avec un niveau d'imbrication différent, ou même lier la commande de raccourci clavier dans la configuration Vim)

Solution


Tout d'abord, sélectionnez (en surlignant visuellement) la liste des dépendances à l'exception de la première ligne de build-depends . Vous pouvez bien sûr simplement appuyer sur V (mode visuel avec sélection ligne par ligne) et sélectionner les lignes nécessaires à l'aide de jk ou des flèches haut et bas. Dans mon cas, je fais cela avec une seule vague de ma main en utilisant un raccourci clavier personnalisé pour le mode visuel:


 xn iz <esc>[zV]z 

Par exemple, étant au milieu de la liste des dépendances, j'appuie simplement sur viz et toutes les dépendances sont mises en surbrillance, car le pli entier est mis en surbrillance, qui est à son tour le bloc d'imbrication actuel (puisque j'ai défini la foldmethod de foldmethod comme indent ). Mais vous pouvez également taper manuellement [zV]z séquentiellement sans raccourci clavier personnalisé ( [z saute au début du pli et ]z à la fin), mais depuis pour moi, une telle opération est souvent utilisée, puis je l'ai raccourcie à viz - il n'y a pas de modificateurs comme un décalage et elle est compressée sur les réflexes en un instant (l'analogue standard le plus proche est vip pour sélectionner un bloc aux lignes vides les plus proches).


Appuyez ensuite sur : (deux-points) pour entrer en mode commande pour exécuter une commande relative à la surbrillance visuelle actuelle. En fait, le mode de commande habituel, mais avec des marqueurs de sélection immédiatement ajoutés, c'est-à-dire ressemblera à :'<,'>'<,'> est la plage de sélection, où '< est la première ligne de la sélection visuelle et '> est la dernière.


Après avoir cliqué ! (point d'exclamation) sur le clavier, cela signifie que tout ce qui va plus loin est une commande shell / bash (selon les paramètres). Cela ressemblera à :'<,'>! . En fait, après avoir mis en surbrillance, vous pouvez immédiatement cliquer ! et obtenez le même résultat - :'<,'>! .


Cette opération redirigera les lignes en surbrillance vers la commande STDIN et remplacera les lignes en surbrillance par l'échappement STDOUT de cette commande. Par exemple, vous pouvez utiliser la commande sort , uniquement à des fins de vérification, le résultat n'est pas ce dont nous avons besoin - '<,'>!sort et appuyez sur Entrée , nous obtenons:


  build-depends: , aeson , base , containers , data-default , dbus , directory , extra , GLFW-b , process , safe , text , time X11 

Mode avec coreutils et tour générale


Restaurez la sélection précédente (vous pouvez appuyer sur gv pour restaurer la dernière sélection) et appuyez sur ! puis la flèche vers le haut - cela restaurera la dernière commande de l'historique, nous n'avons donc pas besoin d'écrire à nouveau, nous extrayons simplement la commande précédente de l'historique et la modifions. Pour éditer plus facilement la commande, vous pouvez appuyer sur Ctrl + f - cela ouvrira davantage. une fenêtre avec l'édition standard normale de la commande, avec toutes les capacités de Vim, soit dit en passant, toutes les équipes précédentes de l'historique y seront visibles sous forme de lignes distinctes, qui peuvent également être sélectionnées, éditées et exécutées.


Quelle est la bonne chose à faire - vous pouvez penser à une trouvaille, mon point est le suivant: nous supprimons d'abord les virgules, les trions sans elles (sans tenir compte de la casse), puis nous renvoyons les virgules, à l'exception de la toute première ligne.


Tout d'abord, supprimez les virgules (et la première ligne a un retrait supplémentaire afin que toutes les lignes aient le même retrait) en utilisant la commande sed avec une expression régulière ( [, ] - une virgule ou un espace, puis un autre espace, \(\w\) crochets d'échappement pour mettre en surbrillance bloc de substitution, pour qu'il soit alors disponible car \1 , \w est le premier caractère alphabétique, dans le remplacement nous restaurerons le caractère alphabétique par substitution \1 ):


 :'<,'>!sed 's/[, ] \(\w\)/\1/' 

Nous obtenons ce qui suit:


  build-depends: X11 base directory extra GLFW-b safe aeson containers data-default text process time dbus 

Ensuite, nous redirige (via le symbole | une fonctionnalité de bash) vers la commande sort sort , en passant le -f pour l'insensibilité à la casse:


 :'<,'>!sed 's/[, ] \(\w\)/\1/' | sort -f 

Nous obtenons:


  build-depends: aeson base containers data-default dbus directory extra GLFW-b process safe text time X11 

Presque terminé! Il ne reste plus qu'à ajouter des virgules, et la première ligne - quelques espaces. Nous utilisons le même sed , dans la syntaxe de ses opérations vous pouvez spécifier des chaînes et des plages de chaînes (comme dans Vim lui-même, la syntaxe est la même, enfin, ou presque la même). Le préfixe 1 signifiera la première ligne, 2,$ signifie la plage de la 2e ligne à la fin ( $ , comme ^ signifie le début du fichier, par analogie avec les mêmes caractères dans les expressions régulières qui signifient la fin et le début de la ligne). Nous allons utiliser \w pour ignorer l'indentation et sélectionner immédiatement le premier caractère alphabétique: 1s/\w/ &/ - ici, nous remplaçons la première ligne, restaurons le premier caractère alphabétique via & (similaire à \1 , seulement & signifie tout sous toute l'expression régulière, tandis que \1 signifie le premier bloc entouré de parenthèses), en ajoutant quelques espaces devant lui. Pour les lignes restantes, au lieu de deux espaces, ajoutez une virgule + espace suivi de: 2,$s/\w/, &/ , la commande entière sera comme ceci: sed -e '1s/\w/ &/' -e '2,$s/\w/, &/' , - -e nous utilisons pour séparer 2 opérations les unes des autres. Dans Vim, l'ensemble de l'opération ressemblera à:


 :'<,'>!sed 's/[, ] \([^, ]\)/\1/' | sort -f | sed -e '1s/\w/ &/' -e '2,$s/\w/, &/' 

Nous postulons et obtenons:


  build-depends: aeson , base , containers , data-default , dbus , directory , extra , GLFW-b , process , safe , text , time , X11 

C'est fait! Il n'est plus nécessaire d'écrire une deuxième fois, il suffit de taper les premiers caractères, par exemple :: :'<,'>!se (en fait, il suffit d'appuyer sur !se ), et d'utiliser la flèche vers le haut pour obtenir la commande souhaitée de l'historique. D'une manière ou d'une autre, je recommande souvent de pratiquer l'écriture de telles choses tout de suite . Ainsi, vous allez à la fois pomper vos compétences professionnelles quotidiennes en bash et en Vim lui-même, comme vous faites essentiellement la même chose.


En fin de compte, toute cette commande peut être affectée à un raccourci clavier, ou résumée dans une fonction, et réutilisée partout pour une ou deux.


Utilisation de PL tiers


Au lieu de lancer quelque chose à partir de coreutils, vous pouvez exécuter l'interpréteur d'une sorte de langage qui vous convient, j'aime faire de telles choses via Perl6 (il a récemment été renommé Raku ):


 :'<,'>!perl6 -e 'my @x=lines.map(*.subst(/<[,\s]>\s(\w)/,{$0})).sort(*.lc); @x.shift.subst(/\w/,{q/ /~$_}).say; .subst(/\w/,{q/, /~$_}).say for @x' 

Oui, au moins sur le zoskoscript (node.js):


 :'<,'>!node -e 'let fs=require("fs"), x=fs.readFileSync(process.stdin.fd).toString().replace(/\n$/,'').split(/\n/).map(x=>x.replace(/[, ] (\w)/,"$1")).sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase())); console.log(x.shift().replace(/(\w)/," $1")); process.stdout.write(x.map(x=>x.replace(/(\w)/,", $1")).join("\n"))' 

Cela peut également être fait sur VimL / Vimscript à l'intérieur de Vim lui-même, sans appeler de commandes externes. Mais ce post n'est pas à ce sujet.


Naturellement, comme vous l'avez peut-être deviné, vous pouvez facilement enregistrer votre script dans un fichier séparé, ou même compiler votre propre programme qui prend quelque chose pour entrer dans STDIN et génère quelque chose de traité dans STDOUT et l'utiliser dans Vim simplement en appelant (qui , encore une fois, peut être attribué à un raccourci clavier):


 :'<,'>!~/my-program-or-script 

Ainsi, lorsque vous écrivez du code dans Vim, non seulement Vim est à votre disposition, mais également tout votre environnement de travail.


L'un des exemples les plus simples consiste à rejeter un fichier JSON:


 :%!jq 

Juste quelques touches, pourquoi réinventer l'analyseur et le prettifayer AST pour JSON pour tout nouvel éditeur / IDE / quoi que ce soit, quand vous pouvez simplement prendre et exécuter un fichier via jq sans quitter Vim? Je ne parle pas du fait que vous pouvez traiter votre gros fichier JSON via jq de cette manière, sans quitter Vim, trouver par exemple la clé souhaitée dans l'arborescence, trier, ne laisser que les données nécessaires, etc.

Source: https://habr.com/ru/post/fr483580/


All Articles