Línea duplicada de Xcode

Hay un comando Duplicate en el Menú de Edición (con un atajo predeterminado de D ), pero es (como señaló Halley ) destinado a la duplicación en la parte del Constructor de Interfaz 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 simplemente copiar y pegar?

Porque es tedioso e implica demasiadas acrobacias manuales:

cualquiera (1) : moviéndose al principio de la línea y luego presionando ⇧ ^ E , luego copiando con ⌘C , moviéndose a la nueva línea, alineando el cursor, y finalmente pegando con ⌘V ;

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

Como Frank Schröder (en la pregunta relacionada ) lo expresó:

El objective no es usar los atajos Cmd-C / Cmd-V.

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

    • Xcode 4.2 o /Developer/Library/PrivateFrameworks/IDEKit.framework/Resources anteriores: /Developer/Library/PrivateFrameworks/IDEKit.framework/Resources
    • Xcode 4.3 o posterior: /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources .
  2. Abra 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): Editando el plist

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

  4. Reinicia Xcode y ve a Preferences – Key Bindings, busca tu comando.

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

  6. Finalmente desató el poder de las asociaciones de teclas en Xcode … ¡Disfrútalo!

Adición de líneas duplicadas Funciona para Xcode versión 7.1, 7.3, 7.3.1 8.0, 8.1, 8.2, 8.3 y 9.0, 9.1, 9.2 también

Proporcione persistencia para editar los siguientes archivos. La mayoría de las veces, el sistema operativo no le permitirá editar los archivos.

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

Edite el siguiente archivo

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

escribiendo el siguiente comando.

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

añada los siguientes snipets xml.

 Customized  Duplicate Lines selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward: Duplicate Current Line moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, moveToBeginningOfLine:, yank:  

captura de pantalla del archivo editado.

enter image description here

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

enter image description here

Eso es.

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

Puedes descargarlo desde mi repository de GitHub: XcodeKit Plugin – https://github.com/ptfly/XcodeKit

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

Entonces, cambié la secuencia de comandos a esto:

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

Los 2 yank: s pueden no funcionar como se espera si tienes NSTextKillRingSize configurado en algo aparte de 1 , pero estoy bastante seguro 1 que 1 es el predeterminado, y tienes que hacer un trabajo no trivial para cambiarlo (se requiere agregar un entrada a ~/Library/Preferences/.GlobalPreferences.plist ).

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

Regularmente copio 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 el todo línea al final y luego copiar / pegar.

Me encontré con otros hilos donde nadie parece usar estos atajos de teclado. ¡Son globales en OS X y los utilizo todo el tiempo! Mucho menos acrobacias a mano;)

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

Párrafo actual duplicado

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

Eliminar el párrafo actual

 selectParagraph:, delete:, moveUp:, moveToEndOfParagraph: 

Funciona bien en Xcode 4.6

Consideraría revisar la secuencia de comandos para:

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

El agregado deleteToBeginningOfLine mantiene la sangría de la línea duplicada.

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

En base a lo que he leído, configuré mi Xcode para estos accesos directos y publiqué sobre ello en: http://jixte.com/2016/03/30/line-duplicate-and-deletion-in-xcode-7-x /

Aquí es cómo se puede hacer:

Primero debemos modificar un archivo plist que viva dentro del paquete Xcode.app (necesita sudo para editarlo)

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

La búsqueda de Insertions and Indentations y debajo de la etiqueta agrega lo siguiente:

 Insert New Line Below moveToEndOfLine:, insertNewline: Insert New Line Above moveUp:, moveToEndOfLine:, insertNewline: Duplicate Current Line selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward: 

A continuación, encuentre el y estos dentro de la sección Deletions debajo de la etiqueta :

 Delete Current Line selectLine:, delete: selectLine:, delete: 

enter image description here

Ahora abra / reinicie Xcode, vaya a Preferencias y vaya a la pestaña “Enlaces clave”. Use la barra de búsqueda para filtrar y buscar los nuevos accesos directos. A continuación, haga clic en frente de la descripción del atajo para asignarle un atajo de su agrado. Asegúrese de que su acceso directo no entre en conflicto con los accesos directos existentes.

enter image description here

Ok, he pensado en esto:

 selectParagraph:, delete:, yank:, moveToBeginningOfLine:, setMark:, yank:, moveToBeginningOfLine:, moveLeft:, selectToMark: 
  • no toca el portapapeles
  • trabaja con múltiples líneas
  • selecciona líneas adicionales, por lo que puede usarse varias veces sin volver a seleccionar

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 un comando adicional usando perl.

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

editar: corrección menor edit2: cambiar a selección de párrafo

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

Tuve un gran problema para desbloquear el archivo .plist en MacOS Sierra y Xcode 9, incluso la decisión @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 en ^W y escriba ‘inserciones’ para saltar a la parte ‘Inserciones y sangrías’. Justo debajo de la etiqueta pegue este fragmento xml:

 Duplicate line selectLine:, copy:, moveToEndOfLine:, insertNewLine:, paste:, deleteBackward: 

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

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

 Duplicate line selectLine:, copy:, moveToEndOfLine:, insertLineBreak:, moveUp:, paste:, moveToBeginningOfLine: 

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

Simplemente configuré esto en Xcode 4.6.1 (basado en la respuesta del usuario570753 anterior y en otros lugares)

  Custimozed  Delete Current Line deleteToBeginningOfLine:, moveToEndOfLine:, deleteToBeginningOfLine:, deleteBackward:, moveDown:, moveToBeginningOfLine: Duplicate Current Line selectLine:, copy:, moveToEndOfLine:, insertNewline:, deleteToBeginningOfLine:, paste:, moveToBeginningOfLine:, deleteBackward:  

Cualquier usuario de texto sublime que desee hacer coincidir sublime’s duplicateLineUp y duplicateLineDown en XCode, por favor agregue lo siguiente a su archivo IDETextKeyBindingSet.plist

 Line Duplications  Duplicate Current Line Above selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:, moveUp: Duplicate Current Line Below selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:  

En caso de que a alguien se le niegue el acceso para editar IDETextKeyBindingSet.plist, puede otorgarse permisos de lectura / escritura de la siguiente manera:

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

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 fueron copiar la línea deseada dos líneas a continuación, para mí.

 Duplicate Lines selectLine:, copy:, moveToBeginningOfLine:, paste: 

Líneas duplicadas compatibles. (Esto funciona en Xcode 9.2)