Как поменять нечетные и четные строки в vi? - PullRequest
3 голосов
/ 27 октября 2019

Скажите, у меня есть такой код:

__device__ ​ float __cosf (float x);
//Calculate the fast approximate cosine of the input argument.
__device__ ​ float __exp10f (float x);
//Calculate the fast approximate base 10 exponential of the input argument.
__device__ ​ float __expf (float x);
//Calculate the fast approximate base e exponential of the input argument.
__device__ ​ float __fadd_rd (float x, float y);
//Add two floating point values in round-down mode.
__device__ ​ float __fadd_rn (float x, float y);
//Add two floating point values in round-to-nearest-even mode.
__device__ ​ float __fadd_ru (float x, float y);
//Add two floating point values in round-up mode.

Как я могу поменять четные и нечетные строки в vi?

Ответы [ 3 ]

2 голосов
/ 27 октября 2019

Вы можете определить ключ, который поменяет 2 строки: :map <F2> ddp<Down>

Кажется, что строки не так много, поэтому нажатие клавиши F2 несколько раз поменяет строки ...

2 голосов
/ 27 октября 2019

Вот быстрый и грязный трюк. В обычном режиме введите:

qaddpjq

… затем:

1000@a

Первая строка записывает макрос: qa начинает запись в макросе "a", dd удаляет текущийи сохраняет его в буфере по умолчанию, p помещает его обратно после текущей строки (ранее следующей), j переходит к следующей строке, затем q снова останавливает запись макросов.

Впоследствии, @a вызывает макрос, а 1000 повторяет его тысячу раз, поскольку мы не можем использовать здесь ни действие, основанное на движении, ни визуальный выбор.

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

1 голос
/ 27 октября 2019

Мой вывод

//Calculate the fast approximate cosine of the input argument.
__device__  float __cosf (float x);

//Calculate the fast approximate base 10 exponential of the input argument.
__device__  float __exp10f (float x);

//Calculate the fast approximate base e exponential of the input argument.
__device__  float __expf (float x);

//Add two floating point values in round-down mode.
__device__  float __fadd_rd (float x, float y);

//Add two floating point values in round-to-nearest-even mode.
__device__  float __fadd_rn (float x, float y);

//Add two floating point values in round-up mode.
__device__  float __fadd_ru (float x, float y);

Я сделал это одной командой в vi:

:%s/\(__device.*\n\)\(.*$\)/\2^M\1/g

Хотя есть один трюк. Чтобы ввести ^M, я нажал Ctrl-V , а затем нажал клавишу Enter.

Подробное объяснение:

В основном, чтобы заменить все совпадения чего-либо в команде vi:

%s/something/other/g

Вместо косой черты можно использовать любой символ. Так что

%s,something,other,g 

делает то же самое.

«что-то» - это то, что мы ищем, а «другое» - это замена.

В моем случае я искал слово »__device ", за которым следуют любые символы (.* обозначает« что-нибудь »), а затем оканчивается символом новой строки \n.

Я пометил части строки поиска, которые хочу использовать повторно, с помощью \( \).

Доллар означает «конец строки».

И затем я просто возвращаю все в обратном порядке с помощью \2 и \1.

, чтобы ввести новую строку. Я нажал Ctrl-V, а затем введите.

Я надеюсь, это объясняет. Обратите внимание, я использую vim, который расшифровывается как Vi Improved. Старая школа простой VI может не хватать некоторых функций. В большинстве Unix-систем в наши дни установка пакета "vim" сделает его доступным, когда его нет по умолчанию.

РЕДАКТИРОВАТЬ: На самом деле вы можете опустить знак доллара. .* в любом случае поиск выполняется только до конца строки. Но я думаю, что держу это в ответе, потому что иногда это нужно регулярному выражению, и это полезное знание.

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