oinume journal

Scratchpad of what I learned

RaycastのScript Commandsを試してみた

RaycastにはScript Commandsという機能があり、ずっとずっと気になっていたのでGW中に重い腰を上げて試してみた。最近会社の人にRaycastをオススメすることが多くなってきたのだけれども、「Raycast歴1年以上経つのにScript Commandsも使ったことないの?」みたいに後ろ指差されないようにするためにも...

Script Commandsとは?

簡単にいうとCUIのコマンドをRaycastから呼び出せるというただそれだけのものっぽい。「っぽい」というのは単純に自分がちゃんと調べてないだけです。はいテキトーですいません。

なにを作るか?

Hello Worldを出力するだけのScript Commandsを作っても仕方がないので、よく自分でやっている単純作業を自動化するスクリプトを考えてみた。結果として生まれたのは、以下のような beforeの文字列をafterに整形するだけのスクリプトである。なんでこんなものが必要かというと、スプレッドシートからIDなどのリストをコピーしてSQLのWHERE句のINに指定する、ということをよくやっているから。

before

aaa
bbb
ccc

after

'aaa',
'bbb',
'ccc',

Script Commandsの登録方法

めちゃくちゃ簡単なのでこのページを見てもらうのが良いと思う。テキストで手順を書くと以下の4ステップしかない。

  1. Raycastを起動する
  2. Create Script Commandと入力する
  3. 必要な情報を入力する
  4. スクリプトにコマンドを記述する

ちなみに上で書いたScript Commandのスクリプトは以下のような感じである。

#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title single-quote-with-trailing-comma
# @raycast.mode fullOutput

# Optional parameters:
# @raycast.icon 🤖
# @raycast.needsConfirmation true

# Documentation:
# @raycast.description single-quote-with-trailing-comma
# @raycast.author oinume
# @raycast.authorURL https://github.com/oinume

pbpaste | perl -pe "s/.*/'\$&',/"

作成したScript Commandを呼び出す

あとはRaycastから作成したsingle-quote-with-trailing-commaを呼び出すだけである。以下の動画ではsingle-quote-with-trailing-commaによって生成された出力をクリップボードにコピーしている。

最後に一言

というわけで駆け足でScript Commandsについて説明した。Apple Scriptを使って特定のSlack Channelを開くということもできるらしいので夢は広がりそうである。Raycast、本当によくできていてこれがあるおかげでmacOSから離れられない。次はExtensionの作成にチャレンジしてみたい。

GraphQL Codegenで自動生成されたファイルでNamed export 'gql' not foundのビルドエラーを回避する

Vite + Apollo Client + GraphQL Codegenの組み合わせでgraphql-codegenを実行すると、gql関数を以下のようにimportするためにエラーが出る。

import { gql } from '@apollo/client';
[vite] Named export 'gql' not found. The requested module '@apollo/client' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from '@apollo/client';
const {gql} = pkg;

解決方法としては graphql-codegenの設定ファイルにgqlImportの設定を追加して再度コード生成する。

