Comment inverser une chaîne avec le script Vim

11

J'essaie d'inverser une chaîne, ce qui 'abc defg hij'devient 'jih gfed cba'. La solution que j'ai trouvée est

join(reverse(split(l:text, '.\zs')), '')

Existe-t-il une solution plus élégante ou dois-je m'en tenir à ce que j'ai trouvé?

René Nyffenegger
la source
1
Cela dépend de ce que vous entendez par «élégant». Il n'y a pas de fonction interne dédiée à inverser une chaîne, si c'est ce que vous demandez. Si vous voulez le faire avec deux appels ou moins à des fonctions internes et sans instructions supplémentaires, cela ne semble pas être possible non plus.
Sato Katsura du
1
Votre solution actuelle est déjà à la fois élégante et idiomatique.
romainl
1
Ignorez le '.' dans la partie scindée.
Christian Brabandt du
1
@SatoKatsura en fait, je pense que c'est plus efficace, car le moteur d'expression rationnelle n'a besoin de correspondre à rien. De plus, c'est la voie préférée de la documentation.
Christian Brabandt du
1
@ChristianBrabandt Selon le manuel, split()sans l' {keepempty}option devrait supprimer un seul élément vide au début et un seul élément vide à la fin. Il supprime actuellement tous les éléments vides, y compris ceux au milieu de la liste (ce qui est plus utile que le comportement documenté si vous me le demandez, mais ce n'est probablement pas le cas). Je pense que cela a été discuté récemment vim_dev.
Sato Katsura du

Réponses:

10

Votre solution est très élégante! Une alternative si vous êtes dans un environnement basé sur Unix:

!!rev
JJoao
la source
3

Depuis Wikia

vnoremap <Leader>r c<C-O>:set revins<CR><C-R>"<Esc>:set norevins<CR>

Pour plus d'informations, voir: :h revins

SergioAraujo
la source
2

Si vous utilisez un système de type Unix, dans vim, tapez ex-command :%! rev

KeeeeiZ
la source