Surface Penの設定

yamyを使用してSurface Book2キーボードのカスタマイズを行なったところ、Surface Penのボタンが意図した通りに動作しなくなってしまった。 「ペンとWindows Ink」の設定をどう変えても常に左Windowsキーとして認識されてしまう。yamyを一時停止すると期待通りの動作をするので、yamy関連の問題らしい。

f:id:kichi941:20181230221359p:plain
Surface Penの設定

ボタンを押したときのスキャンコードを調べると以下のようになっていた。

ボタン操作 yamy OFF yamy ON
シングルクリック 0x83 &VK (U-F20) 0x6b
ダブルクリック 0x82 &VK (U-F19) 0x6a
長押し 0x81 &VK (U-F18) 0x69

.mayuに以下の設定を追加して、期待通りに動くことを確認した。

# Surface Pen
def key pen_single = 0x6b  # 0x83 &VK (U-F20)
key pen_single = &VK(U-F20)
def key pen_double = 0x6a  # 0x82 &VK (U-F19)
key pen_double = &VK(U-F19)
def key pen_hold = 0x69    # 0x81 &VK (U-F18)
key pen_hold = &VK(U-F18)

Surface Book2のキーボード設定

Surface Book2を購入して久しぶりに日本語キーボード環境に戻ってきたので設定のメモ。

やりたいこと


日本語配列キーボードを英語配列として使いたい

yamy 0.03で問題なく英語配列に変更できる。「-DUSE109;-DUSEdefault;-DUSE104on109」のようなオプションを付ければOK(yamy.iniの設定で escapeNLSKeys=1 が必要)。ついでに以下の点も変更。

  • CtrlはAキーの左に
  • 変換・無変換をスペースに
  • ひらがなの「む」と「ろ」キーをそれぞれEnter, Shiftキーに
  • 「ひらがな・カタカナ」キーをAltキーに

英語配列の外付けキーボードと共存させたい

設定ファイルを別々に用意することなしに、今の設定で問題なく動いている。

キーを単独で押したときと他のキーと同時押ししたときで挙動を変えたい

ワンショットモディファイヤ機能で以下のように設定

  • 単押しではSpace, 同時押しではShift
  • 単押しではEsc, 同時押しでCtrl
  • 単押しではEnter, 同時押しではCtrl
  • 単押しではAlt-Tab(アプリの切り替え), 同時押しではAlt
    f:id:kichi941:20181228212712j:plain
    特殊キーの設定

ファンクションキーを押したときに、音量調整などのメディアコントロールではなくファンクションキーとして動いてほしい

F1, F2(画面の明るさ調整), F7(キーボードバックライト調整)のキースキャンコードが分からない。CapsLockのようにFnを一度押せはロックされるようなので、当面はこれでOK。

現在の設定ファイル

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 窓使いの憂鬱 - dot.mayu
# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>
#

# まずキーボード定義を読み込む
if ( USE104 )
  include "104.mayu"        # 104 キーボード設定
  if ( USE109on104 )
    include "109on104.mayu" # 104 キーボードを 109 キーボード風に
  endif
else
  include "109.mayu"        # 109 キーボード設定
  if ( USE104on109 )
    include "104on109.mayu" # 109 キーボードを 104 キーボード風に
  endif
endif

if ( USEdefault )
  include   "default.mayu"  # Emacs ライクなさまざまな設定
endif

keymap Global

# このファイルをホームディレクトリにコピーしてから、
# 以下に自分の好みのキーバインディングを設定するとよい。
# このファイル自体を変更しないこと。

# IMEの制御
key A-Space = $ToggleIME    # Alt-' ' でIMEをON/OFF
#key S-SPACE = $ToggleIME       # Shift-' ' でもIMEをON/OFF
key IC-C-m = Enter   # かな漢字変換中でもC-mによる改行を有効にする


# MacOSっぽく、C-1, C-2で2枚の仮想デスクトップを切り替え
key C-_1 = C-W-Left
key C-_2 = C-W-Right


#
# ワンショットモディファイヤ
#
# Space and Shift
mod shift += !!!Space  # リピート有り
key R-*Space = &Ignore

# ESC + LeftControl
mod Control += !!Esc
key ~R-*C-Esc = Esc
key R-*C-Esc = &Ignore

# Enter + RightControl
mod Control += !!Enter
key ~R-*C-Enter = Enter
key R-*C-Enter = &Ignore

# Backspace + Alt
mod Alt += !!!Backspace  # リピート有り
key ~R-*C-Backspace = Backspace
key R-*C-Backspace = &Ignore

