Дубликат строки Xcode

128

Там есть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.

Blaz
источник
1
Выберите строку и скопируйте и вставьте?
Дэни
1
@Dani, CP - это слишком много работы (а дублирование строк - это не то, в чем возникает необходимость только в редких случаях). :) Обновил вопрос.
Blaz
1
Command-D предназначена для дублирования управления в Интерфейсном Разработчике.
Hailei
@ Хэлли, это полезно знать. И это эквивалент ⌥-mouse-drag (которое также копирует элементы интерфейса)?
Blaz
@courteous Я так думаю. В разделе «Ключи-модификаторы» в disanji.net/iOS_Doc/#documentation/DeveloperTools/Conceptual/… сказано, что «нажатие клавиши Option во время операций перетаскивания копирует выбранные объекты, а не перемещает их».
Hailei

Ответы:

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 и перейдите в Preferences - Key Bindings, найдите свою команду.

  5. Задайте комбинацию клавиш для команды: Ключевые привязки

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

Hailei
источник
3
@MichalStefanow, место, которое вы написали, на самом деле совпадает с местом, на которое /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resourcesуказывает псевдоним. В противном случае я успешно выполнил шаги Галлея в версии 4.3.2 ... Я предлагаю вам сделать резервную копию исходного файла, а затем открыть его в самом Xcode (а не в TextEdit). Кроме того, что касается разрешений: их изменение (только для самого файла; рекурсия не требуется) в Finder работала нормально.
Blaz
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 01
2
Я разработчик Android, и когда я начал пробовать ios dev, я понял, насколько хороша студия Android (или идея intellij).
Илья Еремин 05
91

Обновление 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, найдите команду, которую мы ввели (Duplicate Lines & Duplicate Current Line).

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

Это оно.

Для пользователей unix на заметку: -

sudo chmod 755 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/ 
Зумри Мохамед
источник
Работает как часы! Я отредактировал IDETextKeyBindingSet.plistи добавил приведенный выше словарь, а затем сопоставил ключи в настройках XCode.
Randika Vishman 04
3
Это ответы ботаников, которые нужны пользователям Mac!
Лука Даванцо
1
Для XCode 10.1, я должен был использовать следующую строку: moveToBeginningOfLine :, deleteToEndOfLine :, дергать :, insertNewline :, setMark :, moveToBeginningOfLine :, selectToMark :, дергать: . Большое спасибо @tmsimont
marcelosalloum
1
это первое, что я использую в Google при обновлении Xcode.
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

Rychu
источник
Очень спасибо за это, ищу эту комбинацию. Это может дублировать одну или несколько строк без добавления нежелательных новых строк, а также Ctrl-Z работает хорошо.
mkeremkeskin
Спасибо, вот что ближе всего к поведению IntelliJ ИМХО
OxyFlax
17

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

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

несравненный
источник
Я только что загрузил и установил это - вы также можете использовать системные настройки, чтобы установить сочетания клавиш для команд. Очень хорошо!
Орион Эдвардс
Лучшее решение, потому что это не сломает текущий буфер обмена. Чтобы добавить сочетания клавиш: Системные настройки -> клавиатура -> сочетания клавиш -> сочетания клавиш -> '+'. Там выберите Xcode и заголовок меню, например, «Удалить
выделение / строку
Я только что установил это. УДИВИТЕЛЬНЫЙ, хотя по какой-то причине мое меню «Дублировать» при редактировании неактивно. Хотя я выбрал строку в редакторе, курсоре и попытался выделить всю строку.
Джон Баллинджер,
Это более чем круто. Спасибо!
0x6A75616E
у меня это не работает. «Дубликат» неактивен, и сочетание клавиш также не работает.
SquareBox 03
13

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

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

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

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

