Python メモ

win32com を使ってショートカットを作る

↓参考にしたサイト
[python] デスクトップにショートカットを作る | Reincarnation+

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import win32com.client

# ショートカットを作る
def win32_create_shortcut(target_path, shortcut_path):
    shell = win32com.client.Dispatch("WScript.shell")
    shortcut = shell.CreateShortcut(shortcut_path)
    shortcut.TargetPath = target_path
    shortcut.WindowStyle = 1
    shortcut.Save()

ついでに start コマンドみたいな python 関数も作ってみた

# cmd.exe で実行する start みたいな、ファイルを開くやつ
def win32_start(path):
    shell = win32com.client.Dispatch("WScript.shell")
    shell.Run(path)



でも、win32com は標準でついてないのでインストール必要。

win32com 本家

GitHub - mhammond/pywin32: Python for Windows (pywin32) Extensions

バイナリからインストールが簡単らしい
https://github.com/mhammond/pywin32/releases

VS CodePython 関連

Python の選択

> Python: Select Interpreter // Python の実行ファイルを選ぶ

Linter の選択

> Python: Select Linter // linter を選ぶ

VSCode のターミナルからの win32com インストールしてみた

C:/Users/<your-name>/AppData/Local/Programs/Python/Python37/python.exe -m pip install -U pywin32 --user

(Python3.7が入っている前提)

Emacs が遅くてつらい

Emacs 26.1 を使っているが、C/C++のコードにコメントを付けているとだんだん遅くなる。 それで、しょうがなく、コメントを書くときは text-mode にして書いている。

text-mode にすると速くなるのは、おそらく font-lock に原因があるんだろうけど、 Netをいろいろあさってきたが、解決法が見つからない。

それで、もう Emacs が嫌になってきている。

でも、ここ に font-lock-maximum-decoration をレベル 2 に下げろと書いてあるのでやってみることにする。

