eigene Snippets erstellen

Aug 30 2020

Ich bin ziemlich neu in Vim. Und ich mag es nicht sehr, viele Pakete zu installieren.

Ich benutze HTML, Javascript und react.js und möchte eine einfache Möglichkeit zum Tippen erstellen und dann das richtige Snippet in der Datei haben.

Es wären nur 5 oder 6 Schnipsel. Können Sie mir helfen, wo ich anfangen soll, diese Kunst zu lernen?


Bearbeiten

Ich habe zwei Ideen (im wahrsten Sinne des Wortes).

  1. Eine Verknüpfung zum Rendern eines Textes (vorausgesetzt, dies ist möglich). Vielleicht ist dieser Text in .vimrc oder irgendwo enthalten?
  2. Pluggings, die ich ausgecheckt habe, bestehen darin, etwas einzugeben und es entweder mit der Registerkarte oder einem bestimmten Tastendruck zu erweitern.

Ein konkretes Beispiel ist der HTML-Header, und ein anderes ist eine Reaktionskomponente wie diese:

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

Das HTML-Snippet

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

Für diesen letzten gibt es emmet-vim, aber dennoch würde ich es vorziehen, es auf meine Weise zu tun, zumindest in Bezug auf lange Schnipsel.

Antworten

3 JakeGrossman Aug 29 2020 at 23:41

TL; DR : Auschecken:help abbreviations.

Beispiel:

Angenommen, ich wollte ein Snippet erstellen, um schnell ein JavaScript-Objekt im folgenden Format mit der Abkürzung "obj" ( |repräsentiert die Cursorposition nach der Abkürzung) zu erstellen :

var foo = {|};

Ich könnte:

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

Wenn ich dann objim Einfügemodus gefolgt von einem Nicht-Schlüsselwort (normalerweise <Space>oder <Esc>/ <c-]>) tippe, wird es erweitert (beachten Sie, dass beim <Space>Drücken ein Leerzeichen vor dem Cursor eingefügt wird. Eine Methode zum Vermeiden dieses Verhaltens ist in beschrieben die Hilfeseite für abbreviations)

Wenn Sie aus irgendeinem Grund Ihre Abkürzung nicht erweitern möchten, können Sie drücken, <c-v>bevor Sie das Nicht-Schlüsselwort eingeben.

Sehen:

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

Bearbeiten für Ihre Bearbeitung:

Für eines Ihrer spezifischen Beispiele (React Component) können Sie Folgendes tun:

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

Früher habe ich \es hübscher formatiert, aber ich denke, Sie könnten alles in einer Zeile zusammenfassen:

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

aber viel glück damit zu arbeiten. Bemerkenswert ist \, dass vorhergehende Leerzeichen ignoriert werden, sodass die Einrückung nichts anderes tut, als die Abkürzung zu organisieren.

Dies würde für jede statische Abkürzung funktionieren, die Sie tun möchten, einschließlich Ihres HTML-Beispiels, aber das müssen Sie herausfinden :).

2 LucHermitte Aug 30 2020 at 10:53

Sie könnten Abkürzungen verwenden, wie wir es vor zwei Jahrzehnten getan haben, aber ich würde es nicht für mehrzeilige Snippets empfehlen, wie Sie sie gezeigt haben.

Natürlich ist es möglich, Abkürzungen zu verwenden. Da wir mit Abkürzungen fast alles machen können, was wir mit Snippet-Plugins machen können - auf den Details, die Sie wegnehmen möchten, den zusätzlichen Platz, den Sie mit dem Standardbefehl einfügen :iab, und möglicherweise, um einige Abkürzungen von der Erweiterung innerhalb zu neutralisieren Kommentare oder Zeichenfolgen.

Was ist das Problem mit mehrzeiligen Abkürzungen? Sie sind einfach nicht zu pflegen. Wenn Sie die Cursorbewegung hinzufügen, benötigen wir schnell einige Helfer, um die Schmerzen zu lindern. Siehe zum Beispiel eine einfache Abkürzung für C und C ++ .

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

Alle zusätzlichen Maschinen ( :Inoreabbr, lh#cpp#..., !cursorhere!, !mark) sind einige zusätzliche Dinge , die ich hatte zu definieren , um den Cursor zu kümmern den zusätzlichen Platz zu essen, bewegen, definieren Platzhalter / jump-Positionen, die Expansion in den Kommentaren oder Strings zu neutralisieren, die Anwendung stilistische / Formatierungsoptionen (Leerzeichen und Zeilenumbrüche können vor / nach Klammern eingefügt werden ...).

Das Äquivalent mit einer Snippet-Engine könnte so aussehen

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

Verschiedene Snippet-Engines weisen unterschiedliche Syntaxvarianten auf. Die obige Syntax stammt von dem Plugin, das ich pflege (und das kann auch die Formatierung der Fliege anwenden). Wählen Sie ein Plugin unter den verschiedenen vorhandenen . Auf lange Sicht wird es viel einfacher.

Reserve Abkürzungen zu einfachen Dingen, oder weil Sie wirklich, wirklich nichts wollen , aber den Raum , um den Ausbau Ihres Schnipsel auszulösen.

elmclose Aug 30 2020 at 21:44

Wenn Sie keine Texterweiterungswerkzeuge verwenden möchten, können Sie jedes Snippet in eine separate VIM-Datei einfügen und einfach das Snippet (die Datei) einlesen, das Sie benötigen :r snippet1(oder den Dateinamen, den Sie dem beabsichtigten Snippet gegeben haben). Sie müssen sich im normalen Modus befinden, um dies zu tun.

Stellen Sie sicher, dass Vim weiß, welches Verzeichnis Ihre Snippets enthält.