Visual Studio: touches de raccourci pour déplacer la ligne vers le haut ou vers le bas et pour faire défiler les dernières modifications
-
10-07-2019 - |
Question
Je passe d'Eclipse à Visual Studio .NET et j'ai trouvé tous mes raccourcis clavier bien-aimés, à l'exception de deux:
- dans Eclipse, vous pouvez appuyer sur ALT - & # 8592; et ALT - & # 8594; pour Consultez les modifications récentes que vous avez apportées, chose que j’utilise fréquemment pour revenir à l’emplacement où j’étais dans un autre fichier, puis y revenir. Apparemment dans VS.NET, les CTRL - - et CTRL - SHIFT - - faites-le, mais ils ne semblent pas toujours fonctionner (par exemple sur un ordinateur portable, peut être un problème numkey avec le moins) et ne semblent pas suivre le même algorithme de "où je me trouvais" comme je suis habitué à Eclipse. Est-ce que quelqu'un a réussi à utiliser cela et à s'en servir quotidiennement, etc.?
- dans Eclipse, appuyez sur ALT - uparrow ou ALT - downarrow et vous le déplacez simplement dans le code jusqu'à ce que vous le trouviez où vous le voulez, très gentil. Vous pouvez également appuyer sur MAJ - ALT - uparrow ou MAJ - ALT - downarrow . Ces deux touches de raccourci fonctionnent même pour un bloc de lignes que vous avez sélectionné.
Quelqu'un at-il découvert ces fonctionnalités de raccourci clavier dans Visual Studio .NET?
A D D N D U M:
Lorsque vous utiliserez la deuxième fonctionnalité décrite ci-dessus, par exemple, déplacez la ligne du bas dans la boucle for. Dans Eclipse, placez le curseur sur Console.WriteLine, puis appuyez sur ALT- (uparrow), je l’utilise tout le temps: un trait de touche pour déplacer les lignes de haut en bas.
for (int i = 0; i < 10; i++) {
}
Console.WriteLine(i);
OK, en extrapolant l'idée de Charlie avec no-selection-ctrl-c pour sélectionner une ligne, dans Visual Studio, vous pouvez placer votre curseur sur Console.WriteLine, (aucune sélection) appuyez sur CTRL - X puis déplacez vers le haut et appuyez sur CTRL - V .
La solution
Les réponses proposées fonctionnent, mais aucune d’entre elles n’a autant de valeur qu’éclipse en ce qui concerne la façon dont elles conservent le tampon de collage existant, les caractères actuellement sélectionnés, et ne permettent pas à l’utilisateur d’opérer sur une plage de lignes. Voici une solution que j'ai proposée qui préserve le tampon de collage, la sélection de caractères actuelle, et fonctionne avec ou sans sélection (pouvant 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 message pour ajouter le mécanisme UndoContext (suggéré par Nicolas Dorier) au début des méthodes MoveLineUp () et MoveLineDown () et le fermer à la fin. 23/11/11 - Je l'ai mis à jour à nouveau pour permettre aux lignes déplacées de se mettre en retrait lorsque vous croisez les limites
Autres conseils
Pour ceux qui recherchent un moyen de le faire dans Visual Studio 2010, l'extension gratuite Visual Tools 2010 Power Tools ajoute la possibilité de déplacer les lignes vers le haut et le bas.
http://visualstudiogallery.msdn.microsoft. com / fr-fr / d0d33361-18e2-46c0-8ff2-4adea1e34fef
Si vous ne l'avez pas encore trouvé, l'emplacement où ces raccourcis clavier sont configurés se trouve sous Outils | Options | Environnement | Clavier. Il est possible de trouver de nombreuses commandes pratiques en parcourant la liste, bien que, malheureusement, je n'ai jamais trouvé de bonne référence pour décrire l'objectif de chaque commande.
En ce qui concerne les commandes spécifiques:
-
Je crois que les commandes de navigation vers l'avant / vers l'arrière dont vous parlez sont View.NavigateBackward et View.NavigateForward. Si votre clavier ne coopère pas avec les combinaisons de touches du VS, vous pouvez les remapper sur vos touches Eclipse préférées. Malheureusement, je ne connais pas de moyen de changer l'algorithme utilisé pour décider où aller.
-
Je ne pense pas qu'il existe une commande intégrée pour la duplication d'une ligne, mais si vous appuyez sur Ctrl + C sans texte sélectionné, la ligne actuelle sera copiée dans le presse-papiers. Dans ce cas, voici une simple macro qui duplique la ligne en cours sur la ligne inférieure suivante:
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 déplacer une ligne de texte, Edit.LineTranspose déplace la ligne sélectionnée vers le bas. Je ne pense pas qu'il y ait une commande pour déplacer une ligne, mais voici une macro rapide qui le 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 les macros, elles sont vraiment utiles. Outils | Macros | Les macros IDE vous prendront 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ée ci-dessus. J'ai généré ces macros à l'aide de la commande extrêmement pratique Enregistrer une macro temporaire, également sous Outils | Macros Cette commande vous permet d'enregistrer un ensemble d'entrées au clavier et de les rejouer autant de fois que vous le souhaitez, ce qui est utile pour créer des commandes d'édition avancées ainsi que pour automatiser des tâches répétitives (par exemple, le reformatage de code).
J'ai récemment fait la même chose et je suis passé d'Eclipse à Visual Studio lorsque je suis passé sur un nouveau projet. Le ajout de resharper est vivement recommandé - il ajoute une partie de la riche édition. , fonctionnalité de navigation et de refactoring qu'éclipse a VS.
Resharper vous permet également d’utiliser un schéma de mappage de clavier très similaire à InteliJ. Très pratique pour les échappés Java ...
En ce qui concerne votre deuxième question, Resharper a la même fonction de code de déplacement haut / bas que eclipse, mais avec quelques réserves . Tout d’abord, en utilisant les correspondances de clavier InteliJ, la combinaison de touches est plutôt sinueuse.
Déplacer le code vers le haut: ctrl + Maj + Alt + curseur haut
Déplacer le code vers le bas: ctrl + Maj + Alt + curseur bas
Deuxièmement, il ne se déplace pas toujours d’une seule ligne, mais saute des blocs de code. Ainsi, il ne peut pas déplacer une ligne de l'extérieur d'une instruction if vers l'intérieur, il saute la ligne sélectionnée juste au-dessus du bloc if. Pour ce faire, vous devez vous déplacer " à gauche " et " right " en utilisant
Déplacement du code dans le bloc de code externe: ctrl + Maj + Alt + curseur gauche
Déplacement du code dans le bloc de code interne suivant: ctrl + Maj + Alt + curseur droit
Enregistrez une macro dans Visual Studio pour faire la chose de la flèche alternative:
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
Vous pouvez maintenant mapper cette macro sur n’importe quelle combinaison de touches de votre choix à l’aide de l’ide de macros et des préférences du clavier.
Edit.LineTranspose mais cela ne fonctionne pas pour déplacer une ligne vers le haut ... Voici la macro pour déplacer la ligne
Sub LineTransposeUp()
Dim offset As Integer
Dim sel As TextSelection
DTE.UndoContext.Open("LineTransposeUp")
Try
sel = DTE.ActiveDocument.Selection
offset = sel.ActivePoint.LineCharOffset
sel.LineUp()
DTE.ExecuteCommand("Edit.LineTranspose")
sel.LineUp()
sel.MoveToLineAndOffset(sel.ActivePoint.Line, offset)
Catch ex As System.Exception
End Try
DTE.UndoContext.Close()
End Sub
Utilisez le extension MoveLine pour déplacer une ligne (ou groupe de lignes) vers le haut ou le bas dans VS 2010/2012.
Je ne sais pas si VS prend en charge les fonctionnalités dont vous parlez en natif, mais je sais que le plug-in resharper vous permet de passer aux modifications précédentes en utilisant CTRL + SHIFT + RETOUR ARRIÈRE. Je ne pense pas qu'il ait un support pour déplacer une ligne de haut en bas (bien que ce ne soit pas encore le cas)
Paul Ostrowski J'ai essayé votre outil. Cela fonctionne surtout bien.
L'éclipse a également pour fonction de déplacer la ligne au niveau d'indentation actuel.
Par exemple:
function test()
{
// do stuff
}
Console.WriteLine("test");
Faire un changement de vitesse sur console.writeline le changerait en
function test()
{
// do stuff
Console.WriteLine("test");
}
mais votre outil semble le faire:
function test()
{
// do stuff
Console.WriteLine("test");
}