やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

rangerでコマンドを自作する(Markdownファイル作成)

 自動化しようぜ。

方法

  1. 作る
  2. 使う
  3. キーバインド

1. 作る

  1. mkmd.sh
  2. commands.py

1-1. mkmd.sh

 Markdownファイルを作成するシェルスクリプトを書く。

~/root/sys/workflow/script/sh/runnable/called/ranger/commands/mkmd.sh

#!/bin/bash
set -Ceu
# ----------------------------------------------------------------------------
# Markdownファイル作成
#   rangerのcommands.pyにある`mkmd`classから呼び出される。
#   カレントディレクトリにMarkdownファイルを作成する。
#   ファイル名は`{yyyyMMddHHmmss}.md`, `{yyyyMMddHHmmss}_{title}.md`のいずれか。
# $1: 出力ディレクトリ(rangerカレントディレクトリ)
# $2: ファイルのタイトル(ranger commands.py mkmdコマンド 引数)
# 作成日: 2019-03-26
# ----------------------------------------------------------------------------
Timezone() { echo "$(date +%z)"; }
Timestamp() { echo "$(date "+%Y%m%d%H%M%S")"; }
# メモのテンプレートを追記
# $1: OutputDirectoryName
# $2: Title
WriteText() {
    local OutDir="$1"
    local title="$2"
    local timestamp="$(Timestamp)"
    local year="${timestamp:0:4}"
    local month="${timestamp:4:2}"
    local day="${timestamp:6:2}"
    local hour="${timestamp:8:2}"
    local minute="${timestamp:10:2}"
    local second="${timestamp:12:2}"
    local timezone="$(Timezone)"
    local datetime="${year}-${month}-${day}T${hour}:${minute}:${second}${timezone}"
    content=$(cat <<EOS
---
layout: post
title: ${title}
date: ${datetime}
categories: [memo, note]
tags: [memo, note]
---

# ${title}

EOS
)
    local filename="${timestamp}_${title}"
    [[ -z $title ]] && local filename="${timestamp}"
    local filepath="${OutDir%/}/${filename}.md"
    mkdir -p "${OutDir}"
    echo "$content" > "$filepath"
    echo "$filepath"
}
# $1: OutputDirectoryName
Run() {
    local OutDir=${1:-"/tmp/work"}
    local Title="$2"
    #local append_title=$(zenity --entry --title "mdファイル作成" --text "タイトルが必要なら入力してください。")
    #local filepath="$(WriteText "${OutDir}" "${append_title}")"
    local filepath="$(WriteText "${OutDir}" "${Title}")"
    vim "$filepath"
    # rangerならvimになるが新規プロセスだとnano
    #${VISUAL:-${EDITOR:-sensible-editor}} "$filepath"
}
Run "$@"

1-2. commands.py

 以下ファイルに以下コードを追記する。

~/.config/ranger/commands.py

# ":mkmd<Enter>"
class mkmd(Command):
    """:mkmd <title>

    カレントディレクトリに.mdファイルを作成する。
    """
    def execute(self):
        #self.fm.notify("start mkmd: " + self.fm.thisdir.path)
        import subprocess
        import shlex
        import os
        script_path = "~/root/sys/workflow/script/sh/runnable/called/ranger/commands/mkmd.sh"
        script_path = os.path.expanduser(os.path.expandvars(script_path))
        command = 'bash ' + script_path + ' ' + self.fm.thisdir.path + ' ' +  "'" + self.rest(1) + "'"
        
        #result = subprocess.check_output(shlex.split(command)).decode("UTF-8").strip()
        #print(result)
        
        flags = '' # 'p'=pager(結果をpager(less)で表示)
        self.fm.execute_command(command, flags='')

2. 使う

引数なし

  1. rangerを起動する
  2. :mkmd<Enter>を入力する
  3. カレントディレクトリにyyyyMMddHHmmss.mdファイルが作成される

引数あり

  1. rangerを起動する
  2. :mkmd タイトルを入力する
  3. カレントディレクトリにyyyyMMddHHmmss_タイトル.mdファイルが作成される

3. キーバインド

 :mkmdは長い。mmとすると:mkmdと入力して欲しい。

~/.config/ranger/rc.conf

map mm console mkmd%space

 ちなみにmmmkmd(make markdown)の略。同じように他のファイルも対応できそう。

m? ソースコード
b Bash
c C
+ C++
# C#
f F#
g Go
h HTML, CSS, JS
j Java
l Lua
m Markdown
p Python, (Perl, PHP)
r R, Ruby, Rust
s Swift, SQL
t Tcl, TypeScript

成果

 以下のように入力できるようになった。

キー入力 生成ファイル
mm<Enter> yyyyMMddHHmmss.md
mm タイトル<Enter> yyyyMMddHHmmss_タイトル.md

 以下のような差が出る。

- コマンド ファイル内容
before touch "$(date "+%Y%m%d%H%M%S").md"<Enter> (空)
after mm<Enter> テンプレ(日時)

 タイトルを入力すると以下。

- コマンド ファイル内容
before title="タイトル"; file="$(date "+%Y%m%d%H%M%S")_${title}.md" && echo -e "date: $(date "+%Y-%m-%dT%H:%M:%S%z")\n\n# ${title}" > "$file"<Enter> 自前echo
after mm タイトル<Enter> テンプレ(日時、タイトル、見出し)

 圧倒的楽!

さらなる欲望

 エディタ実行後はキャレットを末尾に移動させたい。すぐに本文を書ける。xdotoolでエディタのキーバインドに合わせて入力させれば可能だろうが省略。

さらなる妄想

所感

 自動化っていいね。楽するための苦労は厭わない。

対象環境

  • Raspbierry pi 3 Model B+
  • Raspbian stretch 9.0 2018-11-13
  • bash 4.4.12
  • python 2.7.13, pip 9.0.1
  • python3 3.5.3, pip3 9.0.1
  • ranger 1.9.2
$ uname -a
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux