Xcode duplicate line

В меню редактирования есть команда Duplicate (с ярлыком по умолчанию D) по умолчанию, но это (как Halley), предназначенный для дублирования в компоненте 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. Перейдите в эту папку, которая содержит темную сторону силы:

    • Xcode 4.2 или ранее: /Developer/Library/PrivateFrameworks/IDEKit.framework/Resources
    • Xcode 4.3 или новее: /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources.
  2. Откройте IDETextKeyBindingSet.plist.

  3. Добавьте новый словарь и новый элемент команды в качестве снимок экрана ниже (назовите их, что вы хотите): Editing the plist

    Это: selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:

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

  5. Задайте комбинацию клавиш для команды: Key Bindings

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

Ответ 2

Работает в версиях 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. Дайте разрешения на редактирование следующих файлов. В большинстве случаев ОС не позволяет редактировать файлы.
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. Отредактируйте файл, написав следующую команду:
open /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist
  1. Добавьте следующие фрагменты XML:
<key>Customized</key>
<dict>
  <key>Duplicate Lines</key>
  <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string>
  <key>Duplicate Current Line</key>
  <string>selectParagraph:, delete:, undo:, moveRight:, yankAndSelect:, moveToBeginningOfLine:, moveToEndOfLine:</string>
</dict>

Скриншоты

enter image description here

и перезапустите Xcode и перейдите к Preferences - Key Bindings, найдите введенную нами команду (Duplicate Lines & Duplicate Current Line).

enter image description here

Это оно.

Ответ 3

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

Вы можете загрузить его из моего репозитория GitHub: Плагин XcodeKit - https://github.com/ptfly/XcodeKit

Ответ 4

@Hailei ответ был довольно хорошим, но имел неудачный побочный эффект сглаживания содержимого буфера обмена (оставив его заполненным содержимым дублированной строки), что является точно частью ручного метода копирования/вставки, который я был пытаясь избежать.

Итак, я изменил последовательность команд на это:

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

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

Ответ 5

Хорошо, я придумал это:

Версия для 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

изменение: мелкое исправление edit2: изменен выбор абзаца edit3: добавлена версия для XCode 11

Ответ 6

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

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

Я столкнулся с другими темами, где никто не использует эти быстрые клавиши. Они глобальны в OS X, и я использую их все время! Гораздо меньше - акробатика;)

Ответ 7

Зачем дублировать одну строку? Дублировать весь абзац лучше. Моя последовательность:

Дублирующий текущий абзац

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

Удалить текущий абзац

selectParagraph:,
delete:,
moveUp:,
moveToEndOfParagraph:

Прекрасно работает в Xcode 4.6

Ответ 8

ОБНОВЛЕНИЕ: 17 сентября 2019 года После обновления до Xcode 10.3 моя запись ключа duplicate line из файла plist исчезла. Я должен был добавить это снова. Тем не менее, связывание ключей все еще было там.

ОБНОВЛЕНИЕ: 28 мая 2019 г. После обновления до Xcode 10.2 моя запись ключа duplicate line из файла plist исчезла. Я должен был добавить это снова. Тем не менее, связывание ключей все еще было там.

ОБНОВЛЕНИЕ: 23 декабря 2018 года После обновления до Xcode 10.1 все мои ярлыки снова сломались. Но что-то другое было то, что после обновления файла plist для дублирования строк мне не нужно было определять привязки клавиш, они уже были там. Странно.

ОБНОВЛЕНИЕ: 14 октября 2018 года Xcode 10: Кто-то в Apple очень любит копировать/вставлять и следит за тем, чтобы с каждой версией обновления XCode дублирование строк удалялось из каждой установки. Мы, разработчики, были крайне разочарованы этой ерундой, происходящей в XCode с тех пор, как навсегда, единственной IDE без опции дублирования строк. Я только что обновился до Xcode 10, и, как вы уже догадались, все мои сочетания клавиш удаляются вместе с моей функцией дублирования строки. Тем не менее, это можно исправить, как в оригинальном ответе. Небольшая разница на этот раз в том, что вам понадобится следующая строка:

<string>selectLine:, copy:, moveToBeginningOfLine:, paste:, moveToEndOfLine:</string>

ОБНОВЛЕНИЕ: Xcode 9: мне пришлось повторить свои ярлыки и дублирование строки и удаление, но хорошо, что теперь вы можете снова редактировать IDETextKeyBindingSet.plist. Этот парень из Apple должен был быть в отпуске, когда они выпустили эту версию.

ОБНОВЛЕНИЕ: Xcode 8. Ошибка, вы не можете изменить файл IDETextKeyBindingSet.plist вообще. Xcode сбрасывает его при запуске. Этот высокопоставленный парень в Apple полон решимости заставить нас использовать копирование/вставку вместо простого дублирования строк, как во всех других IDE.

ОБНОВЛЕНИЕ: Xcode 7.1 и до сих пор нет ярлыков для дублирования и удаления строк. Это единственная IDE, с которой я когда-либо работал без таких ярлыков. И я не могу представить жизнь разработчика без этих двух критических ярлыков.

Основываясь на том, что я прочитал, я настроил свой XCode для этих ярлыков и написал об этом в блоге по адресу: http://jixte.com/2016/03/30/line-duplicate-and-deletion-in-xcode-7-x/

Вот как это можно сделать:

Сначала нам нужно изменить файл plist, который находится внутри пакета 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>

enter image description here

Теперь откройте/перезапустите XCode, перейдите в "Настройки" и перейдите на вкладку "Привязки клавиш". Используйте панель поиска для фильтрации и поиска новых ярлыков. Затем нажмите перед описанием ярлыка, чтобы назначить ему ярлык по своему вкусу. Убедитесь, что ваш ярлык не конфликтует с существующими ярлыками.

enter image description here

Ответ 9

Я бы пересмотрел последовательность команд, чтобы:

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

Добавленный deleteToBeginningOfLine поддерживает отступы дублированной строки.

Ответ 10

insertLineBreak необходимо, по крайней мере, для меня, чтобы сделать копию на новой строке, без нее я получил копию на той же строке

Ответ 11

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

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

Несколько других возможных способов сделать это также описано здесь.

Затем в редакторе nano нажмите ^W и введите "вставки", чтобы перейти к части "Вставки и отступы". Просто под <dict> вставьте этот xml-фрагмент:

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

Нажмите кнопку control + X, затем Y, затем Enter чтобы сохранить файл в редакторе nano.

UPD: я придумал лучшее решение, которое добавляет дополнительную строку перед дублированием (полезно, когда вы хотите дублировать строку, у которой есть другая строка чуть ниже нее):

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

Ответ 12

Вот мои записи Delete (CTRL + D) и Duplicate (CMD + SHIFT + D) из моего IDETextKeyBindingSet.plist. (в/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources)

Я просто установил их в Xcode 4.6.1 (на основе ответа от user570753 выше и в другом месте)

    <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>

Ответ 13

Любые возвышенные текстовые пользователи, которые хотели бы сопоставить Sublime duplicateLineUp и duplicateLineDown в 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>

Ответ 14

Если кому-либо отказано в доступе к редактированию IDETextKeyBindingSet.plist, вы можете предоставить права на чтение/запись:

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

Ответ 15

Чтобы дополнить ответ Хайли, команды, которые работали лучше для меня, были:

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

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

Ответ 16

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

Поддерживаются дубликаты строк. (Это работает в Xcode 9.2)