Помощь новичкам

Ваш Ctrl+/ у меня не работает. Поэтому его нигде и нет

А это, наверное, магия:

У вас хоть клавиатура qwerty? А то на всяких макбуках эта комбинация вообще по-другому выглядит.

Клавиша слеша о которой я говорю, если что, имеет виртуальный код 191 (0xBF).

Для справки: есть клавиатура qwertz. Например, в ней z и y обменяны местами.

editactions[Keys.Divide | Keys.Control] = new ToggleComment();

Ясно… Да, работает

Ну в сущности все

editactions[Keys.Left] = new CaretLeft();
			editactions[Keys.Left | Keys.Shift] = new ShiftCaretLeft();
			editactions[Keys.Left | Keys.Control] = new WordLeft();
			editactions[Keys.Left | Keys.Control | Keys.Shift] = new ShiftWordLeft();
			editactions[Keys.Right] = new CaretRight();
			editactions[Keys.Right | Keys.Shift] = new ShiftCaretRight();
			editactions[Keys.Right | Keys.Control] = new WordRight();
			editactions[Keys.Right | Keys.Control | Keys.Shift] = new ShiftWordRight();
			editactions[Keys.Up] = new CaretUp();
			editactions[Keys.Up | Keys.Shift] = new ShiftCaretUp();
			editactions[Keys.Up | Keys.Control] = new ScrollLineUp();
			editactions[Keys.Down] = new CaretDown();
			editactions[Keys.Down | Keys.Shift] = new ShiftCaretDown();
			editactions[Keys.Down | Keys.Control] = new ScrollLineDown();
			
			editactions[Keys.Insert] = new ToggleEditMode();
			editactions[Keys.Insert | Keys.Control] = new Copy();
			editactions[Keys.Insert | Keys.Shift] = new Paste();
			editactions[Keys.Delete] = new Delete();
			editactions[Keys.Delete | Keys.Shift] = new Cut();
			editactions[Keys.Home] = new Home();
			editactions[Keys.Home | Keys.Shift] = new ShiftHome();
			editactions[Keys.Home | Keys.Control] = new MoveToStart();
			editactions[Keys.Home | Keys.Control | Keys.Shift] = new ShiftMoveToStart();
			editactions[Keys.End] = new End();
			editactions[Keys.End | Keys.Shift] = new ShiftEnd();
			editactions[Keys.End | Keys.Control] = new MoveToEnd();
			editactions[Keys.End | Keys.Control | Keys.Shift] = new ShiftMoveToEnd();
			editactions[Keys.PageUp] = new MovePageUp();
			editactions[Keys.PageUp | Keys.Shift] = new ShiftMovePageUp();
			editactions[Keys.PageDown] = new MovePageDown();
			editactions[Keys.PageDown | Keys.Shift] = new ShiftMovePageDown();
			
			editactions[Keys.Return] = new Return();
			editactions[Keys.Tab] = new Tab();
			editactions[Keys.Tab | Keys.Shift] = new ShiftTab();
			editactions[Keys.Back] = new Backspace();
			editactions[Keys.Back | Keys.Shift] = new Backspace();
			
			editactions[Keys.X | Keys.Control] = new Cut();
			editactions[Keys.C | Keys.Control] = new Copy();
			editactions[Keys.V | Keys.Control] = new Paste();
			
			editactions[Keys.A | Keys.Control] = new SelectWholeDocument();
			editactions[Keys.Escape] = new ClearAllSelections();
			
			editactions[Keys.Divide | Keys.Control] = new ToggleComment();
			editactions[Keys.OemQuestion | Keys.Control] = new ToggleComment();
			
			editactions[Keys.Back | Keys.Alt]  = new Actions.Undo();
			editactions[Keys.Z | Keys.Control] = new Actions.Undo();
			editactions[Keys.Y | Keys.Control] = new Redo();
			
			editactions[Keys.Delete | Keys.Control] = new DeleteWord();
			editactions[Keys.Back | Keys.Control]   = new WordBackspace();
			editactions[Keys.D | Keys.Control]      = new DeleteLine();
			editactions[Keys.D | Keys.Shift | Keys.Control]      = new DeleteToLineEnd();
			
			editactions[Keys.B | Keys.Control]      = new GotoMatchingBrace();

Надо в справке написать

2 лайка