# Altを単体で押した場合はAlt-Tabにする  (なぜか右Altはうまく動かないのでAltは両方とも左Altにしておくこと)
mod Alt += !!LeftAlt
key ~R-*A-LeftAlt = A-Tab
key R-*C-LeftAlt = &Ignore

# C-[をEscに
key C-LeftSquareBracket = Esc Escape


#
# SurfaceBookキーボード用
#
# 変換・無変換をSpace and Shiftに
mod shift += !!変換
key R-*変換 = &Ignore
mod shift += !!E0無変換
key R-*E0無変換 = &Ignore

# ひらがなをLeftAltに
# key *E0ひらがな = $ToggleIME  # ひらがな でIMEをON/OFF
def subst    *E0ひらがな    = *LeftAlt
mod Alt += !!E0ひらがな
key ~R-*C-E0ひらがな = A-Tab
key R-*C-E0ひらがな = &Ignore

# 英数をEsc+Ctrlに
def subst    *E0英数      = *Esc
mod Control += !!E0英数
key ~R-*C-E0英数 = Esc
key R-*C-E0英数 = &Ignore

# Enterキーが遠いので「む」キーもEnterとして使用
def key kinesis_sp          =    0x56  # kinesisとの共存用に左手下の |\ は表記通りに使う
def subst *kinesis_sp = *YenSign
def subst *RightSquareBracket = *Enter


#
# アプリ固有の設定
#
# web browser
window  Mozilla /:MozillaWindowClass$/ : EmacsEdit
window  Chrome /chrome\.exe:/ : EmacsEdit
window  Edge /ApplicationFrameHost\.exe:/ : EmacsEdit

## MS-Office
window  Outlook /OUTLOOK\.exe:/ : EmacsEdit
window  POWERPNT /POWERPNT\.exe:/ : EmacsEdit
window  Excel /EXCEL\.exe:/ : EmacsEdit

## explorer
window  Explorer /Explorer\.exe:/ : EmacsEdit

## Evernote
window  Evernote /Evernote\.exe:/ : EmacsEdit

pythonでのcomment-dwim挙動変更

pythonでプログラムを書く際、Emacs+ Patchedに含まれているcomment-dwimという機能のお世話になっている。この機能を使うことでIntelliJのIntention ActionのようにIDEが空気を読んで適切なコメントアウト処理をしてくれるようになる。たとえば、以下のような処理を同じキー操作で行なうことができる。

  • 行に何も書かれていなければ、' # 'を挿入してコメント記載の準備をする
  • プログラムが書いてある行では、末尾に' # 'を挿入してコメント記載の準備をする
  • 既にコメントが記載されている行では、コメント文の先頭までカーソルを移動させる
  • 範囲選択中であれば、選択行をまとめてコメントアウトする

