ゆっくり開発

開発したい時に開発するブログ

任意のディレクトリからDropboxのメモファイルを編集

やりたいこと

  • Dropboxを利用してメモ(テキストファイル)を各デバイスで共有したい.
  • ただし,メモを配置するディレクトリはDropbox/Memoとする.
  • Dropbox/Memoディレクトリの位置を意識せず,任意のディレクトリからメモの確認・編集を実行したい(memoコマンドの開発).

また,今回の開発は以下の記事の続きです.

uttnaoki.hatenablog.com

前回の開発により,memoコマンドにDropbox/Memoディレクトリ下のファイル名が補完されるようになっています.

memoコマンドの開発

開発手順

以下の処理を実現する.

  1. memoファイルの一覧を表示
  2. memoファイルの内容の確認(出力)
  3. memoファイルの追加
  4. memoファイルの削除
  5. memoファイルの編集

作成するコードは前回の開発のfunction memo(){}内に記述する.

memoファイルの一覧を表示

以下のコマンドでmemoファイルの一覧を出力する.
$ memo

この処理はDropbox/Memoディレクトリをlsすることで実現する.

コードは以下の通り.

local MEMO_DIR=$HOME"/Dropbox/Memo/"

ls $MEMO_DIR

実行結果は以下の通り.ちゃんとファイル名を出力できてる.

f:id:uttnaoki:20180722015414p:plain:h140

memoファイルの内容の確認(出力)

以下のコマンドでDropbox/Memo/memo.txtファイルの内容を確認する.
$ memo memo.txt

この処理は,Dropbox/Memo/memo.txtファイルをlessすることで実現する.

コードは以下の通り.

local MEMO_DIR=$HOME"/Dropbox/Memo/"

function less_memo() {
  local MEMO_NAME=$1
  # メモが既に存在する場合,less
  if [[ -f $MEMO_DIR$MEMO_NAME ]]; then
    less $MEMO_DIR$MEMO_NAME
  # メモが存在しない場合,echo で通知
  else
    echo "「memo: "$MEMO_NAME"」は存在しません."
  fi
}

less_memo $1

実行結果は省略.

memoファイルの追加

以下のコマンドでDropbox/Memo/tmp2.txtファイルを作成する.
$ memo -a tmp2.txt

この処理は,Dropbox/Memo/tmp2.txtファイルをtouchすることで実現する.

コードは以下の通り.

function add_new_memo() {
  local MEMO_NAME=$1
  # メモが既に存在する場合,echo で通知
  if [[ -f $MEMO_DIR$MEMO_NAME ]]; then
    echo "「memo: "$MEMO_NAME"」は既に作成済みです."
  # メモを新規作成
  else
    touch $MEMO_DIR$MEMO_NAME
    echo "「memo: "$MEMO_NAME"」を新規作成しました."
  fi
}
case $1 in
  # メモを新規作成
  '-a' ) add_new_memo $2 ;;
  # 第1引数に関するエラー処理
  * ) echo "error: オプションが適切ではありません." ;;
esac

実行結果は以下の通り.

f:id:uttnaoki:20180722021005p:plain:h300

memoファイルの削除

以下のコマンドでDropbox/Memo/tmp2.txtファイルを削除する.
$ memo -r tmp2.txt

この処理は,Dropbox/Memo/tmp2.txtファイルをrmすることで実現する.

コードは以下の通り.

function remove_memo() {
  local MEMO_NAME=$1
  # メモを削除
  if [[ -f $MEMO_DIR$MEMO_NAME ]]; then
    rm $MEMO_DIR$MEMO_NAME
    echo "「memo: "$MEMO_NAME"」を削除しました."
  # メモが存在しない場合,echo で通知
  else
    echo "「memo: "$MEMO_NAME"」は存在しません."
  fi
}

case $1 in
  # メモを新規作成
  '-a' ) add_new_memo $2 ;;
  # メモを削除
  '-r' ) remove_memo $2 ;;
  # 第1引数に関するエラー処理
  * ) echo "error: オプションが適切ではありません." ;;
esac

実行結果は以下の通り.

f:id:uttnaoki:20180722021441p:plain:h300

memoファイルの編集

以下のコマンドでDropbox/Memo/memo.txtファイルを編集する. $ memo -e memo.txt

コードは以下の通り.