У меня больше.

Ctrl+I runs the IIndentationStrategy on the selected lines (or the whole document if the selection is empty).
Ctrl+Backspace deletes the previous word.
Ctrl+Delete deletes the next word (у меня не работает).
F3 finds the next occurrence in the file.
Shift+F3 finds the previous occurrence in the file.
Esc closes the SearchPanel.
Ctrl+S saves the file.

editactions[Keys.Space | Keys.Control] = new CodeCompletionAllNamesAction();
editactions[Keys.Space | Keys.Shift] = new CodeCompletionNamesOnlyInModuleAction();
editactions[Keys.Enter | Keys.Control] = new GotoAction();
editactions[Keys.LButton | Keys.Control] = new GotoAction();
editactions[Keys.C | Keys.Shift | Keys.Control] = new ClassOrMethodRealizationAction();
editactions[Keys.Space | Keys.Shift | Keys.Control] = new VirtualMethodsAction();
editactions[Keys.I | Keys.Shift | Keys.Control] = new GenerateMethodImplementationHeadersAction();
editactions[Keys.F5 | Keys.Control] = new AddToWatchAction();
editactions[Keys.F | Keys.Shift | Keys.Control] = new CodeFormattingAction();
editactions[Keys.Control | Keys.Y] = new ICSharpCode.TextEditor.Actions.DeleteLine();
editactions[Keys.Escape] = new HideBottomTabs();

editactions[Keys.Space | Keys.Control] = null;
editactions[Keys.Space | Keys.Shift] = null;
editactions[Keys.Enter | Keys.Control] = null;
editactions[Keys.LButton | Keys.ControlKey] = null;
editactions[Keys.C | Keys.Shift | Keys.Control] = null;
editactions[Keys.Space | Keys.Shift | Keys.Control] = null;
editactions[Keys.I | Keys.Shift | Keys.Control] = null;
editactions[Keys.F5 | Keys.Control] = null;
editactions[Keys.Control | Keys.Y] = null;
editactions[Keys.Escape] = null;

editactions[Keys.Enter] = new ImmediateEvaluateAction();

CommandBindings.Add(new CommandBinding(ApplicationCommands.Delete, OnDelete(ApplicationCommands.NotACommand), CanDelete));
AddBinding(EditingCommands.Delete, ModifierKeys.None, Key.Delete, OnDelete(EditingCommands.SelectRightByCharacter));
AddBinding(EditingCommands.DeleteNextWord, ModifierKeys.Control, Key.Delete, OnDelete(EditingCommands.SelectRightByWord));
AddBinding(EditingCommands.Backspace, ModifierKeys.None, Key.Back, OnDelete(EditingCommands.SelectLeftByCharacter));
InputBindings.Add(TextAreaDefaultInputHandler.CreateFrozenKeyBinding(EditingCommands.Backspace, ModifierKeys.Shift, Key.Back)); // make Shift-Backspace do the same as plain backspace
AddBinding(EditingCommands.DeletePreviousWord, ModifierKeys.Control, Key.Back, OnDelete(EditingCommands.SelectLeftByWord));
AddBinding(EditingCommands.EnterParagraphBreak, ModifierKeys.None, Key.Enter, OnEnter);
AddBinding(EditingCommands.EnterLineBreak, ModifierKeys.Shift, Key.Enter, OnEnter);
AddBinding(EditingCommands.TabForward, ModifierKeys.None, Key.Tab, OnTab);
AddBinding(EditingCommands.TabBackward, ModifierKeys.Shift, Key.Tab, OnShiftTab);

editactions[Keys.Left] = new CaretLeft();
editactions[Keys.Left | Keys.Shift] = new ShiftCaretLeft();
editactions[Keys.Left | Keys.Control] = new WordLeft();
editactions[Keys.Left | Keys.Control | Keys.Shift] = new ShiftWordLeft();
editactions[Keys.Right] = new CaretRight();
editactions[Keys.Right | Keys.Shift] = new ShiftCaretRight();
editactions[Keys.Right | Keys.Control] = new WordRight();
editactions[Keys.Right | Keys.Control | Keys.Shift] = new ShiftWordRight();
editactions[Keys.Up] = new CaretUp();
editactions[Keys.Up | Keys.Shift] = new ShiftCaretUp();
editactions[Keys.Up | Keys.Control] = new ScrollLineUp();
editactions[Keys.Down] = new CaretDown();
editactions[Keys.Down | Keys.Shift] = new ShiftCaretDown();
editactions[Keys.Down | Keys.Control] = new ScrollLineDown();

