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マニュアルからどれかを選択する

Visual Studio Code で C++ 開発 with Windows Subsystem for Linux (OS は Windows 10 ですよ)

最近にわかに Visual Studio Code (VSCode) をお勉強をしています。

以前の記事 WSL を使って Windows 10 の上で Linux を動かす - ある日録Windows Subsystem for Linux (WSL)と、その上に Ubuntu を入れたので、VSCode と WSL を使ってC++のビルドとかデバッガとか IntelliSense とか使ってみる。そのための設定。

以下超ざっくり。

VSCode インストール

まあ、これはググればすぐ出来ます。

統合ターミナルを WSL にする

Ctrl-Shift-P Select Default Shell で WSL を選ぶ。

↓に細かい話あり。

Integrated Terminal in Visual Studio Code

とりあえずこれで、Ctrl+@ で統合ターミナルを表示しておけば、VSCode だけで、編集してコンパイルはできる。

g++ -g -Wall source.cpp -o source

とかターミナルでコマンドを打てばよい。

C/C++ extension のインストール

でもまあ、せっかくやるなら、IntelliSenseも使いたいし、デバッガでステップ実行もしたいので、その辺の機能が入った extension を入れる。

左の列の機能拡張ボタンを押すか Ctrl+Shift+X で extension のリストを表示。小窓に c/c++ と入力して検索する。 インストールして、再読み込みすればOK。

C++ programming with Visual Studio Code

ひととおり読んだ方がいいかもしれないが、あまり読んでない。

システムヘッダへのPATH を intelliSense に教えてあげる。

  • c_cpp_properties.json に WSL コンフィグレーションを追加

下記サイトの記述を参考に書く。

vscode-cpptools/Windows Subsystem for Linux.md at master · Microsoft/vscode-cpptools · GitHub

リンク先ではディストリビューションUbuntu 前提で書かれている。WSL上に他のディストリビューションを入れている場合は変更が必要。(そのことも書いてある)。

あと、最後に、一言、WindowsからWSLのファイル書き換えたら酷いことになるよ。的な記載へのリンクがあった気がする。UbuntuとかのファイルがWindowsからたどれるからといって、くれぐれも書き換えないようにしよう。

  • Ctrl+Shift+P c_cpp_configration.json と打ち込み、c_cpp_configuration.json を開く。
  • 以下の WSL (Ubuntuの場合) の Configuration を c_cpp_configuration.json に書く。

          {
              "name": "WSL",
              "intelliSenseMode": "clang-x64",
              "includePath": [
                  "${workspaceRoot}",
                  "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/c++/5",
                  "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu/c++/5",
                  "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/c++/5/backward",
                  "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
                  "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/local/include",
                  "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
                  "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu",
                  "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include"
              ],
              "defines": [
                  "__linux__",
                  "__x86_64__"
              ],
              "browse": {
                  "path": [
                      "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/c++/5",
                      "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu/c++/5",
                      "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
                      "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/local/include",
                      "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
                      "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu",
                      "${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/*"
                  ],
                  "limitSymbolsToIncludedHeaders": true,
                  "databaseFilename": ""
              },
              "cStandard": "c11",
              "cppStandard": "c++17"
          },
    
  • コマンドパレット> c/cpp select configuration で WSL を選ぶ

  • VSCode を再起動すると選択しなおす必要がある件は調査必要
    → と思ったが、c_cpp_properties.json の一番上に書いたらうごいた。Win32 より前にあればいいのか? WSLのコンフィグレーションを Win32 のコンフィグレーションの下に書いてしまうと、次回 VSCode の起動時に Win32 のほうが有効になってしまう。 Select Configuration で選択しているのに。。。そのうち直るかな。

コンパイル

tasks.json を書く。けっこう簡単。

  • tasks.json は Ctrl+Shift+P Configure task とかして、タスクを選ぶと開ける。
  • メニュー>タスク>タスクの構成 でも同じ。

              {
                  "label": "build",
                  "type": "shell",
                  "command": "g++ -g -Wall -O0 VSCodeTest.cpp",
                  "problemMatcher": [
                      "$gcc"
                  ],
                  "group": {
                      "kind": "build",
                      "isDefault": true
                  }
              }
    
  • g++ に -O0 を付けているのは最適化をオフしておかないとデバッグでステップ実行すると変な動きになるため。VisualStudio でやるみたいに DebugビルドとReleaseビルドを分けておいてもいいかもね。

  • isDefault を true にしておくと Ctrl+Shift+B でビルドできる。

実行

tasks.json を書く。これも同じく簡単。

            {
                "label": "run",
                "type": "shell",
                "command": "./a.out",
                "problemMatcher": []
            }

