1
0

More than 3 years have passed since last update.

goでターミナルから簡単に目的のウェブページに飛ぶツール作った

Last updated at Posted at 2020-08-27

成果物

Image from Gyazo

gifのようにするには以下のコマンド(alias貼らないと実用的じゃない)

$ bookmark-go show | fzf | bookmark-go open

課題感

  • アクセスしたいウェブページへのアクセス方法がバラバラ(slackの履歴からやscrapboxのwikiページからなど)でブラウザで表示するまでに時間がかかる
  • chromeの履歴に残ってたりするけどヒットできなかったりする
  • chromeのブックマークも良いけどgui操作がちょっと萎える

要件

  • fzfpecoを使って登録済みのurlを開ける
  • 登録,削除できる
  • 登録しているurlの一覧をみれる

実装

簡単に実装を紹介します
cobraというcliアプリ向けのパッケージを使いました
k8sやgithub cliにも使われているみたいです

基本的にcobraのチューリアルに沿って実装しました

mainは極薄でcmd以下にコマンドを追加していく実装です

main.go
package main

import "bookmark-go/cmd"

func main() {
    cmd.Execute()
}

以下のようにroot cmdを宣言してmainから呼んでいます
rootCmd.AddCommandでコマンドを追加できる

cmd/root.go
package cmd

// 省略

func Execute() {
    all := []*cobra.Command{
        addCmd,
        indexCmd,
        deleteCmd,
        openCmd,
    }

    for _, c := range all {
        rootCmd.AddCommand(c)
    }

    if err := rootCmd.Execute(); err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
}

各cmdは以下にあるような感じ
urlを開くcmdは受け取ったidでdbから検索してexec.Commandで開いているだけ

open.go
package cmd

//省略

var openCmd = &cobra.Command{
    Use:   "open",
    Short: "open url",
    Long:  `open url`,
    Run:   open,
}

func open(cmd *cobra.Command, args []string) {
    db := db.NewDB()
    defer db.Close()

    var u models.URL
    var s string

    if id == "" {
        cli.GetInput("id", &s)
        items := strings.Fields(s)
        if len(items) == 0 {
            return
        }
        id = items[0]
    }

    err := db.Where("id = ?", id).First(&u).Error
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("open %v¥n", u.Url)
    exec.Command("open", u.Url).Run()

    u.LastVisitAt = time.Now()
    err = db.Save(&u).Error
    if err != nil {
        log.Fatal(err)
    }
}


学んだこと

  • 標準入出力はパイプを使うとめちゃくちゃ可能性を秘めていると感じた
    • シェル極めたい
  • Goとsqliteで簡単にcliツール作れるから良い感じ
    • もっと色々cliツール作りたいと思った

TODO

  • テスト書く
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0