editactions[Keys.Insert] = new ToggleEditMode();
editactions[Keys.Insert | Keys.Control] = new Copy();
editactions[Keys.Insert | Keys.Shift] = new Paste();
editactions[Keys.Delete] = new Delete();
editactions[Keys.Delete | Keys.Shift] = new Cut();
editactions[Keys.Home] = new Home();
editactions[Keys.Home | Keys.Shift] = new ShiftHome();
editactions[Keys.Home | Keys.Control] = new MoveToStart();
editactions[Keys.Home | Keys.Control | Keys.Shift] = new ShiftMoveToStart();
editactions[Keys.End] = new End();
editactions[Keys.End | Keys.Shift] = new ShiftEnd();
editactions[Keys.End | Keys.Control] = new MoveToEnd();
editactions[Keys.End | Keys.Control | Keys.Shift] = new ShiftMoveToEnd();
editactions[Keys.PageUp] = new MovePageUp();
editactions[Keys.PageUp | Keys.Shift] = new ShiftMovePageUp();
editactions[Keys.PageDown] = new MovePageDown();
editactions[Keys.PageDown | Keys.Shift] = new ShiftMovePageDown();

editactions[Keys.Return] = new Return();
editactions[Keys.Tab] = new Tab();
editactions[Keys.Tab | Keys.Shift] = new ShiftTab();
editactions[Keys.Back] = new Backspace();
editactions[Keys.Back | Keys.Shift] = new Backspace();

editactions[Keys.X | Keys.Control] = new Cut();
editactions[Keys.C | Keys.Control] = new Copy();
editactions[Keys.V | Keys.Control] = new Paste();

editactions[Keys.A | Keys.Control] = new SelectWholeDocument();
editactions[Keys.Escape] = new ClearAllSelections();

editactions[Keys.Divide | Keys.Control] = new ToggleComment();
editactions[Keys.OemQuestion | Keys.Control] = new ToggleComment();

editactions[Keys.Back | Keys.Alt]  = new Actions.Undo();
editactions[Keys.Z | Keys.Control] = new Actions.Undo();
editactions[Keys.Y | Keys.Control] = new Redo();

editactions[Keys.Delete | Keys.Control] = new DeleteWord();
editactions[Keys.Back | Keys.Control]   = new WordBackspace();
editactions[Keys.D | Keys.Control]      = new DeleteLine();
editactions[Keys.D | Keys.Shift | Keys.Control]      = new DeleteToLineEnd();

editactions[Keys.B | Keys.Control]      = new GotoMatchingBrace();

InputBindings.Add(TextAreaDefaultInputHandler.CreateFrozenKeyBinding(EditingCommands.Backspace, ModifierKeys.Shift, Key.Back)); // make Shift-Backspace do the same as plain backspace
gotoDefinitionItem.InputGestureText = new KeyGesture(Key.Enter, ModifierKeys.Control).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);

if (e.Key == Key.Tab && isCtrlDown) ShowNavigatorWindow();
case Keys.Right:
    txtSnippet.Caret.Goto(txtSnippet.Caret.Position + 1);
    break;
case Keys.Left:
    txtSnippet.Caret.Goto(txtSnippet.Caret.Position - 1);
    break;
case Keys.Enter:
case Keys.Tab:
    if (txtSnippet.AutoComplete.SelectedIndex >= 0)
        txtSnippet.AutoComplete.Accept();
    break;
case Keys.Escape:
    Hide();
    break;

txtSnippet.Commands.AddBinding(Keys.Delete, Keys.None, BindableCommand.Clear);
txtSnippet.Commands.AddBinding(Keys.Back, Keys.None, BindableCommand.DeleteBack);
txtSnippet.Commands.AddBinding('Z', Keys.Control, BindableCommand.Undo);
txtSnippet.Commands.AddBinding('Y', Keys.Control, BindableCommand.Redo);
txtSnippet.Commands.AddBinding('X', Keys.Control, BindableCommand.Cut);
txtSnippet.Commands.AddBinding('C', Keys.Control, BindableCommand.Copy);
txtSnippet.Commands.AddBinding('V', Keys.Control, BindableCommand.Paste);
txtSnippet.Commands.AddBinding('A', Keys.Control, BindableCommand.SelectAll);