ただ、pythonでプログラムを書いている時はcomment-dwimで挿入されるコメントが' # '(空白 + # + 空白 + 空白)になってしまい、内蔵のPEP8チェッカから「コードとコメントの間は少なくとも2スペース以上空けましょう」とか「1行コメントは '# 'で始めましょう」という注意を受けていた。

せっかくEmacs+ Patchedを自分でビルドできるようになったので、試しに修正してみた。 CommentHandler.javaのMultiCaretCodeinsightActionHandlerを以下のように変更する。

// 変更前
protected String getEmptyLineComment() {
    return ' ' + myLineC + ' ';
}

// 変更後
protected String getEmptyLineComment() {
  if (myLineC.equals("# ")) {
    myLineC = " #";
  }
  return ' ' + myLineC + ' ';
}

pythonプログラムを編集している間は、myLineCの値が'# '(# + 空白)になっている。このため、getEmptyLineComment()は' # '(空白 + # + 空白 + 空白)を返すようなっていた。これを逆の' #'にすることで、最終的に返ってくる文字列が' # '(空白 + 空白 + # + 空白)になるようにした。

python以外の#をコメント行に使うプログラミング言語が混在してきた場合の影響は不明だが、CLionでc++pythonのプログラムを書く分には意図した通りに動作している。

IntelliJ用のプラグイン Emacs+ Patchedをローカルでビルドできるようにする

以下の公式ページで配布されている版では、対応するIntelliJのバージョンが細かく指定されている。2018.2がリリースされると動かなくなる可能性が高いので、自分でもビルドできるようにしておく。 plugins.jetbrains.com


まずは、githubからソース一式をダウンロードして、適当な場所に展開する。 github.com

IntelliJ CE 2018.1でプロジェクトを開くと以下の2つのエラーが発生している。

  • 3 modules cannot be loaded
  • Invalid VCS root mapping

3 modules cannot be loadedの方は、ログを開くと問題のファイルがチェックされた状態になっているので[Remove Selected]ボタンをクリックする。 f:id:kichi941:20180405000502j:plain

Invalid VCS root mappingの方は、とりあえずはバージョン管理システムを使用しないことにして、VCSの設定をクリアしてしまう。 f:id:kichi941:20180405000643j:plain

次にbuild.gradleのpublishPluginの設定でエラーになる。この設定はプラグインを一般に公開する場合に必要になる設定のようなので、とりあえずダブルクォートで囲んで文字列にしてしまう。

f:id:kichi941:20180405000857j:plain

gradleの設定画面を開いて、[Use gradle wrapper task configuration]の方に変更する。

f:id:kichi941:20180405000931j:plain

ここまで設定すると、バックグラウンドでタスクが動き出しツールのダウンロードとビルドが始まるのでしばらく待つ。以下のように全ての結果が緑色のOKになれば準備完了。

f:id:kichi941:20180405001037j:plain

./src/main/resources/META-INF/plugin.xml を開いて、until-buildの値を変更する。

f:id:kichi941:20180405001321j:plain

IntelliJウィンドウの右側にある[Gradle]タブを開き、[Tasks]-[build]-[jar]をダブルクリックする。

f:id:kichi941:20180405001421j:plain

15秒ほどで build/libsの下に.jarファイルが生成されるので、プラグインとして手動でインストールする。

f:id:kichi941:20180405001445j:plain

Emacs+ Patchedプラグインへの手動パッチ

CLion 2018.1にEmacs+ Patchedプラグイン(0.3.300)をインストールして使っていたけど、IDE Fatal Errorsというイベントが頻繁に発生するようになった。詳細メッセージを読むと「Argument for @NotNull parameter 'name' of com/mulgasoft/emacsplus/EmacsPlus.resetCommand must not be null」となっている。

f:id:kichi941:20180403222310j:plain

いろいろと検索してみると、そもそも2018.1で0.3.600が動かなくなったのは、プラグイン内部に「until-build="173.*"」という設定があるためらしい。 github.com

JetBrainsのサイトから0.3.600の.zipファイルをダウンロードして確認したところ、.jarファイル内のMETA-INF/plugin.xmlに確かにそのような記載があった。この部分を「until-build="183.*"」と書き換えて[Preferences]-[Plugins]-[Install plugin from disk ...]から手動でインストールした。 plugins.jetbrains.com

今のところ、2018.1で0.3.600が問題なく動作している。 f:id:kichi941:20180403223535j:plain


2018.04.04追記

2018.1に対応したversion 0.3.700 が公開されたため、手動での変更は不要になった。ただ、このバージョンも「until-build="181.*"」という記載が残っているため、2018.2では同じ問題が発生する。

CLionを2018.1に更新

2018.1のお知らせが来たけど、Emacs+ Patched プラグイン(version 0.3.600)が互換性が無いという警告が出ている。

f:id:kichi941:20180330122054p:plain

2018.1に更新したところ、案の定Emacs+ Patchedが無効になっている。

f:id:kichi941:20180330122244p:plain

Emacs+ Patchedを一旦アンインストールしたところ、古いバージョン(0.3.300)だけど無事にインストールできるようになった。 f:id:kichi941:20180330122349p:plain

CLionの設定

c++の勉強のために開発環境としてCLionをインストールした。 現在利用させてもらっているプラグインの設定・使い方メモ。

  • C/C++ Single File Execution

1つのプロジェクト内で独立したc/c++プログラムを書きやすくするツール。 CLionではプロジェクトにファイルを追加した場合でCMakeLists.txtを編集する必要があるが、これを1クリックで自動化できる。プログラミングの勉強やAtCoder, yukicoderなどでプログラムを書く時など、1ファイルごとに独立したmain関数がある時に便利。

プロジェクト内にファイルを追加する際、[Add to targets]は外しておく。 f:id:kichi941:20180305192405j:plain

f:id:kichi941:20180305192454j:plain

このままだと、This file does not belong to any project target... と怒られるので、右クリックして[Add executable for single c/cpp file]を選択する。 f:id:kichi941:20180305192554j:plain

CMakeLists.txtに自動的にファイルが登録され、単体でコンパイルできるようになった。 f:id:kichi941:20180305192730j:plain

キーマップを、よりemacs風にするためのプラグイン。元々はEmacs+というプラグインだったが、JetBrainsのIDE 2017年版ごろから動作しなくなったため有志によるパッチ版が公開された。M-; で comment-dwimコマンドが使えるようになるので非常に便利。