Linha duplicada do Xcode

127

Não é um Duplicatecomando no menu Editar (com um atalho padrão D), mas é (como Halley apontou) significou para a duplicação na parte Interface Builder do Xcode.

Então, como você ( facilmente ) duplica uma linha no Xcode 4?


Pergunta relacionada (com uma resposta funcional) para o Xcode 3 ... e que não funciona para o Xcode 4.


Por que não apenas copiar e colar?

Porque é tedioso e implica muitas acrobacias manuais:

quer (1) : mover a linha que se inicia e, em seguida, pressiona ⇧^E, então a cópia com ⌘C, movendo-se a uma nova linha, alligning cursor, e , finalmente, colando com ⌘V;

ou (2) : ^A(ajuste o cursor na linha inicial), ^SPACE(ajuste a marca), ^E(ajuste o cursor na linha final), ⇧^W( Select to Mark; personalizado), cópia, nova linha, etc.

Como Frank Schröder (na pergunta relacionada ) coloca:

O ponto principal é NÃO usar os atalhos Cmd-C / Cmd-V.

Blaz
fonte
1
Selecione a linha e copie e cole?
21412 Dani
1
@Dani, CP é trabalho demais (e a duplicação de linhas não é algo para o qual a necessidade surge apenas raramente). :) Atualizei a pergunta.
Blaz
1
Command-D é para duplicação de controle no Interface Builder.
Hailei
@ Halley, é bom saber. E é o equivalente a ⌥-mouse-drag (que também copia elementos da interface)?
Blaz
@ cortês eu acho que sim. A seção Teclas modificadoras em disanji.net/iOS_Doc/#documentation/DeveloperTools/Conceptual/… diz que "pressionar a tecla Opção durante operações de arrastar e soltar copia os objetos selecionados em vez de movê-los".
Hailei

Respostas:

173
  1. Vá para esta pasta que contém o lado escuro da força:

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

  3. Adicione um novo dicionário e um novo item de comando como a captura de tela abaixo (nomeie-os como quiser): Editando o plist

    Isso é: selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:

  4. Reinicie o Xcode e vá para Preferences - Key Bindings, procure seu comando.

  5. Defina uma combinação de teclas para o comando: Combinações de teclas

  6. Finalmente, liberou o poder das combinações de teclas no Xcode ... Aproveite!

Hailei
fonte
3
@MichalStefanow, o local que você escreveu é realmente o mesmo para o qual o /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resourcesalias aponta. Caso contrário, segui com êxito as etapas de Halley na versão 4.3.2 ... Sugiro que você faça backup do arquivo original e abra-o no próprio Xcode (e não no TextEdit). Além disso, em relação às permissões: alterá-las (apenas para o próprio arquivo; não é necessária recursão) no Finder funcionou bem.
Blaz 29/04
29
Muito obrigado! Para usuários preguiçosos - selectLine :, copy :, moveToEndOfLine :, insertNewline :, paste :, deleteBackward:
Vlad Tsepelev
15
Se o seu xCode travar! Feche o xCode, abra o arquivo com qualquer editor de texto e adicione seu dicionário: <key>Custom</key> <dict> <key>Duplicate Current Line</key> <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string> </dict>
Vlad Tsepelev 8/08/12
2
Funciona para mim no XCode 4.4.1! Ocorreu algum problema ao alterar as permissões (o localizador ou chmod 777 e começar com sudo a partir do terminal não funcionou, por algum motivo). Copiei o arquivo para outro lugar, editei e substitui o original, que funcionou.
Ixx
2
Eu sou android dev e quando comecei a experimentar o ios dev, percebi como o android studio (ou a idéia intellij) é bom.
IlyaEremin
90

Atualização 2020

Funciona nas versões Xcode: 11.3.1 também

Funciona nas versões 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

Instrução

  1. Conceda permissões para editar os seguintes arquivos. Na maioria das vezes, o SO não permitirá que você edite os arquivos.

para a versão 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/

abaixo das versões 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 o arquivo, escrevendo o seguinte comando: (Abra-o no editor sublime ou de texto, se puder)

para 11.3.1

open  

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

para versões abaixo

open /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist
  1. Anexe os seguintes snippets de 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>

Screenshots

insira a descrição da imagem aqui

e Reinicie o Xcode e vá para Preferences - Key Bindings, procure o comando digitado (Duplicate Lines & Duplicate Current Line).

insira a descrição da imagem aqui

É isso aí.