txtSnippet.Commands.AddBinding(Keys.Down, Keys.None, BindableCommand.LineDown);
txtSnippet.Commands.AddBinding(Keys.Up, Keys.None, BindableCommand.LineUp);

void SearchLayerKeyDown(object sender, KeyEventArgs e)
{
	switch (e.Key) {
case Key.Enter:
	e.Handled = true;
	messageView.IsOpen = false;
	if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
FindPrevious();
	else
FindNext();
	if (searchTextBox != null) {
var error = Validation.GetErrors(searchTextBox).FirstOrDefault();
if (error != null) {
	messageView.Content = Localization.ErrorText + " " + error.ErrorContent;
	messageView.PlacementTarget = searchTextBox;
	messageView.IsOpen = true;
}
	}
	break;
case Key.Escape:
	e.Handled = true;
	Close();
	break;
	}
}

Но я всё равно нашёл не всё! Поэтому я не люблю искать горячие клавиши в исходном коде. В этом ещё нужно искать:

  1. https://github.com/pascalabcnet/pascalabcnet/blob/553e7fbd2481c60d785e9a4a3833e18fed903a24/Libraries/AvalonDock/AvalonDock/ManagedContent.cs
  2. https://github.com/pascalabcnet/pascalabcnet/blob/553e7fbd2481c60d785e9a4a3833e18fed903a24/Utils/NodesGeneratorNew/Scintilla/Sources/ScintillaNET/Configuration/ConfigurationManager.cs
  3. https://github.com/pascalabcnet/pascalabcnet/blob/553e7fbd2481c60d785e9a4a3833e18fed903a24/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretNavigationCommandHandler.cs
  4. https://github.com/pascalabcnet/pascalabcnet/blob/553e7fbd2481c60d785e9a4a3833e18fed903a24/Utils/NodesGeneratorNew/Scintilla/Sources/ScintillaNET/Commands.cs
  5. https://github.com/pascalabcnet/pascalabcnet/search?q=KeyBinding&unscoped_q=KeyBinding
  6. https://github.com/pascalabcnet/pascalabcnet/search?q=AddKeyDownHandler&unscoped_q=AddKeyDownHandler
  7. https://github.com/pascalabcnet/pascalabcnet/search?q=OnPreviewKeyDown&unscoped_q=OnPreviewKeyDown
  8. https://github.com/pascalabcnet/pascalabcnet/search?q=OnKeyDown&unscoped_q=OnKeyDown
  9. https://github.com/pascalabcnet/pascalabcnet/search?q=switch+(e.KeyCode)&unscoped_q=switch+(e.KeyCode)

Я могу что-то пропустить. Разработчики лучше знают исходный код, пускай ищут (если захотят добавить список горячих клавиш).

2 лайка

Чем отличаются https://github.com/pascalabcnet/pascalabcnet/blob/e603b1fd6dcb7c4c0f361a6fade6913daee8eec7/VisualPascalABCNET/DockContent/CodeFileDocumentTextEditorControl.cs#L21 и https://github.com/pascalabcnet/pascalabcnet/blob/e603b1fd6dcb7c4c0f361a6fade6913daee8eec7/VisualPascalABCNET/DockContent/CodeFileDocumentTextEditorControl.cs#L68 (почему в последнем блокируются горячие клавиши и работает только editactions[Keys.Enter] = new ImmediateEvaluateAction();)?

Потому что это окно Immediate. Но его нет в релизе, потому что оно не реализовано.

Ctrl + Delete не работает. Видимо, пересекается с очисткой окна вывода, которое поставлено на эту же комбинацию.

Есть ли подобное в стандартных подпрограммах? https://realadmin.ru/coding/sklonenie-na-javascript.html

Нет. И думаю, что никогда не будет. Чисто пользовательская функция, такое никогда в стандартные библиотеки универсальных языков программирования не включают. Код есть, напишите, сделайте свой модуль библиотечный и пользуйтесь.

Что за буфер, для вывода и изменения которого используются Console.BufferHeight и Console.BufferWidth? Я понял. Видимо, это количество строк и столбцов соответственно в окне консоли (начинаются с нуля).