;; font-lock のレベルを2に下げて速くする
(setq font-lock-maximum-decoration '((c-mode . 2) (c++-mode . 2)))

これは Emacs をはじめたころから知っていたけど、最近の init.el に書くの忘れてた。 これで速くなればいいけど。

VS Code の統合ターミナルを Cygwin にする

以前の記事

nodamotoki.hatenablog.com

で WSL を統合ターミナルにして C++ のビルドまでやるようにしてみた。

しかし、職場ではWSLが使えないらしいので、Cygwin を統合ターミナルとして使えるようにしてみる。

といっても、VSCode のサイト↓にやり方は書いてある模様。

code.visualstudio.com

なになに。

Can I use Cygwin's shell with the terminal on Windows?

Yes, to use the Cygwin shell, you will first need to install the chere package and then add the following settings to your settings.json file:

"terminal.integrated.shell.windows": "C:\Cygwin\bin\bash.exe", "terminal.integrated.shellArgs.windows": ["/bin/xhere", "/bin/bash"]

意訳すると、

Cygwin? もちろんできますよ。

まずはCygwin chere パッケージ入れてね。それから setting.json に下記の要領でかくだけ。

"terminal.integrated.shell.windows": "C:\\Cygwin\\bin\\bash.exe",
"terminal.integrated.shellArgs.windows": ["/bin/xhere", "/bin/bash"]

メニューで言うと、ファイル>基本設定>設定 で出てくる Settings タブから

  1. terminal.integrated.shell.windows
  2. terminal.integrated.shellArgs.windows

を検索すれば良い様子。

1 は Cygwinbash の path を書いておけばOK

2 は今のところまだUIがないらしく、「setting.json で編集」をクリックして手作業で書き込む必要あり。

  • 64bit cygwin 入れている場合は bash.exe への path はデフォルトで ”C:\cygwin64\bin\bash" になると思うので注意。
  • ちなみにメニューとかを日本語化するには Marketplaceで検索して Japanese Language Pack for Visual Studio Code を入れる。

vi_memo

少し前に Emacs 使いの私に vi を教えてくれという人がいた。

vi か。

社会人になって初めて触ったエディタは vi だった。

10ページほどの手作りの教科書を見ながらそこに書かれている操作をすべて覚えたとき、 vi のすべてを理解したとおおきな達成感に包まれたものだった。

もちろん、その教科書は vi のすべてを書いていたわけではなかった。

あるとき先輩が私の知らない魔法を使って一瞬でファイルを編集したとき、私のちいさな全能感は打ち砕かれた。 vi の奥深さを知った瞬間だった。

それから長い年月がすぎ、いま vi はどうなっているのかと興味もあった。

それで Emacs をしばらく擱(お)き、 vi を調べ始めた。

そのときのメモをここにも。

vi の前に…

Unixコマンドのマニュアル

man command command のマニュアルページを開く
man 2 open open などのシステムコールに限定して開く
man 3 printf printf などの C 標準ライブラリに限定して開く
JM Project https://linuxjm.osdn.jp/ 日本語のマニュアルページ。ここからローカルに落としてきて man で使えるようにしたい。

ディレクトリの移動

cd dir dir ディレクトリ変更
cd ~ $HOME へ移動する
cd - 一つ前にいたディレクトリへ移動
pushd dir dir へ移動して元のディレクトリをスタックに記憶
popd pushd で記憶したスタックから一つ取りだして戻る

ファイルの作成

touch file file がない場合はサイズ 0 で新規作成。(既にある場合は file の日付を現在時で更新)
mkdir dir dir ディレクトリを作成
mkdir -p path/to/dir2 深い層まで作成
ln -s path/to/dir path/to/dir のシンボリックリンク dir をカレントディレクトリに作成

ファイルのコピー

cp file1 file2 file1 を file2 にコピー
cp path/to/file1 . file1 をカレントディレクトリ(.)にコピー
cp -pR dir1 dir2 dir1 を dir2 にまるごとコピー

ファイルの移動

mv file1 file2 file1 を file2 にリネーム
mv path/to/file1 . file1 をカレントディレクトリに移動
mv dir1 dir2 dir1 を dir2 にリネーム

ファイルの中を見る

cat file file の中身を表示
less file file の中身を表示 vi-like な操作方法で閲覧できる
view file file を読み取り専用で vi で開く (vi -R と同じ)

ファイルの削除

rm file file を削除。永遠に失われる。
rm -i file1 file1 を削除 -i は確認のプロンプトを出す指定。
rmdir empty_dir1 カラのディレクトリ empty_dir1 を消す。
rm -rf dir1 中身が入っていても dir1 を丸ごと削除。たいへん危険。

ファイルの権限

chmod 744 file file の権限を変更 owner=7(rwx), group=4(r--), other=4(r--)
chown owner file file のオーナーを変更
chgrp group file file のグループを変更

ファイルの検索

find . -name '*.py' 拡張子 .py のファイルを捜す
locate gtags.vim gtags.vim をファイルロケーションデータベースから捜す

ファイルの内容の検索

grep -InR -e 'func' func という文字列をカレントディレクトリ配下の前ファイルから捜す。検索パターンは正規表現が使える。

設定を見る

type command command の PATH を表示
type -a command command が複数ある場合、全部表示
echo $HOME 環境変数 HOME を表示
echo $PATH 環境変数 PATH を表示
echo $PATH sed -e 's/:/\n/g' | ':' を '\n' に置換して PATH を一覧表示
env 環境変数をすべて表示。環境変数はサブプロセスに引き継がれる。
set シェル変数、シェル関数、エイリアスを表示。シェル変数等はサブプロセスに引き継がれない。

.bashrc の設定

MY_DOT_BASHRC="~/.config/my.bashrc"
if [ -f ${MY_DOT_BASHRC} ]; then
    source ${MY_DOT_BASHRC}
fi

./config/my.bashrc

umask 033                       # 新規作成するファイルに付けない権限を指定
                                # 033 なら新規作成ファイルは 744 になる。
alias ll='ls -la'               # 一覧表示(.ファイルも表示)
alias lld='ls -ld'              # 指定したディレクトリ自体の日付などを表示
alias lla='ls -la'              # .ファイルも表示

alias e='emacs'                 # e だけで emacs を起動
alias vi='nvim'                 # vi で neovim を起動
alias v='nvim'                  # v で neovim を起動
alias python='python3'          # python で python3 を起動
alias pydoc='pydoc3'            # pydoc で pydoc3 を起動

export EDITOR='nvim'            # nvim をデフォルトのエディタにする
export PAGER='less'             # less をデフォルトのページャーにする

# $HOME 配下のコマンド用にPATHを追加
export PATH=~/local/bin:~/bin:$PATH

vi (vim/neovim)

重要なキーワード

neovim 今最新の vi は Neovim (ねお ぶいあいえむ)らしい。 https://github.com/Neovim/Neovim/wiki/Introduction
vim チートシート コマンド一覧がいろいろ見つかる。 https://vim.rtorr.com/lang/ja/
vim-jp.org ヘルプを翻訳した日本語マニュアルがある。 https://vim-jp.org/

vim と neovim(nvim) の違い

.vimrc ==> ~/.config/nvim/init.vim 設定ファイル.vimrcの位置が変更され名前も変更。 XDG Base Directory Specification という標準仕様に則ることにしたもよう。
.vim/ ==> ~/.config/nvim/ プラグイン置き場が変更された。その他いろいろ機能 Up してそう。

キーリピート

Windows のキーリピートは最速にしておくと h, j, k, l での移動が早くなる。

用語

ノーマルモード h,j,k,l などのコマンドが使えるモード。
インサート(挿入)モード i, a, I, A など押して入る、文章を入力するモード
ビジュアル(選択)モード v,V,Ctrl-v を押して入る、文字列を選択中のモード
コマンドラインモード : コマンドを入力中
ファイル ファイル。バッファにロードされるもの。
バッファ データが入っているメモリ領域のこと。ファイルはバッファにロードされる。ウィンドウはバッファの内容を表示する。
ウィンドウ 画面上に見えている表示領域のこと。バッファの内容を表示する。ひとつのバッファの内容を分割表示したり、別のバッファを分割したウィンドウに表示したりできる。
タブページ ウィンドウを入れる箱。関連するウィンドウを一つのタブに入れておくことで、作業グループ的に使えるかも。
C-w Ctrl キーを押しながら w を押すこと。 vi では伝統的に ^W と表現される。vim のヘルプでは CTRL-W と書かれている。他にも C-c は ^C, CTRL-C 、 C-r は ^R, CTRL-R など。

ヘルプ

:help ヘルプを起動
:h 上と同じ。たいていのコマンドが省略可能
:h gd gd コマンドのヘルプを表示
:h :q :q コマンドのヘルプを表示
:h CTRL-R C-r コマンドのヘルプを表示。ヘルプを検索するときはコントーロルキーは CTRL-W といったように大文字で書く。
:h CTRL-W_q C-w q コマンドのヘルプを表示。
:K init.vim などvimスクリプトを開いているときはカーソル下の単語でヘルプを起動。それ以外のファイルでは man を実行
:q ヘルプを閉じる

ヘルプでの移動(タグジャンプ)

C-] Ctrl-] タグジャンプ
C-t Ctrl-t 戻る
C-o Ctrl-o ジャンプリストを戻る(これでも戻れる)
C-i Ctrl-i ジャンプリストを進む

