計算物理屋の研究備忘録

Linux, Cygwin, Mac, zsh, emacs等の使い方、設定などのメモ

Emacsでexpand-regionを使う

expand-region

選択したリージョンを単語、カッコ・・・と賢く一発で広げていってくれる。

github.com

インストール

Melpaからパッケージをいれるだけ

設定

(require 'expand-region)
(global-set-key (kbd "C-@") 'er/expand-region)
(global-set-key (kbd "C-M-@") 'er/contract-region)

使い方

  • C-@: 押すごとにリージョンを広げる
  • C-M-@: 押すごとにリージョンを狭める

Emacsでmultiple-cursorsを使う

multiple-cursors

カーソルを増やす。便利。

github.com

インストール

Melpaからパッケージをインストールするだけ

設定

公式のgithubに書いてあるbasic usageのやつをそのまま。

(require 'multiple-cursors)
(global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)
(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
(global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this)

使い方メモ

何も単語などリージョンを選択しない状態

  • C->: 次の行にもカーソルを増やす
  • C-<: 前の行にもカーソルを増やす

単語選択した状態

  • C->: 次に出てくる同じ単語を選択した状態でカーソルを増やす
  • C-<: 前に出てくる同じ単語を選択した状態でカーソルを増やす
  • C-c C-<: 全ての同じ単語を選択した状態でカーソルを増やす

Emacsのhelm-agでripgrepを使う

インストール

まずはripgrepが必要。そのあとにEmacsのhelm-agパッケージ。
(当然helmのパッケージも必要)

ripgrep

grepを高速化させたagよりさらに高速な最近人気のやつ。

github.com

Mac

brewで一発

$ brew install ripgrep

Ubuntu

Ubuntu 18.10より新しい場合はaptでインストールできるらしいが 古いやつではDebianの.debファイルから入れる。
各OSごとにバイナリも配布されてるのでそっちでもいい。

.debファイルのインストールはgithubのページに書いてあるのでその通りにする

$ curl -LO https://github.com/BurntSushi/ripgrep/releases/download/0.10.0/ripgrep_0.10.0_amd64.deb
$ sudo dpkg -i ripgrep_0.10.0_amd64.deb

helm-ag

Melpaからパッケージを入れるだけ。

設定

helm-agでは当然デフォルトはagを使うので、 ripgrepを使う設定に変える。

(setq helm-ag-base-command "rg -S --vimgrep --no-heading")

オプションの--vimgrep--no-headingはripgrepの出力をhelm-agで扱えるようにgrepとかの結果に合わせるためのものらしい。

-Sオプションをつけると、基本的には大文字小文字の区別なしに検索して、大文字を含めた時だけ区別してくれるようになるのでおすすめ。

ついでにtabbarの設定

後述するようにhelm-agでgrepした結果をバッファに一時的に保存しておける。
このバッファはtabbarでも常に表示させたいので設定を変更しておく

設定の一部分

;;----- 表示するバッファ
(defun my-tabbar-buffer-list ()
  (delq nil
        (mapcar #'(lambda (b)
                    (cond
                     ;; Always include the current buffer.
                     ((eq (current-buffer) b) b)
                     ((buffer-file-name b) b)
                     ((char-equal ?\  (aref (buffer-name b) 0)) nil)
                     ((equal "*scratch*" (buffer-name b)) b) ; *scratch*バッファは表示する
                     ((equal "*helm ag results*" (buffer-name b)) b) ; *helm ag results*バッファは表示する
                     ((char-equal ?* (aref (buffer-name b) 0)) nil) ; それ以外の * で始まるバッファは表示しない
                     ((buffer-live-p b) b)))
                (buffer-list))))
(setq tabbar-buffer-list-function 'my-tabbar-buffer-list)

使い方

helm-agを実行してgrepと同じように検索したい文字を入力する。カレントディレクトリ以下をサブディレクトリも含めて検索してくれる。
grepと同じような結果が得られたらhelmなのでそこからさらに絞り込み可能。

結果が出ているミニバッファはC-x C-sでバッファとして保存可能(helm ag results)。
このバッファでの操作は

  • Enter: 該当箇所を開く
  • C-o: 該当箇所を別バッファで開く
  • g: update

UbuntuでEmacsキーバインドを使う

UbuntuEmacsキーバインド

gnome-tweak-toolをインストールすれば1発で設定できる。

インストール

$ sudo apt install gnome-tweak-tool

インストールしたら、Dashで検索、Tweak Toolという名前のやつを起動。

起動したら

キーボードとマウス --> キーテーマEmacsに変更するだけ。

C-aとかC-h、C-kとかが使えるようになる。

ただし、C-yでヤンクできるのはCtrl-Cで普通にコピーしたものだけっぽい。C-wとかC-kはただ削除するだけ。

mykieを使った便利技

mykie

一つのキーバインドに状況によって幾つかのコマンドを割りあてることができるパッケージ

github.com

MELPAからパッケージをインストールして設定は

(require 'mykie)
(setq mykie:use-major-mode-key-override t)
(mykie:initialize)

参考

mykieを使った便利技がここで紹介されていた
この二つの技がかなり使用頻度も高く便利なのでおすすめ

masakinpo.hatenablog.com

qiita.com

そのまま使わせてもらう

1行カット、コピー

通常C-wはリージョンのカットだが、リージョンを選択してない状態でC-wとすることでカーソル位置の1行を丸ごとカットできるようにする。リージョン選択時はいつも通りにリージョンのカット。
同じようにM-wで1行コピーも可能に。

(mykie:set-keys nil
  "C-w"
  :default     (kill-region (line-beginning-position)(line-end-position))
  :region      kill-region
  "M-w"
  :default     (kill-ring-save (line-beginning-position)(line-end-position))
  :region      kill-ring-save 
  )

1行 or リージョンの上下移動

リージョン選択時は選択範囲を、そうでない時はカーソル位置の1行を上下に移動させる設定。
M-P(M+shift+p)で上へ、M-N(M+shift+n)で下へ移動するキーバインド

(defun move-line-down ()
  (interactive)
  (let ((col (current-column)))
    (save-excursion
      (forward-line)
      (transpose-lines 1))
    (forward-line)
    (move-to-column col)))

(defun move-line-up ()
  (interactive)
  (let ((col (current-column)))
    (save-excursion
      (forward-line)
      (transpose-lines -1)
      )
    (forward-line -1)
    (move-to-column col)))

(defun move-region-down ()
  (interactive)
  (let ((col (current-column)))
    (kill-region (region-beginning) (region-end))
    (forward-line 1)
    (yank)
    (set-mark  (region-beginning) (region-end))
    (move-to-column col)))

(defun move-region-up ()
  (interactive)
  (let ((col (current-column)))
    (kill-region (region-beginning) (region-end))
    (forward-line -1)
    (yank)
    (set-mark (region-beginning) (region-end))
    (move-to-column col)))

(mykie:set-keys nil
  "M-P" ;; ここでキーバインドを設定 上へ移動
  :default     move-line-up
  :region      move-region-up
  "M-N" ;; ここでキーバインドを設定 下へ移動
  :default     move-line-down
  :region      move-region-down
  )

Jupyter notebook のフォントを変える

Jupyter notebookのデフォルトのフォントは等幅じゃないので、プログラムを書くのに適していない。

フォントを変更するには .jupyter/custom/custom.css(デフォルトではホームディレクトリに作成されるはず。無ければ作る。)に以下のように書き加える

.CodeMirror pre, .output pre {
  font-family: Ricty;
  font-size: 13.5pt;
}

プログラムということでおなじみのRictyに変更した

zshではなく、bashを使わざるを得ない時の設定

chshコマンドがなぜか使えないサーバー、bashで固定されているようなところでの設定。

shoptで、cdと打つのを省略できるautocdと、./*/ と打てばサブディレクトリまで含めてファイルを指定できるglobstarを有効にする

# ---------- shopt
shopt -s autocd
shopt -s globstar

ディレクトリを移動したら自動でlsする設定。 参考はここ qiita.com

.bashrc

# ---------- ディレクトリ移動したら自動でls
autols(){
  [[ $AUTOLS_DIR != $PWD ]] && ls
  AUTOLS_DIR="${PWD}"
}

export PROMPT_COMMAND="autols"

シンボリックリンクにcdで移動するときは実体のパスに移動する。cd -Pオプションを使うのでalias

alias cd='cd -P'

大文字小文字の区別をせずに補完できるようにする。
.bashrcではなく~/.inputrcに書く

set completion-ignore-case on