emacs-lisp のリスト操作

概要

List Modification にある知らなかった関数。

delete 関数

指定した値をリストから削除した新しいリストを返す。元になったリストは 破壊される。

(setq l01 '(1 2 3))
(delete 1 l01)

重複も削除する。

(setq l01 '(1 1 2 3 1 1))
(delete 1 l01)

元のリストは破壊される。

(setq l01 '(1 1 2 3 1 1))
(delete 1 l01)
l01

remove 関数

元のリストから指定した値を削除する。元になったリストは無事。

(setq l01 '(1 2 3))
(remove 1 l01)

元のリストは無事。

(setq l01 '(1 1 2 3 1 1))
(remove 1 l01)
l01

append 関数

2つのリストを連結したリストを返す。

(setq l01 '(1 2 3))
(setq l02 '(4 5 6))

(append l01 l02)

butlast 関数

指定した個数の要素をリストから除外したリストを返却する。

(setq l01 '(1 2 3 4 5))
(butlast l01 3)

emacs で音楽を聞く

概要

musicForProgramming のmp3ファイルをemacsで再生できないかをあれこれと 試行錯誤したのでその備忘録として。

パッケージ

Music Players にあるようにいくつかのパッケージがあるが emms を選択。

カスタム

customize-group コマンドで emms-volumeemms-volume-change-functionemms-volume-pulse-change を設定。

エラー

mp3 を追加してボリュームを上げようとすると以下のメッセージがミニバッ ファーに表示される。

Wrong type argument: stringp, nil

原因

emms-volume-pulse.elpactl の出力をパースするところが問題。コー ドではSink, Name, Volume を目印として情報を取得しているようで、コマ ンド出力が英語以外だと問題となる。

(string-match
 (mapconcat 'identity
        '(".*Sink[ \t]+\\#\\([0-9]+\\)"
          ".*Name:[ \t]\\([^\n]+\\)"
          ".*Volume:.*?\\([0-9]+\\)%.*\n?")
        "\n")
 output)

コード内の pactl コマンドを再現すると日本語表示になっている。

pactl list sinks 

シンク #0
    状態: RUNNING
    名前: alsa_output.pci-0000_00_01.1.hdmi-stereo-extra1
    説明: 内部オーディオ Digital Stereo (HDMI 2)
    ドライバー: module-alsa-card.c
    サンプル仕様: s16le 2ch 44100Hz
    チャンネルマップ: front-left,front-right
    所有者モジュール: 6
    ミュート: いいえ
    ボリューム: front-left: 39321 /  60% / -13.31 dB,   front-right: 39321 /  60% / -13.31 dB

ロケールを設定すると英語で表示される。

LC_ALL=C pactl list sinks 

Sink #0
    State: RUNNING
    Name: alsa_output.pci-0000_00_01.1.hdmi-stereo-extra1
    Description: 内部オーディオ Digital Stereo (HDMI 2)
    Driver: module-alsa-card.c
    Sample Specification: s16le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 6
    Mute: no
    Volume: front-left: 39321 /  60% / -13.31 dB,   front-right: 39321 /  60% / -13.31 dB

対策

defadvice を使用して問題の関数の環境変数を一時的に置換して問題を回 避。

(defadvice emms-volume--pulse-get-volume
    (around emms-volume--pulse-get-volume-around activate)
  (let ((process-environment (append process-environment '("LC_ALL=C"))))
    ad-do-it))

CodeBlock

自炊した書籍のpdfを整理するときに emacsの org-mode のコードブロックの が役にたったため、備忘録代りに記事にする。

agrep は曖昧検索を実現するgrepの派生プログラム。

code block の使いかたはorg-modeのコードブロック(Babel)の使い方 | Misohena Blogを参考にした。

#+NAME: get-book-links
#+begin_src elisp :var title="" :resutls list
  (let* (
         (len (/ (length title) 3))
         )
    (mapcar (lambda (n) (print (s-concat "[[" n "][" (f-filename n) "]]")))
          (s-lines
           (shell-command-to-string
            (s-lex-format
             "find ~/Dropbox/Book | agrep -E ${len}  \"${title}\"")))))
#+end_src

#+CALL: get-book-links[:results list](title="並列")

#+RESULTS:
- Akkaとアクターモデルではじめる並列並行分散処理プログラミング Vol 1.5.pdf
- C/C++プログラマーのためのOpenMP並列プログラミング 菅原 清文 318p_4877831991.pdf
- 並列計算と数理とアルゴリズム.pdf
- Akkaとアクターモデルではじめる並列並行分散処理プログラミング.pdf
- [[][]]

org-mode エクスポートの設定

org-mode の設定を変更。エクスポートをスニペットとしていたが、 #+SETUPFILE を使用してLatexヘッダー等を別ファイルとする。

元のスニペットは下記.

#+LaTeX_CLASS: koma-jarticle
#+LaTeX_CLASS_OPTIONS: [12pt]

#+latex_header: \usepackage{xcolor}
#+latex_header: \usepackage{minted}

#+LATEX_HEADER: \usepackage{geometry}
#+LATEX_HEADER: \geometry{left=1cm,right=1cm,top=1cm,bottom=1cm}
#+LATEX_HEADER: \usepackage[natbib=true]{biblatex} \DeclareFieldFormat{apacase}{#1} \addbibresource{~/Dropbox/Bibliography/references.bib}
#+STARTUP:  overview
#+STARTUP:  hidestars
#+OPTIONS:  H:4 num:nil toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
#+LINK_UP:
#+LINK_HOME:

#+TITLE: ${1: title}
#+AUTHOR: k-sunako
#+DATE: `(let ((x (org-time-stamp '(16) t ))))`
\vspace*{-1.5cm}

* 概要
  blabla

* 参考文献

  #+LaTeX: \printbibliography[heading=none]

上記のLatexヘッダーなどレポートとしての体裁を設定する箇所を report-header.org として別ファイルにする。

#+LaTeX_CLASS: koma-jarticle
#+LaTeX_CLASS_OPTIONS: [12pt]

#+latex_header: \usepackage{xcolor}
#+latex_header: \usepackage{minted}

#+LATEX_HEADER: \usepackage{geometry}
#+LATEX_HEADER: \geometry{left=1cm,right=1cm,top=1cm,bottom=1cm}
#+LATEX_HEADER: \usepackage[natbib=true]{biblatex} \DeclareFieldFormat{apacase}{#1} \addbibresource{~/Dropbox/Bibliography/references.bib}
#+STARTUP:  overview
#+STARTUP:  hidestars
#+OPTIONS:  H:4 num:nil toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
#+LINK_UP:
#+LINK_HOME:

そのため、スニペットは下記となる。

# -*- mode: snippet -*-
# name: report2
# key: rep2
# --
#+setup: report-header.org

#+TITLE: ${1: title}
#+AUTHOR: k-sunako
#+DATE: `(let ((x (org-time-stamp '(16) t ))))`
\vspace*{-1.5cm}

* 概要
  blabla

* 参考文献

  #+LaTeX: \printbibliography[heading=none]

ripgripのオプション

emacsの ripgrep-regex コマンドが遅いことが多いので調べると検索結果の文字数に上限を設け れば良いらしい。

下記のコマンドで100バイトの文字数に上限を設定できる。

rp -M 100 blahblah . 

emacsの ripgrep-regex コマンドに反映するために下記の設定を追加した。

(setq ripgrep-arguments '("-M 100"))

イデアルの”I”

数学の講義中にイデアルの飾り文字がうまく書けない。latexで出力できるかをチェック。

\[ \mathscr{A} / \mathscr{I} := \{a + \mathscr{I}: a \in \mathscr{A} \} \]

\[ a + \mathscr{I} = b + \mathscr{I} \Longleftrightarrow b – a \in \mathscr{I} \]