Eu sei que posso unir linhas no Vim com J
diversas variantes ( gJ
, etc.); J
irá "Remover o recuo e inserir até dois espaços" .
Mas existe também uma maneira direta de inserir outro caractere em vez dos dois espaços? Por exemplo uma vírgula ( ,
) ou vírgula e espaço ( ,
)?
Dado:
8
9
10
32
Eu gostaria de terminar com:
8, 9, 10, 32
ou:
8,9,10,32
line-breaks
Martin Tournoij
fonte
fonte
Respostas:
Eu escrevi um plugin Join, pode fazer o que você quiser e muito mais.
mais detalhes e capturas de tela:
https://github.com/sk1418/Join
fonte
Uma maneira simples é a seguinte: basta selecionar suas linhas (exceto a última) - ou use
%
- e execute:ou
(onde, é claro, a
'<,'>
peça já foi inserida depois:
pelo Vim, para segmentar a seleção)(2) Atualização:
Com base no exposto acima (e no comentário de Sato Katsura ), aqui está uma possível implementação de "junção interativa", com contagem e suporte repetido opcional:
E um mapeamento real:
É como (*)
J
, mas interativo - ele solicitará a sequência separadora. A sequência padrão é um espaço - portanto, por exemplo, para unir linhas sem separador, pressioneBackspace
quando solicitado, para remover o caractere de espaço padrão eEnter
para aceitar o (agora) separador vazio. Contagem, por exemplo3J
, também funciona. Se otpope/vim-repeat
plug-in estiver instalado, repita com '.' também funcionará, reutilizando o último separador e (se não for alterado - por exemplo10.
) a última contagem ou intervalo de linhas visuais.(*) Porém, não é exatamente assim
J
: embora remova o recuo, ele não procurará.!?
(no final da frase) inserir 2 espaços em vez de um ou inserir um espaço apenas se estiver ausente (é difícil fazer algo como isso, já que a cadeia separadora pode ser qualquer coisa agora). Também removerá espaços à direita (faz mais sentido).Eu acho que essa pode ser uma boa maneira de sobrecarregar o espaço limitado de letras dos operadores :)
Bem, tecnicamente
J
não é um operador, mas um operador - por exemplo, você não pode fazer issoJaw
para juntar "uma palavra".(sugestões são bem-vindas)
fonte
:'<,'>-1s/\n/, /
para linhas marcadas ou:1,$-1s/\n/, /
para o arquivo inteiro.-1
?'<,'>-s/\n/, /
ou1,$-s/\n/, /
como-
é o mesmo que-1
.l:sep
for um&
, sua substituição funcionará incorretamente, pois&
é mágica na substituição. Pode ser melhor usar o\=
para usar uma string literal -let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"
- em vez de tentar lidar com a fuga.Aqui está um exemplo usando o comando externo:
onde
%!
substitui o buffer atual (conteúdo do arquivo) pelo comando:paste -sd,
(parameters-s
é usado para unir várias linhas e-d
define o caractere delimitador como,
).fonte
Caso alguém não goste de digitar Regex e memorizar mais comandos Plugin Ex:
Anexar bloco visual
Visual-block Append está disponível no modo Visual Block (
<C-v>
) e pode fazer um bloco A ppend (e bloquear I NSERT para preceder). (ref::help v_b_A
,:help v_b_I
)E se o último movimento no Modo Visual de Bloco for
$
, o acréscimo será feito no final de todas as seleções; ou então espaços serão inseridos antes do texto que você anexou (imagine alinhar o fechamento)
no final de várias chamadas de método no código).Com texto de exemplo abaixo e cursor ligado
8
:<C-v>}$A,<C-c>
. Depois de voltar ao modo normal, podemos ver que,
é anexado a todas as linhas selecionadas. (Tente sem$
)Em seguida, faça
gv
para selecionar novamente a área eJ
ougJ
. Temos um rastro,
:8,9,10,12,
e$x
terminamos.Usar inserção para não arrastar
,
Vamos desfazer o nosso texto (seja ele
uu..u
sofisticado:ea 1d<cr>:lat 1
) e tentar o Visual Insert:j<C-v>}I, <C-c>
e então podemos juntar as linhasgJ
sem espaços.Espere, espere, algo está faltando. Como selecionar novamente toda a "matriz"? Desta vez, não selecionamos a primeira linha ... então
gv
não ajuda.- Ou pode ajudar,
gvok
é re-selecionar (gv
),o
canto oposto e parak
cima.PS meu mindinho não é rápida e precisa o suficiente para escrever
/\
para/\n
, então eu como a combinação de Vim built-in operações e movimentos para evitar o uso de Regex. No entanto, se eu fizer isso com bastante frequência, usando um mapeamento - talvez aqueles que mapeiem para plugins devam ser melhores.fonte
Uma maneira muito mais simples, sem plugins ou comandos externos, de remapear join (
J
) de um espaço para o caractere que você gosta. Por exemplo, para se juntar a uma vírgula e um espaço:Para a nova linha de caractere especial no final (
^M
), pressioneCtrl-V
e, em seguida, Return / Enter. O mesmo vale se você deseja substituir por uma guia (^I
), digiteCtrl-I
entãoTab
.O que isto está fazendo é substituir uma nova linha por uma guia na linha atual e remapear esse comportamento para o caractere J.
Isso também funciona com combinações, como em
4J
juntar-se aos próximos 4 linhas.fonte
Você pode gravar uma macro para unir linhas com uma vírgula. Isso é útil se for uma tarefa rara ou pontual e você não consegue se lembrar de como escrever um comando substituto e uma expressão regular para executar a tarefa, mas lembra-se de como gravar e executar uma macro.
Para unir linhas com uma vírgula, digite qjgJi,Escqpara registrar a macro no registro
j
. Então você pode executar a macro com @j. Você pode executar novamente a macro com @@, o que economiza na digitação ao executá-la várias vezes seguidas - você pode até manter pressionado @até chegar perto do final das linhas nas quais deseja ingressar. Você também pode usar um prefixo numérico @jou @@repeti-lo um número definido de vezes. Isso deixa o espaço inicial e final intacto, para que haja espaços antes ou depois da vírgula, se o texto original tiver espaços lá.Para juntar uma vírgula e um espaço, insira Spaceentre ,e Escao gravar a macro.
Você também pode usar em Jvez de gJgravar a macro, que geralmente une linhas com vírgula e espaço. No entanto, se a linha atual tiver espaços em branco à direita, a vírgula aparecerá após o espaço em branco sem um espaço a seguir. Além disso, ele não inclui o espaço se a próxima linha começa com
)
, e ele coloca dois espaços após a vírgula, sejoinspaces
estiver definido e as extremidades de linha atuais com.
,!
ou?
. Essas advertências são descritas abaixo:help J
.fonte