Ir para o conteúdo

Modo VI

Introdução

Logotipo do Vim

O modo VI do Kate é um projeto que visa trazer edição modal semelhante à do Vim para o editor de texto Kate e, por extensão, para outros programas do KDE que compartilham o mesmo componente do editor. O projeto começou como um projeto do Google Summer of Code em 2008 – onde todas as funcionalidades básicas foram escritas. Continuei a manter e desenvolver este código, e o número de funcionalidades ausentes do Vim está diminuindo lentamente. A maioria dos usuários do Vim já estará produtiva no modo VI do Kate. Uma lista do que está faltando pode ser encontrada no final da página.

Esta página pretende ser uma visão geral atualizada deste trabalho.

Para habilitar o modo de entrada do VI, acesse
Configurações → Configurar Kate… → Edição → Modo de Entrada do VI.
Também é possível alternar com a configuração "Modo de Entrada do VI" no menu "Editar". (A tecla de atalho padrão é Meta+Ctrl+V – onde Meta geralmente é a tecla Windows).

Objetivos

O objetivo do modo VI não é ser um substituto completo para o Vim e suportar todos os recursos do Vim. Seu objetivo é tornar o "jeito Vim" de edição de texto – e os hábitos aprendidos com o Vim – disponíveis para programas que usam o editor de texto Kate como editor interno. Esses programas incluem

  1. O editor de texto Kate
  2. KWrite – O editor de texto simples do KDE
  3. KDevelop – Um IDE avançado para muitas linguagens de programação
  4. Kile – Um editor LaTeX

O modo VI visa integrar-se perfeitamente aos programas e desviar-se do comportamento do Vim onde fizer sentido. Por exemplo, :w abrirá uma caixa de diálogo para salvar no modo VI do Kate.

Incompatibilidades com o Vim

Existem apenas alguns recursos do modo VI do Kate que são incompatíveis com o Vim (sem contar os que faltam). Eles estão listados abaixo, juntamente com os respectivos motivos.

  1. Kate: U ​​e Ctrl+r são refazer
    Vim: Ctrl+r é refazer normalmente, U é usado para desfazer todas as alterações mais recentes em uma linha
    O motivo para U atuar como refazer no modo VI do Kate é que o atalho ctrl+r, por padrão, é assumido pela função de substituição do Kate (pesquisar e substituir). Por padrão, o modo VI não substitui os atalhos do Kate (isso pode ser configurado em Configurações → Configurar o Kate… → Edição → Modo de Entrada do Vi), portanto, uma ação de refazer precisa estar disponível como um pressionamento de tecla "normal" também. Além disso, o comportamento do comando U no Vim não mapeia bem para o sistema de desfazer interno do Kate, então seria não trivial suportá-lo de qualquer maneira.
  2. Kate: :print mostra o diálogo "imprimir"
    Vim: :print imprime as linhas do intervalo fornecido como seu avô ed. Comandos como :print estão disponíveis não apenas no modo VI, mas também para usuários que usam o Kate "normal" – portanto, optei por deixar o comando :print abrir o diálogo de impressão – seguindo o princípio da menor surpresa em vez de imitar o comportamento do Vim.
  3. Kate: Y puxa para o fim da linha.
    Vim: Y puxa a linha inteira, assim como yy. O comportamento do VI para o comando Y é, na prática, um bug; para os comandos change e delete, cc/dd executará sua ação na linha atual e C/D trabalhará da coluna do cursor até o fim da linha. No entanto, tanto yy quanto Y puxam a linha atual. No Modo VI de Kate, Y puxa para o fim da linha. Isso é descrito como "mais lógico" na documentação do Vim.
  4. Kate: :map altera as linhas selecionadas do documento usando a expressão JavaScript fornecida.
    Vim: :map adiciona o mapeamento fornecido aos modos Normal e Visual. O comando "map" já estava reservado por Kate; na versão 4.12+, você pode usar uma combinação de :nmap e :vmap para substituí-lo.

Comandos suportados

Comandos suportados nos modos normal/visual