Para as pessoas unix notar: -

sudo chmod 755 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/ 
Zumry Mohamed
fonte
Ele funciona como um encanto! Eu editei o IDETextKeyBindingSet.pliste adicionei o dicionário acima e, em seguida, mapeei as chaves nas Preferências do XCode.
Randika Vishman
3
Estas são as respostas nerds que os usuários de mac precisam!
Luca Davanzo
1
Para XCode 10.1, eu tive que usar a seguinte seqüência: moveToBeginningOfLine :, deleteToEndOfLine :, puxão :, insertNewline :, setmark :, moveToBeginningOfLine :, selectToMark :, puxão: . Big graças a @tmsimont
marcelosalloum
1
esta é a primeira coisa que eu Google sempre que o Xcode é atualizado.
newDeveloper
1
Este trabalho solução para mim, em vez da resposta aceita
Khalid
18

Ok, eu vim com isso:

Versão para XCode 11:

selectParagraph:, delete:, undo:, moveRight:, yankAndSelect:
  • não toca na área de transferência
  • trabalha com várias linhas
  • seleciona linhas adicionadas; portanto, pode ser usado várias vezes sem selecionar novamente
  • seleção fixa no XCode 11
  • funciona melhor com desfazer

Como estou aplicando essa alteração após cada atualização do XCode, criei um script para isso. Possivelmente, pode causar algum dano, mas tentei torná-lo relativamente seguro. Ele faz uma cópia do arquivo e substitui a linha pela sua cópia e comando adicional usando perl. Requer que o XCode seja instalado em/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

Versão mais antiga (não tenho certeza se a nova é compatível com versões mais antigas, por isso vou mantê-la aqui):

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

e script para a versão mais antiga para evitar a edição manual de arquivos:

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: correção menor edit2: alterado para a seleção de parágrafos edit3: versão adicionada para o XCode 11

Rychu
fonte
Muito obrigado por isso, procurando esta combinação. Isso pode duplicar uma linha ou várias linhas sem adicionar novas Linhas indesejadas e também ctrl-z funciona bem.
precisa saber é o seguinte
Obrigado, isso é o que está mais próximo ao comportamento IntelliJ IMHO
OxyFlax
17

Hoje eu escrevi um plugin muito pequeno para o Xcode 5 que exclui e duplica linhas e seleções.

Você pode baixá-lo no repositório GitHub: XcodeKit Plugin - https://github.com/ptfly/XcodeKit

inigualável
fonte
Acabei de baixar e instalar isso - Você também pode usar as preferências do sistema para definir atalhos de teclado para os comandos. Muito agradável!
Orion Edwards
A melhor solução existe, porque esta não quebrará a área de transferência atual. Para adicionar combinações de teclas: Preferências do sistema -> teclado -> atalhos -> atalhos de aplicativos -> '+'. Lá, escolha Xcode e o título do menu, por exemplo, 'Excluir seleção / linha'
Sjoerd Perfors
Acabei de instalar isso. IMPRESSIONANTE, por alguma razão, porém, meu menu "Duplicar" em editar está acinzentado. Mesmo que eu tenha selecionado uma linha no editor, cursor e tentei selecionar a linha inteira.
precisa
Isso é mais do que incrível. Obrigado!
0x6A75616E
isso não funciona para mim. O "Duplicar" está acinzentado e o atalho de teclado também não funciona.
SquareBox
13

A resposta de @ Hailei foi muito boa, mas teve o infeliz efeito colateral de prejudicar o conteúdo da área de transferência (deixando-a preenchida com o conteúdo da linha duplicada), que é precisamente a parte da abordagem de copiar / colar manualmente que eu estava tentando evitar .

Então, mudei a sequência de comandos para isto:

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

Os yank:2s podem não funcionar como planejado se você tiver NSTextKillRingSizedefinido algo além 1, mas tenho certeza que 1é o padrão, e você deve fazer algum trabalho não trivial para alterá-lo (é necessário adicionar uma entrada a ~/Library/Preferences/.GlobalPreferences.plist).

