Змініть два твердження на сусідні рядки в C, коли одне висловлювання займає кілька рядків

Припустимо, що у мене є такий код:

int x;
string s = "some very long "
           " string";

Я хотів би мати одну команду, яка обмінюється порядком цих, не закінчуючи щось на кшталт:

string s = "some very long"
int x;
           "string";

Чи є простий спосіб зробити це?

5
Чи допомагає C-M-t ( transpose-sexps )? Передбачається, але, можливо, це не в К.
додано Автор Ryan Eastabrook, джерело
Це може залежати від того, де ви кладете курсор. Не знаю, що Emacs вважає статевим в С. Можливо, це не дуже складно. Ви можете побачити, чи не допомагає який-небудь з інших команд transpose - * ( transpose-paragraph ?) Тут. У будь-якому випадку, ймовірно, є сторонні бібліотеки, які пропонують те, що ви запитуєте, і, сподіваюсь, хтось вам повідомить вас тут.
додано Автор Ryan Eastabrook, джерело
Я б запропонував: 1) виділити одне з тверджень; 2) "витащити" твердження; 3) "поставити" твердження у своєму новому місці. Коли ви створили макрос, який буде запускати з початку затвердження (початок рядка) до першої крапки з комою, потім додати функцію, щоб шукати наступну крапку з комою, а потім перейти назустріч новій рядку, а потім вставити. Тоді ви можете використовувати цей макрос для того, що хочете виконати. (мабуть, LOT швидше, просто виконуйте кроки за допомогою дій клавіатури та миші) Обов'язково збережіть цей макрос у файлі завантаження emacs
додано Автор Alexander Prokofyev, джерело
Ні, це робить щось дуже різне.
додано Автор Josh Belmont, джерело
Може бути, sp-transpose-hybrid-sexp docs від smartparens зробить це, принаймні, ви поставите круглу дугу навколо пари рядків.
додано Автор andrewb, джерело

2 Відповіді

Я рекомендую використовувати smartparens . Для мов, що не мають ліплення, вона має корисне поняття "гібридне s-вираз" . Його команда sp-transpose-hybrid-sexp не зовсім працює безпосередньо у вашому прикладі, але якщо ви готові загорнути ці два рядки в дужках, вона працює (також Emacs, схоже, робить відступ значно краще з доданою дужкою). Якщо ви запускаєте його в наступному тексті з точкою будь-якого місця, в якому string s = він буде правильно обміняти дві декларації:

int x;
string s = ("some very long "
            " string");
1
додано

anchored-transpose may be another option.

Прив'яжіть anchored-transpose до Cx t , тоді ви можете позначити перше твердження, натисніть Cx t , позначте другий вислів, натисніть Cx t , і ці два твердження замінюються. Здається, НЕ дуже зручно з першого погляду, тому краще використовувати його з іншими пакетами, які можуть швидко позначати заяви.

EDIT: я щойно зрозумів, що anchored-transpose не може бути гарним рішенням цього спеціального випадку. Якщо ви швидко позначите регіон, ви можете просто зробити C-w , щоб убити регіон, а потім вставити його. anchor-transposed має відповідати деяким більш загальним випадкам, коли не існує нічого подібного до sexp або statement , а лише випадкові тексти.

0
додано