Eu ouvi muito sobre o Vim , prós e contras. Parece que você deve ser (como desenvolvedor) mais rápido com o Vim do que com qualquer outro editor. Estou usando o Vim para fazer algumas coisas básicas e, na melhor das hipóteses, sou 10 vezes menos produtivo com o Vim.
As duas únicas coisas com as quais você deve se preocupar ao falar sobre velocidade (você pode não se importar o suficiente com elas, mas deveria) são:
- Usar as mãos esquerda e direita como alternativa é a maneira mais rápida de usar o teclado.
- Nunca tocar no mouse é a segunda maneira de ser o mais rápido possível. Demora muito tempo para você mover sua mão, pegar o mouse, movê-lo e trazê-lo de volta para o teclado (e muitas vezes é necessário olhar para o teclado para ter certeza de que você retornou sua mão corretamente ao lugar certo)
Aqui estão dois exemplos que demonstram por que sou muito menos produtivo com o Vim.
Copiar / Recortar e colar. Eu faço isso o tempo todo. Com todos os editores contemporâneos, você pressiona Shift com a mão esquerda e move o cursor com a mão direita para selecionar o texto. Então Ctrl+ Ccopia, você move o cursor e Ctrl+ Vpastas.
Com o Vim é horrível:
yy
copiar uma linha (você quase nunca deseja a linha inteira!)[number xx]yy
para copiarxx
linhas no buffer. Mas você nunca sabe exatamente se selecionou o que queria. Muitas vezes eu tenho que fazer[number xx]dd
entãou
para desfazer!
Outro exemplo? Pesquise e substitua.
- No PSPad : Ctrl+ f, digite o que deseja pesquisar e pressione Enter.
- No Vim:,
/
digite o que deseja pesquisar e, se houver alguns caracteres especiais colocados\
antes de cada caractere especial, pressione Enter.
E tudo com o Vim é assim: parece que eu não sei como lidar com isso da maneira certa.
NB: Eu já li a folha de dicas do Vim :)
Minha pergunta é:
Qual é a maneira como você usa o Vim que o torna mais produtivo do que com um editor contemporâneo?
Respostas:
Seu problema com o Vim é que você não grok vi .
Você menciona cortar
yy
e reclamar que quase nunca deseja cortar linhas inteiras. De fato, os programadores, editando o código-fonte, muitas vezes desejam trabalhar em linhas inteiras, intervalos de linhas e blocos de código. No entanto,yy
é apenas uma das muitas maneiras de puxar o texto para o buffer de cópia anônimo (ou "registrar", como é chamado no vi ).O "zen" do vi é que você está falando um idioma. A inicial
y
é um verbo. A declaraçãoyy
é sinônimo dey_
. Oy
dobrou para facilitar a digitação, pois é uma operação tão comum.Isso também pode ser expresso como
dd
P
(exclua a linha atual e cole uma cópia de volta no lugar; deixar uma cópia no registro anônimo como efeito colateral). Osy
ed
"verbos" tomar qualquer movimento como o "sujeito". Assim,yW
é "puxar daqui (o cursor) até o final da palavra atual / seguinte (grande)" ey'a
é "puxar daqui para a linha que contém a marca denominada ' a '".Se você entender apenas os movimentos básicos do cursor para cima, baixo, esquerda e direita, o vi não será mais produtivo do que uma cópia do "bloco de notas" para você. (Ok, você ainda terá o destaque da sintaxe e a capacidade de lidar com arquivos maiores que uns 45KB ou mais; então trabalhe comigo aqui).
vi possui 26 "marcas" e 26 "registros". Uma marca é definida para qualquer local do cursor usando o
m
comando Cada marca é designada por uma única letra minúscula. Assim,ma
define a marca ' a ' para o local atual emz
define a marca ' z '. Você pode ir para a linha que contém uma marca usando o'
comando (aspas simples). Assim,'a
move-se para o início da linha que contém a marca ' a '. Você pode ir para o local preciso de qualquer marca usando o`
comando (aspas). Assim`z
, moverá diretamente para o local exato da marca ' z '.Por serem "movimentos", eles também podem ser usados como sujeitos para outras "declarações".
Portanto, uma maneira de cortar uma seleção arbitrária de texto seria largar uma marca (eu costumo usar ' a ' como minha "primeira marca", ' z ' como minha próxima marca, ' b ' como outra e ' e ' como outro (não me lembro de ter usado interativamente mais de quatro marcas em 15 anos de uso do vi ; cria-se as próprias convenções sobre como as marcas e os registros são usados por macros que não perturbam o contexto interativo). para a outra extremidade do texto desejado; podemos começar em qualquer extremidade, não importa. Em seguida, podemos simplesmente usar
d`a
para recortar ouy`a
copiar. Portanto, todo o processo possui cinco pressionamentos de tecla (seis se começamos em "insert"). "modo e necessário paraEscfora do modo de comando). Uma vez que tenhamos cortado ou copiado, em seguida, colando em uma cópia é uma única tecla:p
.Eu digo que essa é uma maneira de cortar ou copiar texto. No entanto, é apenas um de muitos. Frequentemente, podemos descrever de maneira mais sucinta o intervalo de texto sem mover o cursor e soltar uma marca. Por exemplo, se eu estou em um parágrafo de texto que posso usar
{
e}
movimentos para o início ou fim do parágrafo, respectivamente. Então, para mover um parágrafo de texto, eu o cortei usando{
d}
(3 pressionamentos de tecla). (Se já estiver na primeira ou na última linha do parágrafo, posso simplesmente usard}
oud{
respectivamente.A noção de "parágrafo" assume como padrão algo que geralmente é intuitivamente razoável. Assim, muitas vezes funciona tanto para código quanto para prosa.
Freqüentemente conhecemos algum padrão (expressão regular) que marca uma extremidade ou a outra do texto em que estamos interessados. Procurar para frente ou para trás são movimentos no vi . Assim, eles também podem ser usados como "sujeitos" em nossas "declarações". Então, eu posso usar
d/foo
para cortar da linha atual para a próxima linha que contém a string "foo" ey?bar
copiar da linha atual para a linha mais recente (anterior) que contém "bar". Se não quiser linhas inteiras, ainda posso usar os movimentos de pesquisa (como declarações próprias), largar minha (s) marca (s) e usar os`x
comandos conforme descrito anteriormente.Além de "verbos" e "sujeitos", o vi também possui "objetos" (no sentido gramatical do termo). Até agora, descrevi apenas o uso do registro anônimo. No entanto, eu posso usar qualquer um dos 26 registros "nomeados" prefixando a referência "objeto" com
"
(o modificador de aspas duplas). Portanto, se eu usar"add
, estou cortando a linha atual no registro ' a ' e, se usar"by/foo
, estou puxando uma cópia do texto daqui para a próxima linha que contém "foo" no registro ' b '. Para colar a partir de um registo I simplesmente prefixar a pasta com a mesma sequência de modificador:"ap
cola uma cópia da ' um ' registo'"bP
cola uma cópia de ' b ' antes da linha atual.Essa noção de "prefixos" também adiciona os análogos dos "adjetivos" gramaticais e dos "advérbios" à linguagem da "manipulação de texto". A maioria dos comandos (verbos) e movimento (verbos ou objetos, dependendo do contexto) também podem usar prefixos numéricos.
3J
significa "unir as próximas três linhas" ed5}
significa "excluir da linha atual até o final do quinto parágrafo abaixo daqui".Isso tudo é nível intermediário vi . Nada disso é específico do Vim e existem truques muito mais avançados no vi, se você estiver pronto para aprendê-los. Se você dominar apenas esses conceitos intermediários, provavelmente descobrirá que raramente precisa escrever macros porque a linguagem de manipulação de texto é suficientemente concisa e expressiva para fazer a maioria das coisas com bastante facilidade usando a linguagem "nativa" do editor.
Uma amostra de truques mais avançados:
Existem vários
:
comandos, principalmente a:% s/foo/bar/g
técnica de substituição global. (Isso não é avançado, mas outros:
comandos podem ser). Todo o:
conjunto de comandos foi herdado historicamente pelas encarnações anteriores do vi como os utilitários ed (editor de linha) e, posteriormente, o ex (editor de linha estendida). Na verdade, vi é assim chamado porque é a interface visual para ex .:
comandos normalmente operam sobre linhas de texto. ed e ex foram escritos em uma época em que as telas dos terminais eram incomuns e muitos terminais eram dispositivos "teletype" (TTY). Por isso, era comum trabalhar com cópias impressas do texto, usando comandos por meio de uma interface extremamente concisa (as velocidades de conexão comuns eram de 110 baud ou aproximadamente 11 caracteres por segundo - o que é mais lento que um datilógrafo rápido; sessões interativas para vários usuários; além disso, muitas vezes havia alguma motivação para economizar papel).Portanto, a sintaxe da maioria dos
:
comandos inclui um endereço ou intervalo de endereços (número da linha) seguido por um comando. Naturalmente, pode-se usar números de linhas literais::127,215 s/foo/bar
para alterar a primeira ocorrência de "foo" em "bar" em cada linha entre 127 e 215. Também se pode usar algumas abreviações como.
ou$
para as linhas atuais e últimas, respectivamente. Também se pode usar prefixos relativos+
e-
se referir a compensações antes ou antes da linha atual, respectivamente. Assim::.,$j
significando "da linha atual até a última linha, junte todos eles em uma linha".:%
é sinônimo de:1,$
(todas as linhas).Os comandos
:... g
e:... v
dão algumas explicações, pois são incrivelmente poderosos.:... g
é um prefixo para "globalmente" aplicar um comando subseqüente a todas as linhas que correspondem a um padrão (expressão regular) enquanto:... v
aplica esse comando a todas as linhas que NÃO correspondem ao padrão especificado ("v" de "conVerse"). Como com outros comandos ex, estes podem ser prefixados por referências de endereçamento / intervalo. Assim,:.,+21g/foo/d
significa "excluir quaisquer linhas que contenham a string" foo "da atual até as próximas 21 linhas" enquanto:.,$v/bar/d
significa "daqui até o final do arquivo, exclua quaisquer linhas que NÃO contenham a string" bar ".É interessante que o comando comum do Unix grep foi realmente inspirado por este comando ex (e é nomeado após a maneira como foi documentado). O comando ex
:g/re/p
(grep) foi a maneira como eles documentaram como "globalmente" "imprimir" linhas contendo uma "expressão regular" (re). Quando ed e ex foram usados, o:p
comando foi um dos primeiros que alguém aprendeu e, geralmente, o primeiro usado ao editar qualquer arquivo. Foi assim que você imprimiu o conteúdo atual (geralmente apenas uma página cheia de cada vez usando:.,+25p
ou algo parecido).Observe que
:% g/.../d
ou (sua contraparte inversa / inversa::% v/.../d
são os padrões de uso mais comuns. No entanto, existem alguns outrosex
comandos que vale a pena lembrar:Podemos usar
m
para mover linhas ej
unir linhas. Por exemplo, se você tem uma lista e deseja separar todos os itens correspondentes (ou inversamente NÃO correspondentes a algum padrão) sem excluí-los, pode usar algo como::% g/foo/m$
... e todas as linhas "foo" serão movidas para o final do arquivo. (Observe a outra dica sobre como usar o final do seu arquivo como um espaço temporário). Isso preservará a ordem relativa de todas as linhas "foo" e as extrairá do restante da lista. (Isso seria equivalente a fazer algo como:1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d
(copie o arquivo para sua própria cauda, filtre a caudagrep
e exclua todas as coisas da cabeça).Para unir linhas normalmente, posso encontrar um padrão para todas as linhas que precisam ser unidas ao seu antecessor (todas as linhas que começam com "^" em vez de "^ *" em uma lista de marcadores, por exemplo). Nesse caso, eu usaria:
:% g/^ /-1j
(para cada linha correspondente, suba uma linha e junte-se a elas). (BTW: para listas de bala tentando procurar as linhas de bala e juntar-se para a próxima não funciona para algumas razões ... ele pode se juntar a uma linha de bala para outro, e não vai aderir a qualquer linha de bala para todos de suas continuações; funcionará apenas em pares nas partidas).Quase desnecessário mencionar que você pode usar nosso velho amigo
s
(substituto) com os comandosg
ev
(global / converse-global). Normalmente você não precisa fazer isso. No entanto, considere alguns casos em que você deseja executar uma substituição apenas em linhas que correspondam a algum outro padrão. Freqüentemente, você pode usar um padrão complicado com capturas e usar referências anteriores para preservar as partes das linhas que você NÃO deseja alterar. No entanto, muitas vezes será mais fácil separar a partida da substituição::% g/foo/s/bar/zzz/g
- para cada linha que contém "foo" substitua todas as "barras" por "zzz". (Algo como:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g
funcionaria apenas para os casos aquelas instâncias de "bar" que foram PRECEDIDAS por "foo" na mesma linha; já é desajeitado o suficiente e precisaria ser distorcido para capturar todos os casos em que "bar" precedeu "foo")O ponto é que há mais do que apenas
p
,s
ed
linhas noex
conjunto de comandos.Os
:
endereços também podem se referir a marcas. Assim, você pode usar::'a,'bg/foo/j
para unir qualquer linha que contenha a string foo à sua linha subseqüente, se estiver entre as linhas entre as marcas ' a ' e ' b '. (Sim, todos osex
exemplos de comandos anteriores podem ser limitados a subconjuntos das linhas do arquivo prefixando esses tipos de expressões de endereçamento).Isso é bastante obscuro (eu só usei algo assim algumas vezes nos últimos 15 anos). No entanto, admitirei livremente que muitas vezes fiz coisas de forma interativa e interativa que provavelmente poderiam ter sido feitas com mais eficiência se eu tivesse tempo para pensar no encantamento correto.
Outro comando vi ou ex muito útil é
:r
ler o conteúdo de outro arquivo. Assim::r foo
insere o conteúdo do arquivo chamado "foo" na linha atual.Mais poderoso é o
:r!
comando. Isso lê os resultados de um comando. É o mesmo que suspender a sessão do vi , executar um comando, redirecionar sua saída para um arquivo temporário, retomar a sua sessão do vi e ler o conteúdo do temp. Arquivo.Ainda mais poderosos são os comandos
!
(bang) e:... !
( ex bang). Eles também executam comandos externos e lêem os resultados no texto atual. No entanto, eles também filtram seleções do nosso texto através do comando! Podemos ordenar todas as linhas em nosso arquivo1G!Gsort
(G
é o comando vi "goto"; o padrão é ir para a última linha do arquivo, mas pode ser prefixado por um número de linha, como 1, a primeira linha). Isso é equivalente à variante ex:1,$!sort
. Os escritores costumam usar!
os utilitários Unix fmt ou fold para reformatar ou "agrupar palavras" seleções de texto. Uma macro muito comum é{!}fmt
(reformate o parágrafo atual). Às vezes, os programadores o usam para executar seu código, ou apenas partes dele, por meio de recuo ou outras ferramentas de reformatação de código.Usar os comandos
:r!
e!
significa que qualquer utilitário ou filtro externo pode ser tratado como uma extensão do nosso editor. Ocasionalmente, eu os usei com scripts que extraíam dados de um banco de dados ou com comandos wget ou lynx que extraíram dados de um site ou comandos ssh que extraíram dados de sistemas remotos.Outro comando ex útil é
:so
(abreviação de:source
). Isso lê o conteúdo de um arquivo como uma série de comandos. Quando você começar a vi normalmente, implicitamente, realiza uma:source
em~/.exinitrc
arquivo (e Vim normalmente faz isso em~/.vimrc
, naturalmente). O uso disso é que você pode alterar o perfil do editor em tempo real, fornecendo simplesmente um novo conjunto de macros, abreviações e configurações do editor. Se você é sorrateiro, pode até usar isso como um truque para armazenar sequências de comandos de edição ex para aplicar a arquivos sob demanda.Por exemplo, eu tenho um arquivo de sete linhas (36 caracteres) que executa um arquivo no wc e insere um comentário no estilo C na parte superior do arquivo que contém esses dados de contagem de palavras. Posso aplicar essa "macro" a um arquivo usando um comando como:
vim +'so mymacro.ex' ./mytarget
(A
+
opção de linha de comando para vi e Vim é normalmente usada para iniciar a sessão de edição em um determinado número de linha. No entanto, é um fato pouco conhecido que se pode seguir+
qualquer expressão / comando ex válido , como um comando "source" como Eu fiz aqui; para um exemplo simples, tenho scripts que invocam:vi +'/foo/d|wq!' ~/.ssh/known_hosts
para remover uma entrada do meu arquivo de hosts conhecidos SSH de maneira não interativa enquanto estou reinventando um conjunto de servidores).Geralmente é muito mais fácil escrever essas "macros" usando Perl, AWK, sed (que é, de fato, como grep um utilitário inspirado no comando ed ).
O
@
comando é provavelmente o comando vi mais obscuro . Ocasionalmente, ministrando cursos avançados de administração de sistemas por quase uma década, conheci muito poucas pessoas que já o usaram.@
executa o conteúdo de um registro como se fosse um comando vi ou ex .Exemplo: Costumo usar:
:r!locate ...
para encontrar algum arquivo no meu sistema e ler seu nome no meu documento. A partir daí, excluo quaisquer ocorrências estranhas, deixando apenas o caminho completo para o arquivo em que estou interessado. Em vez de trabalhar Tabminuciosamente em cada componente do caminho (ou pior, se estiver preso em uma máquina sem o suporte à conclusão da guia em sua cópia do vi ) eu apenas uso:0i:r
(para transformar a linha atual em um comando válido : r ),"cdd
(para excluir a linha no registro "c") e@c
execute esse comando.São apenas 10 pressionamentos de tecla (e a expressão
"cdd
@c
é efetivamente uma macro de dedo para mim, para que eu possa digitá-la quase tão rapidamente quanto qualquer palavra comum de seis letras).Um pensamento sóbrio
Eu apenas arranhei a superfície do poder do vi e nada do que descrevi aqui faz parte das "melhorias" para as quais o vim é nomeado! Tudo o que descrevi aqui deve funcionar em qualquer cópia antiga do vi de 20 ou 30 anos atrás.
Existem pessoas que usaram consideravelmente mais o poder do vi do que eu jamais usarei.
fonte
@
comando muito (em combinação comq
: macro registro)Você está falando sobre a seleção e cópia de texto, acho que você deveria dar uma olhada no Modo Visual Vim .
No modo visual, você pode selecionar o texto usando os comandos do Vim e pode fazer o que quiser com a seleção.
Considere os seguintes cenários comuns:
Você precisa selecionar o próximo parêntese correspondente.
Você poderia fazer:
v%
se o cursor estiver entre parênteses inicial / finalvib
se o cursor estiver dentro do bloco de parêntesesVocê deseja selecionar o texto entre aspas:
Você deseja selecionar um bloco de chaves (muito comum em idiomas no estilo C):
viB
vi{
Você deseja selecionar o arquivo inteiro:
ggVG
A seleção do bloco visual é outro recurso realmente útil, pois permite selecionar uma área retangular do texto, basta pressionar Ctrl- Vpara iniciá-lo e, em seguida, selecionar o bloco de texto desejado e executar qualquer tipo de operação, como puxar, excluir, colar, editar etc. É ótimo editar texto orientado a colunas .
fonte
o
saltará para o outro lado. Assim, você pode mover o começo e o final da seleção o quanto quiser.Algumas dicas de produtividade:
Movimentos inteligentes
*
e#
procure a palavra sob o cursor para frente / para trás.w
para a próxima palavraW
para a próxima palavra separada por espaçob
/e
para o início / fim da palavra atual. (B
/ apenasE
para espaço separado)gg
/G
pula para o início / fim do arquivo.%
pule para a correspondência {..} ou (..), etc.{
/}
pula para o próximo parágrafo.'.
volte para a última linha editada.g;
pule de volta para a última posição editada.Comandos de edição rápida
I
insira no início.A
acrescente ao fim.o
/O
abre uma nova linha depois / antes da atual.v
/V
/Ctrl+V
Modo visual (para selecionar texto!)Shift+R
substituir textoC
alterar parte restante da linha.Combinando comandos
A maioria dos comandos aceita uma quantidade e direção, por exemplo:
cW
= alterar até o final da palavra3cW
= alterar 3 palavrasBcW
= para iniciar a palavra completa, altere a palavra completaciW
= altera a palavra interior.ci"
= mudar interior entre ".."ci(
= alterar texto entre (..)ci<
= altera o texto entre <..> (necessidadesset matchpairs+=<:>
no vimrc)4dd
= excluir 4 linhas3x
= excluir 3 caracteres.3s
= substitua 3 caracteres.Comandos úteis do programador
r
substitua um caractere (por exemplo,rd
substitui o caractere atual pord
).~
muda caso.J
junta duas linhas.
repita o último comando (uma macro simples)==
recuar linha de correção>
bloco de indentação (no modo visual)<
bloco unindent (no modo visual)Gravação de macro
q[ key ]
para iniciar a gravação.q
para parar a gravação.@[ key ]
.Usando comandos e movimentos muito específicos, o VIM pode reproduzir essas ações exatas para as próximas linhas. (por exemplo, A para acrescentar até o fim,
b
/e
para mover o cursor para o início ou o fim de uma palavra, respectivamente)Exemplo de configurações bem construídas
As configurações podem ser armazenadas em todo o
~/.vimrc
sistema ou, em/etc/vimrc.local
seguida, lidas no/etc/vimrc
arquivo usando:(você precisará substituir o
#
caractere de comentário"
para que ele funcione no VIM, eu queria destacar aqui a sintaxe adequada).Os comandos que listei aqui são bem básicos e os principais que eu uso até agora. Eles já me deixam bem mais produtivo, sem precisar conhecer todas as coisas chiques.
fonte
'.
ég;
, que salta de volta através dochangelist
. Vai para a última posição editado, em vez de última linha editadaO mecanismo Control+ Ré muito útil :-) No modo de inserção ou modo de comando (ou seja, na
:
linha ao digitar comandos), continue com um registro numerado ou nomeado:Veja
:help i_CTRL-R
e:help c_CTRL-R
para obter mais detalhes e bisbilhotar nas proximidades para obter mais vantagens CTRL-R.fonte
Control-A
também funciona no modo de inserção do último texto inserido eControl-@
para inserir o último texto inserido e alternar imediatamente para o modo normal.Vim Plugins
Há muitas boas respostas aqui, e uma surpreendente sobre o zen do vi. Uma coisa que não vejo mencionada é que o vim é extremamente extensível através de plugins. Existem scripts e plugins para fazer todo tipo de loucura que o autor original nunca considerou. Aqui estão alguns exemplos de plugins vim incrivelmente úteis:
rails.vim
O Rails.vim é um plugin criado pelo tpope. É uma ferramenta incrível para pessoas que desenvolvem trilhos. Faz coisas mágicas sensíveis ao contexto que permitem que você pule facilmente de um método em um controlador para a visualização associada, para um modelo e para testes de unidade desse modelo. Ele salvou dezenas, senão centenas de horas, como desenvolvedor de trilhos.
gist.vim
Este plug-in permite que você selecione uma região de texto no modo visual e digite um comando rápido para publicá-lo no gist.github.com . Isso permite um acesso fácil à pasta, o que é incrivelmente útil se você estiver colaborando com alguém por meio de IRC ou IM.
space.vim
Este plugin fornece funcionalidade especial para a barra de espaço. Ele transforma a barra de espaço em algo análogo ao período, mas, em vez de repetir ações, repete movimentos. Isso pode ser muito útil para percorrer rapidamente um arquivo da maneira que você definir em tempo real.
surround.vim
Este plugin permite trabalhar com texto delimitado de alguma forma. Ele fornece objetos que denotam coisas dentro de parênteses, coisas dentro de aspas, etc. Pode ser útil para manipular texto delimitado.
supertab.vim
Esse script traz a funcionalidade sofisticada de conclusão de guias para o vim. O material de preenchimento automático já está presente no núcleo do vim, mas isso o leva a uma guia rápida, em vez de vários atalhos de várias marcas diferentes. Muito útil e incrivelmente divertido de usar. Embora não seja o intellisense do VS, é um grande passo e traz uma grande parte da funcionalidade que você gostaria de esperar de uma ferramenta de conclusão de guias.
syntastic.vim
Essa ferramenta traz comandos de verificação de sintaxe externa para o vim. Eu não o usei pessoalmente, mas ouvi grandes coisas a respeito e é difícil vencer o conceito. Verificar a sintaxe sem ter que fazê-lo manualmente economiza muito tempo e pode ajudar a detectar erros sintáticos quando você os apresenta, e não quando você finalmente pára para testar.
fugitive.vim
Acesso direto ao git de dentro do vim. Novamente, eu não usei este plug-in, mas posso ver o utilitário. Infelizmente estou em uma cultura em que o svn é considerado "novo", então provavelmente não verei o git funcionando por algum tempo.
nerdtree.vim
Um navegador de árvore para vim. Comecei a usar isso recentemente, e é realmente útil. Permite colocar uma exibição em árvore em uma divisão vertical e abrir arquivos facilmente. Isso é ótimo para um projeto com muitos arquivos de origem entre os quais você costuma pular.
FuzzyFinderTextmate.vim
Este é um plugin não mantido, mas ainda incrivelmente útil. Ele fornece a capacidade de abrir arquivos usando uma sintaxe descritiva "difusa". Isso significa que, em uma árvore esparsa de arquivos, você precisa digitar apenas caracteres suficientes para desambiguar os arquivos nos quais você está interessado do resto da sujeira.
Conclusão
Existem muitas ferramentas incríveis disponíveis para o vim. Tenho certeza de que apenas arranhei a superfície aqui e vale a pena procurar ferramentas aplicáveis ao seu domínio. A combinação do poderoso conjunto de ferramentas tradicionais do vi, aprimoramentos do vim e plugins que estendem o vim ainda mais, é uma das maneiras mais poderosas de editar texto já concebido. O Vim é facilmente tão poderoso quanto emacs, eclipse, visual studio e textmate.
obrigado
Agradeço a duwanis por suas configurações do vim, das quais aprendi muito e peguei emprestada a maioria dos plugins listados aqui.
fonte
.
Repita o último comando de alteração de textoEconomizo muito tempo com este.
O modo visual foi mencionado anteriormente, mas o modo visual do bloco economizou muito tempo ao editar colunas de tamanho fixo no arquivo de texto. (acessado com Ctrl-V).
fonte
.
tecla.gi
Ir para a última localização editada (muito útil se você realizou alguma pesquisa e deseja voltar à edição)
^ P e ^ N
Complete o texto anterior (^ P) ou o próximo (^ N).
^ O e ^ I
Vá para o local anterior (
^O
-"O"
para antigo) ou para o próximo (^I
-"I"
próximo a"O"
). Quando você realiza pesquisas, edita arquivos, etc., pode navegar por esses "saltos" para frente e para trás.fonte
Eu descobri recentemente este site: http://vimcasts.org/
É muito novo e realmente muito bom. O cara que está executando o site mudou de textmate para vim e hospeda muito bom e concisa transmissões em tópicos específicos do vim. Confira!
fonte
CTRL+A incrementa o número em que você está.
fonte
Tudo no modo Normal:
f <char> para ir para a próxima instância de um caractere específico na linha atual e ; repetir.
F <char> para mover para a instância anterior de um caractere específico na linha atual e ; repetir.
Se usado de maneira inteligente, os dois acima podem fazer você se mover rapidamente em uma linha.
* em uma palavra para procurar a próxima instância.
# em uma palavra para procurar a instância anterior.
fonte
ct(
apaga a palavra e o coloca no modo de inserção, mas mantenha os parênteses!Sessão
uma. salvar sessão
b. força a sessão de salvamento
c. carregar sessão
Adicionando e subtraindo
uma. Adicionando e subtraindo
b. Desmapeamento de teclas da janela
c. Com macro
fonte
Na semana passada, no trabalho, nosso projeto herdou muito código Python de outro projeto. Infelizmente, o código não se encaixou em nossa arquitetura existente - tudo foi feito com variáveis e funções globais, que não funcionariam em um ambiente multithread.
Tínhamos ~ 80 arquivos que precisavam ser reformulados para serem orientados a objetos - todas as funções foram movidas para classes, parâmetros alterados, instruções de importação adicionadas etc. Temos uma lista de cerca de 20 tipos de correções que precisavam ser feitas em cada arquivo. Eu estimaria que fazê-lo manualmente, uma pessoa poderia fazer talvez 2 a 4 por dia.
Então eu fiz o primeiro manualmente e depois escrevi um script vim para automatizar as alterações. A maioria era uma lista de comandos do vim, por exemplo
O último merece um pouco de explicação:
Para algumas transformações mais complexas, como a geração de todas as instruções de importação, incorporei algum python no script vim.
Depois de algumas horas de trabalho, tive um script que fará pelo menos 95% da conversão. Acabei de abrir um arquivo no vim, em seguida, corro
:source fixit.vim
e o arquivo é transformado em um piscar de olhos.Ainda temos o trabalho de alterar os 5% restantes que não valiam a pena automatizar e de testar os resultados, mas, ao passar um dia escrevendo esse script, estimo que economizamos semanas de trabalho.
É claro que seria possível automatizar isso com uma linguagem de script como Python ou Ruby, mas levaria muito mais tempo para escrever e seria menos flexível - o último exemplo teria sido difícil, já que apenas a regex não seria capaz de lidar com isso. colchetes aninhados, por exemplo, para converter
bar(foo(xxx))
emfoo(xxx).bar()
. Vim foi perfeito para a tarefa.fonte
%s/\(bar\)(\(.\+\))/\2.\1()/
faria isso também. (Escapes são compatíveis com:set magic
.) Apenas para o registro. :)%s/\v(bar)\((.+)\)/\2.\1()/
if bar(foo(xxx)) or wibble(xxx):
torna-if foo(xxx)) or wibble(xxx.bar():
se completamente errado.Use o gerenciador de arquivos embutido! O comando é
:Explore
e permite que você navegue pelo seu código-fonte muito, muito rápido. Eu tenho esses mapeamentos no meu.vimrc
:O explorer também permite que você faça modificações no arquivo. Vou postar algumas das minhas teclas favoritas. Pressionar
<F1>
exibirá a lista completa:cd ..
)fonte
:find
,:tag
e as várias teclas relacionadas para pular. (Talvez isso é porque as árvores de origem em que trabalho são grandes e organizadas de forma diferente do que eu teria feito :)?)Eu sou um membro da American Cryptogram Association. A revista bimestral inclui mais de 100 criptogramas de vários tipos. Aproximadamente 15 deles são "criptoaritmos" - vários tipos de problemas aritméticos com letras substituídas pelos dígitos. Dois ou três deles são sudokus, exceto com letras em vez de números. Quando a grade estiver concluída, as nove letras distintas soletrarão uma palavra ou palavras, em alguma linha, diagonal, espiral etc., em algum lugar da grade.
Em vez de trabalhar com lápis ou digitar os problemas manualmente, faço o download dos problemas na área de membros do site deles.
Ao trabalhar com esses sudokus, uso o vi, simplesmente porque estou usando recursos que o vi possui e que poucos outros editores possuem. Principalmente na conversão da grade com letras em uma grade numerada, porque acho mais fácil resolver e, em seguida, a grade numerada concluída de volta na grade com letras para encontrar a (s) palavra (s) da solução.
O problema é formatado como nove grupos de nove letras, com
-
s representando os espaços em branco, escritos em duas linhas. O primeiro passo é formatá-los em nove linhas de nove caracteres cada. Não há nada de especial nisso, basta inserir oito quebras de linha nos locais apropriados.O resultado será semelhante a este:
Portanto, o primeiro passo para converter isso em números é fazer uma lista das letras distintas. Primeiro, faço uma cópia do bloco. Posiciono o cursor na parte superior do bloco e digito
:y}}p
.:
me coloca no modo de comando,y
puxa o próximo comando de movimento. Como}
é uma mudança para o final do próximo parágrafo,y}
puxa o parágrafo.}
depois move o cursor para o final do parágrafo ep
cola o que havíamos puxado logo após o cursor. Entãoy}}p
cria uma cópia do próximo parágrafo e termina com o cursor entre as duas cópias.Em seguida, devo transformar uma dessas cópias em uma lista de letras distintas. Esse comando é um pouco mais complexo:
:
novamente me coloca no modo de comando.!
indica que o conteúdo do próximo puxão deve ser canalizado através de uma linha de comando.}
puxa o próximo parágrafo, e a linha de comando usa otr
comando para remover tudo, exceto letras maiúsculas, osed
comando para imprimir cada letra em uma única linha e osort
comando para classificar essas linhas, remover duplicatas e removertr
a linha as novas linhas, deixando as nove letras distintas em uma única linha, substituindo as nove linhas que compunham o parágrafo originalmente. Neste caso, as letras são:ACELNOPST
.O próximo passo é fazer outra cópia da grade. E, em seguida, usar as letras Acabei identificados para substituir cada uma dessas cartas com um dígito de 1 a 9. Isso é simples:
:!}tr ACELNOPST 0-9
. O resultado é:Isso pode ser resolvido da maneira usual ou inserido em qualquer solucionador de sudoku que você preferir. A solução concluída pode ser convertida novamente em letras com
:!}tr 1-9 ACELNOPST
.Existe um poder no vi que é correspondido por muito poucos outros. O maior problema é que apenas alguns dos livros, tutoriais, sites, arquivos de ajuda, etc. do vi não tocam a superfície do que é possível.
fonte
:
entrar no modo de comando, mas invariavelmente especifica comandos de modo normal (comoy}}p
) que não podem funcionar no modo de comando ?!:se tw=1 fo=
(preparação)VG:s/./& /g
(inserir espaços),gvgq
(split em linhas separadas),V{:sort u
(tipo e duplicatas remover)Manipulações de texto em massa!
Através de macros:
qq
q
@q
(a primeira vez),@@
depois disso.20@@
Ou através de expressões regulares:
:%s/[fo]+/bar/g
(Mas esteja avisado: se você fizer o último, terá 2 problemas :).)
fonte
:% g/foo/-1j
ou:'a,'z v/bar/-1j
por exemplo (onde o primeiro é "todas as linhas e corresponde ao padrão" enquanto o último é "linhas entre a marca ae z que não correspondem ao padrão"). A parte após o padrão em um comandog
ouv
ex pode ser qualquer outro comando ex, -1j é apenas um comando relativo de movimento e junção de linha.Eu descobri recentemente
q:
. Ele abre a "janela de comando" e mostra os comandos mais recentes do modo ex (modo de comando). Você pode mover-se normalmente na janela e pressionar<CR>
executa o comando. Você pode editar, etc. também. Inestimável quando você está mexendo com algum comando ou regex complexo e não deseja redigitar a coisa toda, ou se a coisa complexa que você quer fazer é 3 comandos de volta. É quase como o bashset -o vi
, mas para o próprio vim (heh!).Veja os
:help q:
bits mais interessantes para ir e voltar.fonte
Acabei de descobrir a omnicompleção do Vim outro dia e, embora admita que estou um pouco confuso com o que faz, tive resultados surpreendentemente bons apenas pressionando Ctrl+ x Ctrl+ uou Ctrl+ n/ Ctrl+ pno modo de inserção. Não é bem o IntelliSense , mas ainda estou aprendendo.
Experimente!
:help ins-completion
fonte
Estes não são atalhos, mas estão relacionados:
Eles aumentam minha produtividade.
fonte
Capslock::Escape
Outro vi "atalho" útil que costumo usar é 'xp'. Isso irá trocar o caractere sob o cursor pelo próximo caractere.
fonte
Xp
ir para o outro lado<Ctrl> + W, V para dividir a tela verticalmente
<Ctrl> + W, W para alternar entre as janelas
! python% [args] para executar o script que estou editando nesta janela
ZF no modo visual para dobrar linhas arbitrárias
fonte
<C-w>n
ou<C-w>s
é uma nova janela horizontal,<C-w>b
é a janela inferior direita<C-w>c
ou<C-w>q
é a janela fechada,<C-w>x
é aumentada e diminui a largura da janela (??),<C-w>p
é a última janela,<C-w>backspace
é movemos para a esquerda (ish):help ctrl-w
FTW ... faça um favor a si mesmo e force-se a tentar essas coisas por pelo menos 15 minutos!Modo Visual
Como várias outras pessoas disseram, o modo visual é a resposta para o seu problema de copiar / recortar e colar. O Vim fornece 'v', 'V' e Cv. As letras minúsculas 'v' no vim são essencialmente iguais às teclas Shift do bloco de notas. O bom é que você não precisa pressioná-lo. Você pode usar qualquer técnica de movimento para navegar eficientemente até o ponto inicial (ou final) da sua seleção. Em seguida, pressione 'v' e use técnicas de movimento eficientes novamente para navegar até o outro extremo da sua seleção. Então 'd' ou 'y' permite cortar ou copiar essa seleção.
A vantagem do modo visual do vim sobre a descrição de Jim Dennis de cortar / copiar / colar no vi é que você não precisa obter o local exatamente correto. Às vezes, é mais eficiente usar um movimento rápido para chegar à vizinhança geral de onde você deseja ir e refinar isso com outros movimentos do que pensar em um comando de movimento único mais complexo que o leva exatamente aonde você quer ir.
A desvantagem de usar o modo visual extensivamente dessa maneira é que ele pode se tornar uma muleta que você usa o tempo todo, o que impede você de aprender novos comandos vi (m) que podem permitir que você faça as coisas com mais eficiência. No entanto, se você é muito proativo em aprender novos aspectos do vi (m), isso provavelmente não afetará muito.
Também enfatizarei que os modos de linha visual e de bloco visual oferecem variações sobre o mesmo tema que pode ser muito poderoso ... especialmente o modo de bloco visual.
Sobre o uso eficiente do teclado
Também discordo de sua afirmação de que alternar mãos é a maneira mais rápida de usar o teclado. Tem um elemento de verdade nele. Falando de maneira geral, o uso repetido da mesma coisa é lento. O exemplo mais significativo desse princípio é que as teclas consecutivas digitadas com o mesmo dedo são muito lentas. Sua afirmação provavelmente decorre da tendência natural de usar o s / dedo / mão / transformação nesse padrão. Até certo ponto, está correto, mas no extremo extremamente alto do espectro de eficiência está incorreto.
Basta perguntar a qualquer pianista. Pergunte-lhes se é mais rápido tocar uma sucessão de algumas notas alternando entre mãos ou usando dedos consecutivos de uma única mão em sequência. A maneira mais rápida de digitar 4 teclas não é alternar as mãos, mas digitá-las com 4 dedos da mesma mão em ordem crescente ou decrescente (chame isso de "corrida"). Isso deve ser evidente depois de considerar essa possibilidade.
O problema mais difícil é otimizar para isso. É muito fácil otimizar a distância absoluta no teclado. Vim faz isso. É muito mais difícil otimizar no nível "executar", mas o vi (m) com a edição modal oferece uma chance melhor de você fazer isso do que qualquer abordagem não modal (ahem, emacs) jamais poderia.
No Emacs
Para que os fanáticos do emacs desconsiderem completamente todo o meu post por causa desse último comentário entre parênteses, sinto que devo descrever a raiz da diferença entre as religiões emacs e vim. Nunca falei nas guerras dos editores e provavelmente não farei isso de novo, mas nunca ouvi ninguém descrever as diferenças dessa maneira, então aqui vai. A diferença é a seguinte compensação:
O Vim oferece eficiência incomparável de edição de texto bruto O Emacs oferece capacidade incomparável de personalizar e programar o editor
Os fanáticos cegos do vim alegam que o vim tem uma linguagem de script. Mas é uma linguagem obscura e ad-hoc que foi projetada para servir o editor. O Emacs tem Lisp! Disse o suficiente. Se você não aprecia o significado dessas duas últimas frases ou deseja aprender o suficiente sobre programação funcional e Lisp para desenvolver essa apreciação, use o vim.
Os fanáticos do emacs alegam que o emacs tem o modo viper e, portanto, é um superconjunto do vim. Mas o modo viper não é padrão. Meu entendimento é que o modo viper não é usado pela maioria dos usuários do emacs. Como não é o padrão, a maioria dos usuários do emacs provavelmente não desenvolve uma verdadeira apreciação pelos benefícios do paradigma modal.
Na minha opinião, essas diferenças são ortogonais. Acredito que os benefícios do vim e do emacs, como afirmei, são válidos. Isso significa que o editor final ainda não existe. Provavelmente é verdade que o emacs seria a plataforma mais fácil para basear o editor definitivo. Mas a edição modal não está enraizada na mentalidade do emacs. A comunidade emacs pode se mover dessa maneira no futuro, mas isso não parece muito provável.
Portanto, se você quiser eficiência de edição bruta, use o vim. Se você deseja o melhor ambiente para scripts e programação, o seu editor usa o emacs. Se você quiser alguns dos dois com ênfase na capacidade de programação, use o emacs com o modo viper (ou programe seu próprio modo). Se você quer o melhor dos dois mundos, está sem sorte por enquanto.
fonte
Passe 30 minutos fazendo o tutorial do vim (execute o vimtutor em vez do vim no terminal). Você aprenderá os movimentos básicos e algumas teclas, isso o tornará pelo menos tão produtivo com o vim quanto com o editor de texto usado anteriormente. Depois disso, leia a resposta de Jim Dennis novamente :)
fonte
Ser capaz de executar edições complexas e repetitivas com muito poucas teclas (geralmente usando macros ). Dê uma olhada no VimGolf para testemunhar o poder do Vim!
Após mais de dez anos de uso quase diário, é difícil imaginar o uso de qualquer outro editor.
fonte
Use
\c
em qualquer lugar da pesquisa para ignorar maiúsculas e minúsculas (substituindo as configurações de caixa de ignorância ou caixa inteligente). Por exemplo,/\cfoo
ou/foo\c
irá corresponderfoo
,Foo
,fOO
,FOO
, etc.Use
\C
em qualquer lugar da pesquisa para forçar a correspondência entre maiúsculas e minúsculas. Por exemplo,/\Cfoo
ou/foo\C
corresponderá apenas a foo.fonte
Fiquei surpreso ao encontrar ninguém mencionar o
t
movimento. Eu freqüentemente o uso com listas de parâmetros na forma dedt,
ouyt,
fonte
Estranho, ninguém mencionou ctags. Faça o download de "ctags exuberantes" e coloque-o à frente da versão pré-instalada de baixa qualidade que você já possui em seu caminho de pesquisa. Cd na raiz do que você está trabalhando; por exemplo, a distribuição do kernel do Android. Digite "ctags -R". para criar um índice de arquivos de origem em qualquer lugar abaixo desse diretório em um arquivo chamado "tags". Ele contém todas as tags, não importa o idioma nem o local do diretório, em um arquivo, portanto, o trabalho entre idiomas é fácil.
Em seguida, abra o vim nessa pasta e leia: help ctags para alguns comandos. Alguns eu uso com frequência:
Coloque o cursor em uma chamada de método e digite CTRL-] para ir para a definição do método.
Digite: ta name para ir para a definição de name.
fonte
Recuo automático:
gg
(vá para o início do documento)=
(recuo na hora!)shift-g
(vá para o final do documento)Você precisará do 'recuo do plug-in de tipo de arquivo' no seu
.vimrc
arquivo e provavelmente das configurações apropriadas de 'shiftwidth' e 'expandtab'.fonte
Você perguntou sobre atalhos produtivos, mas acho que sua verdadeira pergunta é: vim vale a pena? A resposta para esta pergunta do stackoverflow é -> "Sim"
Você deve ter notado duas coisas. O Vim é poderoso e é difícil de aprender. Muito do seu poder está na capacidade de expansão e na combinação infinita de comandos. Não se sinta sobrecarregado. Vai devagar. Um comando, um plug-in de cada vez. Não exagere.
Todo esse investimento que você coloca no vim pagará mil vezes. Você ficará dentro de um editor de texto por muitas e muitas horas antes de morrer. Vim será seu companheiro.
fonte
Vários buffers e, em particular, um salto rápido entre eles para comparar dois arquivos com
:bp
e:bn
(corretamente remapeados para um único Shift+ pou Shift+ n)vimdiff
mode (divide em dois buffers verticais, com cores para mostrar as diferenças)Cópia de área com Ctrl+v
E, finalmente, a conclusão da guia dos identificadores (procure por "mosh_tab_or_complete"). Isso é uma mudança de vida.
fonte
Concordo com o pôster principal - the : r! comando é muito útil.
Na maioria das vezes eu o uso para "colar" coisas:
Dessa forma, eu não tenho que mexer
:set paste
.fonte
clipboard
opçãounnamed
(set clipboard=unnamed
no seu .vimrc) para usar a área de transferência do sistema por padrão. Ou se você ainda quer que o sistema prancheta separar do registo sem nome, utilize o registo prancheta apropriadamente chamado:"*p
.:set paste
não funciona tão bem se o autoindent estiver ativado.