これでメニュー>タスクの実行>run を選ぶと Ubuntubash 上で a.out が実行される。

デバッガ

下記サイトを 参考に launch.json を書く。

https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/Debugger/gdb/Windows%20Subsystem%20for%20Linux.md

  • Ctrl+Shift+P open launch.json と打ち、launch.json を開く。(lanunch.json がないときどうなるだろう?)
  • launch.json を開くと右に 構成の追加 ボタンがあるので、これを押す。
  • C/C++: (gdb) Bash on Windows Launch を選ぶ
  • テンプレがインサートされるので、必要なとこだけ変更。たしか・・・
    • program
    • cwd
    • sourceFileMap
  • くらいだったような。

          {
              "name": "(gdb) Bash on Windows Launch",
              "type": "cppdbg",
              "request": "launch",
              "program": "/mnt/c/Code/VSCodeTest/a.out",
              "args": [],
              "stopAtEntry": false,
              "cwd": "/mnt/c/Code/VSCodeTest",
              "environment": [],
              "externalConsole": true,
              "sourceFileMap": {
                  "/mnt/c": "c:\\"
              },
              "pipeTransport": {
                  "debuggerPath": "/usr/bin/gdb",
                  "pipeProgram": "C:\\Windows\\sysnative\\bash.exe",
                  "pipeArgs": ["-c"],
                  "pipeCwd": ""
              },
              "setupCommands": [
                  {
                      "description": "Enable pretty-printing for gdb",
                      "text": "-enable-pretty-printing",
                      "ignoreFailures": true
                  }
              ]
          }
    
  • 左のデバッグアイコンを押してデバック用のペインを開いて、さっき作った構成を選択し右三角をぽちっとすれば実行可能。

  • ソースコードの行番号の左をクリックしてブレークポイントをはっておけばそこで止まる。
  • F10 でステップオーバー
  • F11 でステップイン

以上。

WSL を使って Windows 10 の上で Linux を動かす

Windows 10 で Linux を動かす

Windows10 は何回か大きなバージョンアップがあって、そのたびに Linux を動かす機能をすこしずつ強化してきた。

2016/08/24 の Aniversary Update で少し動くようになり、 2017/07/28 Creators Update でもっと動くようになったそう。

まだ完全ではないらしいがとりあえずそれ、入れてみた。ここにその軌跡を記す。

発端

