MarkdownとBullet Journal

いわゆるプログラマーのつぶやき

ポメラをプログラム開発に使う

プログラムエディターとして使えるか試す

意外に良さそうだ。邪魔が入らない。 ポメラ内蔵のアウトライン機能でMarkdown的に使えることも判明した。

バイス制御要素

  • ①低コスト
  • ②省電力(電池駆動の場合)
  • ③通信機能(通知機能)
  • ④定期通信(状態監視)
  • ⑤電池情報(電圧監視)

想定する商品

  1. 異常通知タイプ
    • 定期通信は必要だが10~30日に1回程度でよい
    • 電圧情報は不要(寿命10年以上で装置交換)
  2. イベント通知タイプ
    • 定期通信は必要だが10~30日に1回程度でよい
    • 電圧情報は必要(交換頻度1年程度なので)
  3. 不定期通知タイプ
    • 定期通信不要(意味がない)
    • 電圧情報は不要(寿命10年以上で装置交換)

GPIOアサイ

E + F6 GPIOアサイ

// GP0  AD入力            
// GP1 COMP入力      
// GP2 COMP出力      
// GP3 MCR入力           
// GP4 
// GP5 Digital入力       

E + F2 GPIOアサイ

// 電池電圧はESP32側で計測するので不要
//
// GP0 Digital入力       
// GP1 Digital入出力    
// GP2 
// GP3 MCR入力

3 +F2 GPIOアサイ

// GP0  Digital入力
// GP1 Digital出力
// GP2 Digital出力
// GP3 MCR入力

【Git】Tips

.gitignoreで特定の拡張子のみ追跡対象にしたい

サブディレクトリも対象とする場合の記載方法

# 最初に全ファイルを除外指定
*
# その上でサブディレクトリを許可
!*/
# 対象とするfile拡張子を記載して許可
!*.c
!*.cpp
!*.h

*/で全サブディレクトリを許可した場合、管理対象fileがないディレクトリは空ディレクトリと同じ扱いとなる。

続く

【Linux】bash シェルスクリプト

bash シェルスクリプトコマンド一覧表(自分用)

スクリプト作成と実行

# test.sh実行はファイル保存の場所でいずれかのコマンドで実行
$ chmod 755 test.sh - $ ./test.sh
$ sh test.sh
$ bash test.sh

入力・出力

- echoで出力、 readで入力します。
test.sh
#!/bin/sh
read NAME
echo "Hello, $NAME!"

変数

  • 変数の名前として半角英数字とアンダーバーが使える
  • 変数に値を与える時=を前後空白なしで書く。文字列な場合"で囲む
  • 変数をアクセスする時は変数名の前に$を入れるか、${}で囲む
  • const変数はreadonlyを使う
  • 変数はunsetで削除できる
test.sh
#!/bin/sh
var="これは変数です"
var2="これも変数です"
echo "var2=$var2"
var2="var2が変更されました。"
echo ${var2}
readonly var
var="readonly varを変えてみる。"

特別な変数

$0  スクリプト名
$1 ~ $9 引数、1番目の引数を$1、2番目の引数を$2でアクセスする
$#  スクリプトに与えた引数の数
$*  *全部の引数をまとめて1つとして処理
$@  全部の引数を個別として処理
$?  直前実行したコマンドの終了値(0は成功、1は失敗)
$$  このシェルスクリプトのプロセスID
$!  最後に実行したバックグラウンドプロセスID

数値の置換

文法  説明
${var}        変数
${var:-word}  変数がまだセットされていないか空文字列の場合wordを返します。varに保存しません
${var:=word}  変数がまだセットされていないか空文字列の場合wordを返します。varに保存します
${var:?word}  変数がまだセットされていないか空文字列の場合置換に失敗し、スタンダードエラーにエラーを表示します
${var:+word}  変数がセットされている場合wordを返します。varに保存しません

test.sh
#!/bin/sh
echo "1 - ${var:-wordSetInEcho1}"
echo "2 - var = ${var}"
echo "3 - ${var:=wordSetInEcho3}"
echo "4 - var = ${var}"
unset var
echo "5 - ${var:+wordSetInEcho5}"
echo "6 - var = $var"
var="newVarValue"
echo "7 - ${var:+wordSetInEcho7}"
echo "8 - var = $var"
echo "9 - ${var:?StandardErrorMessage}"
echo "10 - var = ${var}"

実行結果:
1 - wordSetInEcho1
2 - var = 
3 - wordSetInEcho3
4 - var = wordSetInEcho3
5 - 
6 - var = 
7 - wordSetInEcho7
8 - var = newVarValue
9 - newVarValue
10 - var = newVarValue

配列 (Bash)

test.sh
#!/bin/bash
#bash shellで配列の書き方
ARRAY=(item1 item2 item3 item4)
ARRAY[0]="ITEM1"
ARRAY[2]="ITEM3"

echo "ARRAY[0]: ${ARRAY[0]}"
echo "ARRAY[1]: ${ARRAY[1]}"

#全てのアイテムをアクセスする
echo "ARRAY[*]: ${ARRAY[*]}"
echo "ARRAY[@]: ${ARRAY[@]}"

実行結果

$ ./test.sh
ARRAY[0]: ITEM1
ARRAY[1]: item2
ARRAY[*]: ITEM1 item2 ITEM3 item4
ARRAY[@]: ITEM1 item2 ITEM3 item4

オペレータ

  • shellでは算術演算子expr 数字 演算子 数字で計算できます。
演算子     意味       例
+          加         echo `expr 10 + 20` => 30
-          減         echo `expr 20 - 10` => 10
\*         乗         echo `expr 11 \* 11` => 121
/          割         echo `expr 10 / 2` => 5
%          剰余       echo `expr 10 % 4` => 2
=          指定       a=$b bの値はaに保存されます
==         同         [ "$a" == "$b" ] $aと$bが同じ場合TRUEを返します。
!=         異         [ "$a" != "$b" ] $aと$bが同じではない場合TRUEを返します。