Kelan
источник
Я предлагаю использовать эту команду defaults write -g NSTextKillRingSize 1вместо того, чтобы играть с GlobalPreferences.plist. ;)
dbernard
@amas Скорее всего, вам нужно скопировать файл в другое место, прежде чем изменять его, а затем перезаписать исходный файл, если вы не хотите рисковать изменением разрешений для родительских папок.
nipponese
это почти работает, но по какой-то причине в конец дублированной строки добавляется куча пробелов ... любая идея, почему?
tmsimont 05
5
если исправлено с помощью этой модификации:moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, setMark:, moveToBeginningOfLine:, selectToMark:, yank:
tmsimont 05
Это должен быть предлагаемый ответ (следуя руководству @ Hailei). Спасибо!
brkeyal
9

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

Дублировать текущий абзац

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

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

selectParagraph:,
delete:,
moveUp:,
moveToEndOfParagraph:

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

BB9z
источник
Согласны, манипулирование абзацами лучше строк. Все, сделайте свой редактор достаточно узким, чтобы переносить текст, и попробуйте использовать строковые команды.
Логан Мозли,
Насколько маленькое ваше окно, которое оборачивается вашим кодом. Если это происходит так часто, подумайте о том, чтобы разбить код на более мелкие строки.
quemeful 01
9

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

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

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

Baldur
источник
Для этого требуется гораздо больше «ручной акробатики», чем для копирования с помощью всего лишь одного действия / комбинации клавиш ... именно так я дублирую текст в текстовом редакторе или веб-браузере, да, но я ожидаю немного большего от IDE.
Ixx
1
Кроме того, с дублированием ярлыка строки вы не перезаписываете содержимое буфера обмена. Много раз я что-то копирую, дублирую код и хочу вставить его - с помощью своего метода вам придется скопировать его снова.
Ixx
Ну да. Но меньше, чем предлагает ОП. Я согласен, что одна команда будет лучше. Я просто подумал, что укажу альтернативу.
Baldur
1
это все равно лучше, чем ничего нестандартного. Я бы хотел, чтобы cmd + C / X без выделения просто копировал / вырезал всю строку, как это делают другие редакторы ...
манро 02
@Baldur Я тоже этим занимаюсь. cmd + left cmd + shift + right cmd + c cmd + right введите cmd + left cmd + p. При 7 нажатиях клавиш это можно легко сделать менее чем за 3 секунды, однако это все еще довольно утомительно по сравнению с ctrl + d, как во многих текстовых редакторах. К сожалению, это не встроено в xcode, или что в целом для Mac и программного обеспечения Apple нет лучших горячих клавиш.
csga5000 07
9

РЕДАКТИРОВАТЬ: 12 июля 2020 г. После обновления до Xcode 11.5 моя duplicate lineключевая запись из plistфайла снова исчезла. Пришлось добавить еще раз. Однако привязка клавиш все еще была на месте.

РЕДАКТИРОВАТЬ: 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, и, как вы уже догадались, все мои сочетания клавиш удалены вместе с функцией дублирования строк. Однако это поправимо, как и в исходном ответе. Небольшая разница на этот раз в том, что вам понадобится следующая строка:

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

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

EDIT: Xcode 8: Buggy, вы вообще не можете изменить файл IDETextKeyBindingSet.plist. Xcode сбрасывает его при запуске. Этот высокопоставленный парень из Apple действительно настроен заставить нас использовать копирование / вставку вместо простого дублирования строк, как во всех других IDE.

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

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

Сначала нам нужно изменить файл 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>

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

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

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

Zeeshan
источник
3

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

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

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

user570753
источник
Это отлично сработало, когда я понял, что мне нужно заменить (красивые) символы новой строки пробелом после запятой.
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

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

Затем в редакторе 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>
joliejuly
источник
1

Вот мои записи 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>
обкрадывать
источник
0

Любые пользователи возвышенного текста, которые хотели бы сопоставить 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>
Интернет-Nico
источник
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)

Luminoid
источник
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>
Бен
источник