Como excluir o conteúdo para trás até "=" na linha anterior?

9

Eu uso um exemplo de código javascript:

1        var a = 1;
2        var b = |{};

O cursor está na posição de |(no caractere "{" quando a forma do cursor é um bloco), descubro que desejo aque seja atribuído um objeto a ele, então desejo modificá-lo como abaixo:

1        var a = {};

Então, eu quero saber quando o cursor está em "{", como excluir rapidamente todo o conteúdo antes de "{" até o espaço em branco após o sinal "=" na linha 1?

Em outros editores normais, pressionarei a tecla backspace para excluir o código. Mas não sei como conseguir isso no vim.

Aaron Shen
fonte
você também pode pressionar ie usar a tecla Backspace. Nenhum corpo vai atirar em você por isso. Eu acho que.
Elyashiv
11
mas backspace não excluirá caráter de linha acima
Aaron Shen
3
@AaronShen Isso depende da sua configuração de 'backspace'. Se ele inclui eolem seguida, backspace vai eliminar quebras de linha. Você também precisará startser incluído na configuração. (Veja :help backspace). Não use esse método! Existem vários métodos muito mais rápidos detalhados nas respostas abaixo.
Rich

Respostas:

20

Não tenho certeza se entendi totalmente a pergunta, mas se você deseja excluir até ter apenas var a = {};, você pode, na posição do cursor, usard?1Enter

dfaz um movimento e você pode atribuir a ele um padrão de pesquisa /para uma pesquisa ?para frente ou para uma pesquisa para trás.

Aqui está um pequeno gif demonstrando isso:

insira a descrição da imagem aqui

akshay
fonte
11
Provavelmente vale a pena mencionar que você precisa pressionar Enterapós digitar d?1.
Rich
@ Rich realmente obrigado, eu atualizei a resposta para incluir isso.
akshay
11
Que fonte esse shell está usando?
Chris Burt-Brown
@ ChrisBurt-Brown: Terminus
akshay
10

Se você estiver usando o vim (e não o vi clássico), no seu exemplo, você pode fazer vkd(ou vkx).

  • v colocará no modo 'visual' (selecione)
  • k subirá uma linha para colocar o cursor no '1', selecionando a parte que você deseja excluir
  • dou xexcluirá a seleção
BobH
fonte
5

Excluir

Para este exemplo específico, dgké uma das maneiras mais rápidas de fazer isso.

O dcomando, como Akshay explicou , pode ser seguido por um movimento, excluindo todos os caracteres entre o local onde o cursor começa e para onde o movimento o leva.

No seu código, você deseja excluir tudo entre a posição do cursor e a mesma coluna uma linha mais acima, de modo que mover o cursor para cima com o gkmovimento (que quando usado com um operador não é linear) alcançará seu objetivo.

EDIT: BobH aponta nos comentários que este método só funciona quando 'wrap'está definido. Como tal, a menos que você sempre tenha um conjunto de envoltórios, provavelmente será melhor usar dvkou vkd, conforme sugerido pelas outras respostas nesta página.

Excluir palavras para trás

Você também pode usar: d5bou d4B, que excluirá 5 palavras ou 4 PALAVRAS para trás, respectivamente. ( 1;é uma PALAVRA, mas duas palavras regulares).

Rico
fonte
porque dk irá eliminar tanto a linha atual e linha acima completamente
Aaron Shen
@AaronShen Nope. Tente.
Rich
11
@ Rico, se isso funcionar para você, você tem uma configuração que permite esse movimento de exclusão. Acabei de testar vim -u NONE -U NONEe exclui as duas linhas.
Vitor
@Vitor Você está certo. Tentando descobrir qual configuração faz isso agora.
Rich
11
BTW verifica-se usando gkcomo caractere aparentemente requer :set wrap(um pouco enigmaticamente). Eu não conseguia descobrir por que isso aparentemente funcionava para todo mundo, menos para mim, quando a ajuda da gkmesma forma parecia sugerir que deveria funcionar. A única pista era que o significado principal gktinha a ver com linhas quebradas. Depois que tentei colocar o wrap (meio que por capricho), pronto, funcionou.
21415 BobH
1

Ainda não posso comentar, por isso preciso fazer uma nova resposta. As chaves d kfornecidas por Rich não funcionam para mim, mesmo ao usar a opção nocompatível. Um motivo pode ser que o movimento kseja considerado no sentido da linha pelo vim, caso em que as duas linhas serão excluídas. De :help d:

Uma exceção para o comando d {motion}: se o movimento não for em linha, o início e o fim do movimento não estarão na mesma linha e haverá apenas espaços em branco antes do início e após o final do movimento, a exclusão se tornará na linha. Isso significa que a exclusão também remove a linha de espaços em branco que você pode esperar permanecer. Use o | o_v | operador para forçar o movimento a ser característico

Também mostra o remédio: use dvkpara forçar o movimento a ser inteligente. Isso faz o truque para mim.

Eu não sabia o_v antes, então aqui está :help o_v:

v

Quando usado após um operador, antes do comando de movimento: Força o operador a trabalhar caractere, também quando o movimento é linear. Se o movimento foi na linha, ele se tornará | exclusivo |. Se o movimento já tiver sido característico, alterne entre inclusivo / exclusivo. Isso pode ser usado para tornar uma moção exclusiva inclusiva e uma moção inclusiva exclusiva

PhilippFrank
fonte
A coisa 'nocompatível' era um arenque vermelho completo. Eu errei quando estava testando porque sou um idiota.
Rich
Também podemos usar o dgk, onde o gk também é exclusivo e não linear.
MS.Kim