起動

nvim nvim を起動
nvim file file を開く
nvim -u NONE 設定ファイルやプラグインを読まずに起動
nvim -u NORC 設定ファイルは読まずに起動

終了

:q 今いるウィンドウを閉じる。何か変更していると警告される。すべてのバッファへの変更が保存されていると nvim を終了する。
:q! 今いるウィンドウの変更を破棄して閉じる。でも変更したバッファが裏にある場合は警告され閉じられない。
:qa nvim を終了する。q だとまだ一度も切りかえていないバッファがあると、警告されたが、それがない。ただし裏に変更したバッファがあると警告される。
:qa! nvim を強制終了。とにかく、すべての変更を破棄して終了。

ファイル・ディレクトリを開く

:e folder/file folderフォルダのfileを開く
:e . カレントディレクトリを開く(nvim を起動したディレクトリ)
:e ~/. ホームディレクトリを開く
:E 今見ているファイルのあるディレクトリを開く
:Ve      別のウィンドウにディレクトリを開く

参考

http://d.hatena.ne.jp/ykmbpp/20080701/1214906170 https://qiita.com/kmszk/items/9be187a47d5806b113da

ファイルを読み込む

:r file 今いるバッファの今いる行にfileの内容を取り込む

ファイルの保存

:w バッファをファイルに保存
:w! readonly や他の理由で w で書けないファイルでも強制保存
:wa 変更されたすべてのバッファを保存。
:wa! readonly 等のファイルでもすべてのバッファを強制保存。

バッファの操作

:badd file file をバッファにロードしてバッファ一覧に加える
:ls バッファの一覧を表示
:b9 バッファ一覧のNo.9バッファをウィンドウに表示
:bn バッファ一覧の次のバッファへ移動
:bp バッファ一覧の前のバッファへ移動
:b# 一つ前に表示していたバッファへ移動
C-^ ↑(上と同じ)
:bd バッファを一覧から削除
:bd! 変更があっても警告せずバッファを一覧から削除
:ball バッファを全部表示。たくさんのウィンドウに分割される。

ウィンドウ分割と削除

C-w s ウィンドウを水平に分割。C-w C-s でも同じ意味。つまり、2つめのキーを押すとき Ctrl から指を離しても離さなくても意味は同じ。他の C-w コマンドもたいていそう。
:sp ↑ (上と同じ)
C-w v ウィンドウを垂直に分割
:vs
C-w n 新規ウィンドウを作る(水平分割)
:new
:vne 新規ウィンドウを作る(垂直分割)
:sp file 分割したウィンドウで file を開く(水平分割)
:vs file 分割したウィンドウで file を開く(垂直分割)
C-w o 分割をやめて今いるウィンドウだけにする
C-w c 今いる分割ウィンドウを閉じる。 C-w C-c は C-c がコマンドをキャンセルしてしまうため機能しない。(他の多くのコマンドでは C-w q と C-w C-q というように 2つめのキーを押すとき Ctrl キーから指を離すときと離さないときで同じ意味だが、これは違う)
C-w q 今いる分割ウィンドウを閉じる。最後のウィンドウなら nvim を終了する
:q

ウィンドウ間の移動

C-w w ウィンドウ間を移動
C-w j 下のウィンドウに移動
C-w k 上のウィンドウに移動
C-w h 左のウィンドウに移動
C-w l 右のウィンドウに移動
C-w p 一つ前にいたウィンドウに移動

ウィンドウの位置を動かす

C-w r ウィンドウの位置を入れかえる。垂直分割されているときは横位置を入れかえ水平分割されているときは縦位置を入れかえ
C-w x 一つ前にいたウィンドウと位置を入れかえ。水平、垂直分割がたくさんあるときは入れかえてできない事もある。
C-w J 今いるウィンドウを一番上に配置
C-w K 今いるウィンドウを一番下に配置
C-w H 今いるウィンドウを一番左に配置
C-w L 今いるウィンドウを一番右に配置
C-w T 今いるウィンドウを新しいタブページとして分離

ウィンドウのリサイズ

C-w = すべてのウィンドウを同じ大きさにする
C-w N- 高さをN行低くする(Nを省略すると1)
:resize -N ↑(上と同じ)
C-w N+ 高さをN行高くする(Nを省略すると1)
:resize +N
:resize N 高さをN行ジャストにする。Nを省略すると最大の高さ
zN
C-w N< 幅をN桁狭くする(Nを省略すると1)
C-w N> 幅をN桁広くする(Nを省略すると1)
C-w N | 幅をN桁ジャストにする。Nを省略すると最大幅

ウィンドウ分割とウィンドウ間の移動

http://vimblog.hatenablog.com/entry/vim_window

https://qiita.com/tekkoc/items/98adcadfa4bdc8b5a6ca

タブページの操作

:tabnew タブを新規作成
:tabnext 次のタブへ移動
:tabprevious 前のタブへ移動
:tabedit file file を新しいタブで開く
:tabclose タブを閉じる。 :q でも閉じる。

移動

