Quais são os cantos escuros do Vim sobre os quais sua mãe nunca falou? [fechadas]


799

Há uma infinidade de perguntas nas quais as pessoas falam sobre truques comuns, principalmente " dicas e truques do Vim + ctags ".

No entanto, não me refiro a atalhos comumente usados ​​que alguém novo no Vim consideraria legal. Estou falando de um usuário experiente do Unix (seja um desenvolvedor, administrador, ambos etc.), que acha que sabe algo que 99% de nós nunca ouviu ou sonhou. Algo que não apenas facilita seu trabalho, mas também é FRESCO e hackish . Afinal, o Vim reside no sistema operacional mais rico em cantos escuros do mundo, portanto, deve ter complexidades que apenas alguns privilegiados conhecem e desejam compartilhar conosco.


10
: Janela Sex Split e abra o gerenciador de arquivos integrado (divisão horizontal)
user3218088

2
Essa pergunta parece ser bastante construtiva - olhando para o número de votos positivos ... votados para reabrir - talvez chegue uma resposta ainda mais interessante - que pode ser votada se útil - dando mais valor ao SOF. Ordenando as respostas por votos Eu aprendi muitas coisas legais em apenas 5 minutos ... coisas realmente valiosas aqui, por que fechar algo tão valioso? Como isso não é construtivo?
jhegedus

7
Ridículo que esta questão esteja encerrada. Fale sobre legalismo.
Lepidopterist

2
Penso que esta questão é muito construtiva, mas, mais apropriada no Quora.
Diogo Melo

2
Por que existem 2 (a partir de agora) votos para excluir esta pergunta? Que bem isso faria?
Akavall

Respostas:


782

Pode não ser aquele que 99% dos usuários do Vim não conhecem, mas é algo que uso diariamente e que qualquer usuário avançado do Linux + Vim deve saber.

Comando básico, mas extremamente útil.

:w !sudo tee %

Costumo esquecer o sudo antes de editar um arquivo no qual não tenho permissão de gravação. Quando venho para salvar esse arquivo e recebo um erro de permissão, apenas emito esse comando vim para salvar o arquivo sem a necessidade de salvá-lo em um arquivo temporário e copiá-lo novamente.

Obviamente, você precisa estar em um sistema com o sudo instalado e com direitos.


116
Indiscutivelmente, isso é ainda melhor do que executar o vim como root! Voto a favor!
Arafangion 14/09/09

27
Para um noob, o que exatamente o tee faz? Alguém se importaria de analisar esse comando para mim?
andyl

41
cmap w !! w! sudo tee%
jm666 12/05

58
Você nunca deve correr sudo vim. Em vez disso, você deve exportar EDITORcomo vim e executar sudoedit.
Gerardo Marset

8
@maximus: vim substitui% pelo nome do buffer / arquivo atual.
migu

617

Algo que eu descobri recentemente que achei muito legal:

:earlier 15m

Reverte o documento para como estava há 15 minutos atrás. Pode levar vários argumentos para a quantidade de tempo que você deseja reverter e depende de níveis inferiores. Pode ser revertido com o comando oposto:later


6
@skinp: Se você desfazer e depois fizer outras alterações a partir do estado desfeito, perderá o histórico de refazer. Isso permite que você volte para um estado que não está mais na pilha de desfazer.
ephemient

39
Também é muito útil g + e g- para ir e voltar no tempo. Isso é muito mais poderoso do que uma pilha de desfazer / refazer, pois você não perde o histórico quando faz algo depois de desfazer.
Etienne PIERRE

9
Você não perde o histórico de refazer se fizer uma alteração depois de desfazer. Apenas não é facilmente acessado. Existem plugins para ajudá-lo a visualizar isso, como Gundo.vim
Ehtesh Choudhury 29/11

559
Uau, então agora eu posso fazer :later 8he estou pronto por hoje? : P
Igor Popov

7
Seu comando assume que um gastará pelo menos 15 minutos no vim !
e2-e4

411

:! [command] executa um comando externo enquanto você estiver no Vim.

Mas adicione um ponto após os dois pontos, :.! [command]e ele despejará a saída do comando na sua janela atual. Isso é: . !

Por exemplo:

:.! ls

Eu uso muito isso para coisas como adicionar a data atual a um documento que estou digitando:

:.! date

74
Isso é bem parecido com: r! A única diferença, até onde eu sei, é a seguinte: r! abre uma nova linha,:.! substitui a linha atual.
Saffsd 6/05/09

6
Uma alternativa :.!dateé escrever "date" em uma linha e depois executar !$sh(alternativamente, ter o comando seguido de uma linha em branco e executar !jsh). Isso direcionará a linha para o shell "sh" e substituirá a saída do comando
precisa saber é o seguinte

43
:.!é realmente um caso especial de :{range}!, que filtra um intervalo de linhas (a linha atual quando o intervalo é .) através de um comando e substitui essas linhas pela saída. Eu acho :%!útil para filtrar buffers inteiros.
Nefrubyr

2
@ Sundar: Por que passar uma linha para sed, quando você pode usar os comandos ed/ built-in semelhantes ex? Tente executar :.s/old/new/g;-)
jabirali

4
E também observe que '!' é como 'y', 'd', 'c' etc., ou seja, você pode fazer: !!, número !!,! motion (por exemplo! Gshell_comand <cr> substitua da linha atual até o final do arquivo ('G') por saída do shell_command).
aqn

312

Não é exatamente obscuro, mas existem vários comandos "delete in" que são extremamente úteis, como ..

  • diw para excluir a palavra atual
  • di( excluir dentro dos parâmetros atuais
  • di" para excluir o texto entre aspas

Outros podem ser encontrados em :help text-objects


8
dab "suportes arounb excluir", DAB para suportes em torno encaracolado, t para as tags do tipo xml, combinações com comandos normais são como esperado CIB / Yab / dit / IVA etc
sjh

15
@Masi: yi (va (p elimina apenas os suportes
Don Reba

42
Esta é possivelmente a maior razão para eu ficar com o Vim. Isso e seus equivalentes "mudança" comandos: CIW, ci (, ci", bem como dt <espaço> e ct <espaço>
thomasrutter

4
@ thomasrutter: Por que não dW / cW em vez de dt <space>?

9
@Masi: Com o plugin surround: ds (.

237

de Exclua tudo até o final da palavra pressionando. no desejo do seu coração.

ci (xyz [Esc] - Esse é estranho. Aqui, o 'i' não significa modo de inserção. Em vez disso, significa dentro dos parênteses. Portanto, essa sequência corta o texto entre parênteses em que você está e o substitui por . "xyz" Ele também funciona dentro do quadrado e figura entre parênteses - basta fazer ci [ou ci {correspondentemente Naturalmente, você pode fazer di (se você só quer apagar todo o texto sem digitar nada você também pode fazer.. aem vez de ise deseja excluir os parênteses também e não apenas o texto dentro deles.

ci " - corta o texto entre aspas atuais

ciw - corta a palavra atual. Isso funciona como o anterior, exceto que (é substituído por w.

C - corte o restante da linha e mude para o modo de inserção.

ZZ - salva e fecha o arquivo atual (MUITO MAIS rápido que o Ctrl-F4 para fechar a guia atual!)

ddp - move a linha atual uma linha para baixo

xp - move o caractere atual uma posição para a direita

U - maiúscula, então viwUusa a palavra em maiúscula

~ - alterna entre maiúsculas e minúsculas, portanto viw~, reverterá a maiúsculas e minúsculas da palavra inteira

Ctrl + u / Ctrl + d rola a página meia tela para cima ou para baixo. Isso parece ser mais útil do que a paginação usual em tela cheia, pois facilita a visualização de como as duas telas se relacionam. Para aqueles que ainda querem rolar a tela inteira de cada vez, há Ctrl + f para Forward e Ctrl + b para Backward. Ctrl + Y e Ctrl + E rolam para baixo ou para cima uma linha por vez.

O comando louco, mas muito útil, é zz - rola a tela para fazer esta linha aparecer no meio. Isso é excelente para colocar o código no qual você está trabalhando no centro de sua atenção. Os comandos irmãos - zt e zb - tornam essa linha na parte superior ou inferior da tela, o que não é tão útil.

% localiza e pula para o parêntese correspondente.

de - delete do cursor até o final da palavra (você também pode dEexcluir até o próximo espaço)

bde - exclui a palavra atual, da esquerda para a direita, delimitador

df [espaço] - exclua até e incluindo o próximo espaço

dt. - excluir até o próximo ponto

dd - exclua toda a linha

ye (ou ye) - puxa o texto daqui até o final da palavra

ce - corta o final da palavra

bye - copia a palavra atual (me faz pensar no que "oi" faz!)

yy - copia a linha atual

cc - corta a linha atual, você também pode fazer S. Há também uma tampa inferior sque corta o caractere atual e muda para o modo de inserção.

viwy ou viwc . Arranque ou mude a palavra atual. Pressione wvárias vezes para continuar selecionando cada palavra subseqüente, use bpara retroceder

vi { - selecione todo o texto entre colchetes. va {- selecione todo o texto, incluindo {} s

vi (p - destaque tudo dentro de () se substitua pelo texto colado

b e e movem o cursor palavra por palavra, da mesma forma que Ctrl + Arrows normalmente fazem . A definição de palavra é um pouco diferente, pois vários delmiters consecutivos são tratados como uma palavra. Se você começar no meio de uma palavra, pressionar b sempre levará ao início da palavra atual e cada b consecutivo passará para o início da palavra seguinte. Da mesma forma, e fácil de lembrar, ecoloca o cursor no final da palavra atual e de cada palavra subsequente.

similar a b/ e, capital Be Emova o cursor palavra por palavra usando apenas espaços em branco como delimitadores.

capital D (respire fundo) Exclui o restante da linha à direita do cursor, da mesma forma que Shift + End / Del nos editores normais (observe 2 pressionamentos de tecla - Shift + D - em vez de 3)


15
O zt é bastante útil se você o usar no início de uma definição de função ou classe.
1011 Nick Nick as

9
vitye vitcpode ser reduzido para yite citrespectivamente.
197 Nathan Fellman

33
Todas as coisas que você está chamando de "corte" são "mudança". por exemplo: C é alterado até o final da linha. O equivalente do Vim a "cut" é "delete", feito com d / D. A principal diferença entre alterar e excluir é que a exclusão o deixa no modo normal, mas a mudança o coloca em um tipo de modo de inserção (embora você ainda esteja no comando de alteração, que é útil, pois toda a alteração pode ser repetida .).
Laurence Gonsalves

11
Eu pensei que isso era para uma lista de coisas que muitas pessoas não sabem. yy é muito comum, eu teria pensado.
Almo 29/05

19
byenão funciona quando você está no primeiro caractere da palavra. yiwsempre faz.
Andrea Francia

204

Um que eu raramente encontro na maioria dos tutoriais do Vim, mas é incrivelmente útil (pelo menos para mim), é o

g; and g,

para mover (para frente e para trás) através da lista de alterações.

Deixe-me mostrar como eu o uso. Às vezes, eu preciso copiar e colar um pedaço de código ou string, digitar um código de cor hexadecimal em um arquivo CSS, então pesquiso, pulo (não me importando onde está a correspondência), copie-o e depois pulo de volta (g;) para onde Eu estava editando o código para finalmente colá-lo. Não há necessidade de criar marcas. Mais simples.

Apenas meus 2 centavos.


29
da mesma forma, '.irá para a última linha editada e `.irá para a última posição editada
aehlke

8
Ctrl-O e Ctrl-I (guia) funcionarão de maneira semelhante, mas não a mesma. Eles se movem para trás e para a frente na "lista de salto", que você pode ver fazendo: pula ou: ju Para mais informações faça um: ajuda jumplist
Kimball Robinson

17
Você pode listar a lista de alterações fazendo: changes
Kimball Robinson

Dang quente que é útil. Eu uso <C-o>/ <C-i>para isso o tempo todo - ou marcando meu lugar.
Wayne Werner

187
:%!xxd

Faça do vim um editor hexadecimal.

:%!xxd -r

Reverter.

Aviso: Se você não editar com binário (-b), poderá danificar o arquivo. - Josh Lee nos comentários.


9
E como você reverte isso de volta?
Christian

40
:! xxd -r // Para voltar do HEX
Naga Kiran

21
Na verdade, eu acho que é :%!xxd -rpara revertê-lo
Andreas Grech

@ JoshLee: Se alguém tomar cuidado para não atravessar novas linhas, é seguro não usar a opção -b? Eu pergunto, porque às vezes eu quero fazer uma alteração hexadecimal, mas não quero fechar e reabrir o arquivo para fazer isso.
dotancohen

4
@dotancohen: Se você não deseja fechar / reabrir o arquivo, você pode: set binary
Bambu


119

Às vezes, uma configuração no seu .vimrc é substituída por um plug-in ou comando automático. Para depurar isso, um truque útil é usar o comando: verbose em conjunto com: set. Por exemplo, para descobrir onde o cindent foi configurado / desativado:

:verbose set cindent?

Isso produzirá algo como:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Isso também funciona com mapas e destaques. (Obrigado joeytwiddle por apontar isso.) Por exemplo:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim

8
Excelente dica - exatamente o que eu estava procurando hoje.
Artem Russakovskii 23/10/09

Excelente dica cara! Como você conhece essas coisas nerds?
Rafid

1
:verbosetambém pode ser usado antes nmap lou highlight Normalpara descobrir onde o lmapa de teclas ou o Normaldestaque foram definidos pela última vez. Muito útil para depuração!
Joeytwiddle

@joeytwiddle Thanks! Eu adicionei essa informação à resposta.
Laurence Gonsalves

Quando você começa a criar mapeamentos personalizados, isso vai te salvar muitas vezes, provavelmente um dos mais úteis aqui (IMO)!
SidOfc 24/09


98

Não tenho certeza se isso conta como um canto escuro, mas acabei de aprender ...

:g/match/y A

puxará (copiará) todas as linhas que contêm "correspondência" no registro "a/ @a. (A capitalização como Afaz com que o vim acrescente arrancamentos em vez de substituir o conteúdo anterior do registro.) Eu o usei muito recentemente ao criar folhas de estilo do Internet Explorer.


conta, conta como eu não vi este :)

Agradável. Nunca ouvi falar disso ... pode ser útil: P
skinp

5
Você pode usar: g! para encontrar linhas que não correspondem a um padrão ex: g / set / dd normal (apagar todas as linhas que não contêm set)!
tsukimi

3
Às vezes, é melhor fazer o que o tsukimi disse e filtrar as linhas que não correspondem ao seu padrão. Porém, uma versão abreviada desse comando: :v/PATTERN/dExplicação: :vé uma abreviação de :g!, e o :gcomando aplica qualquer comando ex às linhas. :y[ank]funciona e o faz :normal, mas aqui a coisa mais natural a fazer é justa :d[elete].
Pandubear # 12/13

Você também pode fazer :g/match/normal "Ayy- a normalpalavra - chave permite que você execute comandos no modo normal (com os quais você provavelmente está mais familiarizado).
22716 Kimball Robinson

93

Deseja olhar para o seu: histórico de comandos?

q:

Em seguida, navegue, edite e, finalmente, execute o comando.

Você já fez alterações semelhantes em dois arquivos e alternou entre eles? (Por exemplo, arquivos de origem e cabeçalho?)

:set hidden
:map <TAB> :e#<CR>

Depois, alterne entre esses arquivos.


131
Eu bati q:por acidente o tempo todo ...
Josh Lee

11
Como alternativa, no editor ex (:), você pode executar CTRL-f para abrir a janela do histórico de comandos.
Jason Baixo

6
@jleedev eu também. Eu quase odeio esse comando, só porque o uso acidentalmente demais.
bradlis7

9
q / e q? pode ser usado para fazer algo semelhante aos seus padrões de pesquisa.
bpw1621

5
Pressionar <Cf> após: ou / (ou quando você estiver no modo de comando) exibirá o mesmo menu de histórico. Então você pode remapear q: se você acertar muito acidentalmente e ainda acessar este modo incrível.
Idbrii

82

O Vim abrirá uma URL, por exemplo

vim http://stackoverflow.com/

Bom quando você precisa acessar a fonte de uma página para referência.


2
Para mim, não abriu a fonte; aparentemente, ele usou elinks para despejar a página renderizada em um buffer e, em seguida, abriu-a.
Ivan Vučica

há erro quando executado este comando
Dzung Nguyen

5
Funciona melhor com uma barra no final. Truque puro!
Thomas

@Vdt: Seria útil se você publicasse o seu erro. Se for este: " error (netrw) nem o comando wget nem o fetch estão disponíveis", você obviamente precisará disponibilizar uma dessas ferramentas na variável de ambiente PATH.
Isaac Nequittepas

Acho este particularmente útil quando as pessoas enviam links para um serviço de colagem e esquecem de selecionar um destaque de sintaxe, geralmente só preciso abrir o link no vim após anexar "& raw".
Dettorer

68

Macros podem chamar outras macros e também podem se chamar.

por exemplo:

qq0dwj@qq@q

... excluirá a primeira palavra de todas as linhas até o final do arquivo.

Este é um exemplo bastante simples, mas demonstra um recurso muito poderoso do vim


2
Eu não sabia que macros poderiam se repetir. Legal. Nota: qx inicia a gravação no registrador x (ele usa qq no registrador q). 0 se move para o início da linha. dw exclui uma palavra. j desce uma linha. @q executará a macro novamente (definindo um loop). Mas você esqueceu de terminar a gravação com um "q" final e, em seguida, execute a macro digitando @q.
22810 Kimball Robinson

2
Eu acho que é intencional, como uma macro aninhada e recursiva.
Yktula

7
qqqqqifuu<Esc>h@qq@q
Gerardo Marset

6
Outra maneira de conseguir isso é gravar uma macro no registro a que faz alguma transformação em uma única linha e, em linha a linha, realçar um monte de linhas com V e digite :normal! @apara aplicar sua macro em todas as linhas da sua seleção.
Nathan Long

Encontrei este artigo pesquisando macros VIM recursivas no Google. Não consegui encontrar outra maneira de interromper a macro além de matar o processo VIM.
dotancohen

55

Supondo que você tenha o suporte a Perl e / ou Ruby compilado, :rubydoe :perldoexecutará um liner de Ruby ou Perl em todas as linhas de um intervalo (o padrão é o buffer inteiro), com o $_limite do texto da linha atual (menos a nova linha). Manipular $_mudará o texto dessa linha.

Você pode usar isso para fazer certas coisas que são fáceis de fazer em uma linguagem de script, mas não tão óbvias usando os recursos internos do Vim. Por exemplo, para reverter a ordem das palavras em uma linha:

:perldo $_ = join ' ', reverse split

Para inserir uma sequência aleatória de 8 caracteres (AZ) no final de cada linha:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

Você está limitado a agir em uma linha de cada vez e não pode adicionar novas linhas.


e se eu só quiser que o perldo seja executado em uma linha especificada? ou algumas linhas selecionadas?
284 Sujoy

5
Você pode definir um intervalo como qualquer outro comando. Por exemplo: 1,5perldo funcionará apenas nas linhas 1-5.
27711 Brian Carper

Você poderia fazer $ _ + = '\ nNEWLINE !!!' obter uma nova linha após a atual?
Greg

Infelizmente não, apenas adiciona um caractere de controle descolado ao final da linha. Você pode usar uma pesquisa / substituição do Vim para alterar todos esses caracteres de controle para novas linhas reais.
Brian Carper

3
Da mesma forma, pydoe py3dotrabalhe para python se você tiver o suporte necessário compilado.
Derecho

54

^ O e ^ I

Vá para a posição mais antiga / mais nova. Ao percorrer o arquivo (pesquisando, movendo comandos etc.), lembre-se desses "saltos", para que você possa repetir esses saltos para trás (^ O - O para antigos) e para frente (^ I - logo ao lado de I no teclado ) Acho muito útil ao escrever código e realizar muitas pesquisas.

gi

Vá para a posição em que o modo Inserir foi parado pela última vez. Encontro-me frequentemente editando e depois procurando por algo. Para retornar ao local de edição, pressione gi.

gf

coloque o cursor no nome do arquivo (por exemplo, inclua o arquivo de cabeçalho), pressione gf e o arquivo é aberto

gF

semelhante ao gf, mas reconhece o formato "[nome do arquivo]: [número da linha]". Pressionar gF abrirá [nome do arquivo] e ajustará o cursor para [número da linha].

^ P e ^ N

Texto de preenchimento automático durante a edição (^ P - correspondência anterior e ^ N próxima correspondência)

^ X ^ L

Enquanto a edição é concluída na mesma linha (útil para programação). Você escreve código e lembra que possui o mesmo código em algum lugar do arquivo. Basta pressionar ^ X ^ L e a linha completa concluída

^ X ^ F

Nomes de arquivos completos. Você escreve "/ etc / pass" Hmm. Você esqueceu o nome do arquivo. Basta pressionar ^ X ^ F e o nome do arquivo é concluído

^ Z ou: sh

Mova temporariamente para o shell. Se você precisar de uma resposta rápida:

  • pressione ^ Z (para colocar vi em segundo plano) para retornar ao shell original e pressione fg para retornar ao vim de volta
  • pressione: sh para ir para o sub shell e pressione ^ D / exit para retornar ao vi voltar

Na ^X^Fminha opinião, os nomes de arquivos incluem =sinais, fazendo com que você faça coisas podres em muitas ocasiões (arquivos ini, makefiles etc.). Eu uso se isfname-==para acabar com esse incômodo
sehe

3
Com +1, o preenchimento automático interno fica parado esperando para ser descoberto.
Joeytwiddle

48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor

2
Não vejo para que serve isso (além de parecer uma resposta de piada). Alguém mais pode me esclarecer?
Ryan Edwards

2
abra o vim e faça ": para i no intervalo (1.255) | .put = '10 .0.0. '. i | endfor"
codygman 6/11/12

2
@RyanEdwards preenchendo / etc / hosts talvez
Ruslan

26
Esta é uma resposta fantástica. Não é a parte de criar os endereços IP, mas a parte que implica que o VIM pode usar para loops nos comandos .
dotancohen

4
Sem ex-mode:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap 31/08

47

Este é um bom truque para reabrir o arquivo atual com uma codificação diferente:

:e ++enc=cp1250 %:p

Útil quando você precisa trabalhar com codificações herdadas. As codificações suportadas estão listadas em uma tabela em encoding-values(consulte help encoding-values). O mesmo procedimento também funciona ++ff, para que você possa reabrir o arquivo com a linha Windows / Unix, se você errar pela primeira vez (consulte a seção help ff).


Nunca tive que usar esse tipo de coisa, mas vamos certamente adicionar ao meu arsenal de truques ...

ótima dica, obrigado. Para pontos de bônus, adicione uma lista de codificações válidas comuns.
Adriano Varoli Piazza

2
Eu usei isso hoje, mas acho que não precisei especificar "%: p"; basta abrir o arquivo e: e ++ enc = cp1250 foi suficiente. I
Ivan Vučica 08/07/09

: set encoding = cp1250 teria o mesmo efeito?
laz

1
`: e + b% 'é igualmente útil para reabrir no modo binário (sem alteração de novas linhas)
intuited

47

Digitando == irá corrigir o recuo da linha atual com base na linha acima.

Na verdade, você pode executar um sinal = seguido de qualquer comando de movimento. = {movimento}

Por exemplo, você pode usar o% de movimento que se move entre chaves. Posicione o cursor no {no seguinte código:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

E pressione =% para obter instantaneamente:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

Como alternativa, você pode fazer = a { dentro do bloco de código, em vez de se posicionar diretamente no caractere {.


Hm, eu não sabia disso sobre o recuo.
Ehtesh Choudhury

Normalmente, não há necessidade de estar exatamente no aparelho. Pensei com freqüência que eu apenas =}ou vaBaB=porque é menos dependente. Além disso, v}}:!astyle -bjcombina com o meu estilo de código melhor, mas eu pode obtê-lo de volta para o seu estilo com um simples%!astyle -aj
sehe

7
gg=Gé bem legal ao colar em alguma coisa.
Kyrias 19/10/2013

Relacionado: Re-recuando código mal recuado no Vim SE
kenorb

@ kyrias Oh, eu tenho feito isso como ggVG=.
Braden Best

42
imap jj <esc>

7
como você vai digitar jj então? : P
hasen

6
Com que frequência você digita jj? Pelo menos em inglês?
Ojblass

50
Eu remapeei o capslock para esc, pois é uma chave inútil. No entanto, meu mapeamento era amplo para todo o sistema operacional, por isso tem o benefício adicional de nunca ter que se preocupar em atingi-lo acidentalmente. A única desvantagem é mais difícil gritar com as pessoas. :) #
Alex

7
@ Alex: definitivamente, capslock é a morte. "espera, wtf? oh, isso foi ZZ? .... porcaria."
intuited

5
@ojblass: Não tenho certeza quantas pessoas já MATLAB código direito no Vim, mas iie jjsão comumente usados para variáveis de contador, porque ie jsão reservados para números complexos.
Brianmearns 03/10/12

37

Vamos ver um pequeno editor de IDE fazendo a transposição de colunas.

:%s/\(.*\)^I\(.*\)/\2^I\1/

Explicação

\(e \)é como se lembrar de coisas em regex-land. E \1, \2etc , é como recuperar as coisas lembradas.

>>> \(.*\)^I\(.*\)

Lembre-se de tudo seguido por ^I(tab) seguido de tudo.

>>> \2^I\1

Substitua as coisas acima por "2ª coisa que você lembrou" seguida por "1ª coisa que você lembrou" - essencialmente fazendo uma transposição.


4
Alterna um par de colunas separadas por tabulação (separador arbitrário, é tudo regex) entre si.
caos

39
Isso é apenas uma regex; muitos IDEs têm pesquisa e substituição de expressões regulares.
rlbond

7
@rlbond - Tudo se resume a quão bom é o mecanismo de expressão regular no IDE. As expressões regulares do Vim são bastante poderosas; outros ... nem tanto às vezes.
Romandas 19/06/09

3
O * será ganancioso, portanto, este regex supõe que você tenha apenas duas colunas. Se você quer que ele seja o uso não greedy {-} em vez de * (ver: ajuda não greedy para mais informações sobre o multiplicador {})
Kimball Robinson

4
Este é, na verdade, um regex bastante simples, é apenas escapar dos parênteses do grupo que o torna complicado.
Mk12

30

Não é exatamente um segredo obscuro, mas eu gosto de colocar o seguinte mapeamento no meu arquivo .vimrc, para que eu possa pressionar "-" (menos) a qualquer momento para abrir o explorador de arquivos e mostrar os arquivos adjacentes àquele que acabei de editar . No explorador de arquivos, posso clicar em outro "-" para mover um diretório, fornecendo uma navegação contínua de estruturas de diretório complexas (como as usadas pelas estruturas MVC atualmente):

map - :Explore<cr>

Isso também pode ser útil para alguém. Eu gosto de rolar a tela e avançar o cursor ao mesmo tempo:

map <c-j> j<c-e>
map <c-k> k<c-y>

Navegação por guias - eu amo guias e preciso me mover facilmente entre elas:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Somente no Mac OS X: navegação na guia semelhante ao Safari:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>

Você também pode ver ficheiros em si Vim, usando: Explore
Roman Plasil

Olá, Romano, é exatamente isso que esse mapeamento faz, mas o atribui a uma "tecla de atalho". :)
KKovacs

27

Eu gosto de usar 'sudo bash', e meu sysadmin odeia isso. Ele bloqueou o 'sudo' para que ele pudesse ser usado apenas com alguns comandos (ls, chmod, chown, vi, etc), mas eu pude usar o vim para obter um shell raiz de qualquer maneira:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#

9
FWIW, sudoedit (ou sudo -e) edita arquivos privilegiados, mas executa seu editor como seu usuário normal.
RJHunter 21/07/2009

12
sim ... eu também te odeio;) você só precisa de um shell raiz MUITO RARAMENTE, a menos que você já tenha o hábito de executar muitos comandos como root, o que significa que suas permissões estão todas erradas.
We Are All Monica

5
Por que o seu administrador de sistema ainda lhe dá raiz? : D
d33tah 30/03

26

Muitas vezes, gosto de alterar os diretórios atuais durante a edição - por isso tenho que especificar menos os caminhos.

cd %:h

O que isso faz? E isso funciona com autchdir?
828 Leonard

2
Suponho que substituiria o autochdir temporariamente (até você alternar os buffers novamente). Basicamente, ele altera o diretório para o diretório raiz do arquivo atual. Isso me dá um pouco mais de controle manual do que o autochdir.
Rampion

1
: conjunto autochdir // isso também serve a mesma funcionalidade e muda o diretório atual para o de arquivo em tampão
Naga Kiran

25

Costumo usar muitas janelas quando trabalho em um projeto e às vezes preciso redimensioná-las. Aqui está o que eu uso:

map + <C-W>+
map - <C-W>-

Esses mapeamentos permitem aumentar e diminuir o tamanho da janela atual. É bem simples, mas rápido.


16
Há também Ctrl-W =, que torna as janelas iguais em largura.
Bill Lynch

2
Não esqueça que você pode anexar números para executar uma ação várias vezes no Vim. Portanto, para expandir a altura atual da janela em 8 linhas: 8 <CW> +
joeytwiddle

23

Não é um recurso obscuro, mas muito útil e economiza tempo.

Se você deseja salvar uma sessão de seus buffers, guias, marcadores e outras configurações abertas, é possível emitir o seguinte:

mksession session.vim

Você pode abrir sua sessão usando:

vim -S session.vim

5
Você também pode :so session.vimdentro do vim.
TankorSmash #

22
:r! <command>

cola a saída de um comando externo no buffer.

Faça algumas contas e obtenha o resultado diretamente no texto:

:r! echo $((3 + 5 + 8))

Obtenha a lista de arquivos a serem compilados ao escrever um Makefile:

:r! ls *.c

Não procure o fato de ler na wikipedia, cole-o diretamente no documento que está escrevendo:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever

14
^ R = 3 + 5 + 8 no modo de inserção permite inserir o valor da expressão (3 + 5 + 8) no texto com menos pressionamentos de tecla.
precisa saber é o seguinte

Como posso obter o resultado / saída para um buffer diferente do atual?
DCN


21

Mapeie F5 para ROT13 rapidamente seu buffer:

map <F5> ggg?G``

Você pode usá-lo como chave do chefe :).


14
Eu não sei o que você está escrevendo ... Mas, certamente, o meu patrão seria mais curioso quando me viu escrever ROT13 confusão :)
sehe

ou para falsificar seus amigos: nmap i ggg?G`` . Ou o diabólico: nmap i ggg?G``i!
Romaovs

1
@romeovs segundo um é loop infinito, o uso nnoremap
Amit ouro

19

Acabei de encontrar este hoje via NSFAQ :

Blocos de código de comentários.

Entre no modo Blockwise Visual pressionando CTRL-V.

Marque o bloco que deseja comentar.

Pressione I (maiúscula I) e insira sua sequência de comentários no início da linha. (// para C ++)

Pressione ESC e todas as linhas selecionadas terão // prefixadas na frente da linha.


Adicionei # para comentar um bloco de código em ruby. Como faço para desfazer isso.
Neeraj Singh

3
Você pode apenas bater ctrl + v novamente, marque a // 's e bateu x para 'descomentar'
nºs

6
Eu uso o NERDCommenter para isso.
Zyx

1
O código comentado é provavelmente um dos piores tipos de comentários que você pode colocar no seu código. Existem melhores usos para a incrível inserção de bloco.
Braden Best

1
@ Torta porque o código comentado é código morto . O código morto não serve a nenhum propósito útil e cria confusão. Você acha que está preservando o código que pode trazer de volta mais tarde, mas sempre há uma maneira melhor. Você pode usar seu histórico de desfazer, enganar o arquivo ou usar o git, que possui essa funcionalidade incorporada ( git checkout). Quanto aos melhores usos para a inserção de bloco, não há nenhum imbecil. Você o usa sempre que tiver várias linhas em que deseja inserir a mesma sequência de caracteres no mesmo local.
Braden Best

17

Eu uso o vim para praticamente qualquer edição de texto que eu faço, então geralmente uso copiar e colar. O problema é que o vim, por padrão, muitas vezes distorce o texto importado via colar. A maneira de parar isso é usar

:set paste

antes de colar seus dados. Isso evitará que você estrague tudo.

Observe que você precisará emitir :set nopastepara recuperar a indentação automática. Formas alternativas de colar texto pré-formatado são os registros da área de transferência ( *e +) e :r!cat(você terá que terminar o fragmento colado com ^ D).

Às vezes, também é útil ativar um esquema de cores de alto contraste. Isso pode ser feito com

:color blue

Percebi que ele não funciona em todas as versões do vim que eu uso, mas na maioria.


10
A "distorção" está acontecendo porque você tem algum tipo de recuo automático ativado. Usar set pasteou especificar uma chave para a pastetoggleopção é uma maneira comum de contornar isso, mas o mesmo efeito pode ser alcançado com o set mouse=aque o Vim sabe que o fluxo de texto que vê é uma pasta acionada pelo mouse.
28139 jamessan

1
Se você possui o gvim instalado, pode frequentemente (embora dependa de quais opções sua distro compila o vim) usar a área de transferência do X diretamente do vim através do registro *. Por exemplo, "*ppara colar a partir do x xlipboard. (Ele funciona a partir vim terminal, também, é só que você pode precisar do pacote gvim se eles são separados)
kyrias

2
@ kyrias para o registro, *é o registro PRIMARY("clique no meio"). A área de transferência é+
Braden Best
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.