Mac

ghq管理下のリポジトリを検索するとき、自分で作ったのから絞り込めるようにした

からの続き。

あれ以来、特に置き場の決まっていないなにかをGithubからcloneするときはghq getして、シェル関数で検索できるようにしています。便利。

しかし、管理下にあるリポジトリが増えるにつれ、自分で作ったリポジトリだけ検索したい場合が増えてきました。

そこで、シェル関数をちょっと弄って、「ghq全体から検索」と「自分で作ったリポジトリの中から検索」を分けてみました。

シェル関数

.bashrcで定義。

参考として、ghq管理下のディレクトリ構成は以下のようになります。

(ghqルートディレクトリ)/(リモートリポジトリのドメイン)/(ユーザ名)/(プロジェクト名)

~/.gitconfigでghqルートディレクトリを指定。

1
2
[ghq]
root = ~/ghq

するとこんな感じ。

~/ghq/github.com/catfist/MyHexo
~/ghq/bibucket.org/catfist/dotfiles

ghq listで検索する場合、ドメインは検索対象になりません。(ユーザ名)/(プロジェクト名)から部分一致検索されます。

1個だけ出力して即cd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 自分で作ったのだけ(find repositories)
fr ()
{
dir=$(ghq list -p "catfist/"|grep -im1 "$(ghq root)/[^/]*/catfist/.*$1.*")
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit";
fi
}
# ghq全体(find repositories all)
fra ()
{
dir=$(ghq list -p|grep -im1 ".*$1.*")
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit"
fi
}

pecoで絞り込みしてcd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 自分で作ったのだけ(ghq+peco)
gp () {
dir=$(ghq list -p catfist/|grep "$(ghq root)/.*/catfist/.*$1.*"|peco)
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit"
fi
}
# ghq全体(ghq+peco all)
gpa () {
dir=$(ghq list -p "$1"|peco)
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit"
fi
}

Mac起動時に自動的にBluetoothテザリング接続するようにしてみた

Bluetoothテザリングに接続するのがめどい

私はほとんどの作業を出先かつMacBook Air上で行っており、インターネット環境をiPhoneからのテザリングで賄っています。

そのため、AppleScriptで簡単に接続できるようにしました。

しかし、しょせん手動なので、それすらめどくなってきました。そこで、ログイン時とスリープ解除時に自動的に接続できるようにしてみました。

以下Yosemite前提。

一発でBluetoothテザリングに接続するAppleScriptを用意する

改めて全体を掲載。以下記事から大半を流用しています。

