自動化しようぜ。
方法
- 作る
- 使う
- キーバインド
1. 作る
- mkmd.sh
- commands.py
1-1. mkmd.sh
~/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. 使う
引数なし
- rangerを起動する
:mkmd<Enter>
を入力する- カレントディレクトリに
yyyyMMddHHmmss.md
ファイルが作成される
引数あり
- rangerを起動する
:mkmd タイトル
を入力する- カレントディレクトリに
yyyyMMddHHmmss_タイトル.md
ファイルが作成される
3. キーバインド
:mkmd
は長い。mm
とすると:mkmd
と入力して欲しい。
~/.config/ranger/rc.conf
map mm console mkmd%space
ちなみにmm
はmkmd
(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