40 votes

Visual Studio: raccourcis clavier pour déplacer la ligne vers le haut/vers le bas et se déplacer à travers les changements récents

Je me déplace à partir de l'Éclipse de Visual Studio .NET et ai trouvé tous mes bien-aimés touches de raccourci à l'exception de deux:

  • dans Eclipse, vous pouvez appuyer sur ALT- et ALT- pour visiter les récentes modifications que vous avez apportées, quelque chose que j'utilise fréquemment pour revenir à l'endroit où j'étais dans un autre fichier et revenir ensuite. Apparemment dans VS.NET le CTRL-- et CTRL-SHIFT-- le faire, mais ils ne semblent pas toujours de travail (par exemple, sur l'ordinateur portable, peut être un numkey problème avec le moins) et ne semblent pas suivre le même algorithme de "où j'ai été" comme je suis employé dans Eclipse. Quelqu'un a eu cela de travailler et de s'appuyer sur la tous les jours, etc.?
  • dans Eclipse, pour déplacer une ligne vers le haut ou vers le bas vous appuyez sur ALT-flèche haut ou ALT-flèche bas et vous venez de passer à travers le code jusqu'à ce que vous obtenez à l'endroit où vous le voulez, très agréable. Aussi pour faire une copie d'une ligne, vous pouvez appuyer sur MAJ-ALT-flèche haut ou MAJ-ALT-flèche bas. Deux de ces raccourcis même travail pour le bloc de lignes que vous avez sélectionné.

Quelqu'un a découvert ces raccourcis fonctionnalités de Visual Studio .NET?

A D D E N D U M :

Par exemple, si vous utilisez la deuxième fonctionnalité décrite ci-dessus est de déplacer la ligne de fond ici dans la boucle for. Dans Eclipse, vous mettez le curseur sur la Console.WriteLine et puis appuyez sur ALT-(flèche haut), je l'utilise tout le temps: une touche pour déplacer les lignes en haut et en bas.

for (int i = 0; i < 10; i++) {

}
Console.WriteLine(i);

Ok, l'extrapolation de Charlie idée sans-sélection-ctrl-c pour sélectionner une ligne, dans Visual Studio, vous pourriez placer votre curseur sur la Console.WriteLine (aucune sélection) appuyez sur CTRL-X , puis déplacer vers le haut et appuyez sur CTRL-V.

50voto

Paul Ostrowski Points 986

Les réponses des travaux proposés, mais aucun n'est aussi beau que eclipse quant à la façon de préserver l'existant coller le tampon, les caractères sélectionnés, et ils ne permettent pas à l'utilisateur de faire fonctionner sur une plage de lignes. Voici une solution je suis venu avec qui préserve la mémoire tampon de collage, le caractère actuel de sélection, et fonctionne avec ou sans sélection (qui peut ou peut ne pas s'étendre sur plusieurs lignes):

'' Duplicates the current line (or selection of lines) and places the copy
'' one line below or above the current cursor position (based upon the parameter)
Sub CopyLine(ByVal movingDown As Boolean)
    DTE.UndoContext.Open("CopyLine")
    Dim objSel As TextSelection = DTE.ActiveDocument.Selection

    ' store the original selection and cursor position
    Dim topPoint As TextPoint = objSel.TopPoint
    Dim bottomPoint As TextPoint = objSel.BottomPoint
    Dim lTopLine As Long = topPoint.Line
    Dim lTopColumn As Long = topPoint.LineCharOffset
    Dim lBottomLine As Long = bottomPoint.Line
    Dim lBottomColumn As Long = bottomPoint.LineCharOffset()

    ' copy each line from the top line to the bottom line
    Dim readLine As Long = lTopLine
    Dim endLine As Long = lBottomLine + 1
    Dim selectionPresent As Boolean = ((lTopLine <> lBottomLine) Or (lTopColumn <> lBottomColumn))
    If (selectionPresent And (lBottomColumn = 1)) Then
        ' A selection is present, but the cursor is in front of the first character
        ' on the bottom line. exclude that bottom line from the copy selection.
        endLine = lBottomLine
    End If

    ' figure out how many lines we are copying, so we can re-position
    ' our selection after the copy is done
    Dim verticalOffset As Integer = 0
    If (movingDown) Then
        verticalOffset = endLine - lTopLine
    End If

    ' copy each line, one at a time.
    ' The Insert command doesn't handle multiple lines well, and we need
    ' to use Insert to avoid autocompletions
    Dim insertLine As Long = endLine
    While (readLine < endLine)
        ' move to read postion, and read the current line
        objSel.MoveToLineAndOffset(readLine, 1)
        objSel.EndOfLine(True) 'extend to EOL
        Dim lineTxt As String = objSel.Text.Clone
        ' move to the destination position, and insert the copy
        objSel.MoveToLineAndOffset(insertLine, 1)
        objSel.Insert(lineTxt)
        objSel.NewLine()
        ' adjust the read & insertion points
        readLine = readLine + 1
        insertLine = insertLine + 1
    End While

    ' restore the cursor to original position and selection
    objSel.MoveToLineAndOffset(lBottomLine + verticalOffset, lBottomColumn)
    objSel.MoveToLineAndOffset(lTopLine + verticalOffset, lTopColumn, True)
    DTE.UndoContext.Close()
