Vsvim: cc ne met pas le curseur en retrait s'il est sur une ligne vide

Créé le 8 mai 2012  ·  10Commentaires  ·  Source: VsVim/VsVim

cc supprime la ligne courante et place le curseur en mode insertion (l'option 'autoindent' détermine sa position).

VsVim ne place pas toujours le curseur dans la bonne position. Le seul cas que j'ai toujours réussi à reproduire est que si vous cochez sur une ligne vide, il placera le curseur sur la première colonne plutôt que sur le retrait.
Considérez le code C # de départ suivant ([] est le ncursor, | l'icursor):

class Foo {
    public void Bar()
    [{]
    }
}

Appuyez sur o pour ouvrir la ligne ci-dessous:

class Foo {
    public void Bar()
    {
        |
    }
}

Maintenant, appuyez sur Esc :

class Foo {
    public void Bar()
    {
[ ]
    }
}

Appuyez maintenant sur cc . C'est là que Vim et VsVim diffèrent: Vim placera le curseur en retrait dans la barre:

class Foo {
    public void Bar()
    {
        |
    }
}

tandis que VsVim le placera à la ligne 0:

class Foo {
    public void Bar()
    {
|
    }
}

Vous pouvez également utiliser ce code:

class Foo {
    public void Bar()
    {
        throw new NotImplementedException()[;]
    }
}

Dans Vim et VsVim, un seul cc placera le curseur dans la position indentée, mais cc<Esc>cc placera le curseur à la colonne 0 dans VsVim (tandis que Vim le mettra au retrait droit).

bug

Commentaire le plus utile

Cette solution de contournement simple me donne le comportement que j'attends de vim:

nmap S ddO
nmap cc S

Tous les 10 commentaires

Le comportement que je vois dans VsVim reflète ce que je vois dans gVim.

Je pense que nous avons basculé un paramètre différent. Je vois en fait une différence de comportement après l'étape «o» en haut. Mon curseur apparaîtra sur la même colonne que le { et non en retrait comme le vôtre.

Pouvez-vous exécuter :set et coller la sortie?

autoindent semble être l'une de ces options que j'ai définies dans mon vimrc, que j'ai ensuite source dans vsvimrc.

hlsearch
ignorecase
incsearch
scrolloff=5
smartcase
vimrc="C:\Users\pmateescu\_vsvimrc"
vimrcpaths="C:\Users\pmateescu;C:\Users\pmateescu"
autoindent
number
tabstop=4

VsVim tient-il compte des paramètres d'indentation dans VS? Si tel est le cas, voici les miens (sous Options -> Editeur de texte -> C # -> Formatage):

  1. Indentation (indentation du contenu du bloc, casse, étiquettes, ne pas indentation des accolades ouvertes / fermées)
class MyClass
{
    public void Method()
    {
        goto MyLabel;
MyLabel:
        return;
    }
}
  1. Sous Nouvelles lignes, j'ai tout vérifié
  2. Espacement: tout n'est pas coché sauf pour "Définir d'autres options d'espacement" - Insérer un espace après les mots-clés dans les instructions de flux de contrôle; "Définir l'espacement pour les délimiteurs" -: après deux-points pour la base, après la virgule, après le point-virgule pour, avant deux-points pour la base; "Définir l'espacement pour les opérateurs": avant et après.

Je ne sais pas si cela compte non plus, mais j'ai mis l'indentation sur Smart, taille 4, garder les onglets.

HTH

Ouais l'autoindent semble être la différence. Une fois que j'ai défini cela + enregistré en tant que fichier .c, je pouvais obtenir le comportement que vous voyiez.

J'ai jeté un coup d'œil rapide au code et cela semble être un problème avec les lignes vides. Le code ne respecte pas autoindent lorsque la ligne supprimée était vide, ce qu'il devrait apparemment.

En général, VsVim préfère le retrait de Visual Studio au retrait de Vim. Cela peut être remplacé en désactivant l'option vsvim_useeditorindent .

Cela fonctionne pour la plupart. Malheureusement, en 2010, tous les langages ne fournissent pas de bonnes API pour les services d'indentation. C # a le meilleur, VB n'en a pratiquement pas et C ++ est un jet de dés. Je pense que ça s'améliore dans VS11 mais je n'ai pas encore assez joué pour voir à quel point.

Je vais essayer de compresser ce correctif en 1.3

Joué un peu plus et ce comportement est en fait supprimé de cindent et non de autoindent . C'est l'une des raisons pour lesquelles il m'a fallu si longtemps pour reproduire le problème. J'expérimentais dans des fichiers texte dans lesquels autoindent activé. Cela ne reprend que dans les fichiers C avec cindent activé.

Vous avez raison, j'ai réussi à le reproduire aussi après que vous l'ayez mentionné avec vim -U NONE -u NONE -cmd 'set cindent' index.cs

Dans les paramètres normaux, Vim semble définir automatiquement cindent sur lorsqu'il est dans des fichiers de type C (apparaît dans :setl à la fois en C # et JS).
Cependant, le même comportement - supprimer l'indentation sur <Esc> , ré-indenter sur cc - semble se produire dans des fichiers non cindent : apparu pour moi à la fois en CSS et en HTML, mais dans ces cas, cela aurait pu être l'effet de indentexpr .

@philipmat
@jaredpar

Salut les gars, j'ai rencontré le même problème.
Est-ce corrigé dans la dernière version?
Sortie après :set

backspace="indent,eol,start"
hlsearch
ignorecase
incsearch
autoindent

@lookforit pour le moment non. Ce comportement fait en fait partie de cindent qui n'est pas pris en charge par VsVim pour le moment.

Cette solution de contournement simple me donne le comportement que j'attends de vim:

nmap S ddO
nmap cc S

Ce serait toujours agréable à avoir. Mon sens intuitif est que le «cc» pour effacer une ligne et commencer l'édition doit commencer au même niveau de retrait que la création d'une nouvelle ligne. Y a-t-il un raisonnement interne Vim / VS selon lequel il ne devrait pas en être ainsi? Je peux l'aborder comme une incursion dans le travail avec le projet.

La solution à ce problème était superficiellement rien de plus que "faire pour cc tout ce que o faisait déjà" (c'est pourquoi la solution de contournement de @shkm fonctionne), mais la chirurgie nécessaire en a fait tout un un peu plus de travail.

VsVim faisait déjà la bonne chose pour ce qu'on appelle «vim indent», le genre d'indent que VsVim utilise quand il n'y a pas de service de langue disponible. Afin d'ajouter des tests pour ce problème, j'ai dû ajouter une infrastructure aux tests pour simuler un service de langue. Donc, la déconnexion était que tous les tests existants utilisent "vim indent" mais 99% des utilisateurs utilisent "host indent", c'est-à-dire éditent des fichiers où Visual Studio fournit un service d'indent.

Pour compliquer davantage le problème, il y avait un bogue que personne n'a jamais signalé avec "vim indent" où il ne fonctionnait pas correctement lorsque les onglets n'étaient pas développés (voir le numéro 2302). Encore une fois, d'un point de vue pratique, personne n'utilise "vim indent", donc après réflexion, ce n'est pas si surprenant.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

iamkarlson picture iamkarlson  ·  7Commentaires

jaredpar picture jaredpar  ·  5Commentaires

DanielKeogh picture DanielKeogh  ·  3Commentaires

LariscusObscurus picture LariscusObscurus  ·  4Commentaires

keithn picture keithn  ·  3Commentaires