Kelan
fonte
Sugiro usar o comando em defaults write -g NSTextKillRingSize 1vez de jogar com o GlobalPreferences.plist. ;)
dbernard 11/01
@amas É provável que você precise copiar o arquivo em outro lugar antes de modificá-lo e sobrescrever o arquivo original, a menos que queira arriscar alterar as permissões nas pastas principais.
Nipponese 30/05
isso quase funciona, mas, por algum motivo, um monte de espaço em branco é adicionado ao final da linha duplicada. alguma idéia do porquê?
tmsimont
5
se o corrigiu com esta modificação:moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, setMark:, moveToBeginningOfLine:, selectToMark:, yank:
tmsimont
Essa deve ser a resposta sugerida (seguindo o guia do @ Hailei). Obrigado!
precisa saber é
9

Estou me perguntando por que ninguém mencionou o uso juntamente com as teclas de seta ( ) para mover o cursor e selecionar linhas inteiras (adicionando ).

Copio regularmente linhas inteiras (duplicadas) movendo o cursor para o início de uma linha usando + (em vez de ctrl+ A) e depois uso + + (em vez de ctrl+ + E) para selecionar a linha inteira até o final e depois copio / colo.

Encontrei outros tópicos em que ninguém parece usar esses atalhos de teclado. Eles são globais no OS X e eu os uso o tempo todo! Muito menos acrobacias manuais;)

Baldur
fonte
Isso requer muito mais "acrobacias manuais" do que duplicar com apenas uma combinação de ação / tecla ... é a maneira como duplico o texto em um editor de texto ou navegador da web, sim, mas espero um pouco mais do IDE.
Ixx
1
E também, com o atalho de linha duplicada, você não substitui o conteúdo da área de transferência. Muitas vezes, você copia algo, duplica o código e deseja colá-lo - com seu método, você deve copiá-lo novamente.
Ixx 16/11/2013
Bem, sim. Mas menos do que o sugerido pelo OP. Eu posso concordar que um único comando seria melhor. Eu apenas pensei em apontar uma alternativa.
precisa
1
isso ainda é melhor do que nada pronto para uso. eu desejo que cmd + C / X sem a seleção seria apenas copiar / cortar toda a linha como outros editores de fazer ...
manroe
@Baldur Isto é o que eu faço também. cmd + cmd esquerdo + shift + cmd direito + c cmd + direita digite cmd + cmd esquerdo + p. Com sete pressionamentos de tecla, isso pode ser feito facilmente em menos de 3 segundos; no entanto, ainda é muito tedioso em relação ao ctrl + d, como em muitos editores de texto. É lamentável que isso não ocorra no xcode, ou que, em geral, os softwares macs e apple não possuem teclas de atalho melhores.
Csga5000
9

EDIT: 12 de julho de 2020 Após a atualização para o Xcode 11.5 novamente, minha duplicate lineentrada de chave do plistarquivo desapareceu. Eu tive que adicioná-lo novamente. A ligação das chaves ainda estava lá.

EDIT: Sep 17, 2019 Após a atualização para o Xcode 10.3 novamente, minha duplicate lineentrada de chave do plistarquivo desapareceu. Eu tive que adicioná-lo novamente. A ligação das chaves ainda estava lá.

EDIT: 28 de maio de 2019 Após a atualização para o Xcode 10.2 novamente, minha duplicate lineentrada de chave do plistarquivo desapareceu. Eu tive que adicioná-lo novamente. A ligação das chaves ainda estava lá.

EDIT: 23 de dezembro de 2018 Após a atualização para o Xcode 10.1, todos os meus atalhos foram interrompidos novamente. Mas algo diferente foi que, depois de atualizar o arquivo plist para duplicação de linha, não precisei definir minhas ligações de teclas, elas já estavam lá. Estranho.

EDIT: 14 DE OUTUBRO DE 2018 Xcode 10: Alguém na Apple adora copiar / colar e garante que, a cada versão da atualização do Xcode, a duplicação de linha seja removida da instalação de todos. Nós, desenvolvedores, ficamos extremamente frustrados com esse absurdo acontecendo no Xcode desde sempre, o único IDE sem opção de duplicação de linha. Acabei de atualizar para o Xcode 10 e, como você adivinhou, todas as minhas teclas de atalho são removidas juntamente com a funcionalidade de duplicação de linha. No entanto, é corrigível como na resposta original. Uma pequena diferença dessa vez é que você precisará da seguinte linha:

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

Edição: Xcode 9: Eu tive que refazer meus atalhos e duplicação e exclusão de linhas, mas o bom é que agora você pode editar IDETextKeyBindingSet.plist novamente. Esse cara da Apple deve estar de férias quando lançou esta versão.