(2015-01-02修正)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
on split(sourceText, separator)
if sourceText = "" then return {}
set oldDelimiters to AppleScript's text item delimiters
set AppleScript's text item delimiters to {separator}
set theList to text items of sourceText
set AppleScript's text item delimiters to oldDelimiters
return theList
end split
on number_from(str)
try
str as number
on error
str
end try
end number_from
--click_menu_extra("AppleScript/Script Editor Scripts/About these scripts...")
--click_menu_extra({"AppleScript", "Script Editor Scripts", "About these scripts..."})
on click_menu_extra(menu_path)
if menu_path is "" then
error "menu_path が入力されていません。"
end if
set mp to split(menu_path, "/")
tell application "System Events"
tell process "SystemUIServer"
set frontmost to true
click (menu bar 1's first menu bar item whose attribute "AXDescription"'s value is (mp's item 1))
repeat with i from 2 to mp's length
click (result's menu 1's menu item (my number_from(mp's item i)))
end repeat
delay 0.1 --連続してメニューを操作する時、ひと呼吸必要
end tell
end tell
end click_menu_extra
tell application "System Events" -- Wi-Fiがオフであるか?
tell process "SystemUIServer"
exists (menu bar 1's first menu bar item whose attribute "AXDescription"'s value is "Wi-Fi、Wi-Fi が有効になっていません。")
end tell
end tell
if result is true then -- Wi-Fiがオフの場合のみ
click_menu_extra("bluetooth/mmiPhone/ネットワークへ接続")
end if

本当は以下も含めるべきですが、めどいのでとりあえず省略しました。どうせiPhoneのBluetooth&インターネット共有は常時オンだし。

  • Wi-Fi/PPPoE接続の有無確認
    • →Wi-Fiオンオフ確認を追加(2015-01-02)
  • iPhoneのインターネット共有をオンにする

ログイン時に自動実行

スクリプトエディタを使ってアプリケーション形式(.app)で書き出し(osacompileでもいいけど)、ログイン項目に登録します。

なお、メニューバーにBluetoothアイコンが表示される前に実行されて失敗するパターンがある(のか?)ので、先頭にdelay 20とか入れておくといいかもしれません。

「システム環境設定>ユーザとグループ>(ユーザを選択)>ログイン項目」で「+」をクリックして上記アプリケーションを選択。

さらに、補助装置へのアクセスを許可する必要があります。「システム環境設定>セキュリティとプライバシー>プライバシー」でカギをクリックしてログインパスワードを入力、「+」をクリックして上記アプリケーションを選択。チェック。

(2014-12-31訂正)

作成したアプリケーションを編集すると、補助装置へのアクセス許可がリセットされるようです。編集した場合、再度上記の方法でチェックする必要があります。

スリープ解除時にも自動実行

SleepWatcherを利用します。

私はHomebrewでインストールしました。

1
$ brew install sleepwatcher

基本的な設定方法は上記記事を参照していただくとして。

plistの内容はこうしました。スリープ前の処理が不要なので削除してあります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>de.bernhard-baehr.sleepwatcher</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/sleepwatcher</string>
<string>-V</string>
<string>-w /Users/catfist/scripts/AfterWake</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>

AfterWakeスクリプトは、さっきのAppleScriptをまんま実行します。

1
2
3
4
#!/bin/bash
osascript << _EOB_
(以下略)
_EOB_

さっきのAppleScriptを実行するだけですね。別にこんなんでもいいのですが、

1
2
#!/bin/bash
osascript ~/Library/Scripts/BluetoothConnect.scpt

うっかりスクリプトファイルを削除しても動くように、全部書いちゃいました。

ちなみに、こんなんはなんかうまくいきませんでした。

1
2
#!/usr/bin/osascript
(以下略)

これで、ログイン時&スリープ解除時に自動的にBluetoothテザリングに接続します。

Yosemiteクリーンインストールした(始末編)

前置き

からの続き。ひと通りの環境構築を終え、平和を手にしたかに見えた世界だったが——!

始末1:Extended Attributes

こっちは軽いほう。

環境構築が終わったので、色々と作業に取り掛かろうとしたところ、ターミナルでファイルの作成や移動がうまくいきません。なんじゃらホイ、と思ってls -lして眺めていたところ、妙な表示に気がつきました。

要するにこれです。

Dropboxからコピーしたファイル・フォルダに、com.dropbox.attributesというExtended Attributesが付いていたのでした。素直に全部Gitでやれば良かった。

なんか気持ち悪いので、上記記事を参考に片っ端から削除していきましたが、やっぱりいろいろうまくいきません。

始末2:root権限

またls -lを眺めてみると、多くのファイル・フォルダの所有者がrootになっています。

以下のようにすると再現されます。

1
2
3
$ sudo touch sudo.txt
$ ls -l
-rw-r--r-- 1 root staff 0 12 19 21:51 sudo.txt

環境構築の際に、めんどくさがって区別せずにsudoで実行しまくったせいでしょう。このために通常のユーザ権限ではアクセスできない領域がおちこちに発生しているのです。

これを解消するには、所有者をrootから通常のログインアカウントに変更する必要があります。そのために、chownコマンドを用います。

これで片っ端から変更しまくって、ようやくまともに作業できるようになりました。再帰的実行の-Rオプションが助かる。

教訓:sudoは本当に必要なときだけ使う。

Yosemiteクリーンインストールした(実行編2:パッケージ管理システム)

前置き

からの続き。今回はHomebrew等のパッケージ管理システムによる環境構築です。

Homebrew+homebrew-file

まずは、Homebrew環境の構築です。

この時点ではiTerm2のインストールや.bashrcの復旧などが済んでいないので、素のターミナル.appで作業しています。

最初に、sudo必要な時に毎回やるのが面倒なので、sudo -sをしました。巨大な間違いでした。これについては後ほど。

本来は、何はともあれXcode commandline toolのインストールをすべきなのですが、すっかり忘れていました。あとでGit使うときにインストールしていい?と訊かれたのでインストールしてもらいましたが。

1
$ xcode-select --install

以下コマンドでHomebrewをインストールし、正常に機能することを確認します。

1
2
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew doctor

次に、homebrew-fileパッケージをインストールします。

1
$ brew install rcmdnk/file/brew-file

どうやらGitは最初から入っているので、そのままBrewfileをcloneします。SSH環境を作り直すので面倒だったので、httpsでcloneしました。

1
2
$ brew file set_repo catfist/brewfile
$ brew file update

これで全てのHomebrewおよびHomebrew Casksパッケージがインストールされるので、ボーッと待ちます。

……が、思いの他エラーで停止するので、途中から以下のようなコマンドを繰り返していました。

1
$ brew file update && say ok || say ng

これで、終わったとき/止まったときは声で教えてくれます。止まったら、brew file edit(Vimで開く)でBrewfileを修正します。

これで、私の場合、以下のパッケージ管理システム(みたいなもの)がインストールされます。あと、Dropboxですね。

  • rbenv
  • python(pip)
  • node(npm)
  • ghq

Dropboxから各種設定ファイルをコピー

まあこれは普通に。ただし、後で以外と厄介な問題が待ちかまえているのですが……。

この際、SSH関係のファイルもコピーしたのですが、これは別の理由があって、結局作り直しました。Dropboxに置いておくのは別に問題ないと思います。

Homebrew以外のパッケージ管理システムでインストール

まずは、シェル環境を復旧します。iTerm2のインストール&設定復旧は済んでいるので、次はdotfilesの復旧です。

私はDropboxからコピーしてしまいましたが、git cloneを強く推奨します。

1
2
$ git clone <dotfileリポジトリ> ~/dotfiles
$ ln ~/dotfiles/.bashrc ~/.bashrc

こんな感じですね。他にも.vimrcとか色々です。

ともあれシェル環境が整ったので、他のパッケージ管理システムを動かしていきます。

これはシェルスクリプトを作ってありました。こんな感じです。

RubyGemのインストールにsudoが必要なので、前述の通りsudo -sしたセッションで実行しましたが大間違いです。gem installコマンドにのみsudoを付けることを強く推奨します。

その他補足。

  • シバンに-vxオプションが付いているのは、進行状況をターミナルに表示させるためです。
  • Homebrew CasksでインストールしたアプリをAlfredで検索するには、brew cask alfred linkが必要です。
  • ghqのルートディレクトリを.gitconfigに追記していますが、.gitconfigが復旧済みなら要らないです。
  • Gitパッケージでインストールが必要なものは、サブプロセスでインストールしています。
  • Geeknoteで手入力によるログインが必要なので、通知を出して入力要求しています。sayもさせたほうがよかったですね。
  • RubyGemはHomebrewにもあるので、そっちの方が楽かも。

これで、大方の環境構築は完了したのですが……余計なことをしたツケを払うのにもう少し手間をとられることになります。

続く

次回は、2大やらかしの解決編です。

  • Dropboxからコピーしたディレクトリ・ファイルををls -lした時に、謎の@が!
  • なんかあちこちroot権限でしかアクセスできなくなってる!

Yosemiteクリーンインストールした(実行編1:OS Xアップデート)

前置き

からの続き。

前提条件

なお、ハードはMacBook Air (11-inch, Late 2010)です。

普段、MacBook Airのネット環境はiPhoneからのテザリングなのですが、さすがに転送量的にそれでアップデートするわけにはいきません。

また、自宅のWi-Fiルーターも死んでいるのですが、LANアダプタがあるので光回線に直結できます。

これでイケるやろー、と思って以下記事を参考に取り掛かったのですが……

あれ、PPPoE接続できないぞ。

OS Xインストール前にはPPPoE接続できない!

MacBook AirのPPPoE接続機能はOS Xが提供するものなので、ストレージを消去してYosemiteをダウンロードする際にはPPPoE接続ができません。

この状態で光回線に接続するには、別途ルーターを用意する必要があります。が、残念ながらそれがない。Time Machineで復元することは可能ですが、それは今回の趣旨に反する。

じゃあどうする。

別に、インストールするのはYosemiteじゃなくてよくない?

Snow Leopardをクリーンインストールした上でYosemiteにアップデートする

事前にYosemiteのインストールメディアを作成する方法もあるようですが、今回は楽してMacBook Air付属のSnow Leopardインストールメディアを利用しました。

これをUSBポートに接続し、以下記事を参考にストレージ消去の上インストールしました。

その後、Mac App StoreからYosemiteをダウンロードしてアップデート。

直接Yosemiteをインストールした場合と若干の違いはあるでしょうが、ほぼクリーンなYosemite環境が構築できました。(なお、Shellshock対応済み。)

続く

次回はある意味本題、各種パッケージ管理システムによるパッケージインストールについて書きます。

Yosemiteクリーンインストールした(準備編2:Dropbox同期)

前置き

からの続き。

全開はHomebrewを中心としたパッケージ管理システム関係の準備をしました。

今回できるだけクリーンな状態で環境構築したかったので、TimeMachineからの復元はしません。となるとアプリケーションの設定も保存する必要があります。

Sublime Textの設定だけはバージョン管理したいのでGitリポジトリにプッシュしましたが、その他のアプリケーションに関しては特に必要ないので、普通にDropboxに同期します。

実際に行った内容は以下の通りです。TextExpanderとか、何も考えなくても普通に同期してるようなのは除きます。

Alfred2

Powerpack導入済みの場合、設定をDropboxで同期することができます。

Alfredpreferences > Advanced > Set sync folder…

ここをクリックして、設定をDropboxで同期します。指定したディレクトリにsetting/Alfred.alfredpreferencesが保存されます。今回は、~/Dropboxを指定しました。

これにはWorkflowも含まれるため安心です。

iTerm2

Preferences… > General > Preferences > Load prefernces from a custom folder or URL:

ここをチェックすると、指定ディレクトリ以下にiTerm/com.googlecode.iterm2.plistが保存されます。今回は、Alfredに合わせて~/Dropbox/settingを指定しました。

XtraFinder

(メニューバーのXtraFinderアイコンをクリック) > ツール > 環境設定を書き出す

これでplistファイルが生成されるため、Dropboxに保存します。

BetterTouchTool

Preferences > Gestures > Export

これでエクスポートできるので、適当な名前を付けてDropboxに保存します。

ことえりユーザ辞書

Macの日本語入力システムはかわせみ2なので、ことえりというか、実質iPhoneのユーザ辞書。iCloud同期あるけど(同期死んでるので)念のため。

システム環境設定 > キーボード > ユーザ辞書

登録単語を全選択、ドラッグアンドドロップするとユーザ辞書.plistが生成されます。これ、毎度アホじゃないかと思う。

特にそういう機能のないアプリ

普通にコピーします。

かわせみ2

~/Library/kawasemi2/

Karabiner

~/Library/Application Support/Karabiner/

FoldingText

~/Library/Containers/com.foldingtext.FoldingText/Data/Library/Application\ Support/FoldingText

その他

~/Library/Preferences

ここから適当に。

そして間違いの第一歩:dotfiles/ブログ

ここでやめておけばよかったのですが、Gitの環境構築に手間取るかもと思い、念のためdotfilesリポジトリとブログデータ(Hexoプロジェクト/Gitリポジトリ)もDropboxに入れておきました。

これが後で微妙に厄介のタネになるのですが、それは後述。

続く

続いてはいよいよアップデート編です。ルーターがない時のTips的な内容になります。

Yosemiteクリーンインストールした(準備編1:パッケージ管理システム)

前置き

スーパー今更ネタですが。

Yosemiteじゃないと使えないアプリがちょこちょこ出てきたので、とうとうMavericksからアップデートすることにしたのですが、せっかくなのでクリーンインストールして環境の再構築をしようとしたらえらい時間かかりました。

やりたいこととしては、

  • 使ってないアプリをまるっと削除
  • MacPortが入ってるので全面的にHomebrewに移行
  • ついでに可能な限りHomebrew Caskに移行
  • ついでに入れたいパッケージをまとめてインストール

homebrew-fileでパッケージのリストアップ

上記のパッケージを利用します。

1
$ brew install rcmdnk/file/brew-file

まずはインストール。

BrewfileをGithubで管理するので、Githubにリポジトリを作っておきます。

Brewfileを新規作成します。

1
$ brew file init

リポジトリ名を聞かれるので、この場合はcatfist/brewfileと言っておきます。

すると、/usr/local/Library/catfist_brewfileにBrewfileができています。一部省略。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# tap repositories and their packages
## caskroom/cask
tap caskroom/cask
install brew-cask
## rcmdnk/file
tap rcmdnk/file
install brew-file
...
# Other Homebrew packages
install autoconf
install automake
install cmake
install cscope
install fontconfig
install freetype
install gettext
install git
...
# Below applications were installed by Cask,
but not corresponding casks were found.
#cask install Warning: nothing to list

この時点で、Brewfileにはインストール済みのHomebrewパッケージがインストールされています。

Homebrew Caskでインストールできるアプリのリストアップ

1
$ brew file casklist

このコマンドを実行すると、インストール済みのアプリの中から、Homebrew Caskでインストール可能なものをリストアップしてくれます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Cask applications
# Please copy these lines to your Brewfile and use with `brew file install`.
# Main tap repository for brew-cask
tap caskroom/cask
install brew-cask
# Apps installed by Cask in brew-cask
# Apps installed directly instead of by Cask in brew-cask
#cask install onepassword #/Applications/1Password 4.app
#cask install accessmenubarapps #/Applications/AccessMenuBarApps.app
#cask install alfred #/Applications/Alfred 2.app
#cask install #/Applications/Bitcasa.app
...

すると、こんな感じのファイルCaskfileが生成されます。たしかBrewfileと同じディレクトリだったと思う。

これらを、コメントの#を外してBrewfileの最下部に追加します。いらないのは省きます。

一部、なぜかCask名抜きで検出されるアプリがあるので、以下のようにして調べます。

1
$ brew cask search bitcasa

Brewfileの編集

ついでに、未導入のパッケージも追加することにします。

Brewfileは、以下のコマンドで編集できます。

1
$ brew file edit

以下のようにすると、導入可能なHomebrewパッケージ、およびCaskパッケージの一覧を得ることができます。

1
2
$ brew search
$ brew cask search

これをgrepなりpecoなりファイルに書き込みなりして、気になるパッケージを調べて追記していきます。

最後にBrewfileをGithubにプッシュしますが、brew file updateとすると追記したパッケージがOS X アップデート前にインストールされてしまうので、普通にgitコマンドでやります。

1
2
$ git commit -m "Add package"
$ git push

その他のパッケージ管理システム

その他のパッケージ管理システムのリストも取っておきます。

1
2
3
4
$ gem list
$ pip list
$ npm list
$ ghq list

私の場合、これらは大した数ではないので、普通にテキストファイルとして保存しておきました。

また、ghqで管理下リポジトリにはドットファイルを管理するdotfilesリポジトリが含まれています。この中にはさらに.vimrcが含まれており、そこにはNeoBundleのリストも含まれています。

管理を簡単にするために、まず、以下の記事を参考に、.vimrcを分割しました。

そして、bundle-init.vimにも、ついでに導入したいパッケージを追加しておきます。

これらのリストは、それ自体dotfilesリポジトリに突っ込んでおきました。念のため、インストールしないものも含めたCaskfileも。

当然、その他のGitリポジトリも最新の状態をプッシュしておきます。AppleScriptや、Sublime Textの設定ファイルなどは、この方法で保存しました。

(関連:分散したローカルリポジトリをhln+ghq+pecoで管理する | 豆腐メンタルは崩れない

続く

これでパッケージ管理システムの準備は完了ですが、まだ各種アプリケーションの設定が残っています。これらはDropboxで同期しておきましたが、それは次の記事で書きます。

横着しないでGitでブランチ切ってフォークしてみた

完全に自分用メモ。

あるいは以下記事の反省。

目的

Alfred Workflowの開発で、スクリプトをGUIウインドウ(データ的にはinfo.plist)に入力したものと、スクリプトファイル化したものを分ける。

実は両方のバージョンを別のWorkflowとして残してあるので、ひとつにしたい。どっちで作業したかわかんなくなりがちだし。

手順

プロジェクトディレクトリに移動。

1
cd (プロジェクトディレクトリのパス)

まず、現在の状態が失われないよう、コミットしておく。

1
2
git add -A
git commit -m "modify"

次に、新規ブランチを作成し、そのブランチに切り替える。

1
2
3
4
git checkout -b plistonly
# 以下でも良し
# git branch plistonly
# git checkout plistonly

ここはFinderで作業。.gitディレクトリを除いて現バージョンのファイルを削除し、旧バージョンのファイルをコピペ。

次に、旧バージョンの内容を’plistonly’ブランチにコミットする。

1
2
git add -A
git commit -m "re-init plistonly"

最後に、’master’ブランチに切り替え、元の状態が保存されているか確認する。

1
git checkout master

無事に元の状態が復元された。

シェル関数や自作スクリプトをサクッと定義する

新しいコマンド(シェル関数や自作スクリプト)をガンガン書いていきたいという時に。

なお、コマンド名にスペースを含むことを想定していません。

前提

管理を楽にするために、あらかじめ設定ファイルを分割しておきます。

シェル関数

以下の関数を定義しておきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
afunction () {
tmp=/tmp/$(date '+%s').sh #一時ファイルパスを定義
# 一時ファイルにテンプレートを書き込み
echo "$1 () {
}" > $tmp
vim $tmp +2 # Vimで一時ファイルを開き2行目に移動
echo "Add this function? [Y/n]" # 編集結果をファイルに書き込むか確認
read ANSWER
ANSWER=`echo $ANSWER | tr y Y | tr -d '[\[\]]'` # どっかから拾ったANSWER整形ワンライナー
case $ANSWER in # そのままエンターまたはyesとかなら
""|Y* )
cat $tmp >> ${bash_conf}/function-init.bash # 一時ファイルの内容を設定ファイルに追記
source ~/.bashrc # 設定ファイルを再読み込み
;;
* )
echo "Canceled"
;;
esac
}

aFunction hogeとするとhoge関数を書き始めることができます。

スクリプトファイル

以下の関数を定義しておきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
csh () {
if [ $1 ];then # 引数がある場合
tmp=/tmp/$(date '+%s')_$1.sh # 一時ファイルパスを定義
echo "#!/bin/bash" > ${tmp} # シバンを書き込み
echo "" >> ${tmp} # 空行を書き込み
vim ${tmp} +2 # Vimで開いて2行目に移動
echo "Add this script? [Y/n]" # 確認メッセージ
read ANSWER
ANSWER=`echo $ANSWER | tr y Y | tr -d '[\[\]]'`
case $ANSWER in
Y* ) # y入力時のみ
mv ${tmp} ~/scripts/$1.sh # 一時ファイルをスクリプト用ディレクトリに移動
chmod +x ~/scripts/$1.sh # 実行権限を与える
ln -s ~/scripts/$1.sh /usr/local/bin/$1 # パスの通ったディレクトリにシンボリックリンクを張る
echo "Script created"
;;
* )
echo "Canceled"
;;
esac
else
echo Input script name
fi
}

csh hogeとするとスクリプトファイルを書き始めることができます。

こっちはより慎重にやるべきだから、作成とリンクを分けたほうがいいかな?

分けてみよう

こんな感じかな?

1
2
3
4
5
6
7
8
9
10
11
# スクリプトファイルを作成
csh () {
if [ $1 ];then # 引数がある場合
file=~/sctipts/$1.sh # ファイルパスを定義
echo "#!/bin/bash" > ${file} # シバンを書き込み
echo "" >> ${file} # 空行を書き込み
vim ${file} +2 # Vimで開いて2行目に移動
else
echo Input script name
fi
}
1
2
3
4
5
6
7
# スクリプトディレクトリ内のファイルをパスの通ったディレクトリにシンボリックリンク
lsh () {
for file in `ls`
do
ls -s file /usr/local/bin/${file%.sh} >& /dev/null # リンク済みのファイルがエラーを吐くので捨てる
done
}

分散したローカルリポジトリをhln+ghq+pecoで管理する

こんなことをやっていたら、それghqという彼方からの説教が聞こえたので。

ghqとは

Gitのローカルリポジトリを一括管理できるコマンドラインツールです。指定したディレクトリ以下にローカルリポジトリを配置することにより、検索してcdとかが簡単にできます。

pecoとは

標準入力をインクリメンタルサーチするコマンドラインツールです。これにより、ghq管理下のリポジトリをインクリメンタルサーチすることができます。

ローカルリポジトリの分散

ghq+pecoによるローカルリポジトリ管理は非常に快適なのですが、一身上の都合によりディレクトリを移動できないリポジトリも存在します。Alfred WorkflowとかSublime Textの設定ファイルとか。

ghqのルートディレクトリ以下に/プロジェクト名/.gitを配置しないと、ghqで管理することができません。

どうするか。

ディレクトリのハードリンクを作成する

hlnを利用して、ghqルートディレクトリ以下にディレクトリのハードリンクを作成します。

例えば、Alfred Workflowのディレクトリをターミナルで開いているとして…

1
2
3
$ hln $(pwd) $(ghq root)/github.com/catfist/Add-to-Listacular
$ ghq list Add
github.com/catfist/Add-to-Listacular

こんな具合ですね。当初、シンボリックリンクとかエイリアスとかでなんとかしようとして吐きそうになってました。

おまけ:Gistsもghqで管理しようとしたが

gistyで既存のGistsを全部ローカルに引っ張れるので、これでコード管理楽勝じゃんヤッホーと一瞬だけ思ったのですが。

スクリーンショット

これはつらい。人間が読めるディレクトリ名してないので無理があります。

Gistsだけは別枠で管理するしかなさそうです。まあ、実際そのほうがいいとも思う。