Piknik

sublime

Außerhalb der Console ist Sublime mein Editor der Wahl. Öfters gibt es die Situation, das ich schnell mal ein Text Schnipsel von einem zum anderen Rechner kopieren möchte. Eine einfache Aufgabe für die ich bislang keine einfache Lösung hatte. Man kann den Text in einer Datei speichern und diese über ein gemeinsames Verzeichnis teilen oder mit scp, Air-Drop oder ähnlichem kopieren. All diese Lösungen veranlassen mich meinen Editor zu verlassen und sind mehr oder weniger zu aufwendig.

Was man benötigt wäre eine plattformunabhängige Zwischenablage. Meine Wahl dafür ist Piknik. Ein einfaches in GO geschriebenes Tool mit verschlüsseltem Transportweg. Auf der einen Seite schmeißt man irgendwas in Piknik rein, und holt es auf der anderen Seite wieder ab. Ich liebe minimalistische Lösungen.

Piknik ist für die Console gebaut. Damit sich die Zwischenablage auch aus Sublime heraus nutzen läßt wird ein Plugin benötigt, welches den Aufruf für Piknik weg kapselt und die Zwischenablage nahtlos in Sublime integriert.

Execute

Ausführen eines Consolen Kommandos im Hintergrund und Übergabe der Eingabe und Ausgabe Parameter.

import sublime
import sublime_plugin
import subprocess
import os

def execute(cmd, content):
    try:
        if os.name == "nt":
            si = subprocess.STARTUPINFO()
            si.dwFlags |= subprocess.SW_HIDE | subprocess.STARTF_USESHOWWINDOW
            process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=si, shell=False, creationflags=subprocess.SW_HIDE)
        else:
            process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        result, error = process.communicate(input=content.encode())
        if error:
            print(error.decode())
            return None
        return result.decode()
    except IOError as e:
        print('Error: %s' % e)
    except OSError as e:
        print('Error: %s' % e)

Copy

Kopiert den markierten Text oder den kompletten Inhalt aus Sublime nach Piknik.
Wrapper für piknik -copy.

class CopyToPiknik(sublime_plugin.TextCommand):
    def run(self, edit):
        content = u''
        v = self.view
        for region in v.sel():
            if not region.empty():
                if content: 
                    content += "\n"
                content += v.substr(region)
        if not content:
            content += v.substr(sublime.Region(0, v.size()))
        cmd = ['piknik', '-copy']
        execute(cmd, content)

Paste

Einfügen des Inhalts aus Piknik in Sublime oder in das Clipboard.
Wrapper für piknik -paste.

class PasteFromPiknik(sublime_plugin.TextCommand):
    def run(self, edit):
        cmd = ['piknik', '-paste']
        content = execute(cmd, "")
        if content:
            v = self.view
            v.insert(edit, v.sel()[0].begin(), content)

class PasteFromPiknikToClipboard(sublime_plugin.TextCommand):
    def run(self, edit):
        cmd = ['piknik', '-paste']
        content = execute(cmd, "")
        if content:
            sublime.set_clipboard(content)

Command Palette

Integration in die Sublime Command Palette.

[
    {   "caption": "Piknik: copy",
        "command": "copy_to_piknik"
    },{
        "caption": "Piknik: paste",
        "command": "paste_from_piknik"
    },{
        "caption": "Piknik: paste to clipboard",
        "command": "paste_from_piknik_to_clipboard"
    }
]

Die Sourcen befinden sich auf Github.