ParallelsのWindowsでUSキーボードを使う

下記サイトの手順でGoogleIMEの所をOffice IMEに読み替えて試したところ、うまく行きました。

USキーのMacWindowsをJISキーのMacぽく使う方法
http://ysnhrk.blogspot.jp/2013/10/usmacwindows.html

必要な部分だけピックアップした備忘録を残しておきます。

環境

1. Karabiner(旧KeyRemap4MacBook)からprivate.xmlを開く

タスクバー > Preferences... > Misc&Uninstall > Open private.xml > エディタで開く

private.xmlに以下を書き足す。

<?xml version="1.0"?>
<root>
  <list>
    <item>
      <name>追加</name>
      <item>
        <name>左右のコマンドキー(&#8984;)を「英数/かな」としても使う</name>
        <appendix>(左/右コマンドキーの空打ちで「英数/かな」)</appendix>
        <appendix>(コマンドキーを押している間に他のキーを打つと通常のコマンドキーとして動作)</appendix>
        <identifier>remap.jis_command2eisuukana_prefer_command_notvirtualmachine</identifier>
        <not>VIRTUALMACHINE</not>
        <autogen>__KeyOverlaidModifier__ KeyCode::COMMAND_L, 
          KeyCode::COMMAND_L, KeyCode::JIS_EISUU</autogen>
        <autogen>__KeyOverlaidModifier__ KeyCode::COMMAND_R, 
          KeyCode::COMMAND_R, KeyCode::JIS_KANA</autogen>
      </item>
      <item>
        <name>左右のコマンドキー(&#8984;)をVirtualMachineでも「英数/かな」として使う</name>
        <appendix>(VirtualMachine上で左/右コマンドキーを空打ちすると[Ctrl+Shift+F11/F12])</appendix>
        <appendix>(コマンドキーを押している間に他のキーを打つと通常のコマンドキーを送信)</appendix>
        <appendix>(Parallelsのデフォルト設定では同時押しのコマンドキーは[Ctrl]と解釈される)</appendix>
        <identifier>remap.jis_command2eisuukana_prefer_command_virtualmachine</identifier>
        <only>VIRTUALMACHINE</only>
        <autogen>__KeyOverlaidModifier__ KeyCode::COMMAND_L, 
          KeyCode::COMMAND_L, KeyCode::F11, ModifierFlag::CONTROL_L | ModifierFlag::SHIFT_L</autogen>
        <autogen>__KeyOverlaidModifier__ KeyCode::COMMAND_R, 
          KeyCode::COMMAND_R, KeyCode::F12, ModifierFlag::CONTROL_L | ModifierFlag::SHIFT_L</autogen>
      </item>
    </item>  
  </list>
</root>

2. Karabinerの設定を有効にする

タスクバー > Preferences... > Change Key
以下の[▼追加]のチェックボックスを付ける

3. Microsoft Office IME2010を開く

IMEバーを選択から設定 > インストールされているサービス > Microsoft Office IME2010 > プロパティ > 全般 > 編集操作 > 変更

以下のようにCtrl+Shift+F11,Ctrl+Shift+F12を設定する
[キー追加]で左コマンドキー、右コマンドキーを押下するだけCtrl+Shift+F11,Ctrl+Shift+F12と表示されることから正しくマッピングされていることが確認できる。

Error: ENOENT, stat 'C:\Users\xxx\AppData\Roaming\npm'

winodws7 x64の環境でnpm install実行時にエラーが出た。

npm install 
Error: ENOENT, stat 'C:\Users\xxx\AppData\Roaming\npm'

参考程度にnpmのバージョン

npm -v
1.4.21

ぐぐったところ、stackoverflowでも同じ質問が出ていました。
Node.js/Windows error: ENOENT, stat 'C:\Users\RT\AppData\Roaming\npm' - Stack Overflow

解決策は、手動でフォルダを作るで解決した。

mkdir 'C:\Users\xxx\AppData\Roaming\npm'

選択肢からコマンドを選んで実行する

Intro

新しいPluginを入れてもコマンドやキーバインドが覚えきれないので、
あらかじめ用意して選択肢から実行出来るようにする。
選択肢から実行するための関数として、inputlistがあるので使用する。(詳細は、:h inputlist)

Contents

.vimrcでも何処でも良いので以下を記載する。

let g:scc = {}
" sample
let g:scc.unite = [
	\ ['Sample Uniteの選択リスト', ''],
	\ ['> File', 'Unite file'],
	\ ['> Find', 'Unite find'],
	\ ['> Dir', 'Unite direcotry']]

function! SelectCmd(key)
	let a:viewlist = []
	let a:idx = 0
	let a:input = 0
	let a:slist = g:scc[a:key]
	let a:head = ''

	while a:idx < len(a:slist)
		if a:idx == 0
			call add(a:viewlist, a:slist[a:idx][0])
		else
			execute 'let a:head = printf("[%-' . strlen(len(a:slist)) . 's]", a:idx)'
			call add(a:viewlist, a:head . ' ' . a:slist[a:idx][0])
		endif
		let a:idx = a:idx + 1
	endwhile

	let a:input = inputlist(a:viewlist)
	echo "\n"

	if a:input < 1 || a:input > len(a:slist)
		echohl ErrorMsg
		echo 'Selected-Number('.a:input.') is range over.(0-' . (len(a:slist) - 1) . ')'
		echohl None
		return
	endif

	echohl MoreMsg
	echo '> ' . a:slist[a:input][1]
	echohl None

	execute a:slist[a:input][1]
endfunction

command! -nargs=1 SelectCmd 
	\ call SelectCmd(<q-args>)

実行する

:SelectCmd unite

サンプルの実行結果

自分で好きな選択肢を作りたい場合、下記形式で追加する

let g:scc.[任意のa-z,A-Z,0-9,_(アンダースコア)] = [
	" 第1要素は、表示される文字列
	" 第2要素は、選択時に実行されるコマンド(例> :ls, :h inputlist,など)
	" このサンプルだと> Fileを選択した場合、:Unite fileが実行される
	\ ['Sample Uniteの選択リスト', ''], " 説明文
	\ ['> File', 'Unite file'],         " 選択肢1
	\ ['> Find', 'Unite find'],         " 選択肢2
	\ ['> Dir', 'Unite direcotry']]     " 選択肢3
	" 何個でも良い。

inputlistからinputlistを呼び出すことも出来る

" Sample
let g:scc.unite = [
	\ ['Sample Uniteの選択リスト', ''],
	\ ['> File', 'Unite file'],
	\ ['> Find', 'Unite find'],
	\ ['> Dir', 'Unite direcotry'],
	\ ['> SampleCmd MRUから選択', 'SelectCmd mru']]
let g:scc.mru = [
	\ ['Sample MRUの選択リスト', ''],
	\ ['> ファイルのMRU', 'MRUFile'],
	\ ['> フォルダのMRU', 'MRUDir'],
	\ ['> NetrwのMRU', 'MRUHistory']]

inputlistからinputlistを呼び出すサンプルの実行結果

C言語のリファレンスを探す

Tips

C言語のリファレンスはmanコマンドから参照できる。

printf関数の場合、

# × 見つからない
man printf
# ○ 見つかる(printf関数はセクション3入っている)
man 3 printf
vim-refを使用して表示する場合
Ref man 3 printf


vim内で調べられるので便利。

関数の一部を調べたい場合(

関数名の一部しか分からない場合に使用。(vim-refでやるとエラーになった。)

man -k キーワード

session.vimを使う

Intro

session.vim : Extended session management for Vim
http://www.vim.org/scripts/script.php?script_id=3150

Sessionを保存、起動時にSessionを読み込むことが出来るプラグインの設定
(要は前回の終了時に戻したり、好きな状態に戻せるということ)

[gvim起動時にSessionで復元した画面]

* どうでもいいことだけど、gvimのiconは気分転換に化け猫屋の素材に変えているので違うiconになってます。

Contents

1. PluginをDownloadしてくる
2. 各自のruntimepathの通った場所に放り込む(一般的には、runtimeフォルダ以下?かな)

[g:session_directory]を設定しない場合のデフォルト値は下記のとおり

  • win32 or win64
    • ~\vimfiles\sessions
  • 上記以外
    • ~/.vim/sessions
vimrcで環境設定(iicebar version)

(2010/11/07 AM5:49)動作が気に入らなかったので、終了時の動作を変更できるようにした。

" ↓新規変数を追加
let g:session_directory = "Sessionの保存先" " 設定するかどうかは任意
let g:session_winsize_not_remember = 1 "Windowサイズを覚えない:1 覚える:0
let g:session_vimstartup_columns = 100 "列
let g:session_vimstartup_lines = 50 "行
function! ExitVimFuncSession()
	if g:session_winsize_not_remember == 1
		" 前回終了時のWindowsサイズではなく、幅、高さを固定値で起動する
		execute "set columns=" . expand(g:session_vimstartup_columns)
		execute "set lines="   . expand(g:session_vimstartup_lines)
	endif
	SaveSession
endfunction
command! ExitVimFuncSession call ExitVimFuncSession()

" 引数を指定しなかった時のみ、Sessionを有効にする
if argc() == 0
	" 起動時にSessionを読み込む
	let g:session_autoload = 1
	" Sessionファイル名を聞かず勝手に読み書きする
	let g:session_autosave = 1
	augroup MySession
		" Vim終了時にSassionを保存する
		au VimLeave * ExitVimFuncSession
	augroup END
else
	" 明示的に無効にする
	let g:session_autoload = 0
	let g:session_autosave = 0
endif

これだけで、前回終了時の状態を簡単に復元できる。
また、上記設定だとdefault.vimという名前でSessionが保存される。1つ目のvim起動時はSessionが読み込まれて、2つ目のvim起動時ファイル無しでも読み込まれない。…あれ?矛盾してる。実は既に実装されてて↑の記述で要らないのがあったかもしれない、ちょっと見ておこう…。(2010/11/07 PM17:00)追記

Comment

  • 実は触り始めてまだ30分だけど、良さそうだと思ったのでついカッとなって紹介した。
    (これ書いて修正してるうちに数時間ほど使用してた。)
  • 間違えてる箇所があればご指摘ください。

Repo管理しているpluginをruntimepathに追加する

Intro

github, bitbucketで管理されてるPluginを楽にアップデート/追加/削除する。(vim的な意味で)
頻繁に更新されるので最新同期して、とりあえずコピペしてPluginを更新するとファイルの追加削除があった時に、いらないファイルが残って困りそうなので、Cloneしたディレクトリをruntimepathに追加する。
(Repoのclone方法は、Winならばtortoisehgや、tortoisegitとかで簡単にできる、RepoのCloneについては説明を省略)

Contents

下記のような、ディレクトリ階層を作成する。

Source(vimrc)

簡単に書くと、
1.Plugin毎のディレクトリを指定する。
2.ディレクトリが存在しない場合、runtimepathに追加しない
3.ディレクトリが存在しない場合、Pluginの設定は読み込まない

" runtimepathに追加して、pluginを追加する
" ↓RepoをCloneしているディレクトリを指定
let $PLUGIN_DIR = "D:/works_other/vim_plugin"
let $L9  = expand($PLUGIN_DIR) . "/ns9tks_vim-l9"
let $FUF = expand($PLUGIN_DIR) . "/ns9tks_vim-fuzzyfinder"
" let $NEO = expand($PLUGIN_DIR) . "/shougo_neocomplcache"
" ↑コメントアウトしておけば、isdirectoryのチェックで偽になるので、Pluginは読み込まれない
let $FIR = expand($PLUGIN_DIR) . "/shougo_vimfiler"

" l9
if isdirectory($L9) " ←ディレクトリが見つからない場合、runtimepathに追加されない。
	set runtimepath+=$L9
endif

" FuzzyFinder
if isdirectory($FUF)
	set runtimepath+=$FUF
endi

...省略(↑のような記述を繰り返す)

" vimrcの好きな所に、Plugin毎の設定を書く
" L9 Library
if isdirectory($L9)
	" No Settings
endif

" FuzzyFinder
if isdirectory($FUF)
	let g:fuf_infoFile = expand($LOAD) . "fuf_file.txt"
	let g:fuf_modesDisable = ['']
	let g:fuf_file_exclude = '\v\~$|\.(o|exe|bak|swp)$|(^|[/\\])\.(svn|hg|git|bzr)($|[/\\])'
endif

...省略(↑のような記述を繰り返す)

Comment

  • 目的は達成できた・・・はず。

(気まぐれでfuf.vimをコピペで更新したらL9が必要といわれて焦ったので設定してみた。)

バッチファイル実行後にバルーンを表示させる

Intro

バッチファイル実行後にバルーンを表示させるvimscriptを書いてみました。
以下の機能を持ちます

  • ファイル実行時(バッチファイル)の結果をScratchバッファに出力する
  • 実行終了と同時にバルーンを表示させる

バルーンの表示に、使用したソフトは以下のとおりです。

 ns9log - Balloonly: Windowsでballoon ToolTipを表示するだけのプログラムCommentsAdd Startoton
 http://d.hatena.ne.jp/ns9tks/20091217/1261056787

実行前 実行後
test.batを読み込んでいる状態 バルーンが表示される、Scratchに実行結果を出力
動作環境
  • WindowsXPのみ動作確認(恐らく、他でも動くかと)
  • Scratchコマンドが使えること(Vim - Kaoriya版など)
  • Balloonlyは無くても動作します(バルーンが出ないのみ)
  • バッチファイルは"start"コマンドで実行させています。
導入手順
  1. Balloonlyを入手する
  2. gvim.exeの入っているフォルダにballoonly.exeを入れる
    もしくは、置いた場所にパスを通す
  3. .vimrcに追記か、ファイル名を付けて/pluginフォルダに保存する
  4. テスト用にtest.batを作成する
実行手順
  1. Vimでtest.batを読み込み、設定したキーバインド(デフォルトだと"xx")を実行
  2. 3秒くらいでバルーンが表示して、Scratchバッファに実行結果を出力

Contents

Vimscript Source

.vimrcに以下を追加するか、ファイル名(ex:execbat.vim)を付けて保存して/pluginフォルダにでも配置する

"-----------------------------------------------------------------------------
"   設定
"-----------------------------------------------------------------------------
" 上書き:write, 追記:add
let g:output_buffer_mode  = "add"
" 0 - 30000 msec
let g:exec_batfile_compleate_sec = 5000
" balloで表示させる文字列
let g:exec_batfile_compleate_msg = "Compleate"

" 現在のバッファをstartコマンドで実行する
nnoremap <silent><SPACE>xx :call ExecEndBallo()<CR>
" 補助関数は以下のサイトで掲載されていたものを改変して使用
" http://vimwiki.net/?tips%2F107
"-----------------------------------------------------------------------------
"   補助関数
"-----------------------------------------------------------------------------
" 指定した名前を持つバッファが既に存在するならそこにカーソルを移動。
" 存在しないなら作成。
function! SingletonBuffer(bufnr, split)
	let winlist = FindWindowsByBufnr(a:bufnr)
	if empty(winlist)
		if a:split
			split
		endif
		exe "b " . a:bufnr
	else
		exe winlist[0] . "wincmd w"
	endif
endfunction

" 指定したバッファを含んでいるウィンドウ番号のリストを返す。
function! FindWindowsByBufnr(bufnr)
	return filter(range(1, winnr("$")), 'winbufnr(v:val)==' . a:bufnr)
endfunction

" 上書き:write, 追記:add
let g:output_buffer_mode  = "add"
" 0 - 30000 msec
let g:exec_batfile_compleate_sec = 5000
" balloで表示させる文字列
let g:exec_batfile_compleate_msg = "Compleate"
function! ExecEndBallo()
	" 実行するバッチファイル
	let a:exec_batfile_fullpath = shellescape(expand("%:p"))
	let a:exec_batfile_name = bufname("%")

	if exists("g:output_buffer_bname")
		if (bufexists(g:output_buffer_bname) > 0)
			let a:bufexists_flag = 1
		else
			let a:bufexists_flag = 0
		endif
	else
		let a:bufexists_flag = 0
	endif

	" Buffer Exists
	if (a:bufexists_flag)
		" 存在する場合は、そのバッファを呼び出す
		call SingletonBuffer(g:output_buffer_nr, 1)
	else
		" Scratchバッファ作成
		execute "Scratch"
		let g:output_buffer_bname = bufexists("%")
		let g:output_buffer_nr = bufnr("%")
	endif
	
	if (g:output_buffer_mode == "write")
		" 既存の内容を削除
		execute "%delete"
		let a:position = getpos(".")
	else
		execute "%"
		let a:position = getpos(".")
	endif

	execute "r!echo /--------------------------------------------/"
	execute "r!echo / Exec File   : " . a:exec_batfile_name
	execute "r!echo / Exec Full   : " . a:exec_batfile_fullpath
	execute "r!echo / Output Date : " . strftime("%Y/%m/%d %H:%M:%S")
	execute "r!echo /--------------------------------------------/"
	execute "r!echo /--------------------------------------------/"
	execute "r!echo / Start Execute                              /"
	execute "r!echo /--------------------------------------------/"

	" 標準出力を読み込み
	execute "r!" . a:exec_batfile_fullpath
	
	if (executable("balloonly.exe"))
		execute '!start balloonly.exe '
					\ . g:exec_batfile_compleate_sec . ' "' 
					\ . a:exec_batfile_name . '" "'
					\. g:exec_batfile_compleate_msg .'"'
	endif

	execute "r!echo /--------------------------------------------/"
	execute "r!echo / End Execute                                /"
	execute "r!echo /--------------------------------------------/"
	
	"実行開始位置に戻る
	call setpos(".", a:position)
endfunction
BAT File

test.batとして、以下を好きな場所に保存する
(実行終了まで3秒くらい時間がかかるバッチファイル)

@echo off
rem 以下を参考にtest.batを作成した
rem http://trash-area.com/archives/219
echo testプログラム
cd "C:\"
ping localhost -n 2 > nul
ping localhost -n 2 > nul
ping localhost -n 2 > nul
dir /a

Comment

  • 調べてもバッファの操作する関数が上手く見つけられない
  • 内部コマンドの実行結果をバッファに出力するやり方がこれしか分からなかった(r!echo 内容)
    もっと良いやり方がある気がする
  • vimscriptで頑張らなくてもバッチファイルの最後尾にballoonly.exeを書くだけでも、バルーンは表示できる
  • bitbucketにソースファイル挙げようと思ったけど、まだ色々悩ましい部分が実はあるのでひとまずソース丸ごと掲載して公開
    まだ完成というより、"動いた!!"という感じでもっと煮詰めたい部分があったり。