EDIT: Xcode 8: Buggy, você não pode modificar o arquivo IDETextKeyBindingSet.plist. O Xcode redefine-o no início. Esse cara da Apple está realmente determinado a nos fazer usar copiar / colar em vez da duplicação simples de linha, como em todos os outros IDEs existentes.

EDIT: Xcode 7.1 e ainda não há atalhos para duplicação e exclusão de linhas. Este é o único IDE com o qual já trabalhei sem esses atalhos. E não consigo imaginar a vida de um desenvolvedor sem esses dois atalhos críticos.

Aqui está como isso pode ser feito:

Primeiro, precisamos modificar um arquivo plist que mora dentro do pacote Xcode.app (precisa do sudo para editar)

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

Em seguida, procure <key>Insertions and Indentations</key>e, abaixo da <dict>tag, adicione o seguinte:

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

Em seguida, encontre oe estes dentro da seção <key>Deletions</key>sob a <dict>tag:

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

insira a descrição da imagem aqui

Agora abra / reinicie o Xcode, vá para Preferências e vá para a guia "Key Bindings". Use a barra de pesquisa para filtrar e procurar os novos atalhos. Em seguida, clique na frente da descrição do atalho para atribuir a ele um atalho do seu agrado. Verifique se o seu atalho não está em conflito com os atalhos existentes.

insira a descrição da imagem aqui

zeeshan
fonte
8

Por que duplicar uma única linha? Duplicar o parágrafo inteiro é melhor. Minha sequência:

Duplicar parágrafo atual

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

Excluir parágrafo atual

selectParagraph:,
delete:,
moveUp:,
moveToEndOfParagraph:

Funciona bem no Xcode 4.6

BB9z
fonte
Concordado, manipular parágrafos é superior a linhas. Todos, reduza o editor o suficiente para quebrar o texto e tente usar os comandos de linha.
Logan Moseley
Quão pequena é a janela que seu código está quebrando. Considere dividir seu código em linhas menores, se isso acontecer com tanta frequência.
quemeful
3

Eu consideraria revisar a sequência de comandos para:

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

O adicionado deleteToBeginningOfLinemantém o recuo da linha duplicada.

user570753
fonte
Isso funcionou muito bem quando eu percebi que tinha que trocar as novas linhas (bonitas) por um espaço após a vírgula.
8264 McUsr
2

insertLineBreak precisava pelo menos para eu fazer uma cópia na nova linha, sem ele eu tenho cópia na mesma linha

Vladimir Kruglov
fonte
2

Eu tive um grande problema para desbloquear arquivos .plist no MacOS Sierra e no Xcode 9, mesmo a decisão @Tim não funcionou para mim. Se você tiver o mesmo problema, vá para o terminal e faça o seguinte:

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

Poucas outras maneiras possíveis de fazer isso também são descritas aqui .

Em seguida, no nano editor, clique ^We digite 'inserções' para ir para a parte 'Inserções e recuos'. Logo abaixo da <dict>tag, cole este xml-snippet:

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

Pressione e control + X, em seguida Y, Enterpara salvar o arquivo no nano editor.

UPD: Tomei uma decisão melhor, que adiciona uma linha adicional antes da duplicação (útil quando você deseja duplicar uma linha que tem outra linha logo abaixo):

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

Aqui estão minhas entradas Excluir ( CTRL+ D) e Duplicar ( CMD+ SHIFT+ D) do meu IDETextKeyBindingSet.plist. (em /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources)

Acabei de configurá-los no Xcode 4.6.1 (com base na resposta do usuário570753 acima e em outros 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>
Roubar
fonte
0

Qualquer usuário sublime de texto que gostaria de combinar do sublime duplicateLineUp e duplicateLineDown no XCode, adicione o seguinte ao seu IDETextKeyBindingSet.plist arquivo

<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>
internet-nico
fonte
0

Caso alguém tenha acesso negado a qualquer pessoa para editar o IDETextKeyBindingSet.plist, você poderá obter permissões de leitura / gravação:

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

Apenas para complementar a resposta de Hailei, os comandos que funcionaram melhor para mim foram:

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

Seus comandos sugeridos estavam copiando a linha desejada duas linhas abaixo, para mim.

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

Linha (s) duplicada (s) suportada (s). (Isso funciona no Xcode 9.2)

Luminoid
fonte
0

Quanto ao Xcode 11, nenhuma das opções acima funcionou para mim. A primeira resposta teve um comportamento estranho, pois foi inserida a linha após a próxima. A resposta a seguir, no entanto, funcionou para mim.

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