J'ai trouvé utile dans d'autres éditeurs la possibilité de:
- prendre le texte sélectionné
- exécuter une commande externe et passer la sélection à son
stdin
- prendre les commandes externes
stdout
et remplacer la sélection actuelle par elle.
De cette façon, vous pouvez écrire des outils de texte utiles qui opèrent sur la sélection en utilisant n'importe quelle langue pouvant faire io de base.
Comment cela peut-il être fait avec vim en utilisant la sélection? ... un seul caractère, mot, paragraphe ... etc.
(Directement en ligne de commande, ou via un raccourci clavier?)
Remarque
Des commandes telles que le !sort
travail au niveau ligne, la raison pour laquelle je pose cette question est parce que je voudrais opérer sur la sélection. (c.-à-d. le texte qui serait supprimé s'il x
était enfoncé).
la source
sort
commande.:sort
?J'ai écrit un plugin appelé express.vim qui peut vous aider. Le plugin définit un opérateur
g=
qui vous permet d'évaluer une expression VimScript sur un mouvement (ou une sélection visuelle). Il invite à une expression, dans laquelle vous pouvez utiliserv:val
comme espace réservé pour le texte couvert par le mouvement (ou, encore une fois, la sélection visuelle).Dans ce cas, une expression utile utiliserait la
system()
fonction, qui exécute une commande externe.(Ici, j'ai utilisé
tr
comme exemple simple une commande externe.)La façon d'utiliser express.vim pour ce problème serait de sélectionner le texte avec le mode visuel, puis de taper
g=
suivi de cette expression, puis de cliquerEnter
:J'avoue que ce n'est pas facile à utiliser. (En fait, j'utilise rarement ce plugin moi-même!) J'envisage d'ajouter un raccourci pour appeler une commande externe, comme démarrer l'expression avec
!
. Je publierai une mise à jour ici si je finis par le faire.MODIFIER
J'ai modifié express.vim pour traiter les expressions commençant par
!
comme des commandes externes. Donc, en suivant l'tr
exemple, ce qui précède devient beaucoup plus simple. Après une sélection visuelle, tapez ce qui suit:Explication:
g=
!tr a-z A-Z
comme expressionEnter
la source
Vous recherchez les commandes de filtrage dans Vim. Tu vois
:help filter
. Voici la documentation pertinente:La saisie
5!!sort
triera donc les 5 lignes suivantes à partir du curseur.la source
tr [:lower:] [:upper]
, alors vim mettra en valeur non seulement ce mot mais la ligne entière.Notez que cela peut être fait avec:
s^R=system('tr a-z A-Z', @")[:-2]^M
(avec^R
CTRL + R et ^ M étant ENTER)Il pourrait également fonctionner avec tout ce que la sélection + remplace comme
ci"^R=...
.la source
v
et déplacé le curseur), j'obtiens l'erreurE16: Invalid range\nE16: Invalid range\nE476: Invalid command
(sous Linux,tr
et d'autres commandes de base existent).s
qui passe en mode d'insertion ou:s
la commande?s
depuis le mode visuel, ou frappez-vous en:
premier? Il n'y a aucune:
implication dans la séquence de touches que j'ai écrite. Une cartographie serait la suivante:vnoremap µ s<c-r>=system('tr a-z A-Z', @")[:-2]<cr>
.