Xcode дублікат рядка


127

Там єDuplicate команда в меню Edit (з по замовчуванням ярлика з D), але (як Галлей вказав) , призначений для дублювання в Interface Builder частини Xcode.

Отже, як ви ( легко ) дублюєте рядок у Xcode 4?


Пов’язане запитання (з робочою відповіддю) для Xcode 3 ... і яке не працює для Xcode 4.


Чому б просто не скопіювати та вставити?

Тому що це нудно і тягне за собою занадто багато ручної акробатики:

або (1) : перехід до початку рядка, а потім натискання ⇧^E, потім копіювання ⌘C, перехід до нового рядка, вирівнювання курсору і, нарешті, вставка ⌘V;

або (2) : ^A(встановити курсор на початок рядка), ^SPACE(встановити позначку), ^E(встановити курсор на закінчення рядка), ⇧^W( Select to Mark; настроювати), копіювати, новий рядок тощо.

Як сказав Френк Шредер (у відповідному питанні ):

Вся справа в тому, що НЕ використовувати ярлики Cmd-C / Cmd-V.


1
Виберіть рядок та скопіюйте пасту?
Дані

1
@Dani, CP - це занадто велика робота (а дублювання рядків - це не те, для чого виникає потреба лише рідко). :) Я оновив питання.
Блаз

1
Command-D призначений для дублювання керування в Interface Builder.
Хайлей

@Halley, це добре знати. І це еквівалент-перетягування миші (який також копіює елементи інтерфейсу)?
Блаз

@courteous Я так думаю. У розділі Ключі модифікатора в disanji.net/iOS_Doc/#documentation/DeveloperTools/Conceptual/… йдеться про те, що "натискання клавіші Option під час операцій перетягування копіює вибрані об'єкти, а не переміщення їх".
Хайлей

Відповіді:


173
  1. Перейдіть до цієї папки, яка містить темну сторону сили:

    • Xcode 4.2 або попередній: /Developer/Library/PrivateFrameworks/IDEKit.framework/Resources
    • Xcode 4.3 або більш пізня версія /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources.
  2. Відкрити IDETextKeyBindingSet.plist.

  3. Додайте новий словник та новий елемент команди як скріншот нижче (назвіть їх, що вам потрібно): Редагування списку

    Ось: selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:

  4. Перезапустіть Xcode та перейдіть до Налаштування - Ключові прив’язки, знайдіть свою команду.

  5. Встановіть комбінацію клавіш для команди: Основні прив'язки

  6. Нарешті розв’язав потужність прив’язки ключів на Xcode ... Насолоджуйтесь!


3
@MichalStefanow, місце, яке ви написали, - це фактично те саме місце, на яке /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resourcesвказує псевдонім. В іншому випадку я успішно виконую кроки Халлі у версії 4.3.2 ... Я пропоную вам створити резервну копію оригінального файлу, а потім відкрити його в самому Xcode (а не в TextEdit). Також щодо дозволів: зміна їх (лише для самого файлу; рекурсія не потрібна) у Finder працювала чудово.
Блаз

29
Великий подяк! Для ледачих користувачів - selectLine :, copy:, moveToEndOfLine:, insertNewline :, paste :, deleteBackward:
Влад Цепелєв

15
Якщо ваш xCode виходить з ладу! Закрийте xCode, відкрийте файл будь-яким текстовим редактором та додайте свій словник: <key>Custom</key> <dict> <key>Duplicate Current Line</key> <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string> </dict>
Влад Цепелєв

2
Для мене працює в XCode 4.4.1! У вас виникли проблеми із зміною дозволів (пошук або chmod 777 та початок із sudo з терміналу чомусь не спрацювали). Я скопіював файл десь в іншому місці, відредагував його та перезаписав оригінальний, який працював.
Ixx

2
Я Android Android, і коли я почав пробувати ios dev, я зрозумів, наскільки андроїд-студія (або ідея Intellij) хороша.
ІлляЕремін

90

Оновлення 2020 року

Працює і у версіях Xcode: 11.3.1

Працює у версіях Xcode: 7.1, 7.3, 7.3.1, 8.0, 8.1, 8.2, 8.3, 9.0, 9.1, 9.2, 10.0, 10.1, 10.2.1

Інструкція

  1. Надайте дозволи на редагування таких файлів. Більшу частину часу ОС не дозволить вам редагувати файли.

для версії 11.3.1

