Tri d'une colonne sans modifier les autres colonnes

10

J'étais récemment au courant de la !technique de filtrage et je l'adore. Malheureusement, je ne peux pas l'utiliser en mode de blocage visuel. J'espère que certains experts ici m'aideront.

Fondamentalement, je veux trier sur place une colonne telle que la troisième ci-dessous (juste un MWE). Et je ne veux pas déranger les autres colonnes quand je trie.

J'ai essayé de filtrer ( !) la troisième colonne sélectionnée visuellement (en mode bloc) via l' sortutilitaire. Mais le tri s'étend plutôt au-delà de la sélection, c'est-à-dire que toutes les lignes sont permutées, pas seulement la sélection, ce tri aussi basé sur la première colonne!

1.  LARGEST         40
2.  SECOND-LARGEST  168     
3.  MID             2.8     
4.  MID             540     
5.  MID             14.84   
6.  MID             40      
7.  SECOND-LEAST    64      
8.  LEAST           8

J'ai sélectionné la dernière colonne à l'aide de visual-block et j'ai dit !sort --reversequi apparaît comme

'<,'>!sort --reverse

Et le résultat est étrange contrairement à ce que j'attendais. Le résultat a trié / échangé les lignes entières, pas seulement une colonne, et cela aussi, basé sur la première colonne indépendamment de ma sélection de troisième colonne!

 8.  LEAST           8    
 7.  SECOND-LEAST    64      
 6.  MID             40      
 5.  MID             14.84   
 4.  MID             540     
 3.  MID             2.8     
 2.  SECOND-LARGEST  168     
 1.  LARGEST         40   

Sauf impossibilité contraire, je souhaiterais une solution de tri pur vim +, plutôt que des outils relativement avancés tels que sed/ awk. Il est plus important de me connaître, à quel point le mode de blocage visuel est limité, par rapport au mode visuel, par exemple.

Aime la probabilité
la source
Cela ne résout pas votre problème, mais notez qu'une sortcommande interne vim est disponible, vous n'avez donc pas besoin d'invoquer l'externe !sortpour effectuer un tri régulier.
Dalker
2
Les filtres ne fonctionnent que sur les lignes .
romainl
@Dalker Oui, merci. Mais j'ai déjà essayé ça, ce qui a donné un résultat similaire.
Aime la probabilité du
@romainl C'est ça? Pas de rayons d'espoir? Je trouve rarement ça avec Vim !! Mais néanmoins, n'est-il pas étrange de dire "Les filtres ne fonctionnent que sur les lignes " après avoir sélectionné autre chose et aucun signe de problème jusqu'à la sortie? S'il ne déclenche pas d'avertissement / d'erreur, je dirais même qu'il s'agit d'un BUG.
Aime la probabilité du
Un bug? Haha non. Le comportement est non seulement documenté ( :help filter) mais également standardisé (désolé, je ne sais pas comment lier en profondeur ce point de vente). Vous ne pouvez pas vous plaindre si vous ne faites pas de RFTM.
romainl

Réponses:

9

Je pense que votre meilleur espoir est le plugin vis.vim . Ce plugin fournit une commande Bqui permet d'appliquer une commande à un bloc.

Ici, après l'installation du plugin, vous sélectionnez votre bloc, puis utilisez:

:'<,'>B !sort

Notez que la commande peut être n'importe quoi, donc au lieu de !sortvous pourriez faire beaucoup d'autres traitements sur le bloc comme l'enregistrer dans un autre fichier ( :'<,'>B w foo.txt) ou appliquer une substitution ( :'<,'>B s/foo/bar/g)

statox
la source
1
@LovesProbability, si vous essayez de trier la troisième colonne sans modifier leurs deux premières colonnes, ce fil pourrait être utile.
Jair López
@ JairLópez Sans aucune offense, c'est vraiment drôle de voir comment ma question est copiée par quelqu'un ailleurs, où on lui a demandé de revenir à la source d'origine (c'est-à-dire cette page à côté d'une copie reformulée de cette réponse), et finalement vous me demandez d'aller y trouver une réponse.
Aime la probabilité du
Merci pour votre commentaire, je l'ai fait parce que (1) votre question et cette réponse étaient intéressantes; (2) vous n'êtes peut-être pas seul et il pourrait y avoir plus de gens intéressés; (3) c'est une excellente occasion d'aider quelqu'un à comprendre comment $est utilisé en mode visuel par blocs.
Jair López