キーボードをHHKB(http://www.pfu.fujitsu.com/hhkeyboard/)にしたので、家で emacs の練習しとくかあ。

と思い、gnupack を起動したら mintty がエラー。teraterm に付いてる cygterm も動かない。。。

Windows 10 の仮想デスクトップをいくつか使っているせいかなと思って デスクトップを一つだけにしたけど動かず。。。

どうしよ。emacs で編集して gccコンパイルして、とかやれなくなってしまった。

・・・そういえば、WindowsUbuntu 動かすとか、そんな話あったよなあ。

参考にしたサイト(ありがとうございます!)

Windows10 の "Bash on Ubuntu on Windows" で困ったこと - Qiita

Windows Subsystem for Linuxをインストールしてみよう! - Qiita

  • うちの Windows 10 は Creator Update からだいぶ経っていることもあってか、初めから Windows Subsystem for Linux がインストールされていた。
  • そのため、Microsoft Store から Ubuntu をインストールしただけで動いた。
  • Microsoft Store のレビューにありましたが、初心者が手を出すとクラッカーの攻撃に晒されるかもしれないんだそうです。ご注意ください。

Windows Sybsystem for Linux

Winodws の機能から、Windows Sybsystem for Linux にチェックを付ける。 (私のとこではもう付いてた) OKすると再起動するらしい。

f:id:nodamotoki:20180120220935p:plain
Windowsの機能

  • Windows の機能は、OptionalFeatures.exe を実行すると出ます。
  • 設定メニューからもいけます。けっこう深いとこにいるけど。
    • 設定>アプリ>アプリと機能>(右のほうの)プログラムと機能>(左のほうの)Windowsの機能の有効化または無効化

Microsoft Store から Ubuntu をインストール

f:id:nodamotoki:20180120221934p:plain
Microsoft Store

スタートにピン留めした Ubuntu から実行

実行は スタート>Ubuntu でOK

cmd.exe から bash を実行することでも起動する。

Microsot Store のレビューコメントを見ると PowerShell から実行した方が速い?とか書いてあったので、PowerShell から実行してみたり。

使いたいプログラムをインストール

参考サイトの記載をみながら、ダウンロード元を、北陸先端科学技術大学院大学さん(http://ftp.jaist.ac.jp)に変更。

update & upgrade するらしいのでやってみる

sudo apt update
sudo apt upgrade

これで、最新版になったのかな。

↓ apt コマンドはこちらで少しお勉強(ありがとうございます!)。

「apt-get」はもう古い?新しい「apt」コマンドを使ったUbuntuのパッケージ管理 | Linux Fan

それから emacs やら gcc やらをゲット

$ sudo apt install emacs
$ sudo apt install build-essential     # gcc
$ sudo apt install python ruby         # python と ruby 

すべてをやり直したいとき

lxrun /uninstall /full
lxrun /install

cmd.exe で上のコマンドを叩くとすべてが消えて無くなり、新しく入れ直されるのだとか。 (Windows Subsystem on Linux を消したり入れ直したりする古い?コマンドらしい)

そういえば最初に lxrun /uninstall /full をとりあえずやってしまったんだけど、

そのとき「保留中」みたいな表示が出てたなあ。

パソコンを再起動したら今日やったこと全部消えてしまうのかな。

以上!

#if 0 で囲まれた「文字」のほうの色を変える方法

はじめに

vim では、はじめから当たり前のように #if 0 をコメントと同じ色で表示してくれるのに Emacs ではそうはいかない。困ったもんだ。

一応 cpp-highlight-buffer を使うと「背景色」を変えるのは比較的簡単にできる。 (簡単と言ってもけっこう癖あるけど)

しかし、文字色を変える方法は、さらにわかりにくいので、ここにその方法を載せときます。

cpp-highlight-buffer の裏技を使う。

裏技といっても、Emacs の Face について知っていれば当たり前なのかも…。

というわけで Face を定義して cpp-highlight-buffer でその Face を使います。

.emacs に以下の設定を書くだけ。

;; cpp-highlight-buffer
(defface if-zero-face (quote ((t (:foreground "brightblack")))) nil)
(setq cpp-edit-list
      (quote
       (("0" if-zero-face default both)
        ("1" default if-zero-face both))))
(setq cpp-face-type (quote dark))
(setq cpp-known-face (quote default))
(setq cpp-unknown-face (quote default))
(add-hook 'c-mode-common-hook (lambda () (cpp-highlight-buffer t)))

やっていること

if-zero-face というフェイスを作る。フェイスは list-faces-display で列挙されるやつです。

ここでは foreground (文字色) を brightblack (黒だけど少しあかるい) にしてる。 自分の Emacs で使える色は list-colors-display で確認できるよ。

あとは cpp-highlight-buffer の設定。 #if 0 のときと、 #if 1 のときの #else 側のFace を if-zero-face と指定する。

その他 cpp-highlight-buffer の設定をいくつか。

フックを追加して c-mode とかのときに (cpp-highlight-buffer t) を実行するようにしておく。

defface で作る Face の設定を変えれば、背景色を変えたり bold, italic, underline なども指定できる。

以上

vimdiff の設定と使い方

これから仕事で vimdiff を使いそうなので情報収集。

cygwin だと vimdiff 単体では Setup.exe の検索には引っかからないけれど vim を入れると vimdiff もついてくる。

~/.vimrc 設定

set nocompatible

" 画面表示の設定

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

設定ネタ元

http://vimblog.hatenablog.com/entry/vimrc_set_recommended_options http://qiita.com/takaakikasai/items/b46a0b8c94e476e57e31

操作

vimdiff a.c b.c


[ c                 前の差分
] c                 次の差分

do                  他の窓の今の差分を、自分のほうへ取り込む(obtain)
dp                  自分の窓の今の差分を、他の窓へ押し込む(put)

ctrl+w w            窓を移動
ctrl+w ctrl+w       〃

ctrl+w h            左の窓のファイルへ移動
ctrl+w j            下の窓のファイルへ移動
ctrl+w k            上の窓のファイルへ移動
ctrl+w l            右の窓のファイルへ移動

ctrl+w H            ファイルの位置を左窓へ+横分割に変更
ctrl+w J            ファイルの位置を下窓へ+縦分割に変更
ctrl+w K            ファイルの位置を上窓へ+縦分割に変更
ctrl+w L            ファイルの位置を右窓へ+横分割に変更

ctrl+w [num] <      窓の仕切りを num 個左へ
ctrl+w [num] >      窓の仕切りを num 個右へ
ctrl+w [num] +      窓の仕切りを num 個上へ
ctrl+w [num] -      窓の仕切りを num 個下へ
ctrl+w =            窓の仕切りを戻す

:wqa                変更を全部ファイルに書き込んで修了
:qa!                変更を全部破棄して修了

操作ネタ元

https://ogatism.jp/vi_split_vimdiff/