function edit_memo() {
  local MEMO_NAME=$1

  # 規定のエディタを設定していれば,そのエディタを使用
  # 規定のエディタを設定していなければ, vim を使用
  if [[ -z "$EDITOR" ]]; then
    local DEF_EDITOR='vim'
  else
    local DEF_EDITOR=$EDITOR
  fi

  # メモを編集
  if [[ -f $MEMO_DIR$MEMO_NAME ]]; then
    $DEF_EDITOR $MEMO_DIR$MEMO_NAME
  # メモが存在しない場合,echo で通知
  else
    echo "「memo: "$MEMO_NAME"」は存在しません."
  fi
}

case $1 in
  # メモを新規作成
  '-a' ) add_new_memo $2 ;;
  # メモを削除
  '-r' ) remove_memo $2 ;;
  # メモを編集
  '-e' ) edit_memo $2 ;;
  # 第1引数に関するエラー処理
  * ) echo "error: オプションが適切ではありません." ;;
esac

実行結果は省略.

今回着手していない部分

今回でとりあえずmemoファイルの操作が一通りできたと思うが,実際に使っていかないと,ちゃんとできているのかわからない.
ただ,補完周りで,以下の内容は課題として残る.

  • memoファイルを.txtを意識せず,操作できるようにする.
  • memoコマンドを入力する際,入力している引数(番目)に応じて補完内容を変える.例えば,1つ目の引数を入力する際,「-a, -r, -e」が補完で出るようにする.(また,それぞれの内容を表示する.)

ソースコード全体

#!/usr/local/bin/zsh

function memo() {

  local MEMO_DIR=$HOME"/Dropbox/Memo/"

  # 選択したメモを less する関数
  function less_memo() {
    local MEMO_NAME=$1
    # メモが既に存在する場合,less
    if [[ -f $MEMO_DIR$MEMO_NAME ]]; then
      less $MEMO_DIR$MEMO_NAME
    # メモが存在しない場合,echo で通知
    else
      echo "「memo: "$MEMO_NAME"」は存在しません."
    fi
  }

  # メモを新規作成する関数
  function add_new_memo() {
    local MEMO_NAME=$1
    # メモが既に存在する場合,echo で通知
    if [[ -f $MEMO_DIR$MEMO_NAME ]]; then
      echo "「memo: "$MEMO_NAME"」は既に作成済みです."
    # メモを新規作成
    else
      touch $MEMO_DIR$MEMO_NAME
      echo "「memo: "$MEMO_NAME"」を新規作成しました."
    fi
  }

  # メモを削除する関数
  function remove_memo() {
    local MEMO_NAME=$1
    # メモを削除
    if [[ -f $MEMO_DIR$MEMO_NAME ]]; then
      rm $MEMO_DIR$MEMO_NAME
      echo "「memo: "$MEMO_NAME"」を削除しました."
    # メモが存在しない場合,echo で通知
    else
      echo "「memo: "$MEMO_NAME"」は存在しません."
    fi
  }

  # メモを編集する関数
  function edit_memo() {
    local MEMO_NAME=$1

    # 規定のエディタを設定していれば,そのエディタを使用
    # 規定のエディタを設定していなければ,vim を使用
    if [[ -z "$EDITOR" ]]; then
      local DEF_EDITOR='vim'
    else
      local DEF_EDITOR=$EDITOR
    fi

    # メモを編集
    if [[ -f $MEMO_DIR$MEMO_NAME ]]; then
      $DEF_EDITOR $MEMO_DIR$MEMO_NAME
    # メモが存在しない場合,echo で通知
    else
      echo "「memo: "$MEMO_NAME"」は存在しません."
    fi
  }

  # 引数がなければメモの一覧を表示
  if [[ $# -eq 0 ]]; then
    ls $MEMO_DIR
  # 引数の数が1であれば,メモ(第一引数)の中身を less
  elif [[ $# -eq 1 ]]; then
    less_memo $1
  # 引数の数が2であれば,オプションに応じた処理を実行
  elif [[ $# -eq 2 ]]; then
    case $1 in
      # メモを新規作成
      '-a' ) add_new_memo $2 ;;
      # メモを削除
      '-r' ) remove_memo $2 ;;
      # メモを編集
      '-e' ) edit_memo $2 ;;
      # 第1引数に関するエラー処理
      * ) echo "error: オプションが適切ではありません." ;;
    esac
  # 引数の数が (0 ~ 2) でなければエラーを出力
  else
    echo 'error: 引数の数が適切ではありません.'
  fi
}

_memo() {
  _values "description of completion" $(ls ~/Dropbox/Memo)
}
compdef _memo memo