End Sub

'' Duplicates the current line (or selection of lines) and places the copy
'' one line below the current cursor position
Sub CopyLineDown()
    CopyLine(True)
End Sub

'' Duplicates the current line (or selection of lines) and places the copy
'' one line above the current cursor position
Sub CopyLineUp()
    CopyLine(False)
End Sub


'' Moves the selected lines up one line. If no line is
'' selected, the current line is moved.
''
Sub MoveLineUp()
    DTE.UndoContext.Open("MoveLineUp")
    Dim objSel As TextSelection = DTE.ActiveDocument.Selection
    ' store the original selection and cursor position
    Dim topPoint As TextPoint = objSel.TopPoint
    Dim bottomPoint As TextPoint = objSel.BottomPoint
    Dim lTopLine As Long = topPoint.Line
    Dim lTopColumn As Long = topPoint.LineCharOffset
    Dim lBottomLine As Long = bottomPoint.Line
    Dim lBottomColumn As Long = bottomPoint.LineCharOffset()

    Dim textLineAbove As TextSelection = DTE.ActiveDocument.Selection
    textLineAbove.MoveToLineAndOffset(lTopLine - 1, 1, False)
    textLineAbove.MoveToLineAndOffset(lTopLine, 1, True)
    Dim indentChange As Integer = CountIndentations(textLineAbove.Text) * -1

    ' If multiple lines are selected, but the bottom line doesn't
    ' have any characters selected, don't count it as selected
    Dim lEffectiveBottomLine = lBottomLine
    If ((lBottomColumn = 1) And (lBottomLine <> lTopLine)) Then
        lEffectiveBottomLine = lBottomLine - 1
    End If

    ' move to the line above the top line
    objSel.MoveToLineAndOffset(lTopLine - 1, 1)
    ' and move it down, until its below the bottom line:
    Do
        DTE.ExecuteCommand("Edit.LineTranspose")
    Loop Until (objSel.BottomPoint.Line >= lEffectiveBottomLine)
    ' Since the line we are on has moved up, our location in the file has changed:
    lTopLine = lTopLine - 1
    lBottomLine = lBottomLine - 1

    IndentBlockAndRestoreSelection(objSel, lBottomLine, lBottomColumn, lTopLine, lTopColumn, indentChange)

    DTE.UndoContext.Close()
End Sub

'' Moves the selected lines down one line. If no line is
'' selected, the current line is moved.
''
Sub MoveLineDown()
    DTE.UndoContext.Open("MoveLineDown")
    Dim objSel As TextSelection = DTE.ActiveDocument.Selection
    ' store the original selection and cursor position
    Dim topPoint As TextPoint = objSel.TopPoint
    Dim bottomPoint As TextPoint = objSel.BottomPoint
    Dim lTopLine As Long = topPoint.Line
    Dim lTopColumn As Long = topPoint.LineCharOffset
    Dim lBottomLine As Long = bottomPoint.Line
    Dim lBottomColumn As Long = bottomPoint.LineCharOffset()

    ' If multiple lines are selected, but the bottom line doesn't
    ' have any characters selected, don't count it as selected
    Dim lEffectiveBottomLine = lBottomLine
    If ((lBottomColumn = 1) And (lBottomLine <> lTopLine)) Then
        lEffectiveBottomLine = lBottomLine - 1
    End If

    Dim textLineBelow As TextSelection = DTE.ActiveDocument.Selection
    textLineBelow.MoveToLineAndOffset(lEffectiveBottomLine + 1, 1, False)
    textLineBelow.MoveToLineAndOffset(lEffectiveBottomLine + 2, 1, True)
    Dim indentChange As Integer = CountIndentations(textLineBelow.Text)


    ' move to the bottom line
    objSel.MoveToLineAndOffset(lEffectiveBottomLine, 1)
    ' and move it down, which effectively moves the line below it up
    ' then move the cursor up, always staying one line above the line
    ' that is moving up, and keep moving it up until its above the top line:
    Dim lineCount As Long = lEffectiveBottomLine - lTopLine
    Do
        DTE.ExecuteCommand("Edit.LineTranspose")
        objSel.LineUp(False, 2)
        lineCount = lineCount - 1
    Loop Until (lineCount < 0)
    ' Since the line we are on has moved down, our location in the file has changed:
    lTopLine = lTopLine + 1
    lBottomLine = lBottomLine + 1

    IndentBlockAndRestoreSelection(objSel, lBottomLine, lBottomColumn, lTopLine, lTopColumn, indentChange)

    DTE.UndoContext.Close()
