帰ってきた「しっぽのさきっちょ」

しっぽのさきっちょ: 2015-11-13 付

ATOM Editor で現在日時を挿入する

no extension

上の記事で, date パッケージなるものがあるというので早速試してみるが,フォーマットの指定の仕方が分からない。

この記事を見ると,変な場所を触らないといけないらしい。

よろしい,ならば戦争だ自作しよう。

Atomに現在日時を挿入するコマンドを追加する」を参考に(というかほとんどコピペでw), Init Script (init.coffee) に以下の記述を追加した。

# 現在日時を挿入するコマンドを追加
# refs https://github.com/dannyfritz/atom-date
# refs https://github.com/JerrySievert/date-utils
# refs http://qiita.com/toruot/items/b26fde1a898bb52985e1
daysAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
#daysKanji = ['日', '月', '火', '水', '木', '金', '土']

paddingZero = (str, length) ->
  str = String(str)
  str = '0' + str  while(str.length < length)
  str

timezone = (offset) ->
  if offset == 0
    'Z'
  else if offset < 0
    '+' + paddingZero(-offset / 60, 2) + ':00' # 今のところ分単位の時差はないので計算を端折る
  else
    '-' + paddingZero(offset / 60, 2) + ':00' # 今のところ分単位の時差はないので計算を端折る

dateOrTime = (kind) ->
  now = new Date()
  yyyy = now.getYear() + 1900
  mm = paddingZero(now.getMonth() + 1, 2)
  dd = paddingZero(now.getDate(), 2)
  ddd = daysAbbr[now.getDay()]
  #ddd = daysKanji[now.getDay()]
  hh24 = paddingZero(now.getHours(), 2)
  mi = paddingZero(now.getMinutes(), 2)
  ss = paddingZero(now.getSeconds(), 2)
  tz = timezone(now.getTimezoneOffset())
  if kind == 1
    "#{yyyy}/#{mm}/#{dd} (#{ddd})"
  else if kind == 2
    "#{hh24}:#{mi}:#{ss}"
  else if kind == 3
    "#{yyyy}/#{mm}/#{dd} (#{ddd}) #{hh24}:#{mi}:#{ss}"
  else
    "#{yyyy}-#{mm}-#{dd}T#{hh24}:#{mi}:#{ss}#{tz}"

insertText = (str) ->
  return unless editor = atom.workspace.getActiveTextEditor()
  selection = editor.getLastSelection()
  selection.insertText(str)

atom.commands.add 'atom-text-editor', 'my-date:date', ->
  insertText(dateOrTime(1))
atom.commands.add 'atom-text-editor', 'my-date:time', ->
  insertText(dateOrTime(2))
atom.commands.add 'atom-text-editor', 'my-date:datetime', ->
  insertText(dateOrTime(3))
atom.commands.add 'atom-text-editor', 'my-date:rfc3339', ->
  insertText(dateOrTime(0))

元のコードでは timezone の項目がなかったので追加し,更に RFC 3339 のフォーマットを追加した。 そういや JavaScript の Date.getTimezoneOffset() って ± が逆になるんだっけ。 忘れてた orz

なるほど。 自分で(パッケージにするまでもない)簡単なコマンドを作る場合はこうすればいいんだな。 勉強になりました(谷啓風)。 しかし CoffeeScript は慣れん。 Arrow functions は確かに便利だけど(ES6 に採用されるくらいだし)。