Línea duplicada de Xcode


127

No es un Duplicatecomando en el menú Editar (con un acceso directo por defecto de D), pero es (como Halley señaló) destinada a la duplicación en la parte Interface Builder de Xcode.

Entonces, ¿cómo duplica ( fácilmente ) una línea en Xcode 4?


Pregunta relacionada (con una respuesta de trabajo) para Xcode 3 ... y que no funciona para Xcode 4.


¿Por qué no solo copiar y pegar?

Porque es tedioso y conlleva demasiadas acrobacias manuales:

o bien (1) : moverse a la línea que comienza y luego presionar ⇧^E, luego copiar con ⌘C, mover a una nueva línea, alinear el cursor y finalmente pegar con ⌘V;

o (2) : ^A(establecer el cursor en el inicio de la línea), ^SPACE(establecer la marca), ^E(establecer el cursor en el final de la línea), ⇧^W( Select to Mark; personalizado), copiar, nueva línea, etc.

Como dijo Frank Schröder (en la pregunta relacionada ):

El punto NO es usar los atajos de Cmd-C / Cmd-V.


1
Seleccione la línea y copie y pegue?
Dani

1
@Dani, CP es demasiado trabajo (y la duplicación de líneas no es algo para lo que surja la necesidad en raras ocasiones). :) He actualizado la pregunta.
Blaz

1
Command-D es para la duplicación de control en Interface Builder.
Hailei

@ Halley, es bueno saberlo. ¿Y es el equivalente de ⌥-mouse-drag (que también copia elementos de la interfaz)?
Blaz

@courteous, creo que sí. La sección Teclas modificadoras en disanji.net/iOS_Doc/#documentation/DeveloperTools/Conceptual/… dice que "presionar la tecla Opción durante las operaciones de arrastrar y soltar copia los objetos seleccionados en lugar de moverlos".
Hailei

Respuestas:


173
  1. Vaya a esta carpeta que contiene el lado oscuro de la fuerza:

    • Xcode 4.2 o anterior: /Developer/Library/PrivateFrameworks/IDEKit.framework/Resources
    • Xcode 4.3 o posterior: /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources.
  2. Abierto IDETextKeyBindingSet.plist.

  3. Agregue un nuevo diccionario y un nuevo elemento de comando como la captura de pantalla a continuación (asígneles el nombre que desee): Editar el plist

    Eso es: selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:

  4. Reinicie Xcode y vaya a Preferencias - Atajos de teclado, busque su comando.

  5. Establezca una combinación de teclas para el comando: Atajos de teclado

  6. Finalmente, desaté el poder de las combinaciones de teclas en Xcode ... ¡Disfrútalo!


3
@MichalStefanow, la ubicación que escribió es en realidad la misma ubicación a la que /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resourcesapunta el alias. De lo contrario, he seguido con éxito los pasos de Halley en la versión 4.3.2 ... Le sugiero que haga una copia de seguridad del archivo original y luego lo abra en Xcode (y no en TextEdit). Además, con respecto a los permisos: cambiarlos (solo para el archivo en sí; no se necesita recurrencia) en Finder funcionó bien.
Blaz

29
¡Muchas gracias! Para usuarios perezosos: seleccione Línea :, copia :, moveToEndOfLine :, insertNewline :, paste :, deleteBackward:
Vlad Tsepelev

15
Si tu xCode falla Cierre xCode, abra el archivo con cualquier editor de texto y agregue su diccionario: <key>Custom</key> <dict> <key>Duplicate Current Line</key> <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string> </dict>
Vlad Tsepelev

2
¡Funciona para mí en XCode 4.4.1! Tuve algunos problemas para cambiar los permisos (buscador o chmod 777 y comenzar con sudo desde la terminal no funcionó, por alguna razón). Copié el archivo en otro lugar, lo edité y sobrescribí el original, eso funcionó.
Ixx

2
Soy desarrollador de Android y cuando comencé a probar iOS Dev me di cuenta de que Android Studio (o idea inteligente) es bueno.
IlyaEremin

90

Actualización 2020

Funciona en versiones de Xcode: 11.3.1 también

Funciona en versiones de 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

Instrucción

  1. Otorgue permisos para editar los siguientes archivos. La mayoría de las veces el sistema operativo no le permitirá editar los archivos.

para la versión 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/

por debajo de las versiones 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. Edite el archivo, escribiendo el siguiente comando: (Ábralo en un sublime o editor de texto si puede)

para 11.3.1

open  

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

para las siguientes versiones

open /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist
  1. Agregue los siguientes fragmentos de código 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>

Capturas de pantalla

ingrese la descripción de la imagen aquí

y reinicie Xcode y vaya a Preferences - Key Bindings, busque el comando que escribimos (Duplicar líneas y Duplicar línea actual).

ingrese la descripción de la imagen aquí

Eso es.

Para que la gente de Unix tenga en cuenta: -

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

¡Funciona a las mil maravillas! Edité IDETextKeyBindingSet.plisty agregué el diccionario anterior y luego asigné las claves en Preferencias de XCode.
Randika Vishman

3
¡Estas son las respuestas nerd que los usuarios de mac necesitan!
Luca Davanzo

1
Para XCode 10.1, tuve que utilizar la siguiente cadena: moveToBeginningOfLine :, deleteToEndOfLine :, tirón :, insertNewline :, marca de conjunto :, moveToBeginningOfLine :, selectToMark :, tirón: . Muchas gracias a @tmsimont
marcelosalloum

1
esto es lo primero que busco en Google cada vez que se actualiza Xcode.
newDeveloper

1
Esta solución funciona para mí en lugar de la respuesta aceptada
khalid

18

Ok, se me ocurrió esto:

Versión para XCode 11:

selectParagraph:, delete:, undo:, moveRight:, yankAndSelect:
  • no toca el portapapeles
  • funciona con múltiples líneas
  • selecciona líneas agregadas, por lo que se puede usar varias veces sin volver a seleccionar
  • selección fija en XCode 11
  • funciona mejor con deshacer

Como estoy aplicando este cambio después de cada actualización de XCode, hice un script para eso. Posiblemente pueda causar algún daño, pero he tratado de hacerlo relativamente seguro. Hace una copia del archivo y luego reemplaza la línea con su copia y comando adicional usando perl. Requiere que XCode se instale en/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

Versión anterior (no estoy seguro de si la nueva es compatible con versiones anteriores, así que la mantendré aquí):

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

y script para la versión anterior para evitar la edición manual de archivos:

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: corrección menor edit2: cambiado a selección de párrafo edit3: versión agregada para XCode 11


Realmente gracias por esto, buscando esta combinación. Esto puede duplicar una sola línea o varias líneas sin agregar nuevas líneas no deseadas y también ctrl-z funciona bien.
mkeremkeskin

Gracias, eso es lo más cercano al comportamiento de IntelliJ en mi humilde opinión
OxyFlax

17

Hoy escribí un complemento muy pequeño para Xcode 5 que elimina y duplica líneas y selecciones.

Puede descargarlo desde mi repositorio de GitHub: XcodeKit Plugin - https://github.com/ptfly/XcodeKit


Acabo de descargar e instalar esto: también puede usar las preferencias del sistema para establecer métodos abreviados de teclado para los comandos. ¡Muy agradable!
Orion Edwards

La mejor solución es porque esta no te romperá el portapapeles actual. Para agregar combinaciones de teclas: Preferencias del sistema -> teclado -> accesos directos -> accesos directos a aplicaciones -> '+'. Elija Xcode y el título del menú, por ejemplo, 'Eliminar selección / línea'
Sjoerd realiza

Acabo de instalar esto. IMPRESIONANTE, por alguna razón, mi menú "Duplicar" en edición está atenuado. Aunque he seleccionado una línea en el editor, el cursor y he intentado seleccionar la línea completa.
John Ballinger

Esto es más que asombroso. ¡Gracias!
0x6A75616E

no funciona para mi El "Duplicar" está atenuado y el método abreviado de teclado tampoco funcionará.
SquareBox

13

La respuesta de @ Hailei fue bastante buena, pero tuvo el desafortunado efecto secundario de golpear el contenido del portapapeles (dejándolo poblado con el contenido de la línea duplicada), que es precisamente la parte del enfoque manual de copiar / pegar que estaba tratando de evitar .

Entonces, cambié la secuencia de comandos a esto:

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

Es posible que los 2 yank:s no funcionen según lo previsto si ha NSTextKillRingSizeestablecido algo aparte de 1, pero estoy bastante seguro de que 1es el valor predeterminado, y tiene que hacer un trabajo no trivial para cambiarlo (requiere agregar una entrada ~/Library/Preferences/.GlobalPreferences.plist).


Sugiero usar el comando en defaults write -g NSTextKillRingSize 1lugar de jugar con GlobalPreferences.plist. ;)
dbernard

@amas Es probable que necesite copiar el archivo en otro lugar antes de modificarlo y luego sobrescribir el archivo original, a menos que quiera arriesgarse a cambiar los permisos en las carpetas principales.
nipón

esto casi funciona, pero por alguna razón se agrega un montón de espacios en blanco al final de la línea duplicada ... ¿alguna idea de por qué?
tmsimont

55
si se solucionó con esta modificación:moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, setMark:, moveToBeginningOfLine:, selectToMark:, yank:
tmsimont

Esta debería ser la respuesta sugerida (siguiendo la guía de @ Hailei). ¡Gracias!
Brkeyal

9

Me pregunto por qué nadie ha mencionado usar junto con las teclas de flecha ( ) tanto para mover el cursor como para seleccionar líneas enteras (agregando ).

Copio regularmente líneas enteras (duplicadas) moviendo el cursor al comienzo de una línea usando + (en lugar de ctrl+ A) y luego uso + + (en lugar de ctrl+ + E) para seleccionar la línea completa hasta el final y luego copiar / pegar.

Me he encontrado con otros hilos en los que nadie parece usar estos atajos de teclado. ¡Son globales en OS X y los uso todo el tiempo! Mucho menos acrobacias manuales;)


Esto requiere mucho más "acrobacias manuales" que duplicar con solo 1 combinación de acción / tecla ... es la forma en que duplico texto en un editor de texto o navegador web, sí, pero espero un poco más de IDE.
Ixx

1
Y también, con el acceso directo de línea duplicada no sobrescribe el contenido del portapapeles. Muchas veces copie algo, duplique el código y quiera pegarlo; con su método debe copiarlo nuevamente.
Ixx

Bueno, sí. Pero menos del camino sugerido por el OP. Estoy de acuerdo en que un solo comando sería lo mejor. Solo pensé en señalar una alternativa.
Baldur el

1
Esto es aún mejor que nada fuera de la caja. Me gustaría que cmd + C / X con ninguna selección que acaba de copiar / cortar toda la línea al igual que otros editores hacen ...
Manroe

@ Baldur Esto es lo que hago también. cmd + izquierda cmd + mayús + derecha cmd + c cmd + derecha ingrese cmd + izquierda cmd + p. Con 7 pulsaciones de teclas, se puede hacer fácilmente en menos de 3 segundos, sin embargo, todavía es bastante tedioso en relación con ctrl + d como en muchos editores de texto. Es lamentable que esto no esté integrado en xcode, o que, en general, los Mac y el software de Apple no tengan mejores teclas de acceso rápido.
csga5000

9

EDITAR: 12 de julio de 2020 Después de actualizar a Xcode 11.5 nuevamente, mi duplicate lineentrada clave del plistarchivo desapareció. Tuve que agregarlo nuevamente. Sin embargo, la combinación de teclas todavía estaba allí.

EDITAR: 17 de septiembre de 2019 Después de actualizar a Xcode 10.3 nuevamente, mi duplicate lineentrada clave del plistarchivo desapareció. Tuve que agregarlo nuevamente. Sin embargo, la combinación de teclas todavía estaba allí.

EDITAR: 28 de mayo de 2019 Después de actualizar a Xcode 10.2 nuevamente, mi duplicate lineentrada clave del plistarchivo desapareció. Tuve que agregarlo nuevamente. Sin embargo, la combinación de teclas todavía estaba allí.

EDITAR: 23 de diciembre de 2018 Después de actualizar a Xcode 10.1, todos mis atajos se volvieron a romper. Pero algo diferente fue que después de actualizar el archivo plist para la duplicación de líneas, no tuve que definir mis asociaciones de teclas, ya estaban allí. Extraño.

EDITAR: 14 DE OCTUBRE DE 2018 Xcode 10: A alguien en Apple le encanta copiar / pegar, y se asegura de que con cada versión de la actualización de Xcode, la duplicación de línea se elimine de la instalación de todos. Los desarrolladores nos hemos sentido extremadamente frustrados por esta tontería que ocurre en Xcode desde siempre, el único IDE sin opción de duplicación de línea. Acabo de actualizar a Xcode 10 y, como lo adivinó, todas mis teclas de acceso directo se eliminan junto con mi funcionalidad de duplicación de línea. Sin embargo, es reparable como en la respuesta original. Una ligera diferencia esta vez es que necesitará la siguiente línea:

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

EDITAR: Xcode 9: tuve que rehacer mis atajos y la duplicación y eliminación de líneas, pero lo bueno es que ahora puede editar IDETextKeyBindingSet.plist nuevamente. Este chico de Apple debe estar de vacaciones cuando lanzaron esta versión.

