Archive for the ‘editing’ Category

ripgrep(rg)の検索結果をCotEditorで開いてタグジャンプ

火曜日, 2月 19th, 2019
[`evernote` not found]
Facebook にシェア

(2019年2月19日修正:macOS Mojaveでは外部のOSAXライブラリをサポートしなくなったため、satimageのライブラリを使わないように変更。正規表現のルーチンは、sed – Can’t figure out how to implement REGEX with AppleScript – Stack Overflowに掲載されていたものを使わせてもらった)

指定した文字列を含むテキストファイルを、特定のフォルダ内から検索。テキストエディタで検索結果を開き、該当ファイルの該当行を一発で開けるようにしてみました。
テキスト検索ツールとしてはripgrep、テキストエディタはCotEditor(macOS用)を使っています。

事前準備

ripgrepのインストール

Homebrewをすでに使っているなら、ターミナルから

brew install ripgrep

と入力するだけ。

テキストエディタCotEditorのインストール

CotEditorは、Mac App Storeからインストールできる。

ターミナルからCotEditorを起動できるようにする

CotEditorには「cot」というコマンドラインツールが用意されている。ターミナルから

ln -s /Applications/CotEditor.app/Contents/SharedSupport/bin/cot /usr/local/bin/cot

と入力してシンボリックリンクを作成する。

CotEditor用のスクリプトをインストール

下記のスクリプトを、macOS搭載の「AppleScriptエディタ」で入力して適当なファイル名を付け、CotEditorのスクリプトフォルダ(“~/Library/Application Scripts/com.coteditor.CotEditor”)に保存。私は「tagjump.@~j.scpt」という名前を付けた。

(※”@~”と付いているのは、command+option+jというショートカットキーでこのスクリプトを呼び出せるようにするため。詳しくはCotEditorのヘルプを参照)


use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
tell application "CotEditor"
	if exists front document then
		tell front document
			
			-- get selection's positional data
			set {locLength, selectionLength} to range of selection
			set {locLines, selectionLines} to line range of selection
			set looseSelect to 0
			-- whole lines select
			if (selectionLines is greater than or equal to looseSelect as number) then
				set line range of selection to {locLines, selectionLines}
				set {locLength, selectionLength} to range of selection
			end if
			
			-- ignore last line break
			if contents of selection ends with "
" then set range of selection to {locLength, selectionLength - 1}
			set theSelection to contents of selection
		end tell
	end if
end tell

set regex to "^(/.+):([0-9]+):(.*)"
set aRes to re_match from theSelection against regex given replacement:"/usr/local/bin/cot $1 -l $2"
if aRes is not equal to {} then
	delay 0.2
	do shell script aRes
end if

on re_match against pattern from str given replacement:fmt
	set regex to current application's NSRegularExpression's ¬
		regularExpressionWithPattern:pattern ¬
			options:(current application's ¬
			NSRegularExpressionCaseInsensitive) ¬
			|error|:(missing value)
	
	(regex's stringByReplacingMatchesInString:str ¬
		options:0 range:{0, length of str} ¬
		withTemplate:fmt) ¬
		as text
end re_match

使い方

ターミナルからripgrepで検索を実行

ターミルから

rg -n -e 検索したいパターン 検索対象フォルダのフルパス | cot

と入力する。
フルパスを手入力するのは面倒くさいけど、Finderから対象フォルダをターミナルにドラッグ&ドロップすると簡単に入力できる。

検索結果がCotEditorで開かれる。

Ripgrep coteditor 1

CotEditor上からスクリプトを実行

開きたいファイル名のところにカーソルを移動し、スクリプトメニューから「tagjump.@~j.scpt」を実行(この場合は、command+option+jキーで実行できる)

該当ファイルの該当行がCotEditorで開かれる。

(2018/01/03追記)フルパスを書くのが面倒なら、例えば下記のようなシェルスクリプト(rgcot.sh)を書いておいて、「rgcot.sh 検索パターン」のように実行すると便利。この例では、カレントディレクトリ以下から検索パターンを検索し、結果をCotEditorで開く。

#!/bin/sh
abs_path=$(cd . && pwd)
rg -n -e $1 "$abs_path" | cot -n

Markdownの見出しレベルを変更するスクリプト(CotEditor用)

火曜日, 1月 9th, 2018
[`evernote` not found]
Facebook にシェア