比較       意味                例
-eq        イコール            [ "$a" -eq "$b" ] $aと$bが同じ場合TRUEを返します。
-ne        異なる              [ "$a" -ne "$b" ] $aと$bが違い場合TRUEを返します。
-gt        より大きい          [ "$a" -gt "$b" ] $aが $bより大きい場合TRUEを返します。
-lt        より小さい          [ "$a" -lt "$b" ] $aが $bより小さい場合TRUEを返します。
-ge        より大きいか同じか  [ "$a" -ge "$b" ] $aが $bより大きいか同じ場合TRUEを返します。
-le        より小さいか同じか  [ "$a" -le "$b" ] $aが $bより小さいか同じ場合TRUEを返します。
!          ではない            [ ! "$a" -gt "$b" ] $aが $bより大きくない場合TRUEを返します。
-o         どちらか            [ "$a" -gt "$b" -o "$a" -lt "$b" ] $aが $bより大きいか小さいかの場合TRUEを返します。
-a         両方                [ "$a" -gt 90 -a "$a" -lt 100 ] $aが 90より大きく100より小さい場合TRUEを返します。
-z         文字列が空か        [ -z "$a" ] $aが何も指定してない場合TRUEを返します
-n         文字列が空か        [ -n "$a" ] $aに何かを指定しした場合TRUEを返します
  • [ コマンドの引数に変数を指定するときは " でクォートする必要があります
  • 上記のオペレータを使ってif条件を書きます。

if 条件

ifの基本の書き方は if [ 条件 ] then コマンド fi です。

  • 条件が真の場合 then の次のコマンドを実行します。
  • 違う場合次々の elif [ 条件 ] を確認します。
  • 真の条件がない場合 else の次のコマンドを実行して終了します。
  • else がない場合は、そのまま終了します。
test.sh
#!/bin/sh

  if [ "$1" -gt "$2" ]
  then 
      echo "1番目の引数が2番目の引数より大きい"
  elif [ "$1" -eq "$2" ]
  then
      echo "1番目の引数と2番目の引数は同じです"
  else
      echo "1番目の引数が2番目の引数より小さい"
  fi

実行結果

$ ./test.sh 2 7
1番目の引数が2番目の引数より小さい
$ ./test.sh 10 5
1番目の引数が2番目の引数より大きい
$ ./test.sh 9 9
1番目の引数と2番目の引数は同じです

Switch 条件

  • switchの基本の書き方は case 変数 in 条件・値) コマンド ;; esac です。
  • 条件・値が変数と合う場合それの次のコマンドを実行します。
#!/bin/sh

DRINK="coffee"
case "$DRINK" in
    "beer") echo "ビールです" 
    ;;
    "juice") echo "ジュースです" 
    ;;
    "coffee") echo "プログラマーが飲むとコードに変化!" 
    ;;
esac

実行結果

$ ./test.sh
プログラマーが飲むとコードに変化!

ループ

  • breakキーワードで終了
  • continueキーワードで現在のループを飛ばすことができます。

while ループ

  • 条件が合うときループします。
test.sh
#!/bin/sh

a=0
while [ $a -lt 5 ]
do
    echo $a
    a=`expr $a + 1`
done

until ループ

  • whileの逆で、条件が合うまでループします。
test.sh
#!/bin/sh

a=0
until [ ! $a -lt 5 ]
do
    echo $a
    a=`expr $a + 1`
done

for ループ

  • forの基本の書き方は for 変数 in 複数値・変数・範囲 do コマンド done です。
  • 条件・値が変数と合う場合それの次のコマンドを実行します。
test.sh
#!/bin/sh

for var in 0 1 2 3 4  #範囲の書き方(Bash独自) => {0..4}
do
    echo $var
done
  • いずれのループも同じ結果:
$ ./test.sh
0
1
2
3
4

関数

test.sh
#!/bin/sh

#関数を指定します
MyFunction () { 
      echo "関数のechoです。"
}
MyParamFunc() {
      echo "引数1:$1 引数2:$2"
}

#関数を呼び出します
MyFunction
MyParamFunc param1 param2

実行結果:

$ ./test.sh
関数のechoです。
引数1:param1 引数2:param2

Linuxコマンドとの組み合わせ

  • シェルスクリプトの基本コマンドとunixコマンドを一緒に使えば効率的になります。
  • 以下のサンプルはファイル移動するコマンドmvとexprだけを使っています。
rename.sh
#!/bin/sh
#このスクリプトがあるディレクトリ中のtxtファイルを全部mytxt{番号}.txtに変更するスクリプト

index=1
for file in *.txt
do
    mv "$file" "mytxt${index}.txt"
    index=`expr $index + 1`
done

*実行結果:現在のディレクトリ中のファイルを確認後、名前を変更
$ ls
aaa.txt     bbb.txt     ccc.txt     ddd.txt     eee.txt     test.sh
$ sh rename.sh
$ ls
mytxt1.txt  mytxt2.txt  mytxt3.txt  mytxt4.txt  mytxt5.txt  test.sh

学習用サイト情報

shell操作

  • ファイルなどから?行目だけと指定した行の部分を出力する方法
  • 5行目を出力する例
$ sed -n 5p <file>
または
cat <file> | head -5 | tail -1

.vimrcを編集してC-dでDeleteを実装

  • どうしても欲しかった機能
inoremap <C-d> <Delete>

スクリプト作成

$ history | head -500 | tail -20 > aws.sh  // ターゲットコマンドのある辺りをファイル化
$ vim aws.sh                               // 編集で必要な1行のみ残す
$ sh aws.sh                                // シェルスクリプト実行
  • それをAliasにするとawsだけで起動する
  • もちろん最初からaliasにコマンド入力を記載してもよい
$ alias aws='sh aws.sh' //Shellスクリプトとの組み合わせ