sudo chmod 666 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources//IDETextKeyBindingSet.plist

sudo chmod 777 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/

нижче 11.3 версії


sudo chmod 666 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist

sudo chmod 777 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/
  1. Відредагуйте файл, записавши таку команду: (Відкрийте його у піднесеному чи текстовому редакторі, якщо зможете)

за 11.3.1

open  

/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/

для наведених нижче версій

open /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist
  1. Додайте такі фрагменти xml:
<key>custom</key>
<dict>
    <key>Duplicate Current Line</key>
    <string>moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, moveToBeginningOfLine:, yank:</string>
    <key>Duplicate Lines</key>
    <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string>
    <key>Delete Line</key>
    <string>selectLine:, deleteBackward:</string>
</dict>

Скріншоти

введіть тут опис зображення

та Перезапустіть Xcode та перейдіть до Preferences - Key Bindingsпошуку команди, яку ми ввели (Копіювання ліній та копій поточного рядка).

введіть тут опис зображення

Це воно.

Для користувачів Unix слід зазначити:

sudo chmod 755 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/ 

Це працює як шарм! Я відредагував IDETextKeyBindingSet.plistі додав вищевказаний словник, а потім зіставив ключі в налаштуваннях XCode.
Рандіка Вішман

3
Ось відповіді ботаніків, які потребують користувачів Mac!
Лука Даванцо

1
Для XCode 10.1, я повинен був додати такий рядок: moveToBeginningOfLine:, deleteToEndOfLine:, смикати:, insertNewline:, setMark:, moveToBeginningOfLine:, selectToMark:, смикати: . Велика подяка @tmsimont
marcelosalloum

1
це перше, що я в будь-який час оновлюю Xcode Xbox.
newDeveloper

1
Це Рішення працює для мене, а не прийнята відповідь
халід

18

Гаразд, я придумав це:

Версія для XCode 11:

selectParagraph:, delete:, undo:, moveRight:, yankAndSelect:
  • не торкається буфера обміну
  • працює з декількома лініями
  • вибирає додані рядки, тому може бути використаний кілька разів без повторного вибору
  • фіксований вибір у XCode 11
  • краще працює з відміною

Оскільки я застосовую цю зміну після кожного оновлення XCode, я створив для цього сценарій. Можливо, це може завдати певної шкоди, але я намагався зробити це відносно безпечним. Він робить копію файлу, а потім замінює рядок його копією та додатковою командою за допомогою perl. Потрібен XCode для установки/Applications/Xcode.app

cp /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist ~/Desktop/IDETextKeyBindingSet.plist; sudo perl -pi -e 's/\<string\>selectWord:\<\/string>/'$'\<string\>selectWord:\<\/string\>\n\t\t\<key\>Duplicate Selection\<\/key\>\n\t\t\<string\>selectParagraph:, delete:, undo:, moveRight:, yankAndSelect:\<\/string>/g' /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist

Старіша версія (я не впевнений, чи сумісна нова із більш старими версіями, тому я її зберігатиму тут):

selectParagraph:, delete:, yank:, moveToBeginningOfLine:, setMark:, yank:, moveToBeginningOfLine:, moveLeft:, selectToMark:

та сценарій для старішої версії, щоб уникнути ручного редагування файлів:

cp /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist ~/Desktop/IDETextKeyBindingSet.plist; sudo perl -pi -e 's/\<string\>selectWord:\<\/string>/'$'\<string\>selectWord:\<\/string\>\n\t\t\<key\>Duplicate Selection\<\/key\>\n\t\t\<string\>selectParagraph:, delete:, yank:, moveToBeginningOfLine:, setMark:, yank:, moveToBeginningOfLine:, moveLeft:, selectToMark:\<\/string>/g' /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist

edit: незначне виправлення edit2: змінено на вибір абзацу edit3: додана версія для XCode 11


Дуже дякую за це, шукаючи це поєднання. Це може дублювати один рядок або кілька рядків без додавання небажаних newLines, а також ctrl-z працює добре.
mkeremkeskin

Дякую, саме це найближче до поведінки IntelliJ IMHO
OxyFlax

17

Сьогодні я написав дуже маленький плагін для Xcode 5, який видаляє та дублює рядки та виділення.

Ви можете завантажити його з мого репортажу GitHub: XcodeKit Plugin - https://github.com/ptfly/XcodeKit