EDITAR: Xcode 8: Buggy, no puede modificar el archivo IDETextKeyBindingSet.plist en absoluto. Xcode lo restablece al inicio. Este tipo alto en Apple está realmente decidido a hacernos usar copiar / pegar en lugar de una simple duplicación de línea como en todos los demás IDE que existen.

EDITAR: Xcode 7.1 y todavía no hay atajos para la duplicación y eliminación de líneas. Este es el único IDE con el que he trabajado sin esos atajos. Y no puedo imaginar la vida de un desarrollador sin estos dos atajos críticos.

Así es como se puede hacer:

Primero necesitamos modificar un archivo plist que vive dentro del paquete Xcode.app (necesita sudo para editar)

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

Luego busque <key>Insertions and Indentations</key>y debajo de la <dict>etiqueta agregue lo siguiente:

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

Luego encuentre el y estos dentro de la sección <key>Deletions</key>debajo de la <dict>etiqueta:

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

ingrese la descripción de la imagen aquí

Ahora abra / reinicie Xcode, vaya a Preferencias y vaya a la pestaña "Asignaciones de teclas". Use la barra de búsqueda para filtrar y buscar los nuevos atajos. Luego haga clic delante de la descripción del acceso directo para asignarle un acceso directo de su agrado. Asegúrese de que su acceso directo no entre en conflicto con los accesos directos existentes.

ingrese la descripción de la imagen aquí


8

¿Por qué duplicar una sola línea? Duplicar todo el párrafo es mejor. Mi secuencia:

Duplicar el párrafo actual

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

Eliminar párrafo actual

selectParagraph:,
delete:,
moveUp:,
moveToEndOfParagraph:

Funciona bien en Xcode 4.6


De acuerdo, manipular párrafos es superior a las líneas. Todos, haga que su editor sea lo suficientemente estrecho para ajustar el texto e intente usar los comandos de línea.
Logan Moseley

Qué tan pequeña es su ventana que está envolviendo su código. Considere dividir su código en líneas más pequeñas si eso sucede con tanta frecuencia.
quemeful

3

Consideraría revisar la secuencia de comandos para:

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

El agregado deleteToBeginningOfLinemantiene la sangría de la línea duplicada.


Esto funcionó muy bien una vez que me di cuenta de que tenía que intercambiar las nuevas líneas (atractivas) con un espacio después de la coma.
McUsr

2

insertLineBreak necesitaba al menos para mí hacer una copia en una nueva línea, sin ella obtuve una copia en la misma línea


2

Tuve un gran problema para desbloquear el archivo .plist en MacOS Sierra y Xcode 9, incluso la decisión de @Tim no funcionó para mí. Si tiene el mismo problema, vaya a la terminal y haga esto:

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

Algunas otras formas posibles de hacer esto también se describen aquí .

Luego, en el editor nano, haga clic ^Wy escriba 'inserciones' para saltar a la parte 'Inserciones e indentaciones'. Justo debajo de la <dict>etiqueta, pegue este fragmento de XML:

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

Presione control + X, luego Y, Enterpara guardar el archivo en nano editor.

UPD: se me ocurrió una mejor decisión, que agrega una línea adicional antes de la duplicación (útil cuando desea duplicar una línea que tiene otra línea justo debajo):

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

1

Aquí están mis entradas Eliminar ( CTRL+ D) y Duplicar ( CMD+ SHIFT+ D) de mi IDETextKeyBindingSet.plist. (en /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources)

Acabo de configurarlos en Xcode 4.6.1 (según la respuesta del usuario575753 anterior y en otros lugares)

    <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

Cualquier usuario de texto sublime que desee hacer coincidir duplicateLineUp y duplicateLineDown de sublime en XCode, agregue lo siguiente a su archivo 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

En caso de que a otra persona se le niegue el acceso para editar IDETextKeyBindingSet.plist, puede otorgarse permisos de lectura / escritura al:

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

0

Solo para complementar la respuesta de Hailei, los comandos que funcionaron mejor para mí fueron:

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

Sus comandos sugeridos copiaban la línea deseada dos líneas a continuación, para mí.


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

Línea (s) duplicada (s) compatibles. (Esto funciona en Xcode 9.2)


0

En cuanto a Xcode 11, ninguno de los anteriores funcionó para mí. La primera respuesta tuvo un comportamiento extraño, ya que estaba insertando la línea después de la siguiente. La siguiente respuesta, sin embargo, funcionó para mí.

<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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.