h
j ↓ (覚え方: 下向きの矢印に見えなくもない)
k ↑ (覚え方: 直線が上に向かっているような気がする)
l     
0 (ゼロ) 行頭
^ 行の最初の単語の先頭
$ 行末
w 次の単語の先頭へ
e 次の単語の末尾へ
b      前の単語の先頭へ
W 次の単語の先頭へ(カッコは飛ばす)
E 次の単語の末尾へ(カッコは飛ばす)
B      前の単語の先頭へ(カッコは飛ばす)
- 1行前の先頭文字へ
+ 次の行の先頭文字へ
C-d 半分スクロールダウン
C-f 半分スクロールアップ
C-f ほぼ1画面スクロールダウン
C-b ほぼ1画面スクロールアップ
f{char} 今いる行の指定した1文字へジャンプ(forward)
F{char} 今いる行の指定した1文字へジャンプ(backward)
; (セミコロン)f,Fを繰りかえす
, (カンマ)f,Fを逆方向に繰りかえす
N| N桁目へ
gg バッファの先頭へ
G バッファの最後へ
100G 100 行目へ

入力モード(挿入モード)へ移る

i 挿入モードになる。カーソル下の文字の左側に入力するとき用
I 行の先頭に入力
a 挿入モードになる。カーソル下の文字の右側に入力するとき用
A 行の末尾に入力
o カーソルのある行の次の行に空行を追加してその行の先頭に移動し挿入モードになる。
O カーソルのある行に空行を追加してその行の先頭に移動し挿入モードになる。
r 一文字置換。置換したら挿入モードからすぐ抜ける
R 上書きモード。現在行を内容を入力した文字列で上書きする
ESC 挿入モードで Esc を押すとノーマルモード(コマンドモード)に戻る

変更(Chaneg: 指定した部分を消して挿入モードへ移る)

cc 1行変更(1行消して挿入モードになる)
cl 1文字変更(1文字消して挿入モードになる)
cw 1単語変更(カーソル位置から単語末尾までを消して挿入モード)
caw 1単語の先頭から変更(単語とその後ろの空白も消して挿入モード)
ciw 1単語の先頭から変更(単語だけを消して挿入モード)
2cc 2行変更
c0 (c ゼロ) 行頭からカーソル位置までを変更
c^ 行頭の空白でない最初の文字からカーソル位置までを変更
c$ カーソル位置から行末まで変更
C c$ と同じ

コピー(Yank)

yy      1行コピー
yl 1文字コピー
yw 1単語コピー(カーソル位置から単語末尾まで)
yaw 1単語の先頭からコピー(単語の後ろの空白もコピーする)
yiw 1単語の先頭からコピー(後ろの空白はコピーしない)
2yy 2行コピー
3yaw 3単語コピー
y0 (y ゼロ) 行頭からカーソル位置までコピー
y^ 行頭の空白でない最初の文字からカーソル位置までコピー
y$ カーソル位置から行末までコピー
Y yy と同じ
"ayy 1行コピーし、レジスタaに保存する

切り取り (Delete)

dd 1行切り取り
x (dl) 1文字切り取り
X カーソルの左の一文字切り取り
dw 1単語切り取り(カーソル位置から単語末尾まで)
daw 1単語を先頭から切り取り(単語の後ろの空白も切り取る)
diw 1単語を先頭から切り取り(後ろの空白は切り取らない)
10dd 10行切り取り
20dw 20単語切り取り
d0 (d ゼロ) 行頭からカーソル位置まで削除
d^ 行頭の空白でない最初の文字からカーソル位置までコピー
d$ カーソル位置から行末まで削除
D d$ と同じ
"ayy 1行切り取り、レジスタaに保存する

貼り付け (Put)

P カーソルの前(今いる文字の前)に貼り付け
p カーソルの後(今いる文字の後)に貼り付け
2P コピーや切りとりを 2 個貼り付け(カーソルの前へ)
2p コピーや切り取りを 2 個貼り付け(カーソルの後ろへ)
"2P 2個前にコピーや切り取りしたものを貼り付け(カーソルの前へ)
"2p 2個前にコピーや切り取りしたものを貼り付け(カーソルの後ろへ)
"aP レジスタ a に保存したものを貼り付け(カーソルの前へ)
"ap レジスタ a に保存したものを貼り付け(カーソルの後ろへ)

ビジュアルモード

v 文字単位のビジュアルモードを開始する。 h,j,k,l などの移動コマンドで範囲を選択できる。範囲を選択後、 d, y などのコマンドを打つと選択範囲に対して削除、コピーといった操作が行なわれる
V 行単位のビジュアルモードを開始する
C-v 矩形領域のビジュアルモードを開始する。複数行の同じ桁位置に、文字列を挿入したり削除したりする操作に便利。
C-v 10j S-i /path/to/ ESC こうすると選択した10行の同じ桁位置に "/path/to/" を追加する

ビジュアルモードでのコマンド

aw カーソル位置の単語を選択。単語の後ろの空白を含む
iw カーソル位置の単語を選択。単語の後ろの空白は含まない。
ab カーソル位置を囲む (...) を選択。カッコを含む
ib カーソル位置を囲む (...) を選択。カッコを含まない
aB カーソル位置を囲む {...} を選択。カッコを含む
iB カーソル位置を囲む {...} を選択。カッコを含まない
~ 選択したテキストの大文字・小文字を変換
o カーソルを選択範囲の逆の位置へ移動する
O 矩形選択のとき、同じ行の中で逆の位置へ移動する
<, > 選択したテキストをインデント
2<, 2> 2つぶんインデント
! 選択したテキストを外部コマンドの入力として渡してその出力結果で置き換える。
: 選択した領域に対して ex コマンドを実行
:s/old/new/g 選択した領域に対して置換処理を実行
c 選択した領域を変更
d 選択した領域を切り取り
y 選択した領域をコピー
J 選択した行を連結する
U 大文字にする
u 小文字にする
C-] 選択したテキストでタグジャンプする

