# Дополнительные возможности редактирования

## Комментирование

Команды "Комментировать" и "Раскомментировать", которые доступны из меню Правка, позволяют добавить или убрать маркеры комментариев для выделенного блока текста (или для текущей строки, если текст не выделен), при условии, что комментарии поддерживаются форматом редактируемого текста.

Правила комментирования определяются синтаксисом; таким образом, если подсветка синтаксиса не включена, то команды "Закомментировать" и "Раскомментировать" будут недоступны.

Некоторые форматы поддерживают только однострочные маркеры комментариев, другие -- только многострочные, третьи -- и те, и другие. Если многострочные маркеры недоступны, то комментирование блока, в котором не до конца выделена последняя строка, будет невозможным.

Предпочтение отдается комментированию отдельных строк однострочными маркерами, если последние допустимы синтаксисом и если такое комментирование возможно -- это помогает избежать проблем со вложенными комментариями.

При удалении маркеров комментариев выделение снимается с раскомментированного текста. При удалении маркеров многострочного комментария пробелы снаружи маркеров игнорируются.

Чтобы закомментировать выделенный текст (или активную строку), выберите пункт менюПравка Закомментировать или нажмите соответствующее сочетание клавиш (по умолчанию &Ctrl;#).

Чтобы удалить маркеры комментариев, выберите пункт меню Правка Раскомментировать или нажмите соответствующее сочетание клавиш ( по умолчанию &Ctrl;&Shift;#).

## Команда правки

Этот инструмент доступен из меню Сервис Команда правки.... Он позволяет использовать небольшой набор vi/vim-подобных команд при редактировании текста. Это продвинутая возможность для продвинутых и опытных пользователей, но пусть это не пугает вас -- научитесь использовать этот мощный инструмент!

На текущий момент доступны следующие команды:

`time`

- Эта команда позволяет вставить текущее системное время в формате HH:MM:SS.

  Чтобы использовать ее, откройте диалоговое окно "Команда правки" и наберите слово `time` в строке ввода.

`char`

- Эта команда позволяет вставить символ по его числовому идентификатору в десятичной, восьмеричной или шестнадцатеричной системах счисления. Чтобы использовать ее, откройте диалоговое окно "Команда правки" и наберите `char: [number]` в строке ввода, после чего нажмите кнопку OK.

  ### Примеры использования команды `char`

  Введите: `char:234`

  Получите: `ê`

  Введите: `char:0x1234`

  Получите: `ê`

  Введите: `char:1232`

  Получите: `ê`

`s///[ig]` `%s///[ig]`

- "Типичный пользователь" при виде этих команд обязательно вздрогнет и начнет искать на клавиатуре кнопку "Windows". В самом деле, кому придет в голову искать текст подобным образом? Но вы же не "типичный"? Поэтому попробуем разобраться в этих двух sed-подобных командах. Первая выполняет поиск/замену в текущей строке, вторая -- во всем файле (`%s///`).

  Вкратце, команды производят поиск текста, заданного маской поиска -- регулярным выражением (т.н. regexp) между первым и вторым слешами, и при нахождении выполняет замену выражением, которое задано между вторым и третьим слешами. Круглые скобки в маске поиска позволяют задать обратные ссылки . Обратная ссылка -- это регулярное выражение, которое при совпадении заменяется на фактический текст и может быть использовано в маске замены. Чтобы использовать обратную ссылку в маске замены, в нужном месте поставьте бэк-слеш, а за ним номер обратной ссылки по порядку (`\1` -- для первой пары скобок, `\2` -- для второй, и т. д.).

  Чтобы найти сами символы-скобки `(` или `)`, нужно предварить их бэк-слешем: `\(\)`.

  По умолчанию поиск регистро-независимый. Чтобы он был регистро-зависимым, нужно в конце команды (после последнего слеша) добавить символ `i`.

  ### Замена текста в текущей строке

  Написав гигантский исходник, вы решили его откомпилировать. Но компилятор начал на вас ругаться: класс `myClass`, упомянутый в строке 3902, не определен.

  "Черт!", - думаете вы, -- "да это же мой класс `MyClass`". Вы добираетесь до строки 3902 и, вместо того, чтобы пытаться искать слово в этой длинной строке (а кто сейчас укладывает каждую строчку кода в 60 символов?), вы запускаете диалоговое окно "Команда правки", вводите `s/myclass/MyClass/i`, жмете OK, сохраняете и компилируйте -- успешно и без ошибок.

  ### Замена текста во всем файле

  Представьте себе, что у вас есть файл, в котором вы несколько раз упоминаете некоего человека по имени госпожа Иванова. Но вдруг вам сообщают, что эта самая госпожа Иванова вчера вышла замуж за господина с редкой фамилией Петров. Естественно, вам нужно заменить все упоминания о госпоже Ивановой на текст госпожа Петрова.

  Откройте диалоговое окно "Команда правки" и наберите в строку ввода следующий текст: `%s/госпожа Иванова/госпожа Петрова/` -- и ваша работа сделана.

  ### Более сложный пример

  Этот пример показывает, как пользоваться обратными ссылками и классами слов (кто не знает, что это такое, советую ознакомиться с приведенными ниже разделами).

  Допустим, у вас набрана такая строка:

      void MyClass::DoStringOps( String      &foo, String &bar String *p, int  &a, int &b )

  Теперь вы думаете, что это недостаточно "красивый" код, и решаете, что вам нужно использовать спецификатор `const` с параметрами, заданными ссылкой (теми, перед которыми стоит амперсанд). Вы также хотите свернуть все пробелы, чтобы между каждым словом был всего один пробел.

  Запустите диалоговое окно "Команда правки" и наберите: `s/\s+(\w+)\s+(&)/ const \1 \2/g`, и не забудьте нажать кнопку OK -- иначе ничего не выйдет. Символ `g` в конце команды указывает компилятору "пересчитывать" регулярное выражение обратной ссылки каждый раз, когда встречаются совпадения.

  Вывод: `void MyClass::DoStringOps( const String &foo, const String &bar String *p, const int &a, const int &b )`

  Миссия завершена! Ну, и что же произошло? Мы искали некоторое количество пробелов (`\s+`), за которыми идут несколько алфавитных символов (`\w+`), следом за ними опять несколько пробелов (`\s+`), после которых стоит амперсанд, и по ходу дела сохраняли эти алфавитные символы и амперсанд для использования их в операции замены. После этого мы заменили совпадающие части строки следующей последовательностью: один пробел, за которым идет спецификатор const, за ним еще один пробел, после которого наши сохраненные символы (`\1`), еще один пробел и сохраненный амперсанд (`\2`).

  В одном случае алфавитные символы составили слово String, в другом -- слово int, т.е. символьный класс `\w` с последующим знаком `+` определяет символьный набор произвольной длины.

Это очень мощный инструмент, и, хотя его действие может быть отменено вызовом команды Отменить действие, я все же советую немного попрактиковаться, прежде чем использовать команду "всерьез" (если, конечно, вы не знакомы с регулярными выражениями sed или Perl).