EmacsでGit(ローカル)

EmacsでGitを使ってみる

インストールしたmagitを使ってみる

  • magitの起動
  • リポジトリ
  • ステージング
  • コミット
  • ブランチ
  • マージ
  • コンフリクト

magit(magit-status)の起動

C-x gで立ち上がる.(そのようにinit.elに書いておく)

以降,情報を更新するときは,g

リポジトリ

GitHubなどのリモートリポジトリからクローンするのでなく,リポジトリでないところで magitを立ち上げると,新規にリポジトリを作るか聞かれるので,表示に従って作る.

もし,今使っているリポジトリ以外にもう一つ別のリポジトリを作りたければ,M-x magit-init

ステージング

リポジトリ中のファイルを編集し,(必要に応じてgでmagit-statusを更新すると) Unstaged Changesとして検出される.

f:id:tampaku:20210311224039p:plain

カーソルを合わせてTabで詳細が表示される(Tabを繰り返すことで閉じる)

f:id:tampaku:20210311224044p:plain

sでステージングする

f:id:tampaku:20210311224415p:plain

ファイル中の特定の範囲だけを選択してsするとその範囲のみステージングされ, 残りはUnstatedのままになる.

f:id:tampaku:20210311224048p:plain

コミット

c cでコミットできる.

続いてメッセージの入力を求められる.

f:id:tampaku:20210311224608p:plain

適宜入力したら,C-c C-cで完了

ブランチ

作成

l bでログを表示

f:id:tampaku:20210311233456p:plain

ブランチを作成したいコミットを選んでb c RET, ブランチ名を入力してRETすると作成される.

f:id:tampaku:20210311233459p:plain

チェックアウト

ブランチを切り替えるにはb b

名前を聞かれるので,入力してRET

f:id:tampaku:20210311233502p:plain

マージ

m m RETでマージする.

コンフリクト

コンフリクトがある場合,対象ファイルの問題箇所が示される.

f:id:tampaku:20210311235730p:plain

<<<<<<<>>>>>>で囲まれた範囲を編集し,保存し,あらためてm mでマージする.

コンフリクトを解消せずに前の状態に戻るときはm a

EmacsでGit (準備まで)

Emacs上でGitを使うための準備

 GitそのものとGitHubの操作と両方ともEmacs上で行いたいので,forge(とmagit)を使う.

  • magit:Gitコマンドを実行
  • forge:GitHubの操作

  • パッケージインストール用のリポジトリ設定
  • forgeとmagitのインストール
  • 設定

パッケージインストール用のリポジトリ設定

パッケージのリポジトリmelpaを追加する. 安定版にしているのはなんとなく. <- melpa-stableにあるforge 0.1.0はちゃんと動作しないので必ずmelpaにする

 init.elに以下を記載