CotEditorでMarkdownのテキストを書いている時、見出しレベル(#で始まる行)をショートカットキーで変更できると便利そうだと思ったので、スクリプトを書いてみました。
下記のスクリプトをmacOS標準のAppleScriptエディタで入力し、適当なファイル名を付けて、CotEditorのスクリプトフォルダに保存します。
ファイル名例に付いている「^@k」、「^@j」というのはショートカットキーの指定(CotEditorの機能)。ここでは、control+command+kで見出しレベルを下げる、control+command+jで上げるように設定しています。

見出しレベルを下げる(md_heading_down.^@k.applescript)

tell application "CotEditor"
   if exists front document then
      tell front document
            if coloring style is not in {"Markdown"} then
              quit
           end if
         
           -- get selection's positional data
         set {locLength, selectionLength} to range of selection
         set {locLines, selectionLines} to line range of selection
          set looseSelect to 0
           -- whole lines select
          if (selectionLines is greater than or equal to looseSelect as number) then
             set line range of selection to {locLines, selectionLines}
              set {locLength, selectionLength} to range of selection
         end if
         
           -- ignore last line break
          if contents of selection ends with "
" then set range of selection to {locLength, selectionLength - 1}
          
           -- get contents
            set theSelection to contents of selection
          if rich text 1 of theSelection is equal to "#" then
                set contents of selection to "#" & theSelection
            end if
     end tell
   end if
end tell

見出しレベルを上げる(md_heading_up.^@j.applescript)

tell application "CotEditor"
   if exists front document then
      tell front document
            if coloring style is not in {"Markdown"} then
              quit
           end if
         
           -- get selection's positional data
         set {locLength, selectionLength} to range of selection
         set {locLines, selectionLines} to line range of selection
          set looseSelect to 0
           -- whole lines select
          if (selectionLines is greater than or equal to looseSelect as number) then
             set line range of selection to {locLines, selectionLines}
              set {locLength, selectionLength} to range of selection
         end if
         
           -- ignore last line break
          if contents of selection ends with "
" then set range of selection to {locLength, selectionLength - 1}
          
           -- get contents
            set theSelection to contents of selection
          if (selectionLength ≥ 2) and (rich text 1 thru 2 of theSelection is equal to "##") then
              set contents of selection to rich text 2 thru -1 of theSelection
           end if
     end tell
   end if
end tell

OmniGraffleは、AppleScriptを使う人にとって神アプリかも

日曜日, 6月 14th, 2009
[`evernote` not found]
Facebook にシェア

B001FW0CP0テキストフレームに文字を流し込んで、それをビットマップ画像化するという作業をやる必要ができた。Adobe IllustratorをAppleScriptで制御したら簡単にできるんじゃないかと思ったのだが……。

(さらに…)

日本Ruby会議2008のメモ(2)

日曜日, 6月 22nd, 2008
[`evernote` not found]
Facebook にシェア

日本Ruby会議2008のメモの続き。

(さらに…)

本や書類のページ割りが簡単に作れるOmniOutliner

金曜日, 6月 13th, 2008
[`evernote` not found]
Facebook にシェア

私が書籍やムックの企画を作るために愛用しているのが、OmniOutlinerというMac用ソフトウェアだ。Macユーザーには定番のアウトラインプロセッサだが、アウトラインプロセッサというだけなら他にもさまざまな製品が発売されている。
なぜOmniOutlinerでないとダメなのかといえば、数値の合計機能があるから。
omnioutliner1.png

(さらに…)

Jedit Xの入力補完は親指シフトに最適

水曜日, 2月 6th, 2008
[`evernote` not found]
Facebook にシェア

現在ベータテスト中のJedit X Rev.2に搭載される「入力補完」機能がとてもよくできている。これは日本語入力がオフの時、アルファベットを数文字入れれば、残りのスペルを補完してくれる機能。単語の自動学習機能があるから、使えば使うほど、英単語の入力がスムーズになっていく。
これまで私はローマ字入力を使っていたから英単語の入力にATOKの省入力機能を使っていたのだが、最近親指シフトを使い始めたところこのやり方ができなくて困っていたのだ。これで親指シフトへの障害がまた1つなくなった(親指シフトでの入力自体はまだまだぎこちないんだけど)。

親指シフトの練習開始

金曜日, 2月 1st, 2008
[`evernote` not found]
Facebook にシェア

すっかりマイナーになってしまったものの、今でも根強いファンのいる親指シフトを練習してみることにする。今年の頭に仕事の関係で売れ筋のビジネス書を10冊ほどまとめ読みしたのだが、特に印象深かったのが勝間和代氏の『無理なく続けられる 年収10倍アップ勉強法』。レジに持って行くのはちょっと恥ずかしい書名だが、実践しやすそう、かつ効果がありそうなノウハウがつまっており、確かにこれは売れるわけだ。
アウトプットを効率化する手法として同書の中で紹介されていたのが、親指シフト。私はローマ字入力派でそれなりの速度が出せるから、親指シフトを試すつもりはなかったのだが、タイピングを速くした方が良さそうな事情ができた。定期的で量の多い取材の仕事を受けることになったのである。テープ起こしは外注するのがよいのかもしれないが、この仕事は専門用語も多いし、何よりクライアントの関係で外注するのがちょっとまずい。テープ起こし(文字起こし)を効率化する工夫はしているが、それでも限界はある。ならタイピング速度を上げようということで思い出したのが、親指シフトというわけだ。
Mac OS XではTeslaというエミュレータがメジャーなようで、Stop Making Sense: tesla on Leopard 覚え書きを見るとLeopardで動作させる方法がまとめられている。
しかし、親指シフトを覚えたはいいがあとで困るということがないよう、いくつかの疑問点について事前に調べてみる。

(さらに…)

InDesign CS3上に配置した画像のファイル名を表示する

日曜日, 10月 7th, 2007
[`evernote` not found]
Facebook にシェア

私はInDesignで書籍や雑誌記事のラフレイアウトを作ることが多い。その際、デザイナーにわかりやすいよう、画像ファイル名を画像の上に貼り付けるようにしている。しかし、画像が多いとこの作業はけっこう面倒くさい。適当なプラグインがないか探したところ、KNOWBODYというメーカーの「Label It」という製品を見つけた。ファイル名だけでなく、解像度などの情報も表示できたりとなかなか高機能(ただし項目に日本語が含まれているとうまく動作しない)。しかし、1年間のライセンスで$50というのはちと痛い。

あらためてInDesignのフォルダを調べてみると「LabelGraphicMenu」というスクリプトが入っている!

(さらに…)

Mac OS X上のWindows XPでテキスト入力

土曜日, 7月 1st, 2006
[`evernote` not found]
Facebook にシェア

Macを使い始めて5年以上は経つが、未だに長文のテキスト入力はWindows上で行っている。Mac OS X用にもJedit Xなどのテキストエディタはいろいろ出ているのだが、どうも手になじまない。
ところがMacBook上で最近話題のParallels Desktop for Macを使うと、このあたりがいい感じで解決できそう。Parallels Desktop for Mac上のWindows XPはなかなかの動作速度だし、7月1日に発表されたばかりのAppleK for Parallelsを使うと、Mac用キーボード特有の「かな」「英数」等のキーもWindows上できちんと動作する。
しかも、Parallels Desktop for Macでは、ゲストOSとホストOS間で共有フォルダを持てるようになっている。Mac OS Xの通常のフォルダに作成したファイルを、Windows用のテキストエディタでそのまま編集できるわけだ。WindowsとMac OS Xの両方で(同じバージョンの)ATOKを使っている場合、ATOK Syncでユーザー辞書を同期できるのもいい。
テキストエディタのためだけに、大量のメモリを使ってWindows XPを動かすっていうのも変な話なんだけど、やっぱり快適なんだよなあ。

索引に含まれる全項目のノンブルをずらす

日曜日, 4月 9th, 2006
[`evernote` not found]
Facebook にシェア

あくまで仮の話なのだが、書籍の編集作業をしていて、本文記事の編集も終わり、索引のテキストデータ(項目とノンブル(ページ番号))もきっちり作ったとする。仮に、仮にだ、そういう状況になってから、「やっぱり本文記事のノンブルを変更することにします。全部2ページ後ろにずれます」なんてことをいわれたら、ちょっとばかりブルーになるのが人情というものだ。DTPソフトによっては索引用のプラグインが提供されていることもあるのでこれを使えば一発だと思うかもしれない。しかし、作業の進行によっては索引を複数人で分担して作らなければいけないこともあるし、本文での表記をそのまま索引で使わないこともあったりするから、意外と索引用プラグインの出番は少なかったりする。そもそもDTPのプロダクションが索引用プラグインを持っていなかったらどうしようもないし。
じゃあ、作った索引のノンブルを手作業で変更するか? 私も1桁の足し算くらいは余裕でこなすが、それを2000も3000も間違いなくこなす自信はない。今、脳トレーニングなんてやりたい気分でもない。

そこで、正規表現とExcelを使うことにする。

(さらに…)