Насколько я понял, невозможно удалить определённое слово из окна консольного приложения, как в текстовом редакторе, а можно только перезаписать одинаковым количеством символов, например, превратить “Человек в жёлто-зелёной одежде зашёл в здание.” в “Человек в красной одежде зашёл в здание.”, неправда ли?

В модуле CRT есть подпрограмма ClearLine, которая перезаписывает строку пробелами. Я хотел бы сделать подпрограмму RepalceOutputFromPosition(a, b:integer; c: string), которая заменяет a символов из окна консольного приложения, начиная с ПоложениеКурсора - b, на строку c, но я не знаю, как сделать то, что написано в комментарии, и как сделать, чтобы считались символы, а не строки полностью.

Подобное уже есть в стандартных подпрограммах?

Исходный код моей подпрограммы:

procedure RepalceOutputFromPosition(a, b: integer; c: string);
begin
  if (a < 0) then raise new System.ArgumentException('a < 0');
  if (b < 0) then raise new System.ArgumentException('b < 0');
  var НачальноеCursorTop := Console.CursorTop;
  while (Console.CursorLeft - b < 0) do
  begin
    НачальноеCursorTop -= 1;
    b -= (Console.CursorLeft + 1);
    Console.CursorLeft := Console.BufferWidth - 1;
  end;
  Console.CursorLeft -= b;
  var УдалитьСCursorLeft := Console.CursorLeft;
  var УдалитьСCursorTop := Console.CursorTop;
  var ТекстПослеКонцаУдаления := // Скопировать текст, выведенный от НачальноеCursorLeft и НачальноеCursorTop до УдалитьСCursorLeft и УдалитьСCursorTop
  Console.Write(c);
  Delete(ТекстПослеКонцаУдаления, 1, a);
  Console.Write(ТекстПослеКонцаУдаления);
end;

Работает:

procedure RepalceOutputFromPosition(a, b: integer; c: string);
begin
  Console.CursorLeft -= b;
  var ТекстПослеКонцаУдаления := ('голубой лентой.');
  Console.Write(c);
  Delete(ТекстПослеКонцаУдаления, 1, a);
  Console.Write(ТекстПослеКонцаУдаления);
end;

begin
  Write('Красно-коричневый шарф с голубой лентой.');
  RepalceOutputFromPosition(7, 15, 'жёлтой');
end.

Как открыть текстовый файл, записать туда что-либо дальше, закрыть файл? Пример:

Есть текстовый файл по пути “ПутьКФайлу”. В нём содержится следующий текст:

Текст.

Произошёл вызов подпрограммы ПодпрограммаДляNВФайлПоПути(ПутьКФайлу, ЧтоЗаписать: string). Результат:

N = Write:

Текст.ЧтоЗаписать

N = Writeln;

Текст.ЧтоЗаписать
(Новая строка.)

N = Print;

Текст.ЧтоЗаписать

N = Println;

Текст.ЧтоЗаписать 
(Новая строка.)

Посмотрите для начала на статичные свойства классов в System.IO, в частности класса System.IO.File. Основы ввода-вывода надо знать, а не по первому поводу спрашивать.

Как получить в виде строки весь текст, выведенный в окно консольного приложения?

Без глубокого закапывания в WinAPI консоли - никак. Символы выведенные в консоль в принципе не хранятся в виде строки. Вместо этого там таблица с элементами, хранящими символ + кучу информации типа цвета. Короче это всё принципиально не предназначено для чтения как строки. Сохраняйте то что вывели в своих структурах.

Я хочу иметь возможность удалить или заменить некоторые символы в тексте, выведенном в окно консольного приложения. Если бы можно было легко получить в виде строки весь текст, выведенный в окно консольного приложения, я бы просто изменил строку, выполнил Console.Clear, вывел строку.

То есть мне нужно при каждом выводе прибавлять к переменной типа string выведенный текст?

Как как, а так реализовывать точно не нужно. Каждое изменение строки создаёт новую строку. Для строк размером с буфер консоли - добавление 1 символа может уже создавать значительную задержку.

Лучше, к примеру, опишите класс-блок текста, хранящий своё положение на экране и методы для изменения текста в нём и т.п.

Как использовать https://docs.microsoft.com/en-US/windows/console/readconsoleoutputcharacter в программе?