ChaveDescrição
aEntra no modo de inserção e adiciona
AEntra no modo de inserção e adiciona ao final da linha
iEntra no modo de inserção
IInsere antes do primeiro caractere não branco na linha
vEntra no modo visual
VEntre no modo de linha visual
<c-v>Entra no modo de bloco visual
gvRe-seleciona visual
oAbre nova linha abaixo
OAbre nova linha acima
JMescla (junta) as linhas
cAltera
CAltera até o final da linha
ccAltera linha
sSubstitui caractere
SSubstitui linha
ddExclui linha
dExclui
DExclui até o fim da linha
xExclui caractere
XExclui caractere atrás
guTorna minúscula
guuTorna a linha em minúsculas
gUTorna maiúscula
gUUTorna a linha em maiúsculas
yCopiar
yyCopiar linha
YCopiar até o final da linha
pColar
PColar antes
r.Substituir caractere
REntra no modo de substituição
:Alterna para a linha de comando
/Pesquisar
uDesfazer
<c-r>Refazer
URefazer
m.Definir marca
>>Recuar linha
<<Remover recuo da linha
>Recuar linhas
<Remover recuo de linhas
<c-f>Rolar página abaixo
<pagedown>Rolar página abaixo
<c-b>Rolar página acima
<pageup>Rolar página acima
<c-u>Rolar meia página acima
<c-d>Rolar meia página abaixo
zzCentralizar visualização no cursor
gaImprimir cógido do caractere
.Repetir última mudança
==Alinhar linha
=Alinhar linhas
~Alterar maiúsculas/minúsculas
<c-a>Adicionar ao número
<c-x>Subtrair do número
<c-o>Ir para salto anterior
<c-i>Ir para próximo salto
<c-w>hAlternar para visualização esquerda
<c-w><c-h>Alternar para visualização esquerda
<c-w><left>Alternar para visualização esquerda
<c-w>jAlternar para visualização inferior
<c-w><c-j>Alternar para visualização inferior
<c-w><down>Alternar para visualização inferior
<c-w>kAlternar para visualização superior
<c-w><c-k>Alternar para visualização superior
<c-w><up>Alternar para visualização superior
<c-w>lAlternar para visualização direita
<c-w><c-l>Alternar para visualização direita
<c-w><right>Alternar para visualização direita
<c-w>wAlternar para próxima visualização
<c-w><c-w>Alternar para próxima visualização
<c-w>sDividir horizontalmente
<c-w>SDividir horizontalmente
<c-w><c-s>Dividir horizontalmente
<c-w>vDividir verticalmente
<c-w><c-v>Dividir verticalmente
gtAlternar para a próxima aba
gTAlternar para a aba anterior
gqqFormatar linha
gqFormatar linhas
q. / qInicia/termina a gravação da macro usando o registro de macro nomeado.

Movimentos suportados