readやechoの使い方

  • catやlessを使わずビルトインコマンドだけでファイル表示が可能
while read line; do echo $line; done < sample.c    // この場合は行頭のスペース・タブを削除
read -rd '' file < sample.c ; echo "$file"         // この場合はそのまま表示

正規表現

sed 文字列を置換

  • 例: sample.logファイル内のabcをdefに変換
sed s/abc/def/g sample.log

awk 文字列を抽出

  • 基本は$ awk 'パターン {アクション]'。
  • 列をフィールド、行をレコードと呼ぶ。
  • パターンを指定しない場合、全てのレコードに対してアクションが行われる。
  • 各フィールドの値はそれぞれ変数に格納される。
  • 第1フィールドは$1、第2フィールドは$2みたいに。 $0はレコード全体を示す。
  • 変数NFはフィールド数を、変数NRはレコード数を表す。
  • $NFで最後のフィールドの値を参照できる。
  • 区切り文字を-Fで指定(指定しないとスペース区切りになる)

  • 例: sample2.logファイル内で左から3番目のフィールド(文字列)を抽出

awk -F':' '{print $3}' sample2.log   // コロン区切りの場合
awk '{print $3}' sample3.log         // スペース区切りの場合

grep 文字列を検索

  • 例: 文字列abcが含まれる行を検索する
grep abc sample4.log

応用

  • パイプでつなげると、出力結果を渡すことができ、複数の処理をつなげることができる
  • 例: 文字列abcを含む行を検索後文字列abcをdefに変換、左から2番目と3番目の文字列を抽出してlessで表示
cat sample5.log | grep abc | sed s/aaa/bbb/g | awk '{print $2, $3}' | less

Readline viモード

  • bashをvi操作で使える
  • .bashrcに「set -o vi」の追記でOK

ディレクトリ移動

【Linux】Vim,vi

vimコマンド一覧表(自分用)

オペレーター

c         変更する
d         削除する
y         yankする
~         大文字小文字を入れ替える (‘tildeop’がセットされていれば)
g~        大文字小文字を入れ替える
gu        小文字にする
gU        大文字にする
!         外部プログラムでフィルターする
=         インデントを整形する
gq        テキストを整形する(幅を80に収めたり)
g?        ROT13で暗号化する

>         右にインデントする
<         左にインデントする
zf        折畳みを作成(foldを定義する)
g@        ‘operatorfunc’に設定された関数を呼び出す

モーション

h         左へひとつ  10hと打つと10進む
j         下へひとつ
k         上へひとつ
l         右へひとつ
gj        下へひとつ 表示上の行移動
gk        上へひとつ 表示上の行移動

b         前の[count]個目のwordの先頭に移動
B         前の[count]個目のspace WORDの先頭に移動
w         次の[count]個目のwordの先頭に移動
W         次の[count]個目のspace WORDの先頭に移動
ge        前の[count]個目のwordの末尾に移動
gE        前の[count]個目のspace WORDの末尾に移動
e         次の[count]個目のwordの末尾に移動
E         次の[count]個目のspace WORDの末尾に移動
0         行頭に移動(空白文字も含む)
^         行頭の非空白文字に移動
$         行末に移動(カウントがある場合は[count]-1行)
_g_       行末の非空白文字に移動(カウントがある場合は[count]-1行)

+         下の行の先頭へ
-         上の行の先頭へ

f{char}   右に向かって[count]番目の{char}に移動
F{char}   左に向かって[count]番目の{char}に移動
t{char}   右に向かって[count]番目の{char}の1つ左の文字に移動
T{char}   左に向かって[count]番目の{char}の1つ右の文字に移動
;         [count]回、最後のf、F、t、Tを繰り返す
,         [count]回、最後のf、F、t、Tを反対方向に繰り返す

gg        ファイルの先頭にジャンプ
G         ファイルの最終行にジャンプ
[count]gg [count]行目の最初の非空白文字にジャンプ
[count]G  [count]行目の最初の非空白文字にジャンプ
(         前の[count]個目の文にジャンプ
)         次の[count]個目の文にジャンプ
{         前の[count]個目の段落にジャンプ
}         次の[count]個目の段落にジャンプ
H,M,L     画面の先頭/真ん中/末尾にジャンプ
%         対応する記号にジャンプ(デフォルトは([{}]))
[count]go ファイルの先頭から[count]バイト目にジャンプ
gf        カーソル位置に記述されているファイル名にジャンプ
C-j       カーソル位置に記述されているキーワードの定義にジャンプ
'{mark}   マークした行の行頭にジャンプ
`{mark}   マークした行の文字位置にジャンプ

テキストオブジェクト

iw        現在の単語を選択
aw        現在の単語+前後どちらかの空白を選択
iW        現在の空白区切り単語を選択
aW        現在の空白区切り単語+前後どちらかの空白を選択
is        現在の文を選択
as        現在の文+前後どちらかの空白を選択
ip        現在の段落を選択
ap        現在の段落+前後どちらかの空行を選択
i)        () ブロックの内部を選択
a)        () ブロックを選択
i}        {} ブロックの内部を選択
a}        {} ブロックを選択
i]        [] ブロックの内部を選択
a]        [] ブロックを選択
i>        <> ブロックの内部を選択
a>        <> ブロックを選択
i”        "" の内部を選択
a”        "" を選択
i’        '' の内部を選択
a’        '' を選択
i`        `` の内部を選択
a`        `` を選択
it        html、xmlのタグの内部を選択
at        html、xmlのタグを選択

その他コマンド

p         プット(ペースト)
.         リピート(マイクロマクロ)
u         変更を元に戻す(undo)
C-r       変更をやり直す(redo)

C-b       一画面上にスクロール
C-f       一画面下にスクロール
C-u       画面半分上にスクロール
C-d       画面半分下にスクロール
C-y       画面を1行上にスクロール
C-e       画面を1行下にスクロール
z<Enter>  文字カーソルの行が最上行となるようスクロール
z.        文字カーソルの行が中間行となるようスクロール
z-        文字カーソルの行が最下行となるようスクロール
zt        文字カーソルの行が最上行となるようスクロール
zz        文字カーソルの行が中間行となるようスクロール
zb        文字カーソルの行が最下行となるようスクロール

C-o       ジャンプリストの中の[count]個古いカーソル位置に移動
C-i       ジャンプリストの中の[count]個新しいカーソル位置に移動
g;        変更してきた箇所に戻る
g,        変更してきた箇所に進む
~         カーソル下の文字の大文字/小文字を切り替え
*         カーソル下の単語を前方検索
n         最後の検索を[count]回繰り返す、*と組み合わせて使用すると便利*
N         最後の検索を逆方向に[count]回繰り返す

yy        [count]行をヤンク
dd        [count]行を削除
cc        [count]行を削除して、挿入モードに切り替え
D         カーソル下から[count]-1行末まで削除
C         カーソル下から[count]-1行末まで削除して、挿入モードに切り替え
S         [count]行を削除して、挿入モードに切り替え
s         カーソル下の[count]文字を削除して、挿入モードに切り替え
r{char}   カーソル下の文字を{char}に置換
C-a       カーソル下またはそれ以降の数値を[count]加算
C-x       カーソル下またはそれ以降の数値を[count]減算
>>        現在行を1インデント増やす
<<        現在行を1インデント減らす
J         [count]行を空白を挟んで連結
gJ        Jと基本は同じだが、空白を挿入しない

検索移動

/         順方向に文字列検索
?         逆方向に文字列検索
n         順方向に繰り返し検索
N         逆方向に繰り返し検索

レジスタ一覧

- ""      :  無名レジスタ。d,c,x,yなど一般的な作業で入る
- "a - "z :  指定レジスタに格納
- "A - "Z :  指定レジスタに追記
- "0      :  yankでのコピー
- "1 - "9 :  数行以上の削除・変更したテキストが入る(1が最も新しい)
- "-      :  1行未満の削除・変更したテキストが入る
- "*      :  クリップボードと繋がる*
- ":      :  直近に実行されたコマンドラインEXモードのコマンドを格納
- "%      :  編集中のファイル名(カレントファイル名)
- "#      :  代替ファイルレジスタ
- "/      :  最終検索パターン用レジスタ。:let @/ = "文字列"」で入れ替え
- "=      :  Expressionレジスタ 
- ".      :  最後に挿入されたテキストが格納
- "_      :  消去専用レジスタ_ 

マクロ一覧

q{a-z,A-Z}        マクロの記録を開始(指定レジスタに登録・追記(大文字))
q                 記録の終了
@{a-z,A-Z}        マクロの実行(指定レジスタ)
@@                直前に呼び出したマクロの実行

マーク一覧

:marks            mark一覧を表示する
m[a-zA-Z]         カーソル位置をmarkする
``                直前のマークへ移動
`.                直前に変更された場所へ移動
`^                直前に挿入があった場所へ移動
`[                直前に変更もしくはヤンクが行われた先頭へ移動
`]                直前に変更もしくはヤンクが行われた末尾へ移動
`<                直前のビジュアルな選択範囲の先頭
`>                直前のビジュアルな選択範囲の末尾
C-o               古いマークへ移動(何回も可能)
C-i               新しいマークへ移動(何回も可能)
`[a-zA-Z]         指定のマークに移動
'[a-zA-Z]         指定のマークの行頭に移動
:delmarks [a-Z]   マークの削除
:delmarks!        マークの一括削除

バッファリスト一覧

:ls          バッファリストを表示
:bt         最初のバッファに移動
:bp         前のバッファに移動
:bn         次のバッファに移動
:bb         最後のバッファに移動
:b [1-99]     指定のバッファに移動
:bd         バッファリストからの削除
:bw         バッファの削除

引数リスト一覧

:ar  glob             *.mdなどglobで指定したファイルを一斉に開く
:ar  `cat file名`  1行ずつファイル名を記載したファイルで一斉に開く
:ar         引数リストを表示
:argdo      1つのコマンドを引数リスト中の各バッファに実行する
:fi         先頭ファイルのバッファに移動
:p          前のバッファに移動
:n          次のバッファに移動
:la         末尾ファイルのバッファに移動

短縮形

:ab <短縮形> <展開後テキスト>    短縮形を登録
:unab <短縮形>                   短縮形を削除
:ab                              短縮形一覧

マッピング機能

:map [a-Z,0-9,!"#$%&'] [command]   キーとコマンドのマッピングを登録
:unmap  [a-Z,0-9,!"#$%&']          キーのマッピングを削除
:map                               キー一覧を表示

正規表現(初級編)

- 位置を表す正規表現
^             行頭を表す
$             行末を表す
\<            語頭を表す
\>            語末を表す

- 1文字を表す正規表現
.             任意の1文字を表す
[a-zA-Z]      英字の1文字
[0-9]         数字の1文字
[0-9A-Za-z]   英数字の1文字
[a-z]         英小文字の1文字
[A-Z]         英大文字の1文字
\w            なにかしらの文字にマッチ
\n            改行にマッチ
\t            タブにマッチ
\s            空白にマッチ
^$            空行にマッチ

- 繰り返しを表す正規表現
*             直前の文字の0回以上の繰り返しを表す
\{<n>\}       直前の文字の<n>回の繰り返しを表す
\{<n>,<m>\}   直前の文字の<n>回以上<m>回以下の繰り返しを表す

- エスケープ処理
\ 直後のメタ文字の特別な意味を打ち消す 
\^ ,  \$ ,  \. ,   \* ,  \[ ,  \] ,  \/ ,  \~ ,  \\

その他

C-l                              画面を再描画する

分割window

C-w s         現在のウィンドウを水平分割し、現在のバッファの内容を新しいウィンドウでも利用する
C-w v         現在のウィンドウを垂直分割し、現在のバッファの内容を新しいウィンドウでも利用する
:sp           現在のウィンドウを水平分割し、fileを新しいウィンドウに読み込む
:vp           現在のウィンドウを垂直分割し、fileを新しいウィンドウに読み込む
C-w s         オープンされているウィンドウでフォーカスを順次切り替えていく
C-w h         左のウィンドウにフォーカス
C-w j         右のウィンドウにフォーカス
C-w k         上のウィンドウにフォーカス
C-w l         下のウィンドウにフォーカス
C-w =         すべてのウィンドウの幅と高さを同じにする
C-w |         アクティブなウィンドウの幅を最大化する
C-w -         アクティブなウィンドウの高さを最大化する
[N]C-w |      アクティブなウィンドウの幅を[N]文字にする
[N]C-w -      アクティブなウィンドウの高さを[N]文字にする
:clo  C-w c   アクティブなウィンドウを閉じる
:on   C-w o   アクティブなウィンドウだけを残し他を全て閉じる

ウィンドウ移動
C-w J         カレントウィンドウを最下段に移動する
C-w K         カレントウィンドウを最上段に移動する
C-w H         カレントウィンドウを最左列に移動する
C-w L         カレントウィンドウを最右列に移動する

C-w r         ウィンドウ位置を下・右へ回転させる
C-w R         ウィンドウ位置を上・左へ回転させる

ウィンドウのサイズ変更
:res[ize] +[N] カレントウィンドウの高さを指定した行数分増加させる
:res[ize] -[N] カレントウィンドウの高さを指定した行数分減少させる

:res[ize] [N] カレントウィンドウの高さを指定した行数分にする(省略すると最大まで)
:vertical res[ize] [N] カレントウィンドウの幅を指定した桁数分にする(省略すると最大まで)

C-w +         カレントウィンドウの高さを1行分増やす
C-w -         カレントウィンドウの高さを1行分減らす

C-w >         カレントウィンドウの幅を1桁分減らす
C-w <         カレントウィンドウの幅を1桁分増やす

例)
10C-w + のように複数回分指定することもできる

タブページ

:tabe filename  filenameを新しいタブでオープンする
C-w t           現在のウィンドウを独立したタブに移動する
:tabc           現在のタブページとそこに格納されているすべてのウィンドウを閉じる
:tabo           アクティブなタブページを残しそれ以外のタブページを全て閉じる
:tabn  {N}gt    番号{N}のタブページに切り替え
:tabn  gt       次のタブページに切り替え
:tabp  gT       前のタブページに切り替え
:tabm  [N]      タブページの位置移動、[N]=0は先頭、[N]省略は末尾へ移動

:tabnew filename  ファイルを指定して開く
:E  select t      netrwで開きたいファイルを選択して「t」を押す。
:tab ba           すべてのバッファをタブで開く
:tabs             開いているタブとそこに含まれるバッファ一覧を表示
:tabf (:tabfind)  引数で find して新規タブで開く
:tabm (:tabmove)  引数(数値)+1番目にタブを移動させる
:tabd (:tabdo)    :bufdo のタブ版、後戻りのできない系のコマンドなので勇気が必要
:tab XXX          XXX というウィンドウが開かれる系のコマンドを、新規タブで開くようにする

ファイルパスを用いて開く

:e %<Tab>       アクティブなバッファの相対パスがファイル名を含めて全て表示される
:e %:h<Tab>     アクティブなバッファの相対パスがファイル名無しで表示される

名前を指定してファイルを開く

:set path+=folder名/**    先に対象となるフォルダをパスにセットする **でサブフォルダもOK
:find filename            カレントディレクトリ及びパスの通ったディレクトリから開く

存在していないディレクトリにファイルを保存

:mkdir -p $:h             エラーが発生した場合。-pは中間ディレクトリも作成する指示
:w

netrw

:E              netrwを起動
:e .            カレントバッファ
:e DIR          カレントバッファ
:Ex(plore) DIR  カレントバッファ
:Tex(plore) DIR 新タブ
:Hex(plore) DIR 水平分割した下ウインドウ
:Sex(plore) DIR 水平分割した上ウインドウ
:Vex(plore) DIR 垂直分割した左
:Lex(plore) DIR カレントタブの左側

移動
j                下に移動
k                上に移動
Enter            ディレクトリの場合は移動、ファイルの場合はカレントバッファに開く

-                重要  一つ上のディレクトリに移動
u                undo、1つ前のディレクトリに戻る
U                redo、uで戻る前のディレクトリに戻る
/文字            重要  検索
c                重要  Netrwのカレントディレクトリを、現在開いているディレクトリに変更
                       Newrwを終了したら、Newrwを起動したディレクトリになる
                       

ファイルを開く
Enter            今netrw.vimで開いているバッファの上にファイルを開く
o                水平分割で、ファイルを開く
v                垂直分割で、ファイルを開く
t                重要  タブで、垂直分割で、ファイルを開く
:e ファイル名    重要  ファイルを作成して編集
                       事前にcコマンドでカレントディレクトリを変更しておくこと
x                標準アプリで起動

ファイル操作
d                ディレクトリを作成する
D                ディレクトリ・ファイルを削除する

ファイル操作(マーク)
1 「mt」でターゲットディレクトリを指定
2 「mf」でファイルをマーク
3 「mc」でコピー
  「mm」で移動
  「mg」で、vimgrep
  「md」で、vimdiff

マークする
mf               ファイルをマークする
mr               ワイルドカードを指定してファイルをマークする
mu               すべてのマークを解除

マーク後の処理
mt               コピー・移動先のディレクトリをマークする
mc               mfしたファイルをmtしたディレクトリにコピーする
mm               mfしたファイルをmtしたディレクトリに移動する
mx               マークファイルにシェル実行。コマンド中の“%“がファイル名
md               マークファイルにvimdiffを実行。ファイルは3つまで
mg               マークしたファイルにvimgrepで検索
D                マークしたファイル、ディレクトリを削除

その他
:!               重要  コマンドを実行 :!rm -rf xxxx :!mv xxx yyy :!vi xxxx
:sh              重要  シェルを起動。exitでnetrwに戻ってくる

表示
I                ヘッダの表示トグル
i                ファイルツリーの表示形式を変更
p                ファイルをプレビューする
a                すべて表示 → 隠しファイル非表示 → 隠しファイルのみ表示
gh               ドットで始まるファイルの表示・非表示を切り替える
s                ソートの種類を変更(名前 → 時間 → ファイルサイズ)
r                ソートの順番を逆にする

ブックマーク 注意:TreeViewで表示していると移動できない。
mb               ディレクトリ/フォルダをブックマークに追加する
qb               ブックマークと移動履歴の一覧を確認する
数字qb           数字で指定したブックマークに移動

【Linux】lessのススメ

UNIX/Linuxコマンド:less

lessは簡単に言えばテキストファイルを閲覧するためのコマンド。エディターから編集機能を抜いたものと考えれば大体イメージは一致する。一見低機能に見えるlessは何のために存在するのだろうか。実はこれがとても役立つのだ。

編集不可の強み

編集機能が無いということはlessでfileを閲覧している間は、fileを誤って編集してしまう事故が起きない。

「普段から十分注意して編集しているしGitで更新内容を確認出来るので別に必要と思わない」

確かにそうかもしれない。しかしlessとエディターでは同じfileを開いても開発者の心理状態が変わることにお気付きだろうか。例えばプログラマーがエディターを開いている時は主観的な編集(戦闘)モードの心理状態になっている。それに対してwebなどで参考情報等を探索している時は傍観的な閲覧(休止)モードの心理状態だ。

同様に自分のコードを見る際にlessを使うと自然に閲覧(休止)モードの心理状態になって自分のコードを客観的に見ることが出来る。そしてbugを見つけたら「v」を押すと直ちにその場所でVim等のエディターが立ち上がって編集出来る。そしてエディターを終わるとlessに戻る。これならうっかり誤編集する様な事故も避けられる。VSCodeにもread onlyモードがあれば・・といつも思うが残念ながら実装されていないため、VSCodeのターミナル画面を最大化した上でlessで閲覧している。

catやtail, Viewでは?

閲覧可能なコマンドにcatやtailがある。catは一気に全行を表示するし画面をスクロールすれば全容も確認出来るので閲覧用に使えなくはない。tailもlogや追記を主とするfileでは利用が可能かもしれない。

しかしそれらはfile閲覧を目的としたコマンドではないため使い勝手は圧倒的にlessに軍配が上がる。何と行っても移動関連の操作系がほぼVimと同じコマンドが使えるので、エディター感覚で閲覧が行える。

だったらViewでよいのでは?との声は聞こえそうだが、まずviewは全行を読み込むため起動に時間がかかる。lessは現在表示されている画面分だけをメモリに読み込むので軽量で動作を待つことがない。またviewはVimのread onlyモードに過ぎないので画面がviと同じだ。編集も警告表示はされるがVim同様に出来てしまう。これではエディターを使っている状態と変わらないため、lessを使っている時の様な安心感や開放感が得られない。

lessコマンド一覧表

起動オプション

lessでは起動オプションを起動時でも編集中でも使用出来る。例えば検索時に大文字小文字を区別しない"-i"、長い行を折り返さない"-S"、行番号表示"-N"はよく利用するオプションなので、

$ less -iSN hoge.txt

と起動時に付けてもいいし、編集中に"-iSN"と打っても良い。常に有効にしたい場合は.bashrcの中に記載すればよい。

.bashrc file
---
alias less='less -iSN'
  • 通常のオプション
+行数           指定した行から表示する
+/文字列         指定文字列を検索し、見つけた行から表示する(正規表現可能)
-p文字列         指定文字列を検索し、見つけた行から表示する(正規表現可能)
-oファイル       パイプ(|)などで標準入力から入力した内容を表示する際、指定したファイルにコピーを保存する。既存ファイルを指定した場合は、上書きするか、追加するかを確認するメッセージが表示される
-Oファイル      「-o」と同じだが、既存ファイルを指定した場合は、確認せずに上書きする
-kファイル名     lesskeyファイル(キー定義ファイル、「lesskey」コマンドで生成)を指定する
-L               環境変数LESSOPEN(lessコマンド用のオプションを定義した環境変数)を無視する
  • スクロール、表示方法関係のオプション
-s               連続した空行を1行にする
-S               画面幅より長い行を折り返さない
-#               水平方向にスクロールする際のデフォルトの移動桁数(「0」にするとデフォルト値が画面幅の半分になる)
-数、-z数        スクロールするウィンドウの大きさを指定(1画面より小さくする際は負の数で行数を指定)
-q               ファイル末尾まで表示したときのビープ音を鳴らさない(入力コマンドエラー時は鳴らす)
-Q              「-q」のときも含め、ビープ音を一切鳴らさない
-e               ファイルの末尾に2回達したら表示を終了する(実行例4を参照)
-E               ファイルの末尾に到達したら表示を終了する
-F               1画面で表示できる場合はすぐに終了する
-K              [Ctrl]+[C]キーで終了する
-n               行番号を表示しない
-N               行番号を表示する
-J               画面の左にステータス行を表示する(例えば、検索時に該当する行に「*」記号が表示される)
-m               moreコマンド同様、プロンプトに現在の表示位置をパーセントで表示する
-M              「-m」より詳細なプロンプトを表示する
-f               通常のファイル以外も強制的に表示する
-r               制御文字をそのまま表示する(デフォルトでは「^A」のようにキャレット記号を使って表示する)
-R              「-r」と同様だが、可能な限り画面表示を正しく維持する
-XXX             表示できない誤った文字を表示する際にマーク文字(〓)を使用する(デフォルトではバイナリとして表示)
-u               バックスペースとキャリッジリターンを印刷可能文字として扱う
-U               バックスペース、タブ、キャリッジリターンを制御文字として扱う(「-u」「-U」ともに指定していない場合は、これらの文字を使って重ね打ちによる太字や下線を表示する)
-x数,…           タブストップの位置を設定する。「-x4」の場合4の倍数、「-x9,17」は「9,17,25,33…」となる(デフォルトは8)
-~               ファイル末尾以降のチルダ記号(~)を表示しない
  • 検索関係のオプション
-i                検索時に大小文字を区別しない(ただし、検索文字列に大文字を使用した場合は大小文字を区別する)
-I                検索時、常に大小文字を区別しない
-a                画面に表示されている次の行以降を検索する(デフォルトは画面内の2行目以降、または最後の検索対象が見つかった行以降を検索する)
-g                検索時、最初に見つけた分だけをハイライト表示する(デフォルトでは見つけた箇所を全てハイライト表示)
-G                検索時のハイライト表示をしない
-w                画面単位でスクロールした際、新しく表示された行の先頭部分をハイライト表示する
-W                新しく表示された行の先頭部分を常にハイライト表示する
-tタグ            タグを定義する(タグはソースコードで定義箇所にジャンプしたりする際に使用する)
-Tタグファイル    タグのリストが書かれたファイルを指定する(タグファイルは「ctags」コマンドで生成)

主なコマンド

  • 移動関連
  • 「^v」は[Ctrl]キーを押しながら[v][esc-v]は[ESC]キーを押してから[v]
h/H                         ヘルプを表示(less画面と同様、[Enter]キーで1行、スペースキーで1画面先に進み[q]で終了する)
q/:q/Q/:Q/ZZ             終了する(「:q」は[:]キーを押してから[q]キー)
e/^E/j/^N/return         1行進む(コマンドに続いて数字を入力すると指定行数分進む)
y/^Y/k/^K/^P             1行戻る(コマンドに続いて数字を入力すると指定行数分進む)
f/^F/^V/space/esc-space  1画面進む([esc-space]の場合データの末尾で止まらない)
F                            1画面進み、末尾まで表示しても終了せずにファイルを監視する(「tail -f」同様、データが追加され続けるログファイルなどに使用する)
b/^B/esc-v                 1画面戻る
d/^D                        半画面分進む
u/^U                        半画面分戻る
esc-)/右矢印                半画面分右を表示する
esc-(/左矢印                半画面分左を表示する
g/</esc-<                  先頭行に移動する(コマンドに続いて数字を指定すると指定した行へ移動する)
G/>/esc->                  最終行に移動する(コマンドに続いて数字を指定すると指定した行へ移動する)
v                            表示中のファイルを「vi」コマンドで編集する(使用するエディタは、環境変数VISUALまたはEDITORで変更可能)
!コマンド                    シェルでコマンドを実行する(シェルは環境変数SHELLで変更可能)

:n               次のファイルへ
:p               前のファイルへ
:x               最初のファイルへ
:d               現在のファイルをファイルリストから取り除く
  • 検索関係
/                検索する(「/」続いて検索パターンを入力する)
?                後ろ方向に検索する(「?」に続いて検索パターンを入力する)
n                次を検索する(「n」に続いて数字を入力すると指定回数分先に進む)
N                逆順に次を検索する(「N」に続いて数字を入力すると指定回数分先に進む)
esc-u            検索結果の反転/反転解除を切り替える
&                検索パターンにあっている行だけを表示する(「&」に続いて検索パターンを入力する)

【Windows11】導入手順

完全に自分用メモ

WIndows11 PCに新調した。ゼロから使えるまでの手順を全て記載する。

①PC購入

②Edgeを使う

  • Chromeは重く問題も多いのでインストールしない。
  • ブックマークが自動で入る。固定タブは自動で入らないので手動で追加
  • Edgeのタブを個別に開かせない設定を行う(下記)

laboradian.com

③接続関連

  • SCAN File取り込みのためのネットワークドライブ設定
  • 自宅からアクセスするためのVPN設定

④アプリ追加とスタートメニューピン留め

  • 電子印ソフト追加
  • インストールされたfolderで実行fileを見つけて、右クリックでスタートメニューにピン留めを選択

⑤マウススクロール反転設定

www.incmplt.net

⑥キー配置を変更

yukituna.com

  • CapslockをCTRLに変更するだけの例:
  • 00 00 00 00 // ヘッダー
  • 00 00 00 00 // ヘッダー
  • 02 00 00 00 //変更するキーバインドの個数 + 1を指定。1変更なので2
  • 1D 00 3A 00 //CapslockをCtrlに変更
  • 00 00 00 00 // フッター

Google日本語入力インストールとキー修正

exia.co.jp

  • Macと変換キーの動作を合わせるにはGoogle日本語入力が一番(追加設定でそっくりになる)。
  • インストール後、カスタマイズを行う
  • インストール後、タスクバー内の「あ」の文字を右クリック
  • プロパティを選択、キー設定の選択をカスタムにして設定
  • 最初はATOKからコピればOK、必要なキーを変更する
  • デフォルトでないのは追加する:ひらがな→直接入力など  

    秀丸追加

hide.maruo.co.jp

  • 基本エディターとして使う
  • ダークモード、メニュー非表示、均一フォント、1/8行間、UTF-8、改行LFを設定

⑨開発環境インストール

1. Git追加

  • Gitをインストール
  • c:\bash などルートディレクトリを指定(作成)
  • (あれば).bashrcなど環境ファイルをそこに一式コピー
  • (あれば)各プログラムフォルダを一式コピー
  • スタートにあるGit bashアイコンを右クリック、「ファイルの場所を開く」を選択
  • 上記の場所にあるGit bashを右クリックしてプロパティを選択
  • 「リンク先」と「作業フォルダー」の入力欄にそれぞれ下記を設定
    1. リンク先:git-bash.exeのフルパス “C:¥Program Files¥Git¥git-bash.exe” *注意!
    2. 作業フォルダー :作業ディレクトリのフルパス C:¥bash

「リンク先」に--cd-to-homeがついていた場合はこの記述を削除してGit Bashへのパスのみにすること

2. Typora & Pandoc 追加

  • Typoraをインストール
  • 2021/12時点で有料(約2,000円)。でもそれだけの価値があるので即購入
  • 最大3台まで使用可能
  • タイトルバーが白い点だけが気に入らない
  • Pandoc:Typoraのインポートを選ぶと出て来るメッセージに従ってインストール

typora.io

pandoc.org

3. VSCode追加

  • インストールするだけで即使えてGitと連動する。常に完成度が高いと思う。

azure.microsoft.com

azure.microsoft.com

4. エディター付帯業務

  • GitHub接続確認。2021年からwebログインだけで認証OKになった
  • VSCode-設定-検索で Terminal.Integrated.Default Profile: Windows でGit bash
  • 全エディターのEOLを全てLFで統一。VSCode, Typora, 秀丸の設定を変更
  • 以下、VSCodeに追加
  • 以下PlatformIO IDEに追加
    • ESP32ライブラリ
  • VSCodeキーバインド変更:
    • 編集中C-m, C-h、ターミナル中C-m, C-h, etcが対象
    • Ctrl+Shift+p で >key と打ち「基本設定: キーボードショートカットを開く (JSON)」を開く
    • 以下を追記
[
    {
        "key": "ctrl+m",
        "command": "type",
        "args": {
            "text": "\n"
        },
        "when": "editorTextFocus"
    },
    {
        "key": "ctrl+m",
        "command": "\n",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+p",
        "command": "cursorUp",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+n",
        "command": "cursorDown",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+f",
        "command": "cursorRight",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+b",
        "command": "cursorLeft",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+a",
        "command": "cursorHome",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+e",
        "command": "cursorEnd",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+d",
        "command": "deleteRight",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+h",
        "command": "deleteLeft",
        "when": "terminalFocus"
    }

補足

# yamlではコメントが書ける
Document:
  - path: 'C:\Download\paper'
    extension:
      - pdf
      - doc
    destination:
      - C:\Dropbox\論文\*
      - 'C:\My Documents\査読\*'
  - path: 'C:\Download\music'
    extension: [mp3, wav, mp4]  # こういう書き方もできる
    destination: ['C:\Dropbox\音楽\*', 'C:\My Music\*']

【Git】show,diff,status,logの活用

Gitで色々確認する際に使うコマンド

git status, git log ,git diff, git showはいずれもお世話になっている便利な確認用コマンドであり、見やすい表示など活用例をまとめた。

オススメ.bashrcの設定例

alias gitshow='git show --oneline --color-words'
alias gitstatus='git status --short --branch'
alias gitlog='git log --graph --decorate --oneline'
alias gitdiff='git diff --color-words'

git status色々

$ git status --short        # staging状態等を簡潔表示
$ git status --branch       # 1行目にブランチ名を表示
  • 簡潔表示の表記説明:
  • 1文字目が対象fileのstaging(index)の状態を表示
  • 2文字目が対象fileの作業ディレクトリ内の状態を表示
凡例 説明
M_ file変更をstaging済み (staged)
_M file変更をstagingしていない (modified)
MM staging後に再びfile変更 (modified)
A_ 新規fileをstaging済み
_A 新規fileを追跡file化したが未staging:git add -N
_D fileをshellでrmしたがgit addやgit rmでは未処理
?? gitが追跡していない(untracked)
UU mergeでconflictした (unmerged)

git show色々

$ git show --oneline        # commitを1行表示+単語単位のカラー差分表示
$ git show --color-words    # commitを1行表示+単語単位のカラー差分表示
$ git show SHA1:files       # あるcommit時点の特定fileの内容を確認
$ git show -1               # 最新commit情報と変更点の表示(git show と同じ)
$ git show -2               # 直前commit情報と変更点の表示
$ git show -3               # 2つ前のcommit情報と変更点の表示

git diff色々

$ git diff origin/main           # ローカルとリモートとの変更箇所表示
$ git diff HEAD..origin/main     # git pull前にリモートとの変更箇所表示
$ git diff origin/main..HEAD     # git push前にリモートとの変更箇所表示
$ git diff old_SHA1..new_SHA1    # commit間の変更箇所表示
$ git diff any_SHA1^..any_SHA1   # あるcommitの変更箇所表示
$ git diff branch..anotherbranch # ブランチ間の変更箇所表示
$ git diff HEAD^                 # 最新commitの変更箇所表示
$ git diff                       # 作業ディレクトリとstagingの変更箇所表示
$ git diff --staged              # stagingと最新commitの変更箇所表示
$ git diff -- files              # staging前のfileの変更箇所表示
$ git diff branch..anotherbranch -- files  # ブランチ間の特定file変更箇所表示
$ git diff --stat                # 変更した行数だけを見る
$ git diff --name-only           # 変更したfile名だけを見る
$ git diff --color-words         # 差分が行単位から単語単位でカラー表示

..の右側が時系列的に新しいものとみなされる

git log色々

$ git log --oneline              # commitメッセージを1行のみ表示
$ git log --graph                # commit/merge履歴をGUI的に表示
$ git log --decorate             # 各branchのHEADの位置を表示
$ git log --stat                 # 変更file名と行数の簡易表示
$ git log --since=2021-12-1      # 指定した日付以降のログを表示
$ git log --until=2022-4-1       # 指定した日付までのログを表示
$ git log --since=2022-1-1 --until=2022-4-1 # 指定日から指定日まで表示
$ git log master                 # ブランチを指定して表示
$ git log files                  # 特定fileのログのみを表示