(require 'package)
(add-to-list 'package-archives
'("melpa" . "http://melpa.org/packages/") t)

M-x package-refresh-contents RETを実行しておく.

forgeとmagitのインストール

M-x package-list-packagesでインストール可能なリストを表示する.

C-s forgeでforgeを検索,ヒットしたらforgeにカーソルを合わせてRET

f:id:tampaku:20210305162339p:plain
C-s forge

しばらくすると,次の画面が表示される.Installにカーソルを合わせてRETInstall package 'forge-xxx'?と聞かれるのでy

f:id:tampaku:20210305162843p:plain
forgeのインストール

一緒にmagitなどもインストールされる.

M-x magit-version RETで確認すると,magit,git,emacsのバージョンが表示される.

設定

magit用のキーバインドとして,以下をinit.elに記載

(global-set-key (kbd "C-c g") 'magit-file-dispatch)
(global-set-key (kbd "C-x M-g") 'magit-dispatch)
(global-set-key (kbd "C-x g") 'magit-status)

forge使用前にmagitを有効にするため,以下もinit.elに記載

(with-eval-after-load 'magit
       (require 'forge))

 

参考

It's Magit! A Git Porcelain inside Emacs

Big Sur上のApacheで,Dashを動かす

  • Pythonの実行環境を用意

    • pyenvでのインストール
    • mod_wsgiのインストール
    • dashのインストール
  • Apache2のインストール・設定

    • Homebrewからインストール
    • 設定ファイルの修正・作成
  • WSGIファイルおよびDashを使ったスクリプト

pythonの実行環境

既存のpyenvで作った環境を使おうとしたら,--enable-sharedオプション付きでインストールしていないとmod_wsgiをインストールできなかったので 作り直す(3.9.0の例)

$ env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.9.0

pyenv global 3.9.0またはpyenv local 3.9.0でこの環境をアクティブにしてからmod_wsgiとdashをインストール

$ pip install mod_wsgi
$ pip install dash

Apache2

Homebrewから入れる.

$ brew install apache2

Homebrewで入れたapache2の設定ファイルはデフォルトと異なり,/usr/local/etc/httpd/httpd.confになる.

記載内容を得るため,mod_wsgiの設定を確認する

$ mod_wsgi-express module-config
LoadFile "/usr/local/var/pyenv/versions/3.9.0/lib/libpython3.9.dylib"
LoadModule wsgi_module "/usr/local/var/pyenv/versions/3.9.0/lib/python3.9/site-packages/mod_wsgi/server/mod_wsgi-py39.cpython-39-darwin.so"
WSGIPythonHome "/usr/local/var/pyenv/versions/3.9.0"

これを参考にpython.confに記入.

LoadModule wsgi_module "/usr/local/var/pyenv/versions/3.9.0/lib/python3.9/site-packages/mod_wsgi/server/mod_wsgi-py39.cpython-39-darwin.so"
WSGIPythonHome "/usr/local/var/pyenv/versions/3.9.0"

WSGIScriptAlias / /Users/hogehoge/Sites/python/test.wsgi
<Directory /Users/hogehoge/Sites/python>
        options  ExecCGI Indexes FollowSymLinks
</Directory>
        

WSGIScriptAlias/でないと"Loading..."と表示されるだけで,所望の結果が得られない.

WSGI,Dashによるスクリプト

Dashを使ったアプリ本体(test.py

# -*- coding: utf-8 -*- 

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input,Output,State
import plotly.graph_objects as go

app = dash.Dash(__name__)

app.layout = html.Div(
    children=[
        dcc.Graph(figure=go.Figure()),
    ],
)

if __name__=='__main__':
    app.run_server(debug=True)

WSGIファイル(test.wsgi

import sys
sys.path.insert(0, '/Users/hogehoge/Sites/python')
from test import app
application = app.server

flaskなどと違って,applicationにはappではなくserverを対応づける.

rsyncでiconvとdeleteオプションを使ったら挙動が変

Macrsyncを使ってバックアップを取る際,OS標準のrsyncでは日本語が化けてしまう.

これを改善するためには,iconvオプションがあるHomebrew版を使えばよい.

しかし,deleteオプションも併用した際,本来対象とならないファイルまで削除対象とされてしまった.

最初のオプションはこんな感じ

rsync -nva --delete --iconv=UTF-8 ~/hoge/ /Volumes/backup/

iconvオプションなしなら,表示は化けるがちゃんとバックアップされる.

このiconvオプションを--iconv=UTF-8,UTF-8-MACにしたら,解決した.

rsync -nva --delete --iconv=UTF-8,UTF-8-MAC ~/hoge/ /Volumes/backup/

詳しいことはよくわからないが,--iconv=UTF-8-MAC,UTF-8でもダメだったので,順番も重要らしい.

余談だが,逆にWindowsとかで操作したファイルのバックアップをMacで取るとき,WindowsなのにNFD文字が含まれているときに (メールの添付ファイルとかで時々ある),some files vanishedとなってバックアップされないのはどうにもならない.

\special{pdf:...}で文字修飾

LaTeXの通常のコマンドだけでは、

  • 文字の縁に線をつける(袋文字)
  • 任意の斜体(左斜体を含む。←地図中で川や湾に使われる字形)
  • 透明

などの実現が難しい。

TikZを使えば多分どれも可能だが、もう少しシンプルに実現したい。 いっそのこと\special命令でどうにかしようと調べた結果をメモ。

文字の縁に線をつける(袋文字)

まずプリアンブルで、

  • \usepackage[dvipdfmx]{graphicx}

などとしてdvipdfmxオプションでgraphicxパッケージを読み込む。

そして、色を変えたいところの開始位置で、

  • \special{pdf:bcolor [c1 m1 y1 k1] [c2 m2 y2 k2]}で塗りと縁の線の色を指定

    • [c1 m1 y1 k1] :塗りの色。CMYKをそれぞれ0-1で指定。数値は4つとは限らない。3つならRGB、1つならグレースケール
    • [c2 m2 y2 k2]:縁の線の色。
  • \special{pdf:code q width w mode Tr}で線の太さと塗り・線の有無を指定

    • width:縁の線の太さ。単位はpt
    • mode:塗りと縁の線の有無を指定。0:塗りだけ、1:縁の線だけ、2:両方あり

終了位置で

  • \special{pdf:code Q}\special{pdf:ecolor}

とする。

使用例

\documentclass{jarticle}
\usepackage[dvipdfmx]{graphicx,color}
\begin{document}
\special{pdf:bcolor [1 0 0 0] [0 1 0 0]}%
\special{pdf:code q .25 2 Tr}%
test%
\special{pdf:code }%
\special{pdf:ecolor}%
\end{document}

縁の線が0.25ptで色はシアン100%、塗りはマゼンタ100%。

毎回\special命令すべて入力するのは煩雑なので、次のようなマクロにしておく。

\documentclass{jarticle}
\usepackage[dvipdfmx]{graphicx,color}
\def\stroketext#1#2#3#4{%#1: 塗りの色、#2: 線の色、#3: 線の太さ、#4: 文字列
\special{pdf:bcolor [#1] [#2]}%
\special{pdf:code q #3 w 2 Tr}%
#4
\special{pdf:code Q}%
\special{pdf:ecolor}%
}  
\begin{document}
\stroketext{1 0 0 0}{0 1 0 0}{0.25}{test}
\end{document}

ただし、これらの書き方だと塗りの上に線が来るため、文字がちょっと読みにくいかもしれない。

塗りの下に線が来るようにしたければ、もう一手間かける。

\documentclass{jarticle}
\usepackage[dvipdfmx]{graphicx,color}
\newbox\strokebox %文字を保存するためのボックス
\def\stroketext#1#2#3#4{%#1: 塗りの色、#2: 線の色、#3: 線の太さ、#4: 文字列
\setbox\strokebox=\hbox{#4}
\hbox{%
\special{pdf:bcolor [#1] [#2]}%
\special{pdf:code q #3 w 2 Tr}%
\hbox to0pt{\unhcopy\strokebox\hss}%
\special{pdf:code q 0 Tr}%縁なしに変更
\unhbox\strokebox
\special{pdf:code Q}%
\special{pdf:ecolor}%
}%
}  
\begin{document}
\stroketext{1 0 0 0}{0 1 0 0}{0.5}{test}%第3引数を0.25→0.5に変更
\end{document}

線つきの文字の上に、線なしの文字を重ね打ちしている。

水平ボックスに文字を保存して2回出力している。

線の内側半分は上に来た塗りで隠れてしまうから、 線の太さとして見せたい太さの倍の数値を入力しないといけない。