ChaveDescrição
hEsquerda
<left>Esquerda
<backspace>Esquerda
jAbaixo
<down>Abaixo
<enter>Abaixo para primeira não em branco
kAcima
<up>Acima
Acima para primeira não em branco
lDireita
<right>Direita
<space>Direita
$Para o fim da linha
<end>Para o fim da linha
Para a coluna 0
<home>Para a coluna 0
^Para o primeiro caractere da linha
f.Procurar caractere
F.Procurar caractere para trás
t.Para caractere
T.Para caractere atrás
;Repetir último comando t. ou f.
,Repetir último comando t. ou f.
nProcurar próximo
NProcurar anterior
ggPara primeira linha
GPara última linha
wPalavra para frente
WPALAVRA para frente
bPalavra para trás
BPALAVRA para trás
ePara fim da palavra
EPara fim da PALAVRA
gePara fim da palavra anterior
gEPara fim da PALAVRA anterior
%Para item correspondente
`[a-zA-Z><]Para marca
'[a-zA-Z><]Para linha da marca
[[Para início do bloco de colchetes anterior
]]Para início do próximo bloco de colchetes
[]Para fim do bloco de colchetes anterior
][Para fim do próximo bloco de colchetes
*Para a próxima ocorrência da palavra sob o cursor
#Para a ocorrência anterior da palavra sob o cursor
HPara a primeira linha da janela
MPara a linha do meio da janela
LPara a última linha da janela
gjPara a próxima linha visual
gkPara a linha visual anterior

Objetos de texto suportados

ChaveDescrição
iwPalavra interna
awUma palavra
iWPALAVRA interna
aWUma PALAVRA
i"Aspas duplas internas
a"Aspas duplas
i’Aspas simples internas
a’Aspas simples
i`Acento grave interno
a`Acento grave
ibParênteses interno
i)Parênteses interno
i(Parênteses interno
abParênteses
a)Parênteses
a(Parênteses
iBChave interna
o}Chave interna
i{Chave interna
aBChave
a}Chave
a{Chave
i<Sinal de diferente interno
i>Sinal de diferente interno
a<Sinal de diferente
a>Sinal de diferente
i[Colchete interno
I]Colchete interno
a[Colchete
a]Colchete
i,Vírgula interna
a,Vírgula

Comandos de modo de inserção suportados

ChaveDescrição
<c-d>Remover recuo
<c-t>Recuar
<c-e>Inserir abaixo
<c-y>Inserir acima
<c-w>Excluir palavra
<c-r>.Inserir conteúdo do registro
<c-o>Alternar para o modo normal para um comando
<c-a>Aumentar o número sob o cursor
<c-x>Diminuir o número sob o cursor

O Objeto de Texto Vírgula

Isso é algo que eu sentia falta no Vim. O objeto de texto vírgula facilita a modificação de listas de parâmetros em linguagens do tipo C e outras listas separadas por vírgulas. É basicamente o espaço entre duas vírgulas ou entre uma vírgula e um colchete. Na linha mostrada na ilustração à direita, os três intervalos que este objeto de texto pode abranger estão destacados em vermelho.

vírgula para

Intervalos de objetos de texto com vírgula. Se o cursor estiver sobre, digamos, "arg2", pressionar c i , ("alterar vírgula interna") excluirá "arg2 duplo" e colocará o cursor entre as duas vírgulas no modo de inserção. Uma maneira muito conveniente de alterar os parâmetros de uma função.

Barra de comando emulado do vim

O Kate 4.11 introduziu uma opção de configuração oculta que faz com que /, ? e : abram um novo comando de busca no lugar da barra de linha de comando/Localizar/Substituir do Kate. A barra visa replicar muitos dos recursos da barra de comando do Vim e também corrigir muitos dos problemas com a interação do modo Vim do Kate com a barra de Localizar/Substituir do Kate (substituição interativa não funciona; busca incremental não posiciona o cursor corretamente; não pode ser usada em mapeamentos/macros; etc.).

Os seguintes atalhos são fornecidos pela barra de comandos emulados; assim como no Vim, eles podem ser remapeados com cmap, cnoremap, etc.:

ChaveDescrição
<c-r>.insere conteúdo do registro.
<c-r><c-w>Insere palavra sob o cursor (documento).
<c-p>Invoca conclusão específica do contexto (veja abaixo)
move para trás/para cima na lista de conclusão.
<c-p>Avança/desce na lista de conclusão.
<c-space>Extensão do Vim no Kate.
Completa automaticamente palavras de um documento.
<c-d>Extensão do Vim no Kate.
Em uma expressão 'sed' de substituição (ou seja, s/procura/substitui/[g][c][i]),
limpa o termo "procura" e coloca o cursor lá.
<c-f>Extensão do Vim no Kate.
Em uma expressão 'sed' de substituição (ou seja, s/procura/substitui/[g][c][i]),
limpa o termo “substitui” e coloca o cursor lá.
<c-g>.Extensão do Vim no Kate.
Assim como com ., insere o conteúdo do registrador nomeado,
mas escapa-o de tal forma que, quando usado com uma pesquisa,
busca o conteúdo literal do registrador;
não o conteúdo do registrador interpretado como uma regex.

A "conclusão específica do contexto" é decidida da seguinte forma:

  • Em uma barra de pesquisa (/ ou ?), preenchimento automático a partir do histórico de pesquisa (que inclui pesquisas iniciadas por meio de *; e #; pesquisas feitas em expressões 'sed' de substituição; etc.)
  • Em uma barra de comando vazia (:), completa automaticamente a partir do histórico de comandos (NB: o preenchimento automático de nomes de comandos é invocado automaticamente quando você começa a digitar).
  • Em uma barra de comando contendo uma expressão 'sed' de substituição (por exemplo, :s/procura/substitui/gc), se o cursor estiver posicionado sobre "procura", completa automaticamente a partir do histórico de "pesquisa"; se estiver sobre "substitui", completa automaticamente a partir do histórico de termos de "substituição".

Ao executar uma expressão 'sed' de substituição na barra de comando com o sinalizador "c" (por exemplo, s/procura/substitui/gc), uma expressão interativa de busca/substituição no estilo Vim será iniciada.

Alguns exemplos de uso da barra de comandos emulada, com animações GIF, são apresentados neste blog. Na versão 4.11, a barra de comandos emulados pode ser habilitada definindo a opção de configuração oculta "Vi Input Mode Emulate Command Bar" como ``true` em seu katerc/kwriterc/kdeveloprc.

Funcionalidades que faltam

Como mencionado anteriormente, o objetivo do Modo VI do Kate não é oferecer suporte a 100% dos recursos do Vim, no entanto, existem alguns recursos que fazem muita falta.

  • Modo de bloco visual – especialmente a capacidade de acrescentar/adicionar texto à seleção de bloco visual.
  • Ter comandos 'ex' disponíveis em outros programas além do aplicativo Kate.
  • O código de pesquisa precisa ser melhorado e os comandos * e # devem ser apenas pesquisas regulares.

Se você sentir falta de outros recursos ou quiser ajudar com os mencionados acima, sinta-se à vontade para entrar em contato comigo ou enviar patches! :-)

Registro de alterações

  • 16/05/2010:
    Versão inicial. Coletei informações de entradas de blog e arquivos README para criar uma única fonte de informações atualizadas.
  • 17/05/2010:
    Ctrl+A e Ctrl+X adicionados (incrementa/decrementa o número sob o cursor).
  • 30/08/2010:
    Página movida para kate-editor.org.
  • 10/09/2010:
    Corrigimos o texto no objeto de texto vírgula e fizemos algumas correções de formatação
  • 03/02/2021:
    Tabelas de atalhos de teclado convertidas para markdown para hugo.