ari23の研究ノート

メーカ勤務エンジニアの技術ブログです

引用符自動付与アプリをGoで実装

よく相手のメッセージを引用するときに引用符つけますが、それを自動で付けるアプリをGo言語で実装しました🐜

ソースコードの解説と一緒にご紹介します。

要求仕様

アプリがない、つまり手動でやる手順を考えると以下になると思います。

  • (イ)引用したいメッセージを範囲選択してコピーする
  • (ハ)引用メッセージを本文にペーストする
  • (ニ) 引用メッセージの行頭すべてに引用符を入力する

上記手順で一番面倒なのが(ニ)であり、(イ)と(ハ)はアプリがあっても必ず行う動作になるでしょう。

したがって、今回作るアプリでは以下の手順を想定します。

  • (イ)引用したいメッセージを範囲選択してコピーする
  • (ロ)アプリをダブルクリックする※ここで行頭に引用符が付く
  • (ハ)引用メッセージを本文にペーストする

つまり、アプリの動作としては以下になります。

  • クリップボードの情報を取得
  • クリップボードの情報が文字列かどうか判定
  • 文字列であれば行頭すべてに引用符をつけ、クリップボードに上書きする

こちらをGo言語で実装しました。

プログラム

今回はGo言語でプログラムを書きました。以下で解説します。

開発環境

開発環境は次の通りです。外部パッケージを1つ利用します。

項目 内容
OS Windows 10
Go 1.20.3
atotto/clipboard v0.1.4

ソースコード

ソースコードは以下の通りです。最新コードはこちらを参照ください。コンパイル済みの.exeも用意しています。

package main

import (
    "flag"
    "fmt"
    "github.com/atotto/clipboard"
    "os"
    "strings"
)

var (
    prefix string
)

func init() {
    flag.StringVar(&prefix, "p", "> ", "prefix string")
}

func main() {

    // コマンドライン引数をパースして引用接頭語を取得
    flag.Parse()

    text, err := clipboard.ReadAll()

    if err != nil {
        fmt.Fprintln(os.Stderr, "clipboard is NOT string")
        return
    }

    // 行頭に接頭語を結合
    text = prefix + text
    text = strings.Replace(text, "\n", "\n"+prefix, -1)

    clipboard.WriteAll(text)
}

解説

以下の動画のような使い方を想定してます。簡単ですね。

quote-prefix.exeの使い方gif
quote-prefix.exeの使い方gif

2点解説します。

コマンドライン引数

デフォルトの引用符は> (>と半角スペース)で、init()関数内で定義しています。Go言語ではmain関数よりもこのinit関数が先に呼ばれます。

また、今回はこの引用符を自由に変更できるように、標準パッケージのflagを用いて、コマンドライン引数を組み込んでいます。 コマンドラインで指定することもできますが、Windowsなら.exeのショートカットを作って、下図のようにリンク先に引数を付け加えてあげることで引用符を指定できます。

引用符に$を指定する
引用符に$を指定する

行頭に引用符を付ける

引用符を付けるのは次の2行です。

   text = prefix + text
    text = strings.Replace(text, "\n", "\n"+prefix, -1)

まず、クリップボードから取得したテキストの一番最初に引用符(接頭語)を付けます。
次に、すべての行末にある改行コード\nを、改行コード+引用符に置換します。
その結果、行頭すべてに引用符を付けることができます。

おわりに

引用符を自動で付けるアプリをGo言語で実装しました。

ブラウザアプリでも同じような機能を持つものがありますが、今回実装したアプリの方がネット環境不要なので簡単ですね。

Pythonでも同様のアプリを作っていたんですが、Goならバイナリで渡せるので今回書き直してみました。

規模が小さいので、自作アプリネタとしてもちょうどよいと思います。

参考になれば幸いです(^^)

参考文献