Снимок части файла в Vim: скрыть комментарии и пустые строки - PullRequest
6 голосов
/ 05 февраля 2011

Как временно показать снимок файла, скрывая комментарии и пустую строку?

Цель состоит в том, чтобы получить улов функции C ++ (например) при форматировании плотной страницы.

Способ сделать это - использовать глобальную команду для фильтрации строк комментариев

:g!/\/\/

но затем подсветка синтаксиса и элементы управления перемещением исчезают.

Функция сворачивания Vim - это способ выполнить эту работу, но он сводит только несколько последовательных комментариев к одной строке, которая навязчива.

В любом случае, сворачивание все еще полезно, чтобы скрыть длинные C-подобные комментарии, например, с помощью:

:set foldmethod=marker
:set foldmarker=/*,*/

Но мне не удалось легко сложить комментарии C (/.../) и C ++ (// ...) в одну команду.

Идеальный трюк будет :

  • скрыть (не просто сложить в одну строку) комментарии и пустые строки,
  • возможно, указать скрытые строки с символом в первом столбце,
  • обрабатывает комментарии C и C ++,
  • при сохранении подсветки синтаксиса,
  • и, в идеале, возможность просматривать код
  • позволяет легко вернуть , чтобы вернуться к «закомментированному» представлению.

Чтобы преобразовать следующий код:

/** Let say hello
* and do not forget anybody
*/
void hello( int arg )
{
  // OMG an hello world!
  std::cout << "hello" << std::endl;

} // where is the world?

В следующий буфер:

void hello( int arg )
{
  std::cout << "hello" << std::endl;
}

1 Ответ

4 голосов
/ 05 февраля 2011

Все комментарии можно удалить из источника с помощью следующей команды:
:%s/\/\*\_.\{-}\*\/\n\{,1}\|^\s*\/\/.*\n\|\s*\/\/.*//

Это можно затем отменить с помощью команды u, предполагая, что никакие другие действия отменены не будут.

Поскольку регулярные выражения vi могут быть чрезвычайно загадочными, ниже приводится объяснение каждой части.Все регулярное выражение разделено на три части, разделенные оператором ИЛИ (\|).

\/\*\_.\{-}\*\/\n\{,1}
Это соответствует блочным комментариям вида /* ... */.Он соответствует строке '/ *' (\/\*), за которой следует ноль или более любого символа, включая новую строку, но соответствует как можно меньшему количеству (\_.\{-}), за которым следует ноль или одна новая строка (\n\{,1}).Причина, по которой он соответствует нулю или одной новой строке, заключается в обработке как случая, когда код находится в той же строке, что и комментарий, так и случая, когда комментарий находится в отдельной строке.

^\s*\/\/.*\n Этосопоставлять комментарии формы //..., где комментарий находится на отдельной строке.Он соответствует нулю или нескольким пробельным символам, которые начинаются с начала строки (^\s*), за которой следует строка «//» (\/\/), затем ноль или более любого символа (.*), заканчивающегосяновая строка (\n).

\s*\/\/.* Соответствует комментариям в форме //..., где комментарий следует за кодом.Он соответствует любому количеству пробелов (\s*), за которым следует строка // (\/\/), а затем любое количество символов, не являющихся символом новой строки (.*).

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

Обновление: возможный способ просто «скрыть» комментарии может бытьокрасить их так же, как фон.Это сделало бы их невидимыми.Однако в настоящее время я не знаю, насколько осуществима эта идея или насколько хорошо она будет обобщена.Я не знаю достаточно о цветах в vim, чтобы написать скрипт для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...