creare i propri snippet

Aug 30 2020

Sono piuttosto nuovo a vim. E non mi piace molto installare molti pacchetti.

Uso html, javascript e react.js e vorrei creare un modo semplice per digitare e quindi avere lo snippet corretto sul file.

Sarebbero solo 5 o 6 frammenti, puoi darmi una mano su dove iniziare a imparare quest'arte?


modificare

Ci sono 2 idee nella mia mente (letteralmente).

  1. Una scorciatoia per il rendering di una parte di testo (supponendo che sia possibile). Forse questo pezzo di testo è stato incluso in .vimrc o da qualche parte?
  2. I collegamenti che ho verificato consistono nel digitare qualcosa e nell'espanderlo utilizzando una scheda o una particolare pressione di un tasto.

Un esempio concreto è l'intestazione html e un altro è un componente di reazione, come questo:

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

Lo 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>

Per quest'ultimo, c'è emmet-vim, ma preferirei farlo a modo mio, almeno per quanto riguarda i lunghi frammenti.

Risposte

3 JakeGrossman Aug 29 2020 at 23:41

TL; DR : Check out:help abbreviations.

Esempio:

Diciamo che volevo creare uno snippet per creare rapidamente un oggetto JavaScript nel seguente formato con l'abbreviazione "obj" ( |rappresenta la posizione del cursore dopo aver fatto l'abbreviazione):

var foo = {|};

Potrei fare:

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

Quindi, ogni volta che digito objin modalità di inserimento seguito da un carattere non parola chiave (di solito <Space>o <Esc>/ <c-]>), verrà espanso (nota che se <Space>viene premuto, inserirà uno spazio prima del cursore. Un metodo per evitare questo comportamento è delineato la pagina della guida per abbreviations)

Se per qualche motivo non desideri espandere la tua abbreviazione, puoi premere <c-v>prima di inserire il carattere non della parola chiave.

Vedere:

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

Modifica per la tua modifica:

Per uno dei tuoi esempi specifici (React Component), potresti fare:

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

L'ho \formattato in modo più carino, ma immagino che potresti mettere tutto su una riga:

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

ma buona fortuna se ci lavori. Vale la pena notare che \ignora gli spazi bianchi precedenti, quindi il rientro non fa altro che aiutare a organizzare l'abbreviazione.

Questo funzionerebbe per qualsiasi abbreviazione statica che vorresti fare, incluso il tuo esempio HTML, ma sta a te capirlo :).

2 LucHermitte Aug 30 2020 at 10:53

Potresti usare le abbreviazioni come facevamo 2 decenni fa, ma non lo consiglierei per frammenti di più righe come quelli che hai mostrato.

Ovviamente è possibile usare abbreviazioni. Come possiamo fare con le abbreviazioni, quasi tutto ciò che possiamo fare con i plugin di snippet : sui dettagli che vorrai consumare lo spazio extra che inserirai con il :iabcomando predefinito , e molto probabilmente per neutralizzare alcune abbreviazioni dall'espansione all'interno commenti o stringhe.

Qual è il problema con le abbreviazioni su più righe? Sono semplicemente irrimediabili. Aggiungi il movimento del cursore e avremo rapidamente bisogno di alcuni aiutanti per alleviare il dolore. Vedi ad esempio una semplice abbreviazione che ho per C e C ++ .

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

Tutte le macchine extra ( :Inoreabbr, lh#cpp#..., !cursorhere!, !mark) sono alcune cose in più dovessi definire a prendersi cura di mangiare lo spazio extra, spostando il cursore, che definisce i segnaposto / jump-posizioni, neutralizzando l'espansione nei commenti o stringhe, applicando stilistici / opzioni di formattazione (spazi e nuove righe potrebbero essere inseriti prima / dopo le parentesi ...).

Potrebbe essere l'equivalente con un motore di snippet

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

Vari motori di snippet mostrano diverse variazioni di sintassi. La sintassi di cui sopra proviene dal plugin che sto mantenendo (e che può anche applicare la formattazione del volo). Scegli un plugin tra i vari esistenti . Sarà molto più semplice a lungo termine.

Riserva le abbreviazioni a cose semplici, o perché davvero, davvero non vuoi altro che la barra spaziatrice per attivare l'espansione dei tuoi frammenti.

elmclose Aug 30 2020 at 21:44

Se non si desidera utilizzare gli strumenti di espansione del testo, è possibile inserire ogni frammento in un file vim separato e leggere semplicemente lo snippet (file) di cui si ha bisogno :r snippet1(o qualsiasi nome di file che si è assegnato allo snippet desiderato). Devi essere in modalità normale per farlo.

Assicurati che Vim sappia quale directory contiene i tuoi snippet.