Visual Studio: skróty klawiszowe do przesuwania linii w górę/w dół i przechodzenia przez ostatnie zmiany
Przenoszę się z Eclipse do Visual Studio. NET i znalazłem wszystkie moje ukochane hotkeye oprócz dwóch:
- w Eclipse możesz nacisnąć ALT-← i ALT-→ aby odwiedzić ostatnie zmiany, które wprowadziłeś, coś, czego używam często, aby wrócić do miejsca, w którym byłem w innym pliku, a następnie powrócić. Widocznie w VS.NET CTRL-- i CTRL-SHIFT-- zrobić, ale nie zawsze działają (np. na laptopie, może być numkey problem z minusem) i nie wydaje się podążać za tym samym algorytmem "where I was", jak jestem przyzwyczajony do Eclipse. Czy ktoś ma to do pracy i na tym polega codziennie itp.?
- W Eclipse, aby przesunąć linię w górę lub w dół naciskasz ALT-uparrow lub ALT-downarrow i po prostu przesuwasz go przez kod, aż dotrzesz tam, gdzie chcesz, bardzo ładnie. Aby utworzyć kopię linii, możesz nacisnąć SHIFT-ALT-uparrow lub SHIFT-ALT-downarrow . Oba te skróty działają nawet dla wybranego bloku linii.
Czy ktoś odkrył te funkcje skrótu klawiszowego w Visual Studio. NET?
A D D E N D U M:
Przykładem użycia drugiej funkcji opisanej powyżej jest przeniesienie dolnej linii do pętli for. W Eclipse, można umieścić kursor na konsoli.WriteLine, a następnie naciśnij ALT-(uparrow), używam, że wszystkie czas: jeden naciśnięcie klawisza, aby przesuwać linie w górę iw dół.
for (int i = 0; i < 10; i++) {
}
Console.WriteLine(i);
Ok, ekstrapolowanie pomysłu Charliego za pomocą no-selection-ctrl - c aby wybrać linię, w Visual Studio można było umieścić kursor na konsoli.WriteLine, (brak wyboru) naciśnij CTRL-X a następnie przesuń w górę i naciśnij CTRL-V .
9 answers
Proponowane odpowiedzi działają, ale żadna z nich nie jest tak miła jak eclipse, jeśli chodzi o zachowanie istniejącego bufora wklejania, aktualnie wybranych znaków i nie pozwalają użytkownikowi na operowanie na szeregu linii. Oto rozwiązanie, które wymyśliłem, które zachowuje bufor wklejania, bieżący wybór znaków i działa z zaznaczeniem lub bez zaznaczenia (które może lub nie może obejmować wielu wierszy):
'' 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
Edytowałem ten post, aby dodać Mechanizm UndoContext (sugerowany przez Nicolas Dorier) na początku metod MoveLineUp() i MoveLineDown() i zamykanie ich na końcu. 11/23/11-zaktualizowałem to ponownie, aby umożliwić przesunięte linie do wcięcia się, gdy przekraczasz granice nawiasów
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-23 17:35:22
Dla każdego, kto szuka sposobu, aby to zrobić w Visual Studio 2010, bezpłatne rozszerzenie Visual Studio 2010 Pro Power Tools dodaje możliwość przesuwania linii w górę iw dół.
Http://visualstudiogallery.msdn.microsoft.com/en-us/d0d33361-18e2-46c0-8ff2-4adea1e34fef
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-13 19:14:02
Jeśli jeszcze go nie znalazłeś, miejsce ustawienia tych skrótów klawiaturowych znajduje się w sekcji Narzędzia | Opcje | środowisko | Klawiatura. Wiele przydatnych poleceń można znaleźć po prostu przeglądając listę, chociaż niestety nigdy nie znalazłem żadnego dobrego odniesienia do opisania, co każde polecenie ma zrobić.
Co do konkretnych poleceń:
Wierzę, że polecenia nawigacji do przodu/do tyłu, o których mówisz, to Widok.NavigateBackward i Widok./ Align = "left" / Jeśli twoja klawiatura nie współpracuje z wiązaniami VS, możesz je przemapować do preferowanych klawiszy Eclipse. Niestety, nie znam sposobu, aby zmienić algorytm, którego używa, aby zdecydować, gdzie iść.
-
Myślę, że nie ma wbudowanego polecenia do powielania linii, ale naciśnięcie Ctrl + C bez zaznaczonego tekstu skopiuje bieżącą linię do schowka. Biorąc to pod uwagę, oto proste makro, które duplikuje bieżącą linię na następnym niższym linia:
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
- aby przesunąć linię tekstu wokół, Edytuj.LineTranspose przesunie wybraną linię w dół. Myślę, że nie ma komendy do przenoszenia linii w górę, ale oto szybkie makro, które to robi:
Sub MoveLineUp()
DTE.ActiveDocument.Selection.Collapse()
DTE.ActiveDocument.Selection.Cut()
DTE.ActiveDocument.Selection.LineUp()
DTE.ActiveDocument.Selection.Paste()
DTE.ActiveDocument.Selection.LineUp()
End Sub
Jeśli jeszcze nie zacząłeś grać z makrami, są one naprawdę przydatne. Narzędzia / Makra / makra IDE zabierze cię do edytora, a po ich zdefiniowaniu możesz skonfigurować skróty klawiaturowe za pomocą tego samego interfejsu, o którym wspomniałem powyżej. Wygenerowałem te makra korzystając z niezwykle poręcznego polecenia Record Temporary Macro, również w obszarze Tools / Macros. To polecenie pozwala nagrywać zestaw wejść klawiatury i odtwarzać je dowolną liczbę razy, co jest dobre do tworzenia zaawansowanych poleceń edycji, a także automatyzacji powtarzających się zadań (np. formatowanie kodu).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-24 05:40:56
Ostatnio zrobiłem to samo i przeniosłem się z Eclipse do Visual Studio, kiedy przeniosłem się do nowego projektu. The ReSharper add in jest wysoce zalecane - dodaje niektóre z bogatych funkcji edycji, nawigacji i refaktoryzacji, które eclipse musi VS.
Resharper pozwala również na użycie schematu mapowania klawiszy, który jest bardzo prosty w obsłudze. Bardzo przydatny dla Java escapees...
Odnośnie drugiego pytania, Resharper ma ten sam ruch kod up / down działa jako eclipse, , ale z pewnymi zastrzeżeniami . Po pierwsze, używając mapowania klawiatury InteliJ, kombinacja klawiszy jest dość kręta.
Przesuń kod w górę: ctrl + shift + alt + w górę kursor
Przesuń kod w dół: ctrl + shift + alt + kursor w dół
Po drugie, nie zawsze porusza się tylko o jedną linię, ale w rzeczywistości przeskakuje bloki kodu. Nie może więc przesunąć linii z zewnątrz instrukcji if do jej wnętrza-przeskakuje zaznaczona linia tuż nad blokiem if. Aby to zrobić, musisz przesunąć "w lewo" i "w prawo" używając
Przenieś kod do zewnętrznego bloku kodu: ctrl + shift + alt + lewy kursor
Przenieś kod do następnego wewnętrznego bloku kodu: ctrl + shift + alt + prawy kursor
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-25 15:54:18
Nagraj makro w visual studio, aby wykonać strzałkę alt:
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
Teraz możesz mapować to makro do dowolnego zestawu naciśnięć klawiszy, używając ide makr i preferencji klawiatury.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-24 05:33:22
Edit.LineTranspose, ale to nie działa, aby przesunąć linię... Oto makro do przesunięcia linii
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-20 16:14:02
Użyj rozszerzenia MoveLine, aby przesunąć linię (lub grupę linii) w górę lub w dół w VS 2010/2012.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-03 12:32:22
Nie wiem, czy VS obsługuje funkcje, o których mówisz natywnie, ale wiem, że wtyczka resharper pozwala przejść do poprzednich edycji za pomocą CTRL + SHIFT + BACKSPACE. Nie sądzę, że ma wsparcie dla przesuwania linii w górę iw dół tho (dobrze, że jeszcze nie znalazłem)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-24 07:09:38
Paweł Ostrowski Działa głównie ok.
Inną rzeczą, którą robi eclipse, jest przesunięcie linii do bieżącego poziomu wcięć.
Na przykład:
function test()
{
// do stuff
}
Console.WriteLine("test");
Robi shift-up na konsoli.writeline zmieni to na
function test()
{
// do stuff
Console.WriteLine("test");
}
Ale twoje narzędzie wydaje się to robić:
function test()
{
// do stuff
Console.WriteLine("test");
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-07 06:21:28