2 votes

Existe-t-il un moyen d'obtenir la colonne la plus à droite d'une sélection de blocs visuels ?

Supposons que virtualedit= . Considérons le fichier texte suivant.

1 2 1 1 1 1 1 1
1 3 1 1 1 1 1 1
1 4 1 1 1 1 1 1 1 1
1 1 1 1 7 1 1 1

Si je sélectionne visuellement les lignes 2 à 4 et que j'utilise $ pour rendre la sélection non rectangulaire, le code suivant échouera à trouver la colonne la plus à droite dans la sélection. Plus explicitement, j'utilise la séquence de touches 2G^vjj$ donde ^v est Control-V.

" rightmostCol becomes 15, not 19 as desired.
let rightmostCol = virtcol("'>")

Y a-t-il une autre fonction que je peux appeler, ou une expression que je peux passer à virtcol Comment obtenir de manière programmatique le numéro de la colonne la plus à droite dans ma sélection Visual Block ?

Notez que le simple fait de trouver la longueur de la ligne la plus longue dans le bloc visuel est incorrect, car la sélection visuelle aurait également pu être rectangulaire, et ces cas ne doivent pas être traités de la même manière.

Editar : S'il était possible de déterminer si la sélection du bloc visuel est rectangulaire ou non, cela fonctionnerait également.

0voto

Sergio Points 3381

Vous pouvez écrire une fonction VimScript :

function! GetRightmostCol()
   let start=line("'<")
   let end=line("'>")
   let line=start
   let len=len(getline(line))
   while line<=end
      let len=len<len(getline(line))?len(getline(line)):len
      let line+=1
   endwhile
   return len
endfunction

Une autre approche consiste à utiliser le registre 0 :

function! GetRightmostCol()
   let lines=split(getreg(0),"\n")
   let len=0
   for line in lines
      let len=len<len(line)?len(line):len
      let line+=1
   endfor
   return len
endfunction

Utilisez ensuite la fonction dans l'affectation :

:let rightmostCol = GetRightmostCol()

0voto

sidyll Points 20176

Il n'y a pas de moyen direct de distinguer ces cas par des marques. Une solution serait d'analyser soi-même le texte, en ajoutant la longueur de ligne la plus longue à la position de la marque visuelle la plus à gauche. Il est important de vérifier les deux marques car elles pourraient être inversées dans le cas où la sélection aurait été faite vers le début.

function! RightmostVirtualColumn()
    let reg_v = @v
    silent normal! gv"vy
    let max = 0
    for line in split(getreg('v'), '\n')
        let len = strlen(line)
        let max = max([len, max])
    endfor
    let @v = reg_v
    let max += min([virtcol("'<"), virtcol("'>")]) - 1
    return max
endfunction

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X