crie seus próprios trechos

Aug 30 2020

Eu sou bastante novo no vim. E não gosto muito de instalar muitos pacotes.

Eu uso html, javascript e react.js, e gostaria de criar uma maneira simples de digitar e ter o snippet correto no arquivo.

Seriam apenas 5 ou 6 fragmentos, você pode me dar uma mão sobre por onde começar a aprender essa arte?


Editar

Existem 2 ideias em minha mente (literalmente).

  1. Um atalho que renderiza um pedaço de texto (supondo que seja possível). Talvez este pedaço de texto sendo incluído no .vimrc ou em algum lugar?
  2. Os plug-ins que verifiquei consistem em digitar algo e expandir isso usando uma das guias ou algum pressionamento de tecla específico.

Um exemplo concreto é o cabeçalho html e outro é um componente de reação, como este:

class className extends React.Component{
  constructor(){
    super()
    this.state = {}
  }
  render(){
    return
  }
} 

O snippet html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content=" " />
<meta name="description" content=" " />
<title>Title Here</title>
<link rel="stylesheet" href="index.css">
</head>
<body>
</body>
</html>

Para este último, existe o emmet-vim, mas ainda assim prefiro fazer do meu jeito, pelo menos no que diz respeito a trechos longos.

Respostas

3 JakeGrossman Aug 29 2020 at 23:41

TL; DR : Confira:help abbreviations.

Exemplo:

Digamos que eu queira fazer um snippet para criar rapidamente um objeto JavaScript no seguinte formato com a abreviação "obj" ( |representa a posição do cursor após fazer a abreviação):

var foo = {|};

Eu poderia fazer:

iabbrev obj var foo = {};<Left><Left>

Então, sempre que eu digitar objno modo de inserção seguido por um caractere não-palavra-chave (geralmente <Space>ou <Esc>/ <c-]>), ele será expandido (observe que se <Space>for pressionado, ele irá inserir um espaço antes do cursor. Um método para evitar este comportamento é descrito em a página de ajuda para abbreviations)

Se por algum motivo você não quiser expandir sua abreviatura, você pode pressionar <c-v>antes de inserir o caractere não-palavra-chave.

Vejo:

:h abbreviations
:h :iabbrev
:h 'iskeyword'

Edite para sua edição:

Para um de seus exemplos específicos (Componente React), você poderia fazer:

iabbrev rc class className extends React.Component{<CR>
            \constructor(){<CR>
              \super()<CR>
              \this.state = {}<CR>
            \}<CR>
            \render(){<CR>
              \return<CR>
            \}<CR>
          \}

Eu costumava \formatar mais bonito, mas acho que você poderia colocar tudo em uma linha:

iabbrev rc class className extends React.Component{<CR>constructor(){<CR>super()<CR>this.state = {}<CR>}<CR>render(){<CR>return<CR>}<CR>}

mas boa sorte trabalhando com isso. Vale a pena observar é \ignorar os espaços em branco precedentes, portanto, o recuo não faz nada além de ajudar a organizar a abreviação.

Isso funcionaria para qualquer abreviação estática que você queira fazer, incluindo seu exemplo de HTML, mas isso é para você descobrir :).

2 LucHermitte Aug 30 2020 at 10:53

Você poderia usar abreviações como costumávamos fazer 2 décadas atrás, mas eu não recomendaria para trechos de multilinhas como os que você mostrou.

Claro que é possível usar abreviações. Como podemos fazer com as abreviações quase tudo o que podemos fazer com os plug - ins de snippet - nos detalhes que você deseja consumir o espaço extra que estará inserindo com o :iabcomando padrão e, possivelmente, para neutralizar algumas abreviações de expandir dentro comentários ou strings.

Qual é o problema com abreviações com várias linhas? Eles são simplesmente insustentáveis. Adicione o movimento do cursor e precisaremos rapidamente de alguns ajudantes para aliviar a dor. Veja, por exemplo, uma abreviatura simples que tenho para C e C ++ .

Inoreabbr <buffer> <silent> if <C-R>=lh#cpp#snippets#def_abbr('if ',
      \ '\<c-f\>if(!cursorhere!){!mark!}!mark!')<cr>

Todas as máquinas extras ( :Inoreabbr, lh#cpp#..., !cursorhere!, !mark) algumas coisas extras que eu tinha que definir para cuidar de comer o espaço extra, movendo o cursor, definindo espaços reservados / salto posições, neutralizando a expansão nos comentários ou cordas, aplicando estilísticas / opções de formatação (espaços e novas linhas podem ser inseridos antes / depois dos colchetes ...).

O equivalente a um mecanismo de snippet pode ser semelhante a

if(<+cond+>){<+code+>}

Vários mecanismos de snippet mostram diferentes variações de sintaxe. A sintaxe acima é do plugin que estou mantendo (e que também pode aplicar a formatação instantânea). Escolha um plugin entre os vários existentes . Será muito mais simples no longo prazo.

Reserve abreviações para coisas simples, ou porque você realmente não quer nada além da tecla de espaço para acionar a expansão de seus trechos.

elmclose Aug 30 2020 at 21:44

Se você não quiser usar ferramentas de expansão de texto, você pode colocar cada fragmento em um arquivo vim separado e simplesmente ler o fragmento (arquivo) que você precisa :r snippet1(ou qualquer nome de arquivo que você deu ao fragmento pretendido). Você precisa estar no modo normal para fazer isso.

Certifique-se de que o Vim saiba qual diretório contém seus snippets.