const config: CodegenConfig = {
  ...
  generates: {
  ...
    ".": {
      config: {
        gqlImport: "@apollo/client/core#gql",
      },
    },
  },

そうすると import { gql } from '@apollo/client/core'; が生成されるのでビルドエラーが回避できた 🎉

PostgreSQL + HasuraでUUID v7を生成できるようにする

2024年にRFC 9562としてUUID v7が標準化された。今までは主キーにUUID v4を使っていたけど、時間軸でソートできるUUID v7を使いたいと思ったのでメモ。

簡単に書くとPostgreSQLでUUID v7形式のUUIDを生成するには以下を行えば実現できる。

  • PostgreSQLにはUUID型が標準装備されているのでこれを使用する
  • postgres-uuid-generate-v7にあるUUID v7を生成するFUNCTIONを定義する
  • カラムを "id" uuid NOT NULL DEFAULT uuid_generate_v7() のように定義する

上記を踏まえてHasura consoleでUUID v7のFUNCTIONを定義して使えるようにするには、

  1. consoleからであればDATAタブのSQLを選択
  2. エディター部分にpostgres-uuid-generate-v7リポジトリのuuid_generate_v7.sqlの中身をそのままコピペ
  3. This is a migration にチェックを入れてMigration nameに適当な名前をつける

をやれば良い(以下スクショ参照)

IntelliJ IDEAでよく使うショートカットキーをVSCodeでも使えるようにする

コードを書くためのエディタとして、IntelliJ IDEAとVSCode(Cursor)を併用して使っている。そのため、この2つのエディタのショートカットキーを同じように設定したい。IntelliJ IDEA Keybindingsを過去に使ったのだが、自分が想定してないキーも変更されてしまって使いづらいと感じたので、自分でキーバインドをカスタマイズすることにした。

ちなみにここで紹介する技はもちろんIntelliJ IDEAのみではなく、GoLand, PHPStorm, PyCharm, WebStormなどでもできる。

1. IntelliJ IDEAでよく使っている機能とショートカットキーを調べる

まず、IntelliJで自分がよく使っているキーを把握するために、Help -> My ProductivityでProductivity Guideを開く。そうすると以下のような画面が出るので、Usedの列でソートして使用頻度の高い機能名とショートカットキーを調べておく。

2. VSCode側の機能名を調べる

次に、1.で調べた機能名に対するVSCodeの機能名をChatGPTなどの生成AIを使って調べる。プロンプトは以下のような感じ。

以下のIntelliJ IDEAの機能名に対するVSCodeの機能名(英語)を教えてください。
* Search Everywhere
* Go to declaration
* Go to Implementation(s)
(以下略)

www.perplexity.ai

3. VSCodeのKeybindingを変更する

コマンドパレットからOpen Keyboard Shortcutsを開き、2.で調べた機能名に合致するCommandを調べて、IntelliJ IDEAと同じショートカットキーを登録する。生成されるkeybindings.jsonはこんな感じ。このファイルはmacOSだと ~/Library/Application Support/Code/User/keybindings.jsonに保存されているので、このファイルをGitHubなどでバージョン管理しておくと良い。

// Place your key bindings in this file to override the defaults
[
    {
        "key": "ctrl+d",
        "command": "-workbench.action.debug.run",
        "when": "debuggersAvailable && !inDebugMode && !terminalFocus"
    },
    {
        "key": "cmd+b",
        "command": "editor.action.revealDefinition",
        "when": "editorHasDefinitionProvider && editorTextFocus"
    },
    {
        "key": "f12",
        "command": "-editor.action.revealDefinition",
        "when": "editorHasDefinitionProvider && editorTextFocus"
    },
    {
        "key": "alt+cmd+b",
        "command": "editor.action.goToImplementation",
        "when": "editorHasImplementationProvider && editorTextFocus"
    },
    {
        "key": "cmd+f12",
        "command": "-editor.action.goToImplementation",
        "when": "editorHasImplementationProvider && editorTextFocus"
    },
    {
        "key": "cmd+r",
        "command": "editor.action.startFindReplaceAction",
        "when": "editorFocus || editorIsOpen"
    },
    {
        "key": "alt+cmd+f",
        "command": "-editor.action.startFindReplaceAction",
        "when": "editorFocus || editorIsOpen"
    },
    {
        "key": "shift+f6",
        "command": "editor.action.rename",
        "when": "editorHasRenameProvider && editorTextFocus && !editorReadonly"
    },
    {
        "key": "f2",
        "command": "-editor.action.rename",
        "when": "editorHasRenameProvider && editorTextFocus && !editorReadonly"
    },
    {
        "key": "f1",
        "command": "editor.action.showDefinitionPreviewHover"
    },
    {
        "key": "ctrl+alt+h",
        "command": "references-view.showCallHierarchy",
        "when": "editorHasCallHierarchyProvider"
    },
    {
        "key": "shift+alt+h",
        "command": "-references-view.showCallHierarchy",
        "when": "editorHasCallHierarchyProvider"
    },
    {
        "key": "alt+f7",
        "command": "references-view.findReferences",
        "when": "editorHasReferenceProvider"
    },
    {
        "key": "shift+alt+f12",
        "command": "-references-view.findReferences",
        "when": "editorHasReferenceProvider"
    },
    {
        "key": "f2",
        "command": "editor.action.marker.next",
        "when": "editorFocus"
    },
    {
        "key": "alt+f8",
        "command": "-editor.action.marker.next",
        "when": "editorFocus"
    }
]

ここまで書いて、こんな回りくどいことをしなくとも、1.で調べた機能名とショートカットキーからVSCodeのkeybindings.json(キーバインドの設定ファイル)を生成AIに生成してもらえばいいことに気づいたw

Cursorで開いているファイルをIntelliJ IDEAで開く

最近Cursorを使い始めているのだけど、ガッツリコードを書きたい時はIntelliJに頼ることもまだ多い。なので、Cursorでユーザータスクを定義して、Cmd + Shift + p でコマンドパレットを開いて Tasks: Runt Task でIntelliJでそのファイルを開けるようにした。

Tasks: Open User Tasks で以下のタスクの定義を記述する。(macOSの場合、このファイルは ~/Library/Application Support/Cursor/User/tasks.json に保存される)

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Open Current File with IntelliJ IDEA",
            "type": "shell",
            "command": "idea",
            "args": [
                "${file}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
             "problemMatcher": []
        }
    ]
}

参考: https://code.visualstudio.com/docs/editor/tasks


ここからアフィリエイト広告