Вы можете сохранить строку, начиная с конца. Поскольку вы, кажется, уже знаете maxSize ...
Так что в основном, если файл первоначально был (foo.txt)
[] [] [] [] [] [f] [o] [o] [.] [t] [x] [t] [\0]
^
|
lastEmpty
Теперь, если вы добавите родительский каталог a / it, он будет
[] [] [] [a] [/] [f] [o] [o] [.] [t] [x] [t] [\0]
^
|
lastEmpty
Таким образом, код будет выглядеть примерно так (могут быть ошибки, но вы получаете идею).
char temp[LENGTH], file[LENGTH];
int lastEmpty = put_at_end(some_file_name, file);
// lastEmpty points to right most empty slot
while (some_condition) {
parent_dir = some_calculation_that_yields_name_of_parent_dir;
int len = strlen(parent_dir);
char *tmp = parent_dir + len -1;
while (lastEmpty > 0) {
file[lastEmpty] = *tmp;
lastEmpty --;
tmp--;
}
}
Так как я предполагаю, что мы могли бы ожидать, что parent_dir будет быть маленьким, перебирать его дважды должно быть хорошо. Если вы хотите передать строку файла, вы можете просто использовать file+lastEmpty+1
.
Ctrl + D
Ctrl + D
(изменить) Эта функция теперь встроена в VS2017: Ctrl + E , V дублирует строку, если ничего не выбрано, или дублирует выделение. Вы можете назначить его другой комбинации клавиш или найти в меню:
См. этот справочник для получения дополнительной информации.
Как упоминалось в @cand, вы можете просто выполнить Ctrl + C ; Ctrl + V .
Ctrl + C скопирует строку, если ничего не выбрано.
Если вы хотите реализовать более полное решение, например, создать более простую комбинацию клавиш или вы не хотите использовать буфер обмена, см. Это руководство:
Дублировать строка для Visual Studio
Visual Basic:
Импортирует систему Импортирует EnvDTE Импортирует EnvDTE80 Импортирует System.Diagnostics Общедоступный Модуль DuplicateLastLineModule Sub DuplicateLine () Размыть строку как строку DTE.ActiveDocument.Selection.StartOfLine (0) DTE.ActiveDocument.Selection.EndOfLine (True) line = DTE.ActiveDocument.Selection.Text DTE.ActiveDocument.Selection.EndOfLine () DTE.ActiveDocument.Selection.NewLine () DTE.ActiveDocument.Selection.StartOfLine (0) DTE.ActiveDocument.Selection.Text = line {{1} } End Sub End Module
Чтобы создать макрос, просто перейдите в проводник макросов («Инструменты-> Макросы-> Обозреватель макросов» или Alt + F8 ) и скопируйте и вставьте код в новый модуль. Теперь просто назначьте ему сочетание клавиш:
- перейдите в Инструменты-> Параметры ...
- в разделе «Среда» нажмите «Клавиатура»
- в текстовом поле «Показать команды, содержащие», введите «дубликат» (согласно имя, которое вы дали модулю.)
- теперь вы должны увидеть макрос в списке ниже
- выберите «Текстовый редактор» из списка «Использовать новый ярлык в»
- установите фокус в текстовом поле «Нажимать сочетания клавиш» и нажмите комбинацию на клавиатуре, которую вы хотите использовать ( Ctrl + Shift + D в моем случае)
- нажмите Нажмите кнопку «Назначить»
- . Теперь вы должны увидеть ярлык в текстовом поле «Ярлыки для выбранной команды»
- , нажмите кнопку OK
И все. Наслаждаться!
Для Visual Studio 2019 :
сочетания клавиш меню Edit с: ctrl + k и ctrl + s Редактирование
"Копируют Строку" ( Сдвиг + Высокий звук + DownArrow ) к Вашему Вашему собственному ярлыку.
можно найти его с командой ID: editor.action.copyLinesDownAction
Для меня, Это ctrl + d
Это просто Ctrl + C ; Ctrl + V , проверьте это ссылка . Пока вы не выделяете какой-либо текст, это будет дублировать строку, над которой находится курсор, когда вы нажимаете Ctrl + C .
Если вам нравится дублирование строки (или блока) в стиле затмения, используя CTRL + ALT + UP или CTRL + ВВЕРХ + ВНИЗ , ниже я выкладываю макросы для этой цели:
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Public Module DuplicateLineModule
Sub DuplicateLineDown()
Dim selection As TextSelection = DTE.ActiveDocument.Selection
Dim lineNumber As Integer
Dim line As String
If selection.IsEmpty Then
selection.StartOfLine(0)
selection.EndOfLine(True)
Else
Dim top As Integer = selection.TopLine
Dim bottom As Integer = selection.BottomLine
selection.MoveToDisplayColumn(top, 0)
selection.StartOfLine(0)
selection.MoveToDisplayColumn(bottom, 0, True)
selection.EndOfLine(True)
End If
lineNumber = selection.TopLine
line = selection.Text
selection.MoveToDisplayColumn(selection.BottomLine, 0)
selection.EndOfLine()
selection.Insert(vbNewLine & line)
End Sub
Sub DuplicateLineUp()
Dim selection As TextSelection = DTE.ActiveDocument.Selection
Dim lineNumber As Integer
Dim line As String
If selection.IsEmpty Then
selection.StartOfLine(0)
selection.EndOfLine(True)
Else
Dim top As Integer = selection.TopLine
Dim bottom As Integer = selection.BottomLine
selection.MoveToDisplayColumn(top, 0)
selection.StartOfLine(0)
selection.MoveToDisplayColumn(bottom, 0, True)
selection.EndOfLine(True)
End If
lineNumber = selection.BottomLine
line = selection.Text
selection.MoveToDisplayColumn(selection.BottomLine, 0)
selection.Insert(vbNewLine & line)
selection.MoveToDisplayColumn(lineNumber, 0)
End Sub
End Module
Не ответ, а просто полезное дополнение: В качестве халявы я только что придумал (ну... эээ... подправил код, опубликованный Лоло) макрос RemoveLineOrBlock. Наслаждайтесь!
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics
Public Module RemoveLineOrBlock
Sub RemoveLineOrBlock()
Dim selection As TextSelection = DTE.ActiveDocument.Selection
Dim lineNumber As Integer
Dim line As String
If selection.IsEmpty Then
selection.StartOfLine(0)
selection.EndOfLine(True)
Else
Dim top As Integer = selection.TopLine
Dim bottom As Integer = selection.BottomLine
selection.MoveToDisplayColumn(top, 0)
selection.StartOfLine(0)
selection.MoveToDisplayColumn(bottom, 0, True)
selection.EndOfLine(True)
End If
selection.LineDown(True)
selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn,True)
selection.Delete()
selection.MoveToDisplayColumn(selection.BottomLine, 0)
selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText)
End Sub
End Module