Я щойно завантажив і встановив це - Ви можете скористатися системними налаштуваннями для встановлення комбінацій клавіш для команд. Дуже хороша!
Оріон Едвардс

Найкраще рішення, тому що це не порушить поточний буфер обміну. Щоб додати вкладиші клавіш: Налаштування системи -> клавіатура -> ярлики -> ярлики додатків -> '+'. Виберіть Xcode та назву меню, наприклад, "Видалити вибір / рядок"
Sjoerd Perfors

Я щойно це встановив. ДУЖЕ, чомусь моє "Дублікатне" меню під редагуванням затьмарене. Хоча я вибрав рядок у редакторі, курсор і спробував вибрати цілий рядок.
Джон Баллінгер

Це більш ніж приголомшливо. Дякую!
0x6A75616E

це не працює для мене. "Дублікат" затьмарений, і комбінація клавіш також не працюватиме.
SquareBox

13

@ Відповідь Гайлея була досить хорошою, але мала прикрий побічний ефект від розкрадання вмісту буфера обміну (залишаючи його заповненим вмістом дублюваного рядка), що є саме тією частиною підходу до копіювання / вставки, який я намагався уникнути. .

Отже, я змінив послідовність команд на це:

moveToBeginningOfLine:,
deleteToEndOfLine:,
yank:,
insertNewline:,
moveToBeginningOfLine:,
yank:

2- yank:х може не працювати за призначенням, якщо ви NSTextKillRingSizeщось відмовились 1, але я впевнений, що 1це за замовчуванням, і вам доведеться виконати якусь нетривіальну роботу, щоб змінити його (для цього потрібно додати запис ~/Library/Preferences/.GlobalPreferences.plist).


Я пропоную використовувати команду defaults write -g NSTextKillRingSize 1замість того, щоб грати з GlobalPreferences.plist. ;)
dbernard

@amas Ймовірно, вам доведеться скопіювати файл десь ще до того, як його змінити, а потім перезаписати вихідний файл, якщо ви не хочете ризикувати зміною дозволів у батьківській папці.
ніппонез

це майже працює, але чомусь додається пробіл у кінці дублюється рядка. Будь-яка ідея чому?
tmsimont

5
якщо це виправлено за допомогою цієї модифікації:moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, setMark:, moveToBeginningOfLine:, selectToMark:, yank:
tmsimont

Це має бути запропонована відповідь (дотримуючись посібника @ Hailei). Дякую!
brkeyal

9

Навіщо дублювати один рядок? Дублювати цілий абзац краще. Моя послідовність:

Дублікат поточного абзацу

selectParagraph:,
delete:,
yank:,
moveToBeginningOfParagraph:,
yank:,
moveUp:,
moveToEndOfParagraph:

Видалити поточний абзац

selectParagraph:,
delete:,
moveUp:,
moveToEndOfParagraph:

Добре працює в Xcode 4.6


Погоджено, маніпулювання параграфами перевершує рядки. Кожен, зробіть редактор достатньо вузьким, щоб обернути текст і спробувати використовувати рядкові команди.
Логан Мозелі

Наскільки маленьке ваше вікно, яке ви перегортаєте. Подумайте про розбиття коду на менші рядки, якщо це трапляється так часто.
пам’ятний

9

Мені цікаво, чому ніхто не згадав про використання разом із клавішами стрілок ( ) як для переміщення курсору, так і для вибору цілих рядків (додаванням ).

Я регулярно копіюю цілі рядки (дублікат), переміщуючи курсор на початок рядка, використовуючи + (замість ctrl+ A), а потім використовую + + (замість ctrl+ + E), щоб вибрати цілий рядок до кінця, а потім скопіювати / вставити.

Я зіткнувся з іншими потоками, де, здається, ніхто не використовує ці комбінації клавіш. Вони є глобальними в OS X, і я постійно їх використовую! Набагато менше ручної акробатики;)


Для цього потрібно набагато більше "ручної акробатики", ніж дублювання лише з 1 комбінацією дій / клавіш ... це спосіб копіювання тексту в текстовому редакторі чи веб-браузері, так, але я очікую трохи більше від IDE.
Ixx

1
А також за допомогою ярлика повторюваних рядків ви не перезаписуєте вміст буфера обміну. Я багато разів копіюю щось, дублюю код і хочу вставити його - при своєму методі вам доведеться скопіювати його знову.
Ixx