Undo/Redo/繰り返し

u Undo
Ctrl-r Redo
. 直前のコマンドの繰り返し(移動コマンドは除く)
dd... こうすると dd を 4 回繰りかえす
Ctrl-Z vi の実行を一時中断して Shell に戻る (Undoじゃない!)
fg Ctrl-Z で戻った Shell からもう一度 vi に戻る。(本当は、直前のプロセスに戻る。が正しい)

検索

/pattern pattern (正規表現)を下方向に検索
?pattern pattern (正規表現)を上方向に検索
* カーソル位置の単語を下方向に検索
# カーソル位置の単語を上方向に検索
n 次を検索。 /,*ではじめた検索の場合は、下方向に検索。 ?,#ではじめた検索の場合は、上方向に検索。
N 前を検索。 /,*ではじめた検索の場合は、上方向に検索。 ?,#ではじめた検索の場合は、下方向に検索。
:noh 検索キーワードのハイライト表示を消す。

置換

:%s/printf/puts/g printf を puts に置換。 % はファイルの先頭から最後までの意。 g は一行に複数回登場しても、全部置換する意。 g がないと、一行のうち最初にマッチしたものだけ置換。
:2,6s/printf/puts/g 2行目~6行目(含む)にある printf を puts に置換
:%s/\(def\)/abc\1/g 正規表現も可。この例ではdefという文字列をabcdefに置換。 \( \)で括ったところは\1, \2 といった書き方で置換文字列のほうに登場させることができる。
:%s/old/new/gc c を付けると、一つずつ確認しながら置換できる。 確認中 a と打てば、残り全部を置換。Esc で途中終了。
:g/pattern/s/old/new/g pattern で検索した行にある old を new で置換する。
:g/pattern/s//new/g pattern と old が同じ場合は old は省略できる。この場合 %s/pattern/new/g と同じ。

コード関連の移動・検索

gf カーソル下にファイル名があればそのファイルを開く。 :set path? で表示される PATH に無いファイルは表示出来ない。 :set path+=path/to/dir といったかたちで登録しておく。
gd カーソル下のローカル変数の定義へジャンプ。検索文字列となるのでそのまま n/N で移動可。
gD カーソル下のグローバル変数の定義へジャンプ。検索文字列となるのでそのまま n/N で移動可。
% 対応するカッコ、#ifdef/#endif 等へジャンプ

カーソル位置のワードの情報を表示