End Sub

'' This method takes care of indenting the selected text by the indentChange parameter
'' It then restores the selection to the lTopLine:lTopColumn - lBottomLine:lBottomColumn parameter.
'' It will adjust these values according to the indentChange performed
Sub IndentBlockAndRestoreSelection(ByVal objSel As TextSelection, ByVal lBottomLine As Long, ByVal lBottomColumn As Long, ByVal lTopLine As Long, ByVal lTopColumn As Long, ByVal indentChange As Integer)
    ' restore the cursor to original position and selection
    objSel.MoveToLineAndOffset(lBottomLine, lBottomColumn)
    objSel.MoveToLineAndOffset(lTopLine, lTopColumn, True)
    If (indentChange = 0) Then
        ' If we don't change the indent, we are done
        Return
    End If

    If (lBottomLine = lTopLine) Then
        If (indentChange > 0) Then
            objSel.StartOfLine()
        Else
            objSel.StartOfLine()
            objSel.WordRight()
        End If
    End If
    objSel.Indent(indentChange)

    ' Since the selected text has changed column, adjust the columns accordingly:
    ' restore the cursor to original position and selection
    Dim lNewBottomColumn As Long = (lBottomColumn + indentChange)
    Dim lNewTopColumn As Long = (lTopColumn + indentChange)
    ' ensure that we we still on the page.
    ' The "or" clause makes it so if we were at the left edge of the line, we remain on the left edge.
    If ((lNewBottomColumn < 2) Or (lBottomColumn = 1)) Then
        ' Single line selections, or a bottomColumn that is already at 1 may still have a new BottomColumn of 1
        If ((lTopLine = lBottomLine) Or (lBottomColumn = 1)) Then
            lNewBottomColumn = 1
        Else
            ' If we have multiple lines selected, don't allow the bottom edge to touch the left column,
            ' or the next move will ignore that bottom line.
            lNewBottomColumn = 2
        End If
    End If
    If ((lNewTopColumn < 2) Or (lTopColumn = 1)) Then
        lNewTopColumn = 1
    End If

    ' restore the selection to the modified selection
    objSel.MoveToLineAndOffset(lBottomLine, lNewBottomColumn)
    objSel.MoveToLineAndOffset(lTopLine, lNewTopColumn, True)
End Sub


'' This method counts the indentation changes within the text provided as the paramter
Function CountIndentations(ByVal text As String) As Integer
    Dim indent As Integer = 0
    While (Text.Length > 0)
        If (Text.StartsWith("//")) Then
            Dim endOfLine As Integer = Text.IndexOf("\n", 2)
            If (Equals(endOfLine, -1)) Then
                ' The remaining text is all on one line, so the '//' terminates our search
                ' Ignore the rest of the text
                Exit While
            End If
            ' continue looking after the end of line
            Text = Text.Substring(endOfLine + 1)
        End If

        If (Text.StartsWith("/*")) Then
            Dim endComment As Integer = Text.IndexOf("*/", 2)
            If (Equals(endComment, -1)) Then
                ' This comment continues beyond the length of this line.
                ' Ignore the rest of the text
                Exit While
            End If
            ' continue looking after the end of this comment block
            Text = Text.Substring(endComment + 1)
        End If

        If (Text.StartsWith("{")) Then
            indent = indent + 1
        Else
            If (Text.StartsWith("}")) Then
                indent = indent - 1
            End If
        End If
        Text = Text.Substring(1)
    End While
    Return indent
End Function

J'ai édité ce post pour ajouter le UndoContext mécanisme (suggéré par Nicolas Dorier) au début de la MoveLineUp() et MoveLineDown() les méthodes et la clôture à leur fin. 11/23/11 - j'ai mis à jour ce nouveau pour permettre à l'déplacé les lignes de tiret eux-mêmes que vous traversez support de limites

16voto

Polshgiant Points 1194

Pour ceux qui cherchent un moyen de le faire dans Visual Studio 2010, la version gratuite de Visual Studio 2010 Pro Power Tools extension ajoute la possibilité de déplacer les lignes en haut et en bas.

http://visualstudiogallery.msdn.microsoft.com/en-us/d0d33361-18e2-46c0-8ff2-4adea1e34fef

14voto

Charlie Points 17807