Ну так. Але менше способу, запропонованого ОП. Я можу погодитися, що найкраща була б одна команда. Я просто думав, що зазначу альтернативу.
Балдур

1
це все-таки краще, ніж нічого нестандартного. Я б хотів, щоб cmd + C / X без вибору просто скопіював / вирізав увесь рядок, як це роблять інші редактори ...
manroe

@Baldur Це я теж роблю. cmd + лівий cmd + зсув + правий cmd + c cmd + правий ввід cmd + лівий cmd + p. При 7 натисканнях клавіш це легко зробити за менше 3 секунд, однак це все ще досить втомливо щодо ctrl + d, як у багатьох текстових редакторах. Прикро, що це не вбудований у xcode або в загальному, що в програмному забезпеченні Mac та Apple немає кращих гарячих клавіш.
csga5000

9

EDIT: 12 липня 2020 р. Після оновлення до Xcode 11.5 мого duplicate lineключового запису з plistфайлу не було. Мені довелося його ще раз додати. Ключова прив'язка все ж була там.

EDIT: 17 вересня 2019 р. Після оновлення до Xcode 10.3 мого duplicate lineключового запису з plistфайлу не було. Мені довелося його ще раз додати. Ключова прив'язка все ж була там.

EDIT: 28 травня 2019 р. Після оновлення до Xcode 10.2 мого duplicate lineключового запису з plistфайлу не було. Мені довелося його ще раз додати. Ключова прив'язка все ж була там.

EDIT: 23 грудня 2018 р. Після оновлення до Xcode 10.1 всі мої ярлики знову зламалися. Але щось інше полягало в тому, що після оновлення файлу плистів для дублювання рядків мені не довелося визначати свої ключові прив’язки, вони вже були там. Дивно.

EDIT: 14 жовтня 2018 р. Xcode 10: Хтось високо в Apple дуже любить копіювати / вставляти, і гарантує, що з кожною версією оновлення Xcode дублювання рядків буде видалено з усієї установки. Ми, розробники, були надзвичайно засмучені цією нісенітницею, що триває в Xcode, з тих пір, єдиною IDE, що не має можливості дублювання рядків. Щойно я оновив Xcode 10, і, як ви здогадалися, всі мої клавіші швидкого доступу видаляються разом із функцією дублювання рядків. Однак це можна зафіксувати, як у оригінальній відповіді. Невелика різниця цього разу полягає в тому, що вам знадобиться наступний рядок:

<key>Duplicate Current Line</key>
<string>selectLine:, copy:, moveToBeginningOfLine:, paste:, moveToEndOfLine:</string>

EDIT: Xcode 9: Мені довелося переробити ярлики та копіювання рядків та видалення рядків, але добре, що тепер ви можете редагувати IDETextKeyBindingSet.plist знову. Цей високопоставлений хлопець Apple повинен бути у відпустці, коли випустив цю версію.

EDIT: Xcode 8: Баггі, ви не можете взагалі змінювати файл IDETextKeyBindingSet.plist. Xcode скидає його при запуску. Цей високопоставлений хлопець в Apple справді налаштований змусити нас використовувати копіювати / вставляти замість простого дублювання рядків, як у всіх інших IDE там.

EDIT: Xcode 7.1, і досі немає ярликів для дублювання та видалення рядків. Це єдиний IDE, з яким я коли-небудь працював, не маючи таких ярликів. І я не уявляю життя розробника без цих двох критичних ярликів.

Ось як це можна зробити:

Спочатку нам потрібно змінити файл-пліст, який знаходиться всередині пакета Xcode.app (для редагування потрібен sudo)

/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist

Потім шукайте <key>Insertions and Indentations</key>та під <dict>тегом додайте наступне:

<key>Insert New Line Below</key>
<string>moveToEndOfLine:, insertNewline:</string>
<key>Insert New Line Above</key>
<string>moveUp:, moveToEndOfLine:, insertNewline:</string>
<key>Duplicate Current Line</key>
<string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string>

Потім знайдіть те та це всередині розділу <key>Deletions</key>під <dict>тегом:

<key>Delete Current Line</key>
<string>selectLine:, delete:</string>
<string>selectLine:, delete:</string>

введіть тут опис зображення