[i カーソル位置のキーワードを含む最初の行をステータス行に表示。ファイルの先頭から探し #include しているファイルも捜し、一番最初に見つかったものを表示する。検索するヘッダは set path+=path/to/dir といった感じで登録しておく必要がある。以下同様。
]i [i と同じだが、ファイルの現在位置から下を探しに行く。
[I カーソル位置のキーワードを含む行をステータス行に表示。複数ヒットしたらすべて表示する。ファイル名と行番号も表示するので、目的の定義が見つけやすい。
]I [I と同じだが、ファイルの現在位置から下を探しに行く
[ C-i カーソル位置のキーワードを含む最初の行へジャンプする。戻るときは C-o を押す。
] C-i [ C-i と同じだが、ファイルの現在位置から下を探しに行く
C-w i カーソル位置のキーワードを含む最初の行へジャンプする。そのとき新しいウィンドウを開く。 C-w c でウィンドウを閉じて戻れる。

### カーソル位置のマクロの情報を表示 | | | |:--------------------------------|:--------| | [d | カーソル位置のマクロ定義を検索し最初に見つけたものを表示。 | ]d | [d と同じだが、現在位置から検索をはじめる。 | [D | カーソル位置のマクロ定義をすべて表示 | ]D | [D と同じだが、現在位置から検索をはじめる。 | [ C-d | 見つけた最初のマクロ定義にジャンプ | ] C-d | [ C-d と同じだが、現在位置から検索をはじめる。 | C-w d | 新しいウィンドウを開いて最初に見つけたマクロ定義を表示する。

マーク

ma 現在のカーソル位置を a に記憶する。 a-zA-Z に記憶可能。
`a a に記憶したカーソル位置にジャンプする
'a a に記憶した行の先頭の文字にジャンプする

ジャンプリスト

検索やf,F,%などの大きく移動するコマンド実行するとその位置がジャンプリストに記憶され、行ったり来たりできる。 | | | |:--------------------------------|:--------| | C-o | ジャンプリストを戻る | C-i | ジャンプリストを進む | ju[mps] | ジャンプリストの表示 | cle[ar | jumps] ジャンプリストをクリア

単語補完

Ctrl-n       挿入モードで今の位置から後ろの単語を候補表示
Ctrl-p 挿入モードで今の位置より前の単語を候補表示

その他便利な編集機能

J 現在の行に次の行を連結する
~ 大文字⇔小文字変換
. (ピリオド) 直前の操作の繰り返し
C-a カーソル下の数値をインクリメント
C-x カーソル下の数値をデクリメント
! cmd 外部プログラム cmd を実行
!! 前回 ! で実行したコマンドを再実行
r! cmd cmd の実行結果を今のバッファに取り込む

その他環境

:pwd カレントディレクトリの表示
:cd カレントディレクトリをホームディレクトリに移動
:cd - カレントディレクトリを一つ前にいたディレクトリに戻す
:cd path/to/dir カレントディレクトリを dir へ移動

タグジャンプ

GNU Global

https://www.tamacom.com/global-j.html

https://www.machu.jp/diary/20090308.html#p01

gtags.vim を ~/.config/nvim/plugin の下に置いて ~/.config/nvim/init.vim に下記の記述を追加する。

gtags 用のキーマップ

nnoremap <C-j> :GtagsCursor<CR>
nnoremap <C-n> :cn<CR>
nnoremap <C-p> :cp<CR>

Exuberent Ctags

  • (工事中)

Universal Ctags

  • (工事中)

ターミナルモード

:terminal ターミナルモードに入る。ターミナルモードでは i, a と打つと Shell 上と同じ操作ができる。
C-\ C-n ターミナルモードを終了。通常の移動コマンドや、編集コマンド、それに : コマンド(exコマンド)を受け付けるようになる。

いろいろな設定の仕方

:source % init.vim を変更した保存したらこうすると変更が読み込まれる。 % は今開いているファイル名に置換される
:set number 行番号を付ける
:set nonumber 行番号つけない
:set number? 行番号つける、つけないの設定を表示
:set background=dark 背景が暗いとき用の文字色に変更
:set background=light 背景が明るいとき用の文字色に変更
:set background?  背景の設定を表示
:set background& 背景をデフォルトに戻す
:set list Tab文字や、行末の空白を見える文字で代替して表示

カラースキームの変更

molokai の導入の仕方メモ

https://qiita.com/godgarden/items/9bded65665834438cc3e

その他

https://qiita.com/tomatomus/items/171dd5aaf0bb8f11ec60

dein (パッケージマネージャ)

解説

https://qiita.com/yoza/items/2f8bd33a18225754f346

ご本家

https://github.com/Shougo/dein.vim

~/.config/nvim/init.vim の例

set nocompatible

" 画面表示の設定

colorscheme molokai " カラースキームを molokai にする

set background=dark " 暗い背景用の文字色にする(逆は light)
set number          " 行番号を表示する
set cursorline      " カーソル行の背景色を変える
"set cursorcolumn    " カーソル位置のカラムの背景色を変える
set laststatus=2    " ステータス行を常に表示
set cmdheight=2     " メッセージ表示欄を2行確保
set showmatch       " 対応する括弧を強調表示
set helpheight=999  " ヘルプを画面いっぱいに開く
"set list           " 不可視文字を表示
" 不可視文字の表示記号指定
"set listchars=tab:?\ ,eol:?,extends:?,precedes:?

" カーソル移動関連の設定

set backspace=indent,eol,start " Backspaceキーの影響範囲に制限    を設けない
set whichwrap=b,s,h,l,<,>,[,]  " 行頭行末の左右移動で行をまたぐ
set scrolloff=8                " 上下8行の視界を確保
set sidescrolloff=16           " 左右スクロール時の視界を確保
set sidescroll=1               " 左右スクロールは一文字づつ行う

" ファイル処理関連の設定

set confirm    " 保存されていないファイルがあるときは終了前に保存    確認
set hidden     " 保存されていないファイルがあるときでも別のファイ    ルを開くことが出来る
set autoread   "外部でファイルに変更がされた場合は読みなおす
set nobackup   " ファイル保存時にバックアップファイルを作らない
set noswapfile " ファイル編集中にスワップファイルを作らない

" 検索/置換の設定

set hlsearch   " 検索文字列をハイライトする
set incsearch  " インクリメンタルサーチを行う
set ignorecase " 大文字と小文字を区別しない
set smartcase  " 大文字と小文字が混在した言葉で検索を行った場合に    限り、大文字と小文字を区別する
set wrapscan   " 最後尾まで検索を終えたら次の検索で先頭に移る
set gdefault   " 置換の時 g オプションをデフォルトで有効にする

" タブ/インデントの設定

"set expandtab     " タブ入力を複数の空白入力に置き換える
set tabstop=4     " 画面上でタブ文字が占める幅
set shiftwidth=4  " 自動インデントでずれる幅
set softtabstop=4 " 連続した空白に対してタブキーやバックスペース    キーでカーソルが動く幅
set autoindent    " 改行時に前の行のインデントを継続する
set smartindent   " 改行時に入力された行の末尾に合わせて次の行の    インデントを増減する

" 動作環境との統合関連の設定

" OSのクリップボードをレジスタ指定無しで Yank, Put 出来るようにする
set clipboard=unnamed,unnamedplus
" マウスの入力を受け付ける
set mouse=a
" Windows でもパスの区切り文字を / にする
set shellslash
" インサートモードから抜けると自動的にIMEをオフにする
"set iminsert=2

" コマンドラインの設定

" コマンドラインモードでTABキーによるファイル名補完を有効にする
set wildmenu wildmode=list:longest,full " コマンドラインの履歴    を10000件保存する
set history=10000

" ビープの設定

"ビープ音すべてを無効にする
set visualbell t_vb=
set noerrorbells "エラーメッセージの表示時にビープを鳴らさない


" vimdiffの色設定
highlight DiffAdd    cterm=bold ctermfg=10 ctermbg=22
highlight DiffDelete cterm=bold ctermfg=10 ctermbg=52
highlight DiffChange cterm=bold ctermfg=10 ctermbg=17
highlight DiffText   cterm=bold ctermfg=10 ctermbg=21

""" キーマップの変更
" Ctrl-Tabでバッファ移動
nnoremap <silent> <F12> :silent :bn<CR>

" Ctrl-Shift-Tabでバッファを逆に移動
nnoremap <silent> <F11> :silent :bp<CR>

nnoremap <C-j> :GtagsCursor<CR>
nnoremap <C-n> :cn<CR>
nnoremap <C-p> :cp<CR>

Emacs helm のこと

helm のいろいろ。

helm-follow-mode

helmセッションが有効なときに C-c C-f で helm-follow-mode (HF) の有効・無効を切りかえられる。

HFが有効なとき、候補選択と同時にその候補をすぐ表示する。 有効でないときは C-j (helm-execute-persistent-action)を実行する必要がある。

helm-help

helmセッション中に C-h m (helm-help)を実行するとコンテキストごとのヘルプが表示される。 Emacs のドキュメントは普通 info 形式のはずだが、helm は Org モード?のヘルプになっている。

helm-find-files で helm-execute-persistent-action が symlink を展開する件

TAB に helm-excute-persistent-action を割り当てているけど、TAB押すとシンボリックリンクが展開されてしまい使いづらい。

下記関数の中で symlink を展開している。

helm-find-files-persistent-action-if

この中でファイルへのsymlinkなら helm-execute-persistent-action でリンクを展開してしまう。 symlink でもリンク先がディレクトリなら展開しない。

ディレクトリへのSymlinkの場合 C-uを付けると file-truename (シンボリックリンクを展開する関数)を呼んで展開する。

ファイルへのsymlinkではそうなっておらず、C-uを付けると転換しないで中身を表示するがが、C-uを付けないと展開する。動きが逆なんだよなあ。同じにしてほしいなあ。

↓ファイルへのsymlinkのとき file-truename 呼ばないよう、修正してる人いた。

Emacs で Helm をストレスなく使うための個人的な設定 (2) - あらびき日記

;; A symlink file, expand to it's true name. (first hit)
((and (file-symlink-p candidate) (not current-prefix-arg) (not follow))
 (cons (lambda (_candidate)
         (funcall insert-in-minibuffer candidate))

↓ 変更(file-truename を削除)

;; A symlink file, expand to it's true name. (first hit)
((and (file-symlink-p candidate) (not current-prefix-arg) (not follow))
 (cons (lambda (_candidate)
         (funcall insert-in-minibuffer (file-truename candidate)))

変更したら M-x emacs-lisp-byte-compile-and-load で再コンパイルしてロードしておく。

Emacsは適切な検索キーワードを見つけるのが難しい気がする。原因までたどり着いてようやく修正している人にたどり着いた。

どうせコード変更するなら、TAB で補完するようにしたい

そのうちチャレンジしてみようかな。

TAB を helm-execute-persistent-action に割り当ててるけど、普通の補完とは動きが違うんだよね。 helm-file-files だと、カーソル下のファイル名を minibuffer に取り込むけど、 Emacs の普通の補完だと、すべてのファイルのうち前方一致する部分までを minibuffer に取り込む。 その動きをさせてみたい。

Edebug を使った Emacs Lisp のデバッグ(書きかけ)

『改訂版 やさしいEmacs-Lisp講座』を読んで Edebug の存在を知ったけど、Edebugの終わらせ方が分からず調べたので、そのメモ。

出典

17.2 Edebug

Edebug - GNU Emacs Lisp Reference Manual

17.2.2 Instrumenting for Edebug

Instrumenting - GNU Emacs Lisp Reference Manual

Edebug の始め方

C-u C-M-x (eval-defun)

デバッグしたい関数やマクロの定義の中で C-u C-M-x するとコードが instrument される。 instrument とは、どうやらデバッグ用のコードを裏でこっそり組み込む事らしい。 そして、そのデバッグ機能付きの関数がEmacsにロードされる。

※ eval-defun は Edebug によって置き換えられていて edebug-eval-defun が実行される。

Edebug の終わらせ方

C-M-x (eval-defun)

デバッグ機能付きの関数は、そのままだとずっとデバッグ機能付きのままなので、呼ばれれば関数の先頭でブレークしてしまう。それをやめさせたいときは、デバッグ用のコードを組み込む前の、元の関数をEmacsにロードすれば良い。

いやー、そう言われれば分かるけど、気付かなかったなあ。

上の 17.2.2 Instrumenting for Edebug では M-x load するか M-: (eval-expression) すると書かれている

To remove instrumentation from a definition, simply re-evaluate its definition in a way that does not instrument. There are two ways of evaluating forms that never instrument them: from a file with load, and from the minibuffer with eval-expression (M-:).

Info の読み方

Emacs で C-h i とすると info を開けるが、操作方法をメモ。

Info は Emacs 上で見る方法とは別に info コマンドでも見られる。

操作はどちらもほぼ同じ。

かなり入り組んだ、直感的でない操作性だよね。いつまで経っても覚えられない。

基本的な Info の使い方

  • q で終了
  • l(エル) で元の位置に戻る。m, f, s, g などのジャンプ操作のほか n, p, ], [ での移動も元に戻せる。
  • SPC でスクロールしながら読んでいく。BACKSPACEで逆スクロール。サブノードへも入る。 SPCとBACKSPACE でスクロールしていけば Infoファイルのすべての情報を読むことができる。
  • ] で次のノードへ。[ で前のノードへと次々と移動。スクロールはしない。サブノードへも入る。
  • n (next) と p (previous) はサブノードを飛ばしてしまうので基本使わない。
  • m+サブノード名 でサブノードへ下る。
  • u でサブノードから上がる。
  • f+リンク先 でリンク先を選んでジャンプできる。
  • g+ノード名 で今開いているinfoファイルにあるすべてのノードにジャンプできる。
  • s+検索キーワード で検索。
  • C-s でインクリメンタルサーチも可
  • M-x info-apropos で全Info検索

TIPS

  • Info マニュアルは、1つのファイルに書かれたテキストを複数のノードという単位に分割して表示する。
  • Infoを起動すると、ひとつのノードだけが見えるようになっている。
  • 一番最初のページはTopノードと言う。
  • モードラインに "(infoファイル名) 今いるノード名" が表示される
  • ノードのサブノード(子ノード)へのリンクをなぜかメニューと呼ぶ。
  • 子ノードでないノードへのリンクをクロスリファレンスと呼ぶ。
  • 今いるファイルとは違うファイルへのクロスリファレンス(リンク)は、(ファイル名) という表示がリンクの後ろに付く。
  • Info ファイルはたいてい索引を持っていて(?)、Topノードで mIndexなどとするとジャンプできる。

Infoを読んでいるときのキーバインド

キー 意味
C-n カーソルを一行進む
C-p カーソルを一行戻る
C-f 一文字進む
C-b 一文字戻る
↑この辺までは Emacs と同じ操作
q Info を終了して元の作業に戻る
n (next) 次のページ(ノード)へ移動。サブノードへは降りない
p (previous) 前のページ(ノード)へ移動。サブノードへは降りない
u (up) サブノードから戻る
上の方に Next: xxx, Prev: xxx, Up: xxx と表示される。Next, Prev は同じ深さ(レベル)にあるドキュメントを行き来するのに使う。Up は一段上の深さ(レベル)に戻るときに使う。n, p はサブノードがあっても表示してくれないので基本使わない。
] n と基本的に同じ動きだが、サブノードを飛ばさない
[ p と基本的に同じ動きだが、サブノードを飛ばさない
SPC スクロール。そのまま次のページにもいける。サブノードがあればその中に入る
BACKSPACE SPCの逆。逆向きにスクロール。そのまま前のページにもいける
PageDown SPC と同じだが、次のページには飛べない。
PageUp BACKSPACE と同じだが、前のページには戻れない。
b このページの先頭に戻る。(Beginning of the node)
C-l 表示が崩れたときに再表示する
? コマンドの簡単な説明を表示。SPCで最後までスクロールして表示すると元の画面に勝手に戻る。
H 別ウィンドウに ? で表示するのと同じ内容を表示。勝手に消えないので消すときは C-x 1 とかで消す
M-x visible-mode 見えないテキストを表示する。もう一度実行するとまた見えなくなる(基本使わない)
m + メニュー名 (menu) ノードの持つサブノード(メニュー)にジャンプする。 途中でやめたくなったら C-g でキャンセル
f クロスリファレンス(リンク先)へのジャンプ。m と似ているが、サブノード(メニュー)ではない別のノードへもジャンプできる。
TAB メニューやクロスリファレンスのリンクを持つノードなら、次のリンクの位置へカーソルを移動する。そのまま Enter を押せばジャンプできる
S-TAB Shift+TAB。TABとは逆順にリンクの位置へ移動
i 索引の検索。索引ノードを開かなくても用語を使っている位置へジャンプできる
, i で索引検索したあと、索引の使われている次の場所へジャンプ
l (エル)(last) 元の位置に戻る。Info はノード間の移動を記録するヒストリーリストを持っている。m, f, i, L, d, t などのジャンプ操作のほか n, p, ], [ での移動をこのヒストリーリストを使って元に戻せる。
r (re-visit) l で戻ったヒストリーリストを先へ進むことができる。
L ヒストリーリストを表示する。ここからジャンプすることも可能。 l (エル)で元の位置に戻れる。
d ディレクトリ・ノードに移動する。ディレクトリ・ノードは Info を起動して最初に表示されるノードで、すべての Info ファイルへのリンク(メニュー)が載っているInfoノードのこと。
t 今読んでいる Info マニュアルの Top ノードへ移動する
< t と同じ。Topノードへ移動
> 最後のノードへ移動
T サイトマップ風にこのInfoファイルの構成を表示する
s 文字列を検索する。同じ文字列の検索を続ける場合は s+RET でよい
C-s, C-r 同じInfoファイル内であれば、ノードを越えてインクリメンタルサーチができる。
M-x info-apropos すべての Info ファイルから検索
g 別のノードへジャンプ。 gTop で Topノードへジャンプする。
g(FILENAME)Top 他のInfoファイルへジャンプする。 g(emacs)Top のように先頭に () で括ったInfoファイル名を指定すると飛べる。でも helm を入れていると他のファイルに飛べないみたい。。。
g* Infoファイルをすべて一つのバッファに展開して表示。これが一番わかりやすいかも
1 - 9 サブノードへジャンプする。 1 なら最初のサブノード、2 なら次と。
M-n 別窓に同じInfoを開く
C-u m 別窓に指定したサブノード(メニュー)のInfoを開く
C-u g 別窓に指定したノードのInfoを開く
C-u f 別窓に指定したリンク先(クロスリファレンス)のInfoを開く
M-x info-display-manual Infoマニュアル名を指定してInfoマニュアルを開く。C-u で Prefix すると今開いているInfoマニュアルからどれかを選択する