[oedit]行を上下に移動

oedit上で、行を上下に移動するマクロです。

;; ==================================================================
;; move line
;; (caution:改行のない最終行で移動させると、最終行に改行を追加します)
;; ==================================================================
(app-set-key "Ctrl+UP" ;上に移動
  (lambda()
    (if (> (editor-get-cur-row) 0) 
      (begin
        (define text (editor-get-row-string-cr (editor-get-cur-row)))
        (editor-delete-row (editor-get-cur-row))
        (editor-previous-line 1 #f)
        (editor-paste-string text)
        (editor-previous-line 1 #f)))))

(app-set-key "Ctrl+DOWN" ;下に移動
  (lambda()
    (if (<= (editor-get-cur-row) (editor-get-row-cnt)) 
      (begin
        (define text (editor-get-row-string-cr (editor-get-cur-row)))
        (editor-delete-row (editor-get-cur-row))
        (editor-next-line 1 #f)
        (editor-paste-string text)
        (editor-previous-line 1 #f)))))

(define (editor-delete-row x)
  (begin
    (editor-set-select-row x)
    (editor-delete-selected-string)
    (editor-delete-char)))

(define (editor-set-select-row x)
  (editor-set-select-area x 0 x (editor-get-col-cnt x)))

(define (editor-get-col-cnt x)
  (string-length (editor-get-row-string x)))

(define (editor-delete-char)
  (begin
    (editor-forward-char 1 #t)
    (editor-replace-selected-string ".|\\n" "")))

(define (editor-get-row-string-cr x)
  (begin
    (editor-set-select-row x)
    (string-append (editor-get-selected-string) "\n")))

標準で準備されている関数でなんとかかんとかやっています。文末の改行の削除をする方法がわからず大変でした。そのため妙な方法をとっています。
editor-関数をいくつか作ってしまっているので、今後正式なものが用意された場合関数名は要変更。

でスケジュール管理

日付の一覧を表示しテキストでの管理するためのマクロです。iMemo*1の「スケジュール」機能がシンプルで使いやすかったので移植。

出力結果はこんな感じ。

;----- 2009年1月 -----
 1(木):
 2(金):
 3(土):

  (途中は省略)

29(木):
30(金):
31(土):

oedit.scm

;;schedule
(app-set-key "Ctrl+T"
  (lambda()
    (begin
      ;(define weekday (list "Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat"))
      (define weekday (list "日" "月" "火" "水" "木" "金" "土"))
      (define lastday (list 31 28 31 30 31 30 31 31 30 31 30 31))
      (define (retrieve ls n) (if (zero? n) (car ls) (retrieve (cdr ls) (- n 1)))) ;list-refと同じなので不要

      (define tm (sys-localtime (sys-time)))
      (define tm-year (+ 1900 (slot-ref tm 'year)))
      (define tm-mon  (+ 1 (slot-ref tm 'mon)))
      (define tm-mday (slot-ref tm 'mday))
      (define tm-wday (slot-ref tm 'wday))
      
      ;タイトル行
      (editor-paste-string  (string-append ";----- " (number->string tm-year) "年" (number->string tm-mon) "月 -----" "\n"))

      ;一日の曜日計算
      (define wday (abs(- tm-wday (remainder tm-mday 7))))

      ;日の一覧
      (do ((i 1 (+ i 1))) ((> i (list-ref lastday (- tm-mon 1))) ())
        (begin
          (define pr-day (number->string i))
          (if (>= 9 i) (set! pr-day (string-append " " pr-day)))
          (editor-paste-string (string-append pr-day "(" (list-ref weekday wday) "):" "\n"))
          (set! wday (remainder (+ wday 1) 7))
        )
      )
    )
  )
)

あいかわらずSchemeっぽくなくバッチっぽいです…エディタのマクロだしまずは動けば。使うの月一だし。
うるう年対応や年月の入力はそのうち…

clgrep

clgrepを呼び出すマクロです。changelogを表示しているときに呼び出してください。
入力ダイアログで検索文字列(正規表現)を入れ、OKを押すと検索結果が表示されます。検索エラーがあった場合、結果がない場合と同じ何もない画面が表示されます。
clgrep.rb*1rubyの実行環境*2が必要です。clgrep.txtは結果出力用ファイルです。
oedit.scm

(app-set-key "Ctrl+5" (lambda() (chlog-clgrep)))
;clgrep呼び出し
(define (chlog-clgrep)
  (begin
    ;*.rbが関連付けされていること
    (define clgrep-module-path (string-append (app-get-tool-dir) "clgrep.rb"))
    (define clgrep-result-path (string-append (app-get-tool-dir) "clgrep.txt"))
    (define clgrep-viewer-path (string-append (app-get-tool-dir) "oedit.exe"))
    (app-status-bar-msg "")
    (define edit-file (editor-get-filename))
    (if (not edit-file)
      (app-status-bar-msg "ファイル名取得失敗")
      (if (equal? edit-file "")
        (app-status-bar-msg "ファイルがありません")
        (let()
          (win-exec "cmd" "/c" "del" clgrep-result-path)
          (define clgrep-input (app-input-box "clgrep"))
          (if clgrep-input 
            (if (not (equal? clgrep-input ""))
              (begin
                (app-status-bar-msg (string-append "clgrep: \"" clgrep-input "\""))
                (win-exec "cmd" "/c" clgrep-module-path (string-append "\"" clgrep-input "\"") edit-file ">" clgrep-result-path)
                (win-exec clgrep-viewer-path clgrep-result-path "/m txt")))))))))

ちらちら見える黒い画面はコマンドプロンプトです。見えないようにする方法はわかりませんでした…
検索元画面のステータスバーに入力された検索文字列を表示しているので、検索結果があやしい場合などの参考に。

changelogを開く

新しいoeditの画面でchangelog.txtを開きます。キー、パスは適当に変更。
oedit.scm

(app-set-key "Ctrl+4" (lambda() (chlog-show)))
; changelog開く
(define (chlog-show)
  (begin
    (define chlog-editor-path (string-append (app-get-tool-dir) "oedit.exe"))
    (define chlog-path "D:\\docs\\changelog.txt")
    (win-exec chlog-editor-path chlog-path )
  )
)

schemeマクロでchangelog

oeditでchangelog*1形式でメモを取りたいとき、Ctrl+3で日付、アイテムの追加ができるようになります。

oedit.scm

(app-set-key "Ctrl+3" (lambda() (chlog-add)))

; changelog追加
(define (chlog-add)
  (begin
    (define chlog-user "testuser")
    (define chlog-email-address "testuser@aaa.bbb.ccc")
    (define today (sys-strftime "%Y-%m-%d" (sys-localtime (sys-time))))
    (define chlog-date (string-append today "  " chlog-user "  <" chlog-email-address ">\n"))
    (define chlog-item "\t*  :\n")
    (app-status-bar-msg "")
    ;search today
    (define rs (string-append "^" today))
    (define rm (rxmatch (string->regexp rs) (editor-get-all-string)))
    (if rm
      (begin ;found
        ;move cursor
        (app-status-bar-msg "busy...")
        (editor-set-row-col 0 0)
        (editor-forward-char (rxmatch-start rm) #f)
        (app-status-bar-msg "")
        (editor-next-line 1 #f)
        (editor-paste-string "\n"))
      (begin ;not found
        ;insert date
        (editor-set-row-col 0 0)
        (editor-paste-string chlog-date)
        (editor-paste-string "\n\n")
        (editor-previous-line 1 #f)))
    ;insert item
    (editor-paste-string chlog-item)
    (editor-previous-line 1 #f)
    (editor-forward-char 3 #f)))

ユーザ名(testuser)、メールアドレス(testuser@aaa.bbb.ccc)は適当に。
作ってる人がいなかったので、年末休みで作成。scheme(lispも)よく知らない身ですが何やら動いてるっぽいです。
マクロ作成でここ*2に大変お世話になりました。

改行時に自動インデント

oedit*1というテキストエディタでCtrl+J時に現在行と同じインデント(行頭の空白、全角空白、タブ)と改行を挿入するマクロです。
oedit.scm

;; インデント?
(app-set-key "Ctrl+J"
  (lambda()
    (editor-paste-string 
      (string-append "\n" 
        (rxmatch-substring 
          (rxmatch #/^[  \t]*/ 
            (editor-get-row-string 
              (editor-get-cur-row))) 0)))))

"ENTER"でもいいかも。