Тепер відкрийте / перезапустіть Xcode, перейдіть до "Налаштування" та перейдіть на вкладку "Ключові прив'язки". Використовуйте панель пошуку для фільтрування та пошуку нових ярликів. Потім натисніть перед описом ярлика, щоб призначити йому ярлик за вашим уподобанням. Переконайтесь, що ваш ярлик не суперечить існуючим ярликам.

введіть тут опис зображення


3

Я б розглядав можливість перегляду послідовності команд для:

selectLine:,
copy:,
moveToEndOfLine:,
insertNewline:,
deleteToBeginningOfLine:,
paste:,
moveToBeginningOfLine:, 
deleteBackward:

Доданий deleteToBeginningOfLineпідтримує відступ дублюваного рядка.


Це спрацювало чудово, як тільки я зрозумів, що мені потрібно обмінятись (добре виглядаючими) новинками з пробілом після коми.
McUsr

2

insertLineBreak мені потрібен був принаймні для того, щоб зробити копію на новому рядку, без цього я не отримав копію в тому ж рядку


2

У мене виникли великі проблеми з розблокуванням .plist-файлів на MacOS Sierra та Xcode 9, навіть рішення @Tim не працювало для мене. Якщо у вас є така ж проблема, перейдіть до терміналу і зробіть це:

cd /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/
sudo chmod -R 777 *
nano IDETextKeyBindingSet.plist

Кілька інших можливих способів зробити це також описано тут .

Потім у наноредакторі натисніть ^Wта введіть "вставки", щоб перейти до частини "Вставки та відступи". Просто під <dict>тегом вставте цей XML-фрагмент:

<key>Duplicate line</key>
<string>selectLine:, copy:, moveToEndOfLine:, insertNewLine:, paste:, deleteBackward:</string>

Натисніть control + X, потім Y, Enterщоб зберегти файл у наноредакторі.

UPD: Я придумав краще рішення, яке додає додатковий рядок перед дублюванням (корисно, коли ви хочете дублювати рядок, який має інший рядок трохи нижче):

<key>Duplicate line</key>
<string>selectLine:, copy:, moveToEndOfLine:, insertLineBreak:, moveUp:, paste:, moveToBeginningOfLine:</string>

1

Ось мої записи видалення ( CTRL+ D) та дублювання ( CMD+ SHIFT+ D) з мого списку IDETextKeyBindingSet.plist. (у /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources)

Я просто встановив їх у Xcode 4.6.1 (на основі відповіді користувача570753 вище та в інших місцях)

    <key>Custimozed</key>
<dict>
    <key>Delete Current Line</key>
    <string>deleteToBeginningOfLine:, moveToEndOfLine:, deleteToBeginningOfLine:, deleteBackward:, moveDown:, moveToBeginningOfLine:</string>
    <key>Duplicate Current Line</key>
    <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, deleteToBeginningOfLine:, paste:, moveToBeginningOfLine:, deleteBackward:</string>
</dict>

0

Будь-які користувачі піднесеного тексту, які хотіли б відповідати duplicateLineUp і duplicateLineDown sublime у XCode, додайте наступне у свій файл IDETextKeyBindingSet.plist

<key>Line Duplications</key>
<dict>
    <key>Duplicate Current Line Above</key>
    <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:, moveUp:</string>
    <key>Duplicate Current Line Below</key>
    <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string>
</dict>

0

У випадку, якщо комусь іншому заборонено доступ до редагування IDETextKeyBindingSet.plist, ви можете надати собі дозволи на читання / запис:

sudo chmod 777 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist

0

Тільки для доповнення відповіді Гайлея командами, які найкраще працювали для мене, були:

selectLine:, copy:, moveRight:, moveLeft:, insertNewline:, paste:, deleteBackward:

Його запропоновані команди копіювали потрібний рядок на два рядки нижче.


0
<key>Duplicate Lines</key>    
<string>selectLine:, copy:, moveToBeginningOfLine:, paste:</string>

Підтримуються дублікати рядків (Це працює в Xcode 9.2)


0

Що стосується Xcode 11, то для мене нічого з цього не працювало. Перша відповідь мала дивну поведінку, оскільки вона вставляла рядок після наступного рядка. Наступна відповідь, однак, спрацювала для мене.

<key>Duplication</key>
<dict>
    <key>Duplicate Current Line</key>
    <string>moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, moveToBeginningOfLine:, yank:</string>
    <key>Duplicate Lines</key>
    <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string>
    <key>Delete Line</key>
    <string>selectLine:, deleteBackward:</string>
</dict>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.