Si vous n'avez pas déjà trouvé, le lieu où ces raccourcis clavier sont le programme d'installation est sous Outils | Options | Environnement | Clavier. Beaucoup de pratique de commandes peut être trouvé simplement en parcourant la liste, bien que malheureusement je n'ai jamais trouvé un bon point de référence pour décrire ce que chaque commande est destiné à faire.

Comme pour les commandes spécifiques:

  • Je crois que le avant/arrière commandes de navigation vous faites allusion, sont en Vue.NavigateBackward et la Vue.NavigateForward. Si votre clavier n'est pas coopérer avec le VS raccourcis clavier, vous pouvez reconfigurer votre préféré Eclipse clés. Malheureusement, je ne connais pas de moyen de changer l'algorithme qu'il utilise à décider où aller.

  • Je ne pense pas qu'il y a une commande intégrée pour la duplication d'une ligne, mais en appuyant sur Ctrl+C avec aucun texte n'est sélectionné copie la ligne courante dans le presse-papiers. Voici une macro simple qui duplique la ligne courante sur le côté inférieur de la ligne:


    Sub CopyLineBelow()
        DTE.ActiveDocument.Selection.Collapse()
        DTE.ActiveDocument.Selection.Copy()
        DTE.ActiveDocument.Selection.Paste()
    End Sub

    Sub CopyLineAbove()
        DTE.ActiveDocument.Selection.Collapse()
        DTE.ActiveDocument.Selection.Copy()
        DTE.ActiveDocument.Selection.LineUp()
        DTE.ActiveDocument.Selection.Paste()
    End Sub
  • Pour le déplacement d'une ligne de texte autour de, Modifier.LineTranspose va déplacer la ligne vers le bas. Je ne pense pas qu'il y a une commande pour le déplacement d'une ligne, mais voici une petite macro qui fait:

    Sub MoveLineUp()
        DTE.ActiveDocument.Selection.Collapse()
        DTE.ActiveDocument.Selection.Cut()
        DTE.ActiveDocument.Selection.LineUp()
        DTE.ActiveDocument.Selection.Paste()
        DTE.ActiveDocument.Selection.LineUp()
    End Sub

Si vous n'avez pas encore commencé à jouer avec des macros, elles sont vraiment utiles. Outils | Macros | Macros IDE va vous prendre de l'éditeur, et une fois qu'ils sont définis, vous pouvez configurer des raccourcis clavier à travers la même INTERFACE utilisateur que j'ai mentionné ci-dessus. J'ai généré ces macros à l'aide de l'incroyablement utile Enregistrement Temporaire de Macro-commande, également dans le menu Outils | Macros. Cette commande vous permet d'enregistrer un ensemble d'entrées de clavier et de les rejouer n'importe quel nombre de fois, ce qui est bon pour la construction avancée commandes d'édition ainsi que l'automatisation des tâches répétitives (par exemple, le code de reformatage).

9voto

serg10 Points 10157

J'ai récemment fait la même chose et déplacé à partir d'Eclipse, Visual Studio, quand j'ai déménagé sur un nouveau projet. Le Resharper ajouter dans est fortement recommandé - il en ajoute de la richesse de l'édition, de la navigation et des fonctionnalités de refactoring qu'eclipse a du VS.

Resharper vous permet également d'utiliser un keybaord schéma de mise en correspondance qui est très similaire à InteliJ. Très pratique pour le Java évadés...

Concernant votre deuxième question, Resharper a le même code de déplacement haut / bas fonction comme eclipse, mais avec quelques mises en garde. Tout d'abord, à l'aide de la InteliJ clavier mappages, la combinaison de touches est assez tortueux.

Déplacer code: ctrl + maj + alt + curseur

Code de déplacement vers le bas: ctrl + maj + alt + curseur vers le bas

Deuxièmement, il ne le fait pas toujours par une seule ligne, mais en réalité, sauts de blocs de code. Donc, il ne peut pas déplacer une ligne à partir de l'extérieur d'une instruction if à l'intérieur - il saute la ligne sélectionnée à droite sur le bloc if. Pour cela, vous devez déplacer la "gauche" et "droite" à l'aide de

Passer le code en extérieur bloc de code: ctrl + maj + alt + gauche du curseur

Passer le code, dans l'intérieur du bloc de code: ctrl + maj + alt + droite du curseur

2voto

1800 INFORMATION Points 55907

Enregistrer une macro dans visual studio pour faire de la alt-flèche chose:

ctrl-alt-r -- record mode
ctrl-c -- copy a line
up arrow -- go up a line
home -- beginning of line (maybe there is a way to paste before the current line without this)
ctrl-v -- paste
ctrl-alt-r -- end record mode

Maintenant, vous pouvez mapper cette macro à un ensemble de touches que vous aimez à l'aide de l'éditeur de macros et les préférences de clavier.

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