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.
Respostas:
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.
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.
fonte
sudo vim
. Em vez disso, você deve exportarEDITOR
como vim e executarsudoedit
.Algo que eu descobri recentemente que achei muito legal:
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
fonte
:later 8h
e estou pronto por hoje? : P:! [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:
Eu uso muito isso para coisas como adicionar a data atual a um documento que estou digitando:
fonte
:.!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:.!
é 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.sed
, quando você pode usar os comandosed
/ built-in semelhantesex
? Tente executar:.s/old/new/g
;-)Não é exatamente obscuro, mas existem vários comandos "delete in" que são extremamente úteis, como ..
diw
para excluir a palavra atualdi(
excluir dentro dos parâmetros atuaisdi"
para excluir o texto entre aspasOutros podem ser encontrados em
:help text-objects
fonte
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..
a
em vez dei
se 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 porw
.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
viwU
usa a palavra em maiúscula~ - alterna entre maiúsculas e minúsculas, portanto
viw~
, reverterá a maiúsculas e minúsculas da palavra inteiraCtrl + 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
dE
excluir 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 inferiors
que corta o caractere atual e muda para o modo de inserção.viwy ou viwc . Arranque ou mude a palavra atual. Pressione
w
várias vezes para continuar selecionando cada palavra subseqüente, useb
para retrocedervi { - 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,
e
coloca o cursor no final da palavra atual e de cada palavra subsequente.similar a
b
/e
, capitalB
eE
mova 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)
fonte
vity
evitc
pode ser reduzido parayit
ecit
respectivamente..
).bye
não funciona quando você está no primeiro caractere da palavra.yiw
sempre faz.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.
fonte
'.
irá para a última linha editada e`.
irá para a última posição editada<C-o>
/<C-i>
para isso o tempo todo - ou marcando meu lugar.Faça do vim um editor hexadecimal.
Reverter.
Aviso: Se você não editar com binário (-b), poderá danificar o arquivo. - Josh Lee nos comentários.
fonte
:%!xxd -r
para revertê-loSeleciona novamente a última seleção visual.
fonte
À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:
Isso produzirá algo como:
Isso também funciona com mapas e destaques. (Obrigado joeytwiddle por apontar isso.) Por exemplo:
fonte
:verbose
também pode ser usado antesnmap l
ouhighlight Normal
para descobrir onde ol
mapa de teclas ou oNormal
destaque foram definidos pela última vez. Muito útil para depuração!:%TOhtml
Cria uma renderização html do arquivo atual.
fonte
Não tenho certeza se isso conta como um canto escuro, mas acabei de aprender ...
puxará (copiará) todas as linhas que contêm "correspondência" no registro
"a
/@a
. (A capitalização comoA
faz 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.fonte
:v/PATTERN/d
Explicação::v
é uma abreviação de:g!
, e o:g
comando aplica qualquer comando ex às linhas.:y[ank]
funciona e o faz:normal
, mas aqui a coisa mais natural a fazer é justa:d[elete]
.:g/match/normal "Ayy
- anormal
palavra - chave permite que você execute comandos no modo normal (com os quais você provavelmente está mais familiarizado).Deseja olhar para o seu: histórico de comandos?
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?)
Depois, alterne entre esses arquivos.
fonte
q:
por acidente o tempo todo ...O Vim abrirá uma URL, por exemplo
Bom quando você precisa acessar a fonte de uma página para referência.
fonte
Macros podem chamar outras macros e também podem se chamar.
por exemplo:
... 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
fonte
qqqqqifuu<Esc>h@qq@q
:normal! @a
para aplicar sua macro em todas as linhas da sua seleção.Supondo que você tenha o suporte a Perl e / ou Ruby compilado,
:rubydo
e:perldo
executará 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:
Para inserir uma sequência aleatória de 8 caracteres (AZ) no final de cada linha:
Você está limitado a agir em uma linha de cada vez e não pode adicionar novas linhas.
fonte
pydo
epy3do
trabalhe para python se você tiver o suporte necessário compilado.^ 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:
fonte
^X^F
minha 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 usose isfname-==
para acabar com esse incômodofonte
i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
Este é um bom truque para reabrir o arquivo atual com uma codificação diferente:
Útil quando você precisa trabalhar com codificações herdadas. As codificações suportadas estão listadas em uma tabela em
encoding-values
(consultehelp
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çãohelp
ff
).fonte
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:
E pressione =% para obter instantaneamente:
Como alternativa, você pode fazer = a { dentro do bloco de código, em vez de se posicionar diretamente no caractere {.
fonte
=}
ouvaBaB=
porque é menos dependente. Além disso,v}}:!astyle -bj
combina com o meu estilo de código melhor, mas eu pode obtê-lo de volta para o seu estilo com um simples%!astyle -aj
gg=G
é bem legal ao colar em alguma coisa.ggVG=
.fonte
ii
ejj
são comumente usados para variáveis de contador, porquei
ej
são reservados para números complexos.Vamos ver um pequeno editor de IDE fazendo a transposição de colunas.
Explicação
\(
e\)
é como se lembrar de coisas em regex-land. E\1
,\2
etc , é como recuperar as coisas lembradas.Lembre-se de tudo seguido por
^I
(tab) seguido de tudo.Substitua as coisas acima por "2ª coisa que você lembrou" seguida por "1ª coisa que você lembrou" - essencialmente fazendo uma transposição.
fonte
fonte
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):
Isso também pode ser útil para alguém. Eu gosto de rolar a tela e avançar o cursor ao mesmo tempo:
Navegação por guias - eu amo guias e preciso me mover facilmente entre elas:
Somente no Mac OS X: navegação na guia semelhante ao Safari:
fonte
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:
fonte
Muitas vezes, gosto de alterar os diretórios atuais durante a edição - por isso tenho que especificar menos os caminhos.
fonte
Costumo usar muitas janelas quando trabalho em um projeto e às vezes preciso redimensioná-las. Aqui está o que eu uso:
Esses mapeamentos permitem aumentar e diminuir o tamanho da janela atual. É bem simples, mas rápido.
fonte
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:
Você pode abrir sua sessão usando:
fonte
:so session.vim
dentro do vim.cola a saída de um comando externo no buffer.
Faça algumas contas e obtenha o resultado diretamente no texto:
Obtenha a lista de arquivos a serem compilados ao escrever um Makefile:
Não procure o fato de ler na wikipedia, cole-o diretamente no documento que está escrevendo:
fonte
Mapeie F5 para ROT13 rapidamente seu buffer:
Você pode usá-lo como chave do chefe :).
fonte
nmap i ggg?G``
. Ou o diabólico:nmap i ggg?G``i
!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.
fonte
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.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
antes de colar seus dados. Isso evitará que você estrague tudo.
Observe que você precisará emitir
:set nopaste
para 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
Percebi que ele não funciona em todas as versões do vim que eu uso, mas na maioria.
fonte
set paste
ou especificar uma chave para apastetoggle
opção é uma maneira comum de contornar isso, mas o mesmo efeito pode ser alcançado com oset mouse=a
que o Vim sabe que o fluxo de texto que vê é uma pasta acionada pelo mouse."*p
para 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)*
é o registroPRIMARY
("clique no meio"). A área de transferência é+