Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all 5692 articles
Browse latest View live

#でコメントアウトする言語で勝手にインデントが行頭に移動されるのを防ぐ(vim)

$
0
0

ネットで調べても出てなさそうなので

pythonとかrubyとか#でコメントアウトする言語を書いてるときに勝手にインデントが解除される現象があっていらいらしていた。

解決策

setlocalnosmartindent

この1行を該当のファイルタイプのftpluginに追加。

例えばpythonだとruntimepathのftplugin/python.vimにこの1行を追記すればいい。

よくわからなかったら適当なフォルダに作っておいて.vimrc

setruntimepath+={適当なフォルダ}

と書けばいい。

蛇足

smartindentはC Likeな言語においてそれっぽく自動でインデントしてくれるという機能。

その中に#で始まる行をインデントできないようにするというのがあり、多分それが原因になっていると思う。

cinoptionsで細かく挙動を制御できるけど、インデントを維持するという設定はできないっぽい。

それでsmartindentを切ってやれば解決するんじゃね?と思った次第。


Visual Operator メモ / Vim

$
0
0

Visual Operator 開始キー

・v
選択

・c
書き換え

・d
削除

Visual Operator

・iw
inner word
1単語

・iW
inner Word
次の空白まで

・is
inner sentence
1文

・ip
inner paragraph
1段落

・it
inner <tag>.*</tag>
1タグの中身

・i<記号>
inner <記号>
<記号>で囲まれた中身

先頭のiをaに変えると、全体になる。
(例)"hoge" -> viw: hoge, vaw: "hoge"

Vim日本語チートシート作った

$
0
0

先人のvimmer様が作ったチートシートはUS配列の図か、
日本語化されたものでもコマンドの羅列のみの物が多かったので、
JIS配列+日本語表記のvimチートシート作りました。

まずはテンプレート作成

世界一有名であろうこの図を元に作成する。
vi-vim-cheat-sheet.gif

幸いなことにこの図をJIS配列化しているVimmerの方が居たので、
JIS配列化されているものを使用する。
vim_cheetSheet1-2.gif

そして英語説明部分を切り取ったものがこちら。
vimチートシートJIS配列.png

日本語化

まっさらな状態のJIS配列表にキー説明を書き込んでいく。
記入例.png

最後に自分用のメモ書きを書き込んで完成!
オレオレチートシート.png

キーマッピングを独自に変えててこのままじゃ使えないよ!という先輩Vimmer様はまっさらな状態の物から自分専用チートシートを作ってください!
(間違っている箇所があればご指摘ください!)

NerdTreeでdotfileを表示させる設定

$
0
0

概要

NERDTreeを使用する際、dotfileが表示されるようにしてみた。

前提条件

vimと
NERDTreeをインストールしていること。

設定方法

.vimrc
let NERDTreeShowHidden=1

.vimrcに一行追加するだけ

変更前後の比較

カレントディレクトリにdotfileが複数ある状態でNERDTreeを開く。
スクリーンショット 2018-01-07 16.59.12.png

変更前

通常状態で開くと、dotfileが表示されない。
(ユーザ名は黒く塗りつぶしてます。)
スクリーンショット 2018-01-07 17.00.47.png

変更後

設定すると、dotfileが表示される。
スクリーンショット 2018-01-07 17.02.55.png

参考

https://github.com/scrooloose/nerdtree

Kaoriya版Vim で migemo を使えるようにした時の覚書

$
0
0

Migemoのインストール

migemo はIMEを介さずに日本語を検索できる非常に便利な機能です。
導入の際、いくつかハマった箇所があったため、メモとして記載します。

インストール手順

Kaoriya版Vim さんの構築した vim バージョン8.0 64bit版での例となります。

1. C/Migemo のダウンロード

[Koronさんのサイト]”(https://www.kaoriya.net/software/cmigemo/)から C/Migemo をダウンロードする

2. migemo.dll を gvim.exe の置いてある場所にコピーする

アーカイブを展開し、migemo.dll を gvim.exe と同じ場所にコピーする
(私の場合 \vim80-kaoriya-win64 の直下)

3. migemo.vim を runtimepath の通っているディレクトリにコピーする

runtimepath は ':set runtimepath?' で確認ができます。
(私の構成では \vim80-kaoriya-win64\vim80 以下に置きました)

4. 辞書をコピーする

アーカイブのdict以下をコピーする
(私の構成では \vim80-kaoriya-win64 直下に置きました)

5. _vimrcに以下の記載して完了

辞書と場所を指定します。
'g/' でmigemoでの検索ができます。
(ここでは '/'キーで検索できるように 'g/'をリマップしています。)

set incsearch
if has("migemo")
    set migemo
    set migemodict=$VIM\dict\cp932\migemo-dict
    nnoremap / g/
endif

vim環境を入れてみた(※編集中)

$
0
0

経緯

今までエディタへの興味は特になかったのですが、とある場所で、
「すごいエンジニアというものは必ず開発の環境への愛を持っている」という話を聞きまして
鵜呑みにした私がまず注目したのがエディタ。
普段はサクラエディタを使っていたのですが、いろいろ調べるうちにVimなるエディタが人気だと知り、
人気があるからにはよいものだろうと早速使ってみることにしました。

手順

(環境:Windows10の場合)
①下記URLからVimをダウンロード
https://www.kaoriya.net/software/vim/

②上記URL内「その他」からvimdoc-ja「Vimドキュメント翻訳プロジェクト on github」
を参考

Kaoriya版Vim で migemo を使えるようにした時の覚書

$
0
0

Migemoのインストール

migemo はIMEを介さずに日本語を検索できる非常に便利な機能です。
導入の際、いくつかハマった箇所があったため、メモとして記載します。

インストール手順

Kaoriya版Vim さんの構築した vim バージョン8.0 64bit版での例となります。

1. C/Migemo のダウンロード

[Koronさんのサイト]”(https://www.kaoriya.net/software/cmigemo/)から C/Migemo をダウンロードする

2. migemo.dll を gvim.exe の置いてある場所にコピーする

アーカイブを展開し、migemo.dll を gvim.exe と同じ場所にコピーする
(私の場合 \vim80-kaoriya-win64 の直下)

3. migemo.vim を runtimepath の通っているディレクトリにコピーする

runtimepath は ':set runtimepath?' で確認ができます。
(私の構成では \vim80-kaoriya-win64\vim80 以下に置きました)

4. 辞書をコピーする

アーカイブのdict以下をコピーする
(私の構成では \vim80-kaoriya-win64 直下に置きました)

5. _vimrcに以下の記載して完了

辞書と場所を指定します。
'g/' でmigemoでの検索ができます。
(ここでは '/'キーで検索できるように 'g/'をリマップしています。)

set incsearch
if has("migemo")
    set migemo
    set migemodict=$VIM\dict\cp932\migemo-dict
    nnoremap / g/
endif

Vim/Viの終了のさせ方

$
0
0

設定ファイルを編集する際に普段使わないvimやviを開いて修正したけど、vim/viからターミナルに戻れない。
そんなときにvim/vi(以降vimとだけ表記)の終了の仕方

まずはエスケープキー【Esc】を押す

これでVimをニュートラルなモードにしてコマンド入力できるようにする

終了コマンドをコマンドを入力する

画面左下に入力中のコマンドが表示されるはずだ

保存済みのファイルを開いているvimから抜ける場合

:q

ファイルを保存しないでvimを抜ける場合

:q!

ファイルを保存してからvimを抜ける場合

:wq

vimでテンプレートを使う

$
0
0

vimにだいぶ慣れてきたので、カスタマイズしたくなってきた。
その過程で得た知識の理解を深めるためにまとめた。

動機

visual studioやandroid studioではプロジェクトを作るときにテンプレートを入力した状態にしてくれる。
これをvimでもやりたかった。
htmlやtexを書くとき、いつも同じ内容をはじめに入力していることに気づいたため、それを自動化したかった。

template

まず、テンプレートを用意する。
今回はhtml, texのテンプレートを用意した。
テンプレートは$VIMの下に新たにtemplateディレクトリを作ってその下に入れた。
tex templete: $VIM/template/t.tex
\documentclass{jarticle}
\usepackage{graphicx}
\title{}
\author{}
\begin{document}
\maketitle
\section{}
\section{}
\section{}
\begin{thebibliography}{99}
\bibitem{book1}
\bibitem{book2}
\end{thebibliography}
\end{document}

html template: $VIM/template/t.html
<!DOCTYPE html>
<html>
<head>
<mata charset="utf-8">
<link rel="stylesheet" href="style.css" type="text/css" charset="utf-8">
<title></title>
</head>
<body>
</body>
</html>

vimrc

次に上で作ったテンプレートをファイルを新たに作成したときのみ、挿入するように設定する。
vimrc: $VIM/vimrc
augroup templateGroup
autocmd!
autocmd BufNewFile *.html :0r $VIM/template/t.html
autocmd BufNewFile *.tex :0r $VIM/template/t.tex
augroup END

autocmdはvimrcが複数回読み込まれたときに、上書きされずに追加されていくのでautocmd!で再度読み込み時にいったんautocmdの設定を削除しています。
また、autogroupを設定することでautocmd!で再読み込み時に他のantocmdの設定が知らないうちに削除されないようにしています。pluginでautocmdを使っていた場合に影響が出ないようにするためにしたほうがよいと思っています。

BufNewFileは存在しないファイルの編集を開始したときを意味しています。ここを変えることで後ろのコマンドの実行タイミングが変わります。
例えば、QuitePreにすると:quiteを使ったときに実行されるようになるのでここでコンパイルやテストを行う外部コマンドを実行するように指定するというようなことが考えられます。
詳しくはvimのドキュメントに書かれています。

次はvimにデフォルトである補完の設定をしたいです。
目標はkaoriyaさんのスパルタンVIMです。

ale.vimを通して、PSR-2での静的解析を行う

$
0
0

概要

こちらの記事のale版です。
https://qiita.com/hidelafoglia/items/7f42b83788acab9a60ba

aleというvimの非同期lintプラグイン上で、
PHP_CodeSnifferというPHPのコード静的解析チェッカーを通す。
そのときのコーディング規約を「PSR-2」とします。

前提条件

下記インストール済み

  • vim
  • ale.vim
  • PHP_CodeSniffer

設定

説明

通常状態だと、aleから、phpcs(PHP_CodeSnifferを呼び出すコマンド)を呼び出してくれないことがあるので、.vimrcでパスを指定。
また、phpcsは複数のコーディング規約でチェックすることが出来るため、どの規約でチェックさせるのかを.vimrcで設定しなければならない。

phpcs確認

zsh
まず、phpcsがどこにあるか確認して下さい。
pearで入れているとこんな感じになります。

$ which phpcs
/Users/ユーザ名/pear/bin/phpcs

次に、現在インストール済みのphpcsが使えるコーディング規約を確認して下さい。

$ phpcs -i
The installed coding standards are MySource, PEAR, PSR1, PSR2, Squiz and Zend

PSR2がなければ、アップデートお願いします。

.vimrc設定

.vimrc
" 今回はglobal設定を想定します。
" phpで使うチェッカーの種類を指定
" デフォルト設定だと、phpcs以外のチェッカーも動いてしまいます。
let g:ale_linters                  = {
\    'php': ['phpcs'],
\}
" phpcsコマンドの設定
" どこからphpcsを実行するのか。
" which phpcsの結果を入れます。
let g:ale_php_phpcs_executable = '/Users/ユーザ名/pear/bin/phpcs'
" コーディング規約の指定
" phpcs -i で返ってきた値を使えます。
let g:ale_php_phpcs_standard = 'PSR2'
" グローバルで設定する
let g:ale_php_phpcs_use_global = 1

動作確認

PSR2

スクリーンショット 2018-01-10 16.04.00.png

PSR2.Classesから呼び出されている!

PEAR

.vimrc
let g:ale_php_phpcs_standard = 'PEAR'

に切り替えて、PEARになるのか動作確認

スクリーンショット 2018-01-10 16.06.40.png

PEAR.Classesから呼び出されている!

参考

ale/doc/ale-php.txt
https://github.com/w0rp/ale/blob/7086586b1776d2b5f3bf87a7f0c25595a5d7e1b0/doc/ale-php.txt

今更ながらvimチートシート

$
0
0

私家版 Vim標準キーバインド表

基本的なキーバインドは指が覚えているが、たまに使いたいうろ覚えのvimキーバインドについての覚書です。
モーションや繰り返し回数Nの説明は省き、対となる機能はまとめて1つにしました。
完全な解説はこちらです→ http://vim-jp.org/vimdoc-ja/vimindex.html
わからないキーバインドは :h キーバインドで調べましょう。

ファイル選択、表示分割、タブ分割

insertnormal機能
***:hヘルプファイルを開く
***:e {file}ファイルを開く
***gf/gFカーソル位置の文字列をファイル名/ファイル名+行番号として開く
***:r {file}ファイルを読み込む
***:r! {command}コマンド出力を読み込む
***:w {file}ファイルを上書きする
***:sp {file}画面を上下分割して別のファイルを開く (vim -o files..)
***CTRL-WJ/WK分割画面の上/下へ切り替える
***:vsp {file}画面を左右分割して別のファイルを開く
***CTRL-WH/WL分割画面の左/右へ切り替える
***:tabe {file}タブを追加して別のファイルを開く (vim -p files..)
***gt/gT次/前のタブへ切り替える
***ZZ変更を保存して現在のファイルを閉じる
***ZQ / :q!変更を捨てて現在のファイルを閉じる
***:qa!変更を捨てて全てのファイルを閉じる

入力、削除、ヤンク

insertnormal機能
***i/I現在位置直前/現在行頭にてinsertモードに入る.
***a/A現在位置直後/現在行末にてinsertモードに入る
***o/O現在行直後/現在行直前に新規行を設けてinsertモードに入る
***r現在位置N文字を1入力文字で上書きする
***R現在位置にて上書きinsertモードに入る
***s/cw/cb/C/cc現在位置にてN文字/単語/単語先頭/行末/行全体を削除してinsertモードに入る
ESC***insertモードを抜けて、入力内容をN回分挿入する.
CTRL-C***insertモードを抜ける
CTRL-O***normalモードで1コマンド実行する
CTRL-E/Y***1行下/上の文字を現在行に入力する
CTRL-U***現在行の入力文字を削除する
CTRL-Wdb現在位置から単語先頭までを削除する
Deletex現在位置のN文字を削除する
***D現在位置から行末まで削除する
***J現在行からN行を連結する
***dd現在行からN行を削除する
***dw/de現在位置からN単語/単語末までを削除する
***yy現在行からN行をヤンクする
***yw/ye現在位置からN単語/単語末までをヤンクする
***P/p現在位置の直前/直後へ貼り付ける

インデント、補完入力、Undo

insertnormal機能
CTRL-D/T<</>>インデントを減らす/増やす
0 CTRL-D***インデントを無くす
***==自動インデントする
CTRL-N/P***カーソル前方/後方にある単語で補完入力する
CTRL-XO***オムニ補完入力する
CTRL-XL***行全体を補完入力する
***u/CTRL-RUndo/Redo
***U現在行を編集開始時点の内容に戻す
***~カーソル位置の大文字小文字を切り替える
***guw/gUw単語を小文字化する/大文字化する
***CTRL-Xカーソル上の数値文字列を減算する
***.直前の変更操作を繰り返す

クリップボード操作

insertvisual機能
SHIFT-Insert現在位置へクリップボードから貼り付ける
CTRL-Insert現在選択テキストへクリップボードへコピーする
CTRL-Delete現在選択テキストへクリップボードへカットする

カーソル移動

insertnormal機能
←/→h/l1文字左/右へ移動する
SHIFT-←/→b/w1単語左/右へ移動する
e単語末尾文字へ移動する
***F{c}/f{c}左/右の 文字 {c} へ移動する
***T{c}/t{c}左/右の 文字 {c} の直前へ移動する
***;直前のf/t/F/T移動操作を同方向へ繰り返す
***,直前のf/t/F/T移動操作を逆方向へ繰り返す
Home/End0/$行頭/行末へ移動する
↑/↓k/j1行上/下へ移動する
SHIFT-↑/↓1ページ進む/戻る
PageDown/UpCTRL-F/B1ページ進む/戻る
***CTRL-D/U半ページ進む/戻る
CTRL-XE/XYCTRL-E/YN行上/下方向スクロール
***gg/GファイルN行目/ファイル末尾行にカーソルを移動する
***(/)/{/}文頭/文末/節頭/節末にカーソルを移動する
***M/H/L画面中央/先頭/末尾にカーソルを移動する
***zz/zt/zb現在行を画面中央/先頭/末尾にして再表示する
***gd/gDカーソル位置の単語の定義を関数内/ファイル内で探してカーソルを移動する
***[Iカーソル位置の単語を含む行を一覧表示する
***CTRL-]/Tカーソル位置の単語をタグジャンプする/タグリストに沿って戻る
***g;/g,変更リストに沿って進む/戻る
***CTRL-I/Oジャンプリストに沿って進む/戻る
***%カーソル右にある括弧の対位置へ移動する
***CTRL-gファイル内の現在位置をステータス表示する

検索置換

insertnormal機能
***:s/{pat}/{to}/{flag}文字列置き換え
***&再度置き換え
***?{pat}後方(先頭)へ検索する
***/{pat}前方(末尾)へ検索する
****/#カーソル位置の単語を前方/後方検索する
***n/N同方向へ再検索する/逆方向へ再検索する

vaffleのキーマップの追加

$
0
0

概要

矢印でも移動したくなった時の設定

内容

:h vaffle-examplesにサンプルはありましたが、通常時にも反映されてしまうので、少し改良。

function! s:customize_vaffle_mappings() abort
        nmap <buffer><silent><Left><Plug>(vaffle-open-parent)
        nmap <buffer><silent><Right><Plug>(vaffle-open-current)endfunction
    augroup vimrc_vaffle
        autocmd!
        autocmd FileType vaffle call s:customize_vaffle_mappings()
    augroup END

mattn/memo の Denite source を作った

$
0
0

最近ずっと Denite をいじっております。こいつは Unite の後継だけあって大した時間泥棒プラグインですね! いくらでもカスタム可能なので際限なく設定に凝ることが出来ます。Unite と違って Python で拡張が書けるのでなおさらです。

今回はいつも利用させていただいてます、mattn/memoの source を書いてみました。これはリンク先を見るとわかるとおり、メモを取るためのツールなのですが、本来はターミナルから起動してメモを作成/検索するためのものです。ターミナルからメモを作成/検索するのは簡単なんですが、一度作成したメモを Vim 上から検索したりするのが難しかったんですよね。これを簡単にしてみました。

vim-denite-memo

こんな感じです。インストール方法などは README を参照してください。以下の機能が利用できます。

" List up all memos:Denite memo" List up all memos or create a new one:Denite memo memo:new" Search memo:Denite memo/grep" Search memo interactively:Denite memo/grep::!

特に最後の、「memo のインクリメンタル検索」が欲しくて作ったようなものです。同じ事は peco の --exec オプションを使えばできるのですが、Vim 上でやることに意味があるのです!多分!

以下、vim-go に unite/denite source を作って contribute した話 - Qiitaの続きのような内容ですが、開発中に気をつけた点についてまとめておきます。

memo 一覧を非同期に読み込む

grep sourceが非常に参考になりました。通常は一度だけ呼ばれて候補を返す gather_candidatesメソッドですが、context['is_async'] = Trueにしておくと Denite が繰り返し呼んでくれるようになります。

内部では Popen.communicate メソッドを使って 0.01 秒ごと(async_timeoutオプションで変更可能)に結果を返すようにしています。gather_candidatesから処理が戻る度に逐次表示も更新されます。

気をつけなければいけないのは、候補を出し尽くした後は context['is_async'] = Falseにしないと永遠に待ち続けてしまうことです。

# 省略しています。詳しくはソースを見てください。defgather_candidates(self,context):ifcontext['__proc']:returnself.__async_gather_candidates(context,0.01)# process.Process は subprocess.Popen のラッパーです。context['__proc']=process.Process(['memo','list'],context,context['path'])returnself.__async_gather_candidates(context,0.01)def__async_gather_candidates(self,context,timeout):# エラー処理は省略outs,errs=context['__proc'].communicate(timeout=timeout)# eof に到達したら完了context['is_async']=notcontext['__proc'].eof()# ここで出力結果をごにょごにょして候補を作るreturncandidates

タイトルを全角○文字に切り詰める

memo コマンドはターミナルで起動したとき「ファイル名 : タイトル」のように一覧を表示してくれるのですが、長すぎるファイル名は適当にちょん切ってくれます。これを Denite 上で再現するのは結構骨でした。どんな言語でも環境でもそうですが、文字列の「全角○文字詰め」って厄介なんですよねー。

Vim の場合さらに 'ambiwidth'というオプションがありまして、設定によっては同じ文字が半角だったり全角だったりします。strwidth()という関数を使うと「'ambiwidth'オプションを考慮した文字幅」が得られます。

ホントは「'ambiwidth'オプションを考慮した文字数にカットしてくれる関数」が欲しかったのですが、そういうものは Vim には無いようです。しょうがないので地道にループ廻して一文字ずつカウントしています。

# なんか Python っぽくないコードになった……。i=0whileTrue:char=string[i:i+1]next_r=result+char# Denite の便利メソッドを使うと Vim の関数が簡単に呼べますnlen=self.vim.funcs.strwidth(next_r)ifnlen>col-3:rlen=self.vim.funcs.strwidth(result)returnresult+('....'ifrlen<col-3else'...')elifnlen==col-3:returnnext_r+'...'result=next_ri+=1

他の source を継承して source を作る

memo/grep source は grep source を継承して、ロジックをそのまま使っています。継承のためにモジュールを import するには相対パスを使うと簡単です。

memo_grep.py
from.grepimportSourceasGrep# grep source を継承して必要な情報だけ上書きするclassSource(Grep):def__init__(self,vim):super().__init__(vim)self.name='memo/grep'

最初同様のロジックを見たとき、「同じディレクトリに grep.pyなんて存在しないのに、なんでこれでいいの?」って思ったのですが、これは Denite のコードに秘密がありました。denite.load_sourcesというメソッドで 'runtimepath'内にある全ての source を動的に読み込んでいるんですね。grep.pyは標準添付の source ですので import 出来た訳です。

さらに memo_grep.pyでは同じディレクトリにある memo.pyをも import しています。これは memo.pymemo_grep.pyより先に読み込まれていることを期待しているので少々 hacky です。

memo_grep.py
# memo.py は先に読み込まれているはずfrom.memoimportMemo,CommandNotFoundError

他の kind を継承して kind を作る

「候補を列挙する」ものが source なら「選択した候補で何かする」のが kind です。今回の memo source による各の候補は単なるファイルと異なりませんから file kind を継承して作れば良さそうです。

from.fileimportKindasFileclassKind(File):def__init__(self,vim):super().__init__(vim)self.name='memo'

source の時と一緒ですね。今回は memo を開くための open action だけを上書きしています。ホントは memo を削除する action も追加しようと思ったのですが、それは file kind の方に追加した方が良さそうです。


以上です。特に is_asyncオプションで簡単に候補の非同期読み込みができるのがいい感じです。Vim だって job/channel による非同期実行は可能になりましたが、やっぱり Python 使えると楽ですねえ。

Xcoce に XVim2 をインストール

$
0
0

Qiita 初投稿です。よろしくお願いします。

愛用していた MacBookPro が壊れて、最近 MacBook に変えたんですが、Xcode の環境構築の際に XVim 入れようとして一筋縄では行かなかったので書いておきます。

環境
MacBook (Retina, 12-inch, 2017)
macOS High Sierra バージョン 10.13.1
Xcode Version 9.2

同じ症状で困っている人の参考になってくれれば幸いです。

まず、Xcode 9.x 以上では XVim2 を使えって何人かの方が書いていたので、Xvim2 を落としきます。
証明書もキーチェーンで作成して、

sudo codesign -f -s XcodeSigner /Applications/Xcode.app

を実行。
この辺りは、README にも書いてありますし、参考になる記事がいっぱいあります。

ここから本題なのですが、いざ make すると。


The domain/default pair of (/Library/Developer/CommandLineTools/../Info, DVTPlugInCompatibilityUUID) does not exist

The domain/default pair of (/Library/Developer/CommandLineTools/../Info, CFBundleShortVersionString) does not exist

のメッセージが出て make が動いていないっぽかった。
(XVim も試したのですが、同様)

結論から行ってしまうと、この記事 Github "Getting the error The domain/default pair of (/Library/Developer/CommandLineTools/../Info..."の通りにやれば動きました。

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

の後で make すれば良いです。

xcode-select は知らなかったので、後日調べて何か解ったら追記します。

Vim script でクラスベースオブジェクト指向言語の継承っぽいことをする

$
0
0

Vim 8.0 からの Vim script が以前とは比べ物にならないほど便利なのでプラグインを書くのがはかどります。書く上でいい感じの書き方などを模索していて、いまクラスベースオブジェクト指向言語っぽくできないかといろいろ遊んでいます。具体的に言うとまあ、Python なんですけど、正直 Python も Vim script の100分の1も書いてないのであやふやかも。

まず、クラスはスクリプトローカルな辞書変数を作ってメソッドを生やすことで代替します。コンストラクタは同名のスクリプトローカル関数を定義することにしましょう。 Vim script では変数と関数は別のテーブルにのるらしいのでたぶん大丈夫。

" Foo クラスlet s:Foo = {
  \ 'key1': 'value1',
  \ }" Foo クラスのメソッドfunction! s:Foo.echo() abortechomsg'foo'endfunction" Foo クラスのコンストラクタfunction! s:Foo() abortreturn deepcopy(s:Foo)endfunction

次にこの Fooクラスを継承する Barクラスを作ります。

" Bar クラスlet s:Bar = {
  \ 'key2': 'value2',
  \ }" Bar クラスのメソッドfunction! s:Bar.echo() abortechomsg'bar'endfunction

継承には専用の関数を用意します。

" 継承用の関数function! s:inherit(subname, supername, args) abortlet super =call('s:' . a:supername,a:args)let sub = deepcopy(s:[a:subname])call extend(sub, super,'keep')let sub.__SUPER__ = {}for [key,l:Val] in items(super)if type(l:Val)==v:t_func ||key==# '__SUPER__'let sub.__SUPER__[key] =l:Valendifendforreturn subendfunction

ちょっと読みにくい感じですが、親クラスのコンストラクタを呼び、子クラスのもととなる辞書のコピーに extend()しているだけです。親クラスのメソッドの関数参照は適当なところに保存しておきます。さて、この s:inherit()関数を子クラスのコンストラクタで呼ぶことを継承と称することにしましょう。

" Bar クラスのコンストラクタfunction! s:Bar() abortreturn s:inherit('Bar','Foo', [])endfunction

動かしてみます

let s:foo = s:Foo()let s:bar = s:Bar()call s:foo.echo()" foocall s:bar.echo()" bar

いいかんじですね。さらに Barクラスをつかってその親クラスのメソッドを呼びたい場合もあるかもしれません。これにも挑戦してみましょう。

" 親クラスのメソッドを呼ぶための関数function! s:super(sub, ...) abortif!has_key(a:sub,'__SUPER__')return {}endiflet level = max([get(a:000,0,1),1])let supermethods =a:subforiin range(level)let supermethods = supermethods.__SUPER__endforlet super = {}for [key,l:Val] in items(supermethods)if type(l:Val)==v:t_funclet super[key] =function('s:supercall', [a:sub,l:Val])endifendforreturn superendfunctionfunction! s:supercall(sub, Funcref, ...) abortreturncall(a:Funcref,a:000,a:sub)endfunction

この s:super()関数を使うことで親クラスのメソッドを呼び出せます。

call s:super(s:bar).echo()" foo

たぶん親クラスの親クラスとかも行けるはず。

  • 書いたものの全体
" Foo クラスlet s:Foo = {
  \ 'key1': 'value1',
  \ }" Foo クラスのメソッドfunction! s:Foo.echo() abortechomsg'foo'endfunction" Foo クラスのコンストラクタfunction! s:Foo() abortreturn deepcopy(s:Foo)endfunction" Bar クラスlet s:Bar = {
  \ 'key2': 'value2',
  \ }" Bar クラスのメソッドfunction! s:Bar.echo() abortechomsg'bar'endfunction" Bar クラスのコンストラクタfunction! s:Bar() abortreturn s:inherit('Bar','Foo', [])endfunction" 継承用の関数function! s:inherit(subname, supername, args) abortlet super =call('s:' . a:supername,a:args)let sub = deepcopy(s:[a:subname])call extend(sub, super,'keep')let sub.__SUPER__ = {}for [key,l:Val] in items(super)if type(l:Val)==v:t_func ||key==# '__SUPER__'let sub.__SUPER__[key] =l:Valendifendforreturn subendfunction" 親クラスのメソッドを呼ぶための関数function! s:super(sub, ...) abortif!has_key(a:sub,'__SUPER__')return {}endiflet level = max([get(a:000,0,1),1])let supermethods =a:subforiin range(level)let supermethods = supermethods.__SUPER__endforlet super = {}for [key,l:Val] in items(supermethods)if type(l:Val)==v:t_funclet super[key] =function('s:supercall', [a:sub,l:Val])endifendforreturn superendfunctionfunction! s:supercall(sub, Funcref, ...) abortreturncall(a:Funcref,a:000,a:sub)endfunctionlet s:foo = s:Foo()let s:bar = s:Bar()call s:foo.echo()" foocall s:bar.echo()" barcall s:super(s:bar).echo()" foo

ファイルに保存して :sourceコマンドで読み込むと動きます。普段 matlab とか Fortran とかみたいな手続き型っぽい言語しか書かないのでなんか勘違いしてるかも。コメント欄でやんややんやしてください。


1つのvimrcをWindows/Linux/Macで使えるようにしよう!

$
0
0

全国1億2千万人のVimファンのみなさま、こんにちは。
今回は1つのvimrcをOSやvimのバージョンが違う場合にも、
エラーが発生しないで起動できるようにする設定方法をご紹介します。

OS別の設定記載方法

if has("mac")
    " mac用の設定
elseif has("unix")
    " unix固有の設定
elseif has("win64")
    " 64bit_windows固有の設定
elseif has("win32unix")
    " Cygwin固有の設定
elseif has("win32")
    " 32bit_windows固有の設定
endif

こちらは鉄板ですが、OS別設定の記載方法です。
vimrcでは、if has("OS名")を使用することで、指定したOSのみに適応する設定を記載することができます。

環境別の設定記載方法

if ( has ('python') || has('python3') )
    " python が必要な設定をここに書く
else
    " python がないときの設定
endif
if has('lua')
    " lua が必要な設定
else
    " lua がないときの必要な設定
endif

こちらは、上記のOS別設定の応用版です。
if has("依存関係名")を使用することで、
Vimインストール時に、有効化されているオプションの依存関係別に設定することが可能です。
現在自分がインストールされているVimの有効化されているオプションが知りたい場合は、
vim --versionで。

Vimバージョン別の設定記載方法

Vimのバージョンによっては、未実装の機能があったりします。
例えば、バージョン8.0以下のVimのvimrcにset breakindentがあった場合、
起動時にエラーが表示されます。
これでは、非常に使いづらいので、
「バージョン8.0のVimのみbreakindentを有効化する」という書き方にします。

if v:version >= 800|set breakindent|endif

上記の書き方で、実現することが可能です。

他にも、vimにはcryptmethodというファイル暗号化機能があり、
既定値は一番古い暗号化方式であるzipなんですが、
vimバージョン7.4からは、暗号化方式にblowfish2が追加されています。

if v:version >= 704 | set cm=blowfish2 | elseif | set cm=zip | endif

上記をvimrcに記載することで、
「Vimのバージョンが7.4以上の場合は暗号化方式にblowfish2を使い、7.4以下の場合は暗号化方式にzipを使う」
なんて設定もできてしまいます。

おわりに

上記3種の設定を行うことで、Vim起動時のOS違い、依存関係、バージョン違いのエラー表示を防ぐことができます。
せっかくマルチプラットフォームで使えるエディタを使っているんだし、OS毎にvimrcを用意するのではなく、1つのvimrcで完結したいですよね。

VimキーバインドまとめとAtom, Jupyter, ChromeにおけるVimキーバインド

$
0
0

テキストエディタVimの効率的なキーバインドは、他のテキストエディタやJupyter、Webブラウザといったさまざまな環境で使えます。つまり、Vim自体を使わなくても、Vimキーバインドを学ぶことで作業を効率化できます。

この記事では、まずVimのキーバインドについてまとめます。そして具体的に、

  • テキストエディタAtom
  • インタラクティブコーディング環境Jupyter NotebookおよびJupyter Lab
  • WebブラウザChrome

におけるVimキーバインドについて見ていきます。各内容は独立しているので、興味があるところだけお読み下さい。

※以下で出てくる<C-{key}>, <S-{key}>, <A-{key}>という表記は、それぞれCtrl+key, Shift+key, Alt+keyのことです。例えば、<C-r>はCtrl+rのことです。

目次

参考文献

help - Vim日本語ドキュメント


Vimについて

テキストエディタ概観

テキストをよく編集する人たちにとって、テキストエディタ選びは作業の生産性を大きく左右する重要なファクターだ。世の中には色んなテキストエディタがある。手軽に使える有名どころとしては、TeraPad、サクラエディタ、秀丸エディタ、Notepad++、miなどがある。一方で、テキスト編集作業の概念をうまく抽象化して構造化することによって、慣れるのに時間がかかるものの、とても効率的に複雑な作業ができるエディタがある。それがEmacsとVimだ。どちらにも熱烈な愛好者たちがいて、とくに狂信的な愛好者たちはエディタ戦争と呼ばれる宗教戦争に日々馳せ参じている。

  • Emacs上で作られ、Vimのキーバインドを使えるようにしたりとEmacsを色々改良したSpacemacs (2014) というエディタも良さそう
    (参考:spacemacsについて ~~spacemacsが最強で最高で神エディタであると思い始めた件~~

  • Vimをリファクタリングして改良しようとするNeovimというプロジェクトも2014年から走っている

  • 現代的なエディタとしては、Sublime Text (2008), GitHub社のAtom (2014), Microsoft社のVisual Studio Code (2015) などがある

  • 大規模なソフトウェア開発においては、テキストエディタよりもIDE(Integrated Development Environment, 統合開発環境)を使うほうが良いと思う。IDEとしては、JetBrains社のものや、Eclipse、Visual Studioなどがよく知られている。PythonではPyCharmが人気だ

Vimの特徴

Vimの特徴としては、モードの概念、コマンドの構造化、独自のスクリプト言語による高度なカスタマイズ、が挙げられると思う。

ただの文字入力じゃない高度な操作をする命令(コマンド)の入力は、何らかの方法で通常の文字入力と区別する必要がある。多くのテキストエディタでは、CtrlやAlt, Shiftといった装飾キーと同時に文字キーを押すことでコマンドを入力して、文字入力と区別している。一方Vimでは、モードと呼ばれる状態の概念を導入して、今どのモードにいるかによって文字入力とコマンド入力を切り替える方式を採っている。(ロラン・バルトが言うモードとはたぶん関係ない。)

また、Vimではコマンドはうまく構造化されていて、コマンドを部品として組み合わせて複雑なコマンドを作れる。例えば、作用内容と作用対象の概念は分離されていて、動詞+目的語のような文法構造を取っている。他にも、自然数でコマンドを定数倍したりできる。

このモードの概念とコマンドの構造化はとても強力なので、Vimのキーバインドは元の実装を離れて、さまざまな環境において有志達の手によって実装されている(感謝!)。

~/.vimrcファイルにVimScriptと呼ばれる独自のスクリプト言語で詳細設定を書いてカスタマイズする機能もVimの大きな特徴だ。Vimの熟練者達はみな、自分だけの最強のvimrcファイルを育てているらしい。けれどVim以外の環境ではさすがにそこまでは実装されてないので、この記事ではあまり立ち入らないことにする。

Vimの学習方法

何も知らない状態からは、まずvimtutorというチュートリアルを一通りやるのが一番よいと思う。日本語化もされてる。
- vimが入っていれば、ターミナルでvimtutorと打てば起動する。windowsだとどこか探せば出てくる

世の中にいろいろあるVimチートシートを眺めてみるのも参考になる。
- https://qiita.com/zipper/items/8fbed306e203b17be0c3
- https://vim.rtorr.com/lang/ja/

実践Vimという本もよく薦められていて、Vimの本と言えばこれ、といった感じだ。こういう使い方ができるのか!と、とても参考になる。とくに、.(直前の変更を繰り返す)コマンドの威力を思い知ることになる。詳しすぎるので、全部読む必要はないと思う。

Vimキーバインドまとめ

モードの変更

ノーマルモード: キーの入力でコマンドを実行する。名前の通り、基本的にこのモードに居ることになる

  • <Esc>ノーマルモードに戻る

インサートモード: カーソルが文字と文字の間にあり、キーの入力でそこに文字を挿入していく

  • iカーソルの直前でインサートモードに入る (Insert)
    • I行頭でインサートモードに入る。^iと同じ
  • aカーソルの直後でインサートモードに入る (Append)
    • A行末でインサートモードに入る。$aと同じ
  • o下に空行を追加してインサートモードに入る (Open line)。A<Enter>と同じ
    • O上に空行を追加してインサートモードに入る。koと同じ

置換モード: キーの入力で既にある文字を置き換えていく

  • R置換モードに入る (Replace)

ビジュアルモード: 文字列の範囲指定をする。範囲指定の始端は固定されてて、終端をカーソルで動かす

  • vビジュアルモードに入る (Visual)
    • V行を選択できるビジュアルモードに入る
    • <C-v>矩形を選択できるビジュアルモードに入る
    • モーション(後述)で移動したり、オペレータ(後述)に渡したり、テキストオブジェクト(後述)で範囲指定できる
    • o始端と終端を入れ替える。始端を変えたいときに使う

コマンドラインモード: Exコマンドという特殊なコマンドを実行する

  • :コマンドラインモードに入る
  • /{string}コマンドラインモードに入り、文字列stringを前方検索。後方検索するには、?{string}
    • nで次のヒットへ、Nで前のヒットへ移動 (Next)

モーション

モーションは文字の位置を表す。モーションコマンドを単独で入力すると、単にカーソルをその位置に移動する。

1文字:

  • h左、j下、k上、l
    • ホームポジションを崩さずに、右手で完結するのがウリ

単語:

  • w前方で最寄りの、単語の先頭 (Word)
    • e前方で最寄りの、単語の末尾 (End of word)
  • b後方で最寄りの、単語の先頭 (Backward)
    • ge後方で最寄りの、単語の末尾

空白だけじゃなく、.-, )といった記号類も単語の区切りと解釈している。空白だけ単語の区切りと解釈するには、大文字にしたW, E, B, gEを使う。もっと速く動ける。

行:

  • 0今居る行の先頭
    • 空白を無視するには^あるいは_
  • $今居る行の末尾
    • {N}$ N-1行下の行末
  • f{char}右で最寄りの、文字charの位置 (Find)
    • F{char}左で最寄りの、文字charの位置
  • t{char}右で最寄りの、文字charの位置の1個前 (To)
    • T{char}左で最寄りの、文字charの位置の1個前

いずれも、検索を繰り返すには;、逆方向に繰り返すには,を使う。

より大きな単位:

  • }下の段落との境界
    • {上の段落との境界
  • ggファイルの先頭
  • Gファイルの末尾
    • {N}GファイルのN行目

画面:

  • H, M, L画面表示の上部 (Home)、中部 (Middle)、下部 (Last)

その他:

  • *前方で最寄りの、今居る単語と同じ単語の先頭
    • #後方で最寄りの、今居る単語と同じ単語の先頭
  • %対応する括弧の位置

オペレータ

オペレータは作用対象を引数に取って、その対象に対して作用する。作用可能な対象としては、モーション、テキストオブジェクト、ヴィジュアルモードでの選択範囲、がある。
- {operator}{motion}の形で、今居る位置とモーションの間の文字列に作用する
+ {motion1}{operator}{motion2}とすれば、まずmotion1に移動してからオペレータがmotion2までの範囲に作用するので、motion1からmotion2までの範囲に作用できる。例: ggyGで全てコピー
- {operator}{text-obj}の形で、テキストオブジェクト(後述)に作用する
- ヴィジュアルモードでオペレータコマンドを入力することで、選択された範囲に対して作用する

オペレータコマンド:

  • d削除 (Delete)
  • c変更 (Change)。対象を削除してインサートモードに入る
  • yヤンク (Yank)
    • コピーのこと。CopyのCはChangeに取られていたので、コピーと言わずにヤンクと言うことになった
  • >, <右にシフト、左にシフト
  • gu小文字にする
    • gU大文字にする

同じオペレータを2回連打することで、今居る行全体を作用対象にする。

  • dd今居る行を削除
  • yy今居る行をヤンク
  • >>, <<今居る行を右にシフト、左にシフト
  • guu今居る行を小文字にする
    • gUU今居る行を大文字にする
    • gugu, gUgUでもよいけど打ちづらい

オペレータを大文字にすることで、行末までを対象にする。

  • D行末まで削除。d$と同じ
  • C行末まで変更。c$と同じ
  • Yはなぜか行末までではなく、今居る行をヤンクする。yyと同じ
    • vimの先祖であるviとの互換性のために仕方なくこうなってるらしい

ショートカット:

  • x今居る文字を削除。dlと同じ
    • X今居る文字の左を削除。dhと同じ
  • s今居る文字を変更。clと同じ
    • S今居る行を変更。ccと同じ

直前にヤンクや削除した内容の貼り付け:

  • p右に貼り付ける。内容が行単位の場合は下に貼り付ける (Put)
    • P左に貼り付ける。内容が行単位の場合は上に貼り付ける

テキストオブジェクト

オペレータの作用対象として使う。a{char}の形で、ある範囲を表す (冠詞のa)。i{char}の形で、ある範囲の内側を表す (Inner)。charとして可能なもの:

  • w今居る単語。aでは末尾の空白も含む
    • 例えばdawで今居る単語を消去
  • p今居る段落。aでは下の空行も含む
  • 括弧(, [, {, <や引用符', ", `それらで囲まれた今居る範囲。aではそれら囲む記号も含む
    • b(, B{と同じ (Bracket)。例えばdib()の中身を消去

カウント

[count]{command}でcommandをcount倍できる。例:

  • 3j 3行下に移動
  • 3dd 3行消去
  • 3p同じ内容を3回ペースト
  • 3i{string}<Esc>文字列stringを3回挿入

例えば、3単語消去は3dwともd3wとも書ける。3d5wってやると3*5=15単語消える

直前の変更に対する操作

  • .直前の変更を繰り返す
  • u直前の変更を取り消す (Undo)
  • <C-r>直前の取り消された変更をやり直す (Redo)

その他

  • r{char}今居る文字を別の文字charに置換 (Replace)
  • J今居る行と下の行を結合 (Join)
    • 間に空白を挟まないようにするには、gJ
  • ~今居る文字の大文字と小文字を入れ替えて右に進む

コマンドラインモード

:によって入れるコマンドラインモードでは、Exコマンドと呼ばれるコマンドを実行できる。Exコマンドを打ち終えるには<Enter>が必要。

  • w上書き保存 (Write)
    • w {filename}別名で保存
  • q!変更を破棄して修了 (Quit)
    • 末尾の!は強制の意味。qだと変更を保存してないと怒られる
  • wq変更を保存して終了
  • !{command} shellコマンドを実行する
  • r {}挿入する
    • {filename} ファイルの中身を挿入する
    • !{command} shellコマンドの出力を挿入する
  • s/{string1}/{string2}最寄りのstring1をstring2に置換 (Substitute)
    • 最後に/gを付けると、その行全体で置換 (Global)
    • 最後に/gcを付けると、1つ1つ確認を取りながら変更する (Confirm?)
    • {num1},{num2}s/ num1行目からnum2行目の範囲で置換
    • %s/ファイル全体で置換

AtomにおけるVimキーバインド

Atomについて

Atomは、2014年にGitHub社によってリリースされた現代的なテキストエディタだ。特徴を挙げると、

  • 優れたデザイン、使いやすいGUI
  • 管理が楽で豊富なパッケージ
  • Gitとの連携機能
  • ファイル・フォルダのツリービュー
  • 動作が重い、メモリ食う、サイズが大きいファイルは苦手。(徐々に改善している)

テキストエディタに標準的にあるとうれしい機能もちゃんとある。

  • ペイン分割(画面分割)
  • タブ切り替え
  • コードの折りたたみ
  • シンタックスハイライト
  • 自動で括弧や引用符を閉じる

マークダウンエディタとしても優秀だ。マークダウンファイルを編集中にCtrl+Shift+Mと打てば、画面分割してレンダリング結果をリアルタイムに表示してくれる。
Qiitaに記事を投稿するときにブラウザ上に現れるマークダウンエディタと比べても、

  • markdownもシンタックスハイライトされる
  • レンダリング結果の同期が速い(Qiitaだと長文になるとすぐ同期しない)
  • 豊富なパッケージが使える

などの点で優れている。この記事もAtomでできている。

Atom上でJupyterを動かすHydrogenっていうパッケージもあるそうだ。すごい。命名の由来も面白くて、木星(Jupiter)の体積の90%が水素ガスだからだそうだ(そのガスはhydrogen atomじゃなくてhydrogen moleculeだけども)

vim-mode-plusパッケージ、ex-modeパッケージ

AtomでVimのキーバインドを実装しているパッケージが、vim-mode-plusパッケージだ。Atomでパッケージを入れるのは簡単で、環境設定->インストール、でパッケージ名を打って検索するだけだ。

Vimのキーバインドが驚くほどしっかりと再現されていて、この記事で挙げたようなコマンドならほぼ全て使える。

コマンドラインモードを使うには、さらにex-modeというパッケージを入れる。実装されているExコマンドの一覧については、https://github.com/lloeki/ex-mode/wiki/CommandsAvailableで確認できる。

  • 名前が紛らわしいけど、歴史的事情によって存在するvim-mode、vim-mode-plus-ex-modeパッケージは非推奨

JupyterにおけるVimキーバインド

Jupyter Notebook・Jupter Lab

Jupyter Notebookはコードやマークダウンや数式、グラフといった画像や動画からなるノートブックを作成、共有できるWebアプリケーションだ。ノートブックはそれ自体がインタラクティブなコーディング環境で、40種類以上の言語をサポートしている。

  • pip install jupyterで入れられて、jupyter notebookで起動できる
  • 以前はIPython Notebookという名前だった。Python以外の言語も広くサポートするようになって、改名した。名前はプログラミング言語のJulia, Python, Rから取られている
  • このインタラクティブなノートブックという概念は、Mathematicaノートブックからきている。ノートブックは、セルと呼ばれる構成単位を縦に並べることでできている
  • ノートブックはファイルとして共有もできるし、簡単にWebページにもできる
  • データ分析環境としてとても優れている

現在、Jupyter Notebookの次世代版としてJupyter Labが開発中で、アルファ版が公開されている。将来的にはNotebookはLabに移行するそうだ。

  • pip install jupyterlabで入れられて、jupyter labで起動できる
  • 画面分割ができるようになった。ファイルブラウザ、ターミナル、csvファイル、ライブラリリファレンスなども同時に表示できる
  • マークダウンのレンダリング結果もリアルタイムに同時に表示できる
  • タブ切り替え機能もある

Vimキーバインド拡張機能

Jupyter Notebookの拡張機能はnbextensionという。Vimキーバインドを実装したnbextensionとして、jupyter-vim-bindingがある。

しかし、その開発はほぼ停止してる。作者が転職してJupyter Notebookを使わなくなったらしく、Jupyter Labへ移行される可能性もほぼない。

一方、Jupyter Labにおける拡張機能はlabextensionという。Vimキーバインドを実装したlabextensionとして、jupyterlab_vimが開発中だ。開発中だけど、一応もう使える。

  • jupyter labextension install jupyterlab_vimで多分入れられる。node.jsが入ってないと、'NoneType' object has no attribute 'rfind'とかいうわけの分からないエラーが出て失敗する(ひどい)
  • jupyter-vim-bindingの水準を目指したいと作者が宣言してる

今は過渡期なので、どちらを使う選択肢もありえると思う。

Jupyterには元々2つのモード、コマンドモードとエディットモードがある。エディットモードはセル内のテキストを編集するモードで、セルを選択して<Enter>することで入れる。コマンドモードはセルを選択したりセルを制御するモードで、<Esc>で入れる。

Vim拡張機能を入れると、このモードが3つになる:

  • Jupyterモード: セルを制御する。拡張前でいうコマンドモードにあたる。<S-Esc>でこのモードに入れる。セルを選択して<Enter>iを押すか、セルをダブルクリックするとコマンドモードへ移る
  • Vimコマンドモード: Vimコマンドが普通に使える。Vimでいうところのノーマルモード。Vimと同じく、iaなどでインサートモードへ移る
  • Vimインサートモード: 文字を挿入できる。<Esc>でコマンドモードに戻る

Vimコマンドモードでも、Ctrl-oを押せばJupyterモードのコマンドが使えるようになっている。このおかげで、可能な限りJupyterモードに立ち入らずに、Vimコマンドモードで過ごすことができる。

とくに、Vimコマンドモードのままでも、次のコマンドでセルを移動できる:

  • <C-j>, <C-k>上下のセルに移動(Vimコマンドモードでは、j, kでは普通にセル内を上下に移動する)

jupyter-vim-bindingではさらに、JupyterモードでのキーバインドまでVimライクになっている。一方、jupyterlab_vimでは拡張前のJupyterのコマンドモードでのショートカットキーと同じだ。なので、両方まとめておく。

Jupyterコマンドモードのショートカットキーまとめ

一般

  • hキーバインド一覧を表示するかどうかをトグル (Help)
  • f検索、置換 (Find)
  • sファイルを上書き保存 (Save)

セルの移動

  • j, kセルの上下移動
    • J, Kセルを複数選択しながら上下移動

セルの実行

  • <S-Enter>セルを実行して下のセルへ移動
    • 末尾のセルなら下に空セルを作る
  • <C-Enter>セルを実行するが下のセルに移動しない
  • <A-Enter>セルを実行して下に空セルを作る

セルの操作

  • a上に空セルを作る (Above)
  • b下に空セルを作る (Below)
  • cセルをコピー (Copy)
  • ddセルを削除(クリップボードにコピーしない)
    • xセルをカット(クリップボードにコピーする)
    • zセルの削除、カットの取り消し
  • vセルを下に貼り付け
    • Vセルを上に貼り付け
  • mセルをマークダウンセルへ変更 (Markdown)
  • yセルをコードセルに変更
  • M下のセルと結合。複数選択の場合はそれらを結合 (Merge)

画面表示

  • l行番号を表示するかどうかをトグル (Line number)
    • L全てのセルでトグル
  • oセルの出力を表示するかどうかをトグル (Output)
    • Oセルの長い出力をスクローリング表示するかどうかをトグル

カーネル

  • iiカーネルを中断 (Interrupt)
  • 00カーネルを再起動

jupyter-vim-bindingでの変更点

jupyter-vim-bindingのJupyterモードでは、上のショートカットキーの一部もVimライクに変更されている。

  • Hキーバインド一覧を表示するかどうかをトグル (Help)
  • gg先頭のセルへ移動
  • G末尾のセルへ移動
  • /検索、置換
  • yyセルをコピー
  • ddセルをカット(クリップボードにコピーする)
    • uセルの削除の取り消し
  • o下に空セルを作成
    • O上に空セルを作成
  • pセルを下に貼り付け
    • Pセルを上に貼り付け

ChromeにおけるVimキーバインド

WebブラウザにおけるVimキーバインド

Webブラウジングはテキスト編集とはだいぶ違う作業なので、Vimキーバインドとはいってもさすがにエディタと同じようにはいかない。ただ、Vimのコマンドを知っていれば、意味にそれなりに納得できるようなキーバインドが世の中にある。

Chromeは言わずとしれたGoogle社のWebブラウザで、ブラウザ戦争の勝者だ。
ChromeでVimキーバインドを実装した拡張機能としては、Vimium, Vichrome, Vrome, cVimなどいくつかある。そのうち、圧倒的に人気なのがVimiumだ。

  • ChromeウェブストアのVimium公式サイトからChromeに追加すれば入る

  • Firefoxでは、VimperatorというアドオンがVimキーバインドを実装したものとしてとても優秀だったようだ。しかし、2017年11月にリリースされたFirefox QuantumでFirefoxの仕様が大きく変わってしまい、Vimperatorは動かなくなりサポートも停止した

Vimiumを使えば、マウスやトラックパッドを使わずに、キーボードだけでWebブラウジングができる。具体的に最も便利なのは、ページ内の好きなリンク先のページに飛べるfコマンドだと思う。vで入れるヴィジュアルモードもちゃんとあって、キーボードだけでWebページ上の文字列の範囲選択ができて、yでコピーしたり、pで内容を検索したりできる。yyで今居るページのURLをコピーするとかも地味に便利だ。

推奨する初期設定について3つ紹介してから、Vimiumのキーバインドについてまとめる。

Vimium初期設定1:デフォルトキーバインドの変更

Chromeをvimライクに使えるようにするvimium」で紹介されているように、デフォルトのキーバインドは変えた方が使いやすい。アドレスバー右側に出現した丸Vマークを押して、Optionsを選び、Custom key mappingsの入力フォームに次を記入する。

map h goBack
map l goForward
map H previousTab
map L nextTab
map i LinkHints.activateMode
map I LinkHints.activateModeToOpenInNewTab
  • デフォルトではh, lは左右にスクロールに設定されているけれど、普段べつに使わないので、もっとよく使う「戻る」と「進む」に割り当てている
  • デフォルトではHLが「戻る」と「進む」に割り当てられてるけれど、今や小文字でできるので、「左のタブに移動」「右のタブに移動」に割り当てなおしている。これはJ, Kと同じだけども
  • iIはほぼ何の働きもしてないので、fFと同じくページ内のリンクを開く役割を割り当てている

Vimium初期設定2:「次へ」のリンクをすぐ飛べるようにする

]][[といったコマンドでnext>, previous<といった名前のリンクを移動できる機能があるのだけど、日本語の名前も追加しておくと便利だ。

同じくアドレスバー右側の丸Vマークを押して、Optionsの画面でShow Advanced Optionsボタンを押し、現れたPrevious patternsの入力フォームに「前へ」「戻る」「前のページ」を追加して次のようにする:

prev,previous,back,older,<,‹,←,«,≪,<<,前へ,戻る,前のページ

同じように、Next patternsの入力フォームに「次へ」「進む」「次のページ」を追加して次のようにする:

next,more,newer,>,›,→,»,≫,>>,次へ,進む,次のページ

これで例えば、]], [[コマンドによってGoogleの検索結果の次のページ、前のページへ移動できるようになる。

Vimium初期設定3: Vimiumを無効化するサイトを指定

Jupyter NotebookやJupyter Labなど独自のキーバインドを持っているサイトでも、Vimiumのキーバインドが優先されてしまう。独自のキーバインドを使いたいサイトでは、キーバインドが衝突しないようにVimiumを無効化する。その無効化したいサイト上でアドレスバー右側の丸Vマークを押して、Save Changesボタンを押せばよい。

Optionsから無効化されたURLの一覧が見られる。例えばJupyter Notebookならhttps?://localhost:8888/*, Jupyter Labならhttps?://localhost:8890/*と入っている。

Vimiumキーバインドまとめ

ヘルプ

  • ?キーバインドの一覧を表示する。困ったらこれを叩こう

移動

  • j, k画面を上下にスクロールする
  • h, l戻る、進む
  • J, H左のタブへ移動
  • K, L右のタブへ移動
  • g0, g$最初のタブ、最後のタブへ移動
  • ggページの先頭に移動
  • Gページの末尾に移動
  • u, d半ページ上下にスクロールする
    • Vimでいう<C-u>, <C-d>を意識している (Up, Down)

ページ内のリンクを開く

  • f, iページ内のリンクに文字を割り振る。その文字を打つことでリンク先のページを開く
    • 新しいタブで開くには、文字を大文字で打つか、あるいはF, Iを使う

検索

  • /{string}文字列stringを検索。nで次のヒット、Nで前のヒットに移動

ヤンク・貼り付け

  • yy今居るタブのURLをクリップボードにコピー
  • yfページ内のリンクに文字を割り振り、その文字を打つことでリンク先のURLをクリップボードにコピー
  • yt今居るタブを複製
  • pクリップボードのURLに移動。URLでなければその内容で検索
    • 新しいタブで開くにはP

vでヴィジュアルモードに入り、テキストの範囲指定ができる。

  • 複数行を範囲指定するには、Vを使う
  • 選択範囲を動かすには、h, j, k, lだけでなく、w, e, bも使える
  • 検索/などであらかじめ始端を指定していなかったら、ヴィジュアルモードには入らず、カーソルを動かして始端を指定するためのキャレットモードというモードに入る。始端を指定したら、vを押して改めてヴィジュアルモードに入る必要がある

ヴィジュアルモードでできること:

  • y選択範囲をクリップボードにコピー
  • p選択範囲の内容で検索
    • 新しいタブで開くにはP
  • o始端と終端の入れ替え
  • cキャレットモードに入る。始端を指定したら、vでビジュアルモードに戻る

ページを開く

  • t新しいタブを開く (Tab)
    • T開いているタブから検索して移動
  • oブックマークや履歴から検索してページを開いたり、URLを開いたり、何かを検索する
    • 新しいタブで開くにはO
  • bブックマークから検索して開く (Bookmark)
    • 新しいタブで開くにはB
  • 複数現れる候補は、カーソルキーの上下あるいはTabとShift+Tabで上下できる

その他

  • rページを更新 (Reload)
  • x今居るタブを閉じる
    • X閉じたタブを開く
  • giページ内の入力フォームに移動
    • {num}giでnum番目の入力フォームに移動
  • <<, >>タブの順序を左右と入れ替える
  • W今居るタブを新しいウィンドウで開く

カウント機能もサポートしている。例えば、3xでタブを3つ閉じる。

Vimにまつわる諸問題

IME切替だるい問題

Vimでは、ノーマルモードとインサートモードの間を頻繁に行き来することが想定されている。しかし、日本語の文章を書くためには、インサートモードに入ったら毎回日本語IMEに切り替え、インサートモードを出る前に毎回日本語IMEを切る必要がある。これだと頻繁に行き来するのがだいぶだるい。日本語でコマンドを打ってしまうというミスを、誰しもがやらかす。

そこで、インサートモードを出るときに自動的に日本語IMEを切る方法が幾つか提案されている。

他にも、1文字置換r{char}や該当文字への移動f{char}が日本語文字では失敗するとか、全角括弧を他の括弧類と同じようにうまく扱えないとか、日本語文章には細々といろんな問題がある。検索すればこういった問題を何とかするVim用のプラグインが色々出てくるけれど、Vim以外の環境でVimキーバインドを使っている場合、どうして良いかはちょっと分からない。

Escキー遠すぎ問題

Vimでは、ノーマルモードに戻るためにEscキーを頻繁に使うことが想定されている。しかし、Escキーはキーボードの左上端、1キーの上、より悪いことにさらに上のF1キーの上にあることすらある。キーの大きさもなんか小さかったりする。明らかにあんまり頻繁に打ちたいキーではない。

  • 遙か昔々、vimの先祖のviが開発された頃、Escキーは今で言うTabキーの位置、Qキーの左にあった。当時は気軽に打てたのだろう

解決策1: <Esc>と同じ意味の<C-[>を代わりに使う

  • JIS配列のキーボードでは[もあまり打ちやすいキーとは言えないものの(US配列だともう1キーぶん近い)、それに目をつぶれば万能ではある

解決策2: がんばって別の何かを<Esc>に割り当てる。<C-j>jj(jキーの2連打)が人気だ

  • 打ちやすさで言えばjjが最高だ。jが連続する文章を書くことはほぼないので、実用上問題が起きない。いざとなれば、めっちゃゆっくりjを連打すれば打てる。ただ、上の「IME切り替えだるい問題」と同時に解決する方法はよく分からない・・・OS XならKarabinerでできるんだろうか。OS X以外ではどうすればいいんだろう
  • Vimでは、~/.vimrcでキーマッピングを追加すればできる:
noremap jj <Esc>
noremap! jj <Esc>
noremap っj <Esc>
noremap! っj <Esc>

を追加すればいい。noremapはノーマルモードとヴィジュアルモードで、noremap!はコマンドラインモードとインサートモードでのキーマップ設定だ。「っj」も設定しておけば、日本語IMEを切ってなくてもノーマルモードに戻れる

  • Atomでは、Atom->キーマップを押すと現れるkeymap.csonファイルに
'atom-text-editor.vim-mode-plus.insert-mode':
  'j j': 'vim-mode-plus:activate-normal-mode'

を追加すればできる(参考: jj shortcut. How to implement this? #669)。この場合、日本語の「っj」も追加する方法はよく分からない

  • Jupyter Notebookのjupyter-vim-bindingでは、公式ページにあるように、~/.jupyter/custom/custom.js(無ければ作る)に
// Configure CodeMirror Keymaprequire(['nbextensions/vim_binding/vim_binding',// depends your installation],function(){// Map jj to <Esc>CodeMirror.Vim.map("jj","<Esc>","insert");});

と書き込めばできる。やってみた感じ、jキーをある程度速く2回連打する必要がある。Jupyter Labのjupyterlab_vimでのやり方はよく分からない


以上です。一緒にVimキーバインドライフを楽しみましょう!

VIMで置換するときの可視性

$
0
0

%sコマンドを使うと、vim内でsedと同じことができる。

:%s/"置換前"/"置換後"/g:%s/"置換前"/"置換後"/gc
  • 上記のように後ろにgをつけると全行置換する。
    • 付けないとカーソル行のみ置換する。
  • c をつけると、確認(yes/no)が出るようになる。


:%s#"置換前"#"置換後"#g
  • "/"は別の文字でも可能。オススメは "#" (見易いので)。


:%s#a\|b#c#g
  • aまたはbを、cに置換する。
    • BREの (sedやgrepと同じ) 正規表現になる。
    • | はor条件を表す。
    • \ で | をメタ文字にする(エスケープする)。


:%s#\va|b#c#g
  • aまたはbを、cに置換する
    • \vでEREの (sed や grep -e、egrep、awk、perlと同じ) 正規表現になる。


:%s#\v(a|b)#\1c#g
  • aまたはbを、acまたはbcに置換する
    • \1は ( ) にマッチしたパターン文字列になる
      • oniguruma の$1と同じ

2018年のWindowsのテキスト編集環境

$
0
0

TL;DR

  • テキストエディタは軽量なvimとモダンなatomの併用がおすすめ
  • フォントはMeiryoKeが万人向け妥協点、それ以上を求めるならMacTypeが必要そう
  • markdownやAsciiDocを普及させよう

対象読者

Windows上での作業を余儀なくされているプログラマー。とりわけ、2010年以前の資産やら文化が残っている現場の皆様。

Windowsのテキスト軽視文化

旧来、Windows界隈には「テキストファイル」を扱う文化がありませんでした。たとえば…

  • 設定はバイナリ (レジストリ)
  • ドキュメントもバイナリ (「拡張子 docのバイナリファイル」は、MSWordにより強引に普及がなされたもの。元来 .docはテキストファイルに用いられるものでした)

そしてWindows界隈には「GUI内で黒い窓を開く」文化もありませんでした。つい最近1PowerShellが登場するまで、コマンドプロンプトはこの30年間ほぼ進歩していません。「DOS窓」の俗称がWindows7時代になっても使われ続けていたことからも、どれだけ等閑にされていたかわかろうというものです。

昨今業界御用達のような扱いになっているMacにしても、かつて(OS9まで)のMacintoshではそもそもDOS窓に相当するものすらないという有様でした。ハッカーたちが細々とPC UNIXや中古のSPARCstationで使い続けていたものが、Mac OS X の普及でようやく変な目で見られなくなった感がありますが、Windowsはまだそこに追いついていません2

プログラマーたるもの「コードを書くためのエディタ」を常用すべし

標準でテキストファイルを扱うために用意された唯一のツールが「メモ帳」というあたりにWindowsのテキスト軽視がいかに徹底していたかがわかるでしょう。00年代からWindowsで仕事をしていた人たちは、いくらなんでもそれでは困るためにサードパーティーのテキストエディタを導入するようになりました。たとえば「秀丸エディタ」。これが有償ソフト不可の現場になると「サクラエディタ」や「TeraPad」になるわけです。

ただし、これらは「仕事のできるビジネスマン向けのメモ帳」として有能であっても、プログラマーがコードを書くためのエディターというより、DOS時代の仕事道具の延長線上の存在として捉えるべきでしょう。

vimを普段使いしよう

「プログラミングのためのエディタ」は、天地開闢3以来、Emacsとviが二大巨頭として君臨していました。最近はviの進化系であるvimがEmacsに対して優勢なようです。AdSenseとかでよく見かける「転職ドラフト」調べでは 人気のテキストエディタNo.1だそうで、しかも若年層からの支持が厚いということからもわかります。

vimの使い方については幾多の優れたvimmer様方の記事にお譲りして、本記事は「Windows内でvimを快適に普段使いする」ことにフォーカスしたいと思います。

vimを育てる

開封の儀

Windowsでは、香り屋版というバイナリが最近10年くらい普及していますのでダウンロード。zip は適当な場所 (C:\Program Files\でいいと思います) に展開してOK。展開先にある gvim.exeをダブルクリックで起動しましょう。

きっとのけぞると思います。多くの人はここでやる気をなくします。

調教

くじけずに設定とプラグインをバシバシ叩き込みます。

バックアップやスワップファイルなどのゴミ対策

デフォルトだと作業用ファイルを散らかす悪い癖があるので、道具箱を作ってやります。

# git bashやPoweshellでの例。
mkdir ~/.vim/work

:e ~/_vimrcで個人用設定ファイルのC:\Users(ユーザー名)_vimrcを編集して、道具は道具箱にしまうようにします。バックアップは人間かファイルシステムのどちらかがやればいいので不要でしょう。新規ファイル_vimrcに以下を記述します。

set nobackup
set directory=~/.vim/work
set undodir=~/.vim/work

C:\Users\(ユーザー名)をUnixのホームディレクトリと同様に ~と読み替えてくれます。

ウィンドウサイズの保存

これまたデフォルトだと毎回好き勝手な場所でこじんまりとしたウィンドウで起動するので、しつけましょう。GUI関係の設定ファイルは_gvimrcです。:e ~/_gvimrcで新規ファイルを開き、以下を記述します4

let g:save_window_file = expand('~/.vimwinpos')
augroup SaveWindow
  autocmd!
  autocmd VimLeavePre * call s:save_window()
  function! s:save_window()
    let options = [
      \ 'set columns=' . &columns,
      \ 'set lines=' . &lines,
      \ 'winpos ' . getwinposx() . ' ' . getwinposy(),
      \ ]
    call writefile(options, g:save_window_file)
  endfunction
augroup END

if filereadable(g:save_window_file)
  execute 'source' g:save_window_file
endif
その他おすすめの_vimrc向け設定
set list
set listchars=tab:>-,trail:-,eol:$
set number
その他おすすめの_gvimrc向け設定
set showtabline=2
プラグイン管理システム

以前からVundleなどのプラグイン管理システムがあったのですが、流行り廃りがあるようで、いま流行っているのはdein。流行ろうが廃れようが「プラグインの指定先はgithubのリポジトリ」という点は変わらないようなので、互換性を気にする必要はあまりなさそうです。
インストールするにはdeinの作業用ディレクトリを準備する必要がありますが、それさえやってやればプラグイン管理は驚くほど楽になります。なお、gitが利用できることが前提となります。

mkdir -p ~/.vim/dein/repos/github.com/Shougo/dein.vim
git clone https://github.com/Shougo/dein.vim.git ~/.vim/dein/repos/github.com/Shougo/dein.vim

さらに_vimrcを編集。

set runtimepath+=~/.vim/dein/repos/github.com/Shougo/dein.vim

call dein#begin(expand('~/.vim/dein'))
call dein#add('Shougo/dein.vim')
" インストールしたいプラグインを以下に記述する
" call dein#add('developer-a/plugin_you_want_to_install-1')
" ...
" call dein#add('developer-z/plugin_you_want_to_install-xx')
call dein#end()

" install non-installed plugins
if dein#check_install()
  call dein#install()
endif

_vimrcを再読み込みさせます。

:source ~/_vimrc
Vim-airline

これを叩き込めば一気にモダンなエディタに様変わり。

_vimrcを編集。

" deinの設定外に
set laststatus=2

" deinの設定内に
call dein#add('tpope/vim-fugitive')
call dein#add('vim-airline/vim-airline')
call dein#add('vim-airline/vim-airline-themes')

その他、vim-airline にカーソル下の文字コードを表示するなどの記事を参考にカスタマイズして、快適な環境を構築してください。

カラーテーマ

デフォルトのライトガルグレーみたいな背景色ではいまいちテンションが上がらないので、自分の気に入ったカラースキームを探してみましょう。基本的にdeinでインストールできます。私のお気に入りはVim の割と新しいおすすめ colorscheme たちを紹介するの記事で見つけたnefertitiというものです。

ダウンロード方法は_vimrcのdein設定部に以下を追記

call dein#add('jeetsukumaran/vim-nefertiti')

設定は、_gvimrcに以下を追記

colorscheme nefertiti

フォントにこだわる

MSゴシック/MS Pゴシックを撲滅せよ

30年前の遺物、といってもHelveticaなんかは半世紀以上前からある書体ですので、古さのみが問題となるわけではありません。
しかし、このフォントに限って言えば登場当時からそもそも0(ゼロ)とO(オー)の見分けもつかず、プログラマーが使うべき代物ではありませんでした。(Windows95のころは、これを避けるために和文セットのないCourier Newなどを我慢して使っていたように記憶しています)
もうひとつの問題は、ビットマップフォントとしての使用を前提としていることです。解像度640*480のブラウン管モニターに最適化されたようなギザギザフォントを、2010年代に使い続ける理由はありません。
デザイナーもまずこんなフォントを使うことはありません。

最近のWindowsには「メイリオ」と、それを画面表示向けにカスタマイズした「MeiryoUI」というそれなりにまともなフォントがバンドルされています。しかし、これらはプロポーショナルフォントのみの提供となっているため、プログラマーとしては大変困ります。逆に、等幅のLucida ConsoleやConsolasには和文セットがありません。

21世紀のフォントの選択肢

2018年初頭の時点で万人にお薦めできるローリスクな解決策はMeiryoUIに等幅化パッチを当てて、MeiryoKeというフォントを生成して利用することです。
さらに、Mac/Linux界隈5では以前よりコンソール作業に適したフォントとして

が使われており、とくにRictyはMac界隈では高い評価を受けています6。しかし、これらのモダンなフォントはWindowsのレンダリングの貧弱さのためにひどく滲んでしまいます。ですが、これについては、MacTypeというレンダリング改善ソフトで解決することができます。驚くほどフォントの表示が美しくなりますので、一旦は試してみてください。
ただし、MacTypeは環境によっては他ソフトの動作に影響をおよぼす場合があるなどの不具合が報告されており、リスクを伴った利用が前提となります。MacTypeを導入できなかったとしても、先述のMeiryoKeだけでも十分に改善と言えるでしょう。

vimへの適用は、_gvimrc

set guifont=MeiryoKe_Console:h12:cSHIFTJIS

のように追記
すればOKです。

ここまで設定してきたサンプルファイルは https://github.com/mskako/vimrcに上げております。

軽量マークアップ言語

テキスト編集環境も快適になると、いろいろなもののテキスト化を企みたくなります。そこのあなた、Excel方眼の設計書、駆逐したいですよね? 私たちのプロジェクトでは、かつてドキュメントを脱Excelしてwiki(Confluence)にもっていき、編集と閲覧、なにより検索の容易さを実現したまではよかったのですが、こんどはバージョン管理の壁にぶつかってしまいました。

テキストファイルで管理したい…でも設計書くらいになると文書構造は必要…だからといって見出しを

#############
## 項目一覧 ##
#############

みたいに装飾するのは避けたい… そんなとき、ふとある日にREADME.mdを書きながら、「これだ」と思ったのでした。

markdown

githubなどでおなじみのREADME.mdは、markdownというフォーマットで書かれています(Qiitaの記事もですね)。簡単な説明文くらいなら十分な表現力があるうえ、いちばん目にする場がgithubのリポジトリというくらいなので、VCSとの相性もバッチリです。

  • 単なるテキストファイルに見せかけられるくらい単純なので書きやすい
  • テキストファイルなので、gitで差分管理ができる
    • ということは、設計書をこれで書けばブランチもプルリクエストもマージも自由自在では?
      • うわーゆめがひろがりんぐ

ただし、

  • 設計書に採用するには表現力が少々弱すぎる

というわけで、設計書にはもっと表現力のある軽量マークアップ言語が必要と考え、AsciiDocの導入を検討することになりました。

AsciiDoc

ですが、まだ実用に堪えるかの検証中です。テーブルの記述がより強力になった点を最も評価していますが…

atom

markdown/asciidocはvimでもある程度直感的な編集ができますが、リモートにpushする前にプレビューできないのは流石に困ります。
そこで、ローカルでのビューワーがほしいという動機でatomをインストールしてみました。github謹製というだけあって、git操作の容易さはさすがと言った感じです。
ただ、私の感覚としてはvimとIDEの隙間を埋める存在かなと見ています。メモリも結構食いますしね。

資料


  1. いうて登場から10年は経っている。ただし、認知度的には… 

  2. 現状Windows7な筆者はCygwinを我慢しながら使っております。ターミナル環境の決定版がまだ見えていないため、本記事はgvimにフォーカスすることにしました。ご容赦ください。 

  3. 1970-01-01T00:00:00Z 

  4. http://vim-jp.org/vim-users-jp/2010/01/28/Hack-120.html 

  5. 標準でバンドルされているという意味ではない 

  6. それ以上に、Ricty Diminishedはpowerline-symbols同梱版が配布されているのでvim-airlineで使うととてもハッピーになれますが、詳細については本記事では扱いません。 

UNIX環境で論文執筆する場合のtips

$
0
0

僕が論文とか文書作成する際によく使うツール群と、それぞれのオススメポイントと使う際のtipsのまとめます。ちなみに環境としてはUNIXライクなCUI上での作業を想定してます。

 使用ツール

  • TeX
  • vim
  • git

TeX

TeXでやるメリットとしては

  • 図表、節、参考文献の番号振りが自動
  • 数式書くのが楽
  • 色んな設定ウィンドウといったりきたりしなくていい

とか色々あります。TeXに触れたことがなければLaTeX入門を参考に。あとCloudLaTeXなら環境設定しなくてもブラウザ上で出来るしクラウド上にデータ保存できます。でも本記事ではこの話はしません。
ここではTeXの基礎的なことでなく論文で使えるtipsの話をします。

ファイル分割

論文はおおかた数十頁と長い文書になると思います。数ページ程度なら1ファイルで書いても問題無いでしょうか、数百、数千行という文量になると収集がつかなくなります。そのため章ごとにファイルを分けるのがオススメです。例えば以下のようなファイル構成だとします。

  • thesis.tex (親ファイル)
  • intro.tex (1章 はじめに)
  • related_work.tex (2章 関連研究)
  • ...

このとき親ファイルの中身をこんな感じにします。

thesis.tex
\include{intro}\include{related_work}
...

\include{}というのはファイルを呼び出して改ページする関数です。thesis.texのinclude{intro}の位置にそのままintro.texのソースコードを代入するというイメージです。似たような関数にinput{}がありますが、これはファイルを呼び出すだけで改ページはしません。そのため表ファイルとしてCSVファイルなどを呼ぶのに使えます。

Makefile

Makefileを同ディレクトリにおいてシェル上で$makeと叩けばコンパイルしてくれる便利な奴です。ファイル構成はこんな感じだとします。

  • thesis.tex 親ファイル
  • images/*.pdf 画像ファイル
  • Makefile

実際に使ってるMakefileはこんなです。

FILENAME= thesis # 親ファイル名TEX=$(FILENAME).texPDF=$(FILENAME).pdfUNAME=${shell uname}all:
    make tex
    make previewxbb:# 画像ファイル(pdf)のxbbファイルを作るifeq ($(UNAME),Darwin)
    extractbb images/*.pdfendifclean:# 不要なファイルの削除
    rm *.aux *.dvi *.idx *.ilg *.ind *.log *.out *.toc *~tex:# コンパイル
    ptex2pdf -l -ot -kanji=utf8 $(TEX)preview:# PDF 表示#for Linuxifeq ($(UNAME),Linux)
    evince $(PDF)endif# for MacOSXifeq ($(UNAME),Darwin)
    open $(PDF)endif

例えば$make cleanというコマンドをシェル上で叩くとclean:の処理、$makeall:の処理を行います。他にシェルでやりたい処理があればMakefileを改造するのもアリです。最終的にPDFで出力するため画像もPDF形式にしておくとコンパイルが早いですし、作図システム上でPDF出力すればベクター方式で保存されるはずなので論文上でもキレイな仕上がりになります。

setcounter

例えば論文作成途中で3章だけ出力したいとき、

thesis.tex
\setcounter{section}{2}\section{hoge}

でhogeという章の番号が3からはじまります。\setcounterについて詳しくはここを見て下さい。

マクロ

くわしくはLaTeX入門/LaTeXマクロの作成から。僕の場合は便利な機能を作るというよりは頻繁に使う部分をマクロ化して省略するという使い方です。例えば長い数式で繰り返し使う部分をマクロにしてしまうこと。それから添削で修正した点を赤くする(これは自分のいる研究室特有のシステムですが)ということをよくやるのでこれも短くすむようにしてます。

\newcommand{\red}{\textcolor{red}}

これで\red{hogehoge}というように囲むことで赤文字にできます。ちなみに\textcolorを使うのには\usepackage{color}でパッケージを読み込んでおく必要があります。

おまけ

redpenという自動文書精査ツールがあります。誤字や文法チェックをしてくれるすごい奴です。ただ僕の場合、大体添削とかで指摘されるのは「意味がわかりにくい」「不要な部分がある」とかツールでは分からないようなところが多いので結局使ってません……。
あと文字数制限がある文書を作成するときは簡単なpythonスクリプト作って確認したりしてました。Wordだったらすぐ確認できますが……。
それから句読点を「、。」から「,.」にするのはこんなシェルを使ってます。

maru2ten.sh
#!/bin/sh# $ sh maru2ten.sh (ファイル名)
cat $1| sed 's/。/./g'| sed 's/、/,/g'> tmp
mv tmp $1
rm -f tmp

これも文字入力の設定変えればいい話ですが……。

Vim

CUI上でやるならvimかemacsが楽です。が、emacsは知見が全く無いので特に言うことはないです。このようなエディタを使うメリットとしては

  • 文字列置換、検索、削除、貼り付けなどが数キーの操作で出来る
  • 繰り返しの処理が楽(例えば「5p」で5回貼り付け、「d5w」で5単語削除)

とかでしょうか、vim使ったこと無い人はvimインストールして$ vimtutorを起動してチュートリアルを一通りやってみましょう。慣れると大分早くなると思います。ただ日本語入力は面倒かもしれません。挿入モードになるときに自動的に入力切替する方法とかもあるっぽいですが、アルファベット入力する場合も結構あるのでそこはそんなに工夫してません。

行末の空白を消す

:%s/ *$//

これでできます。一応説明すると、' *$'が正規表現で「空白を行末まで繰り返してる文字列」という意味で、それを全て空の文字列に置換してます。

矩形選択

ノーマルモードのとき「Ctrl + V」でヴィジュアルモードの矩形選択モードになります。矩形選択した部分を削除する、という使い方もありますし、選択してから「Shift + i」し文字入力、「Esc」で複数行に同時書き込みができます。「Shift」と同時押しするキーを「a」「p」などにしても同様に複数行で同じ処理を行うことができます。

クリップボードからの貼り付け

webページとかPDFとかvim外からコピーしてくるときにそのまま貼り付けるとインデントがズレる場合があります。その時は:set pasteで貼り付けモードにしてから貼るといい感じになります。

git

メリットとしては

  • クラウド上に論文データの保存が可能
  • いつ、どのファイルを修正したか?という差分が全て保存される
  • 結果として無駄なファイルが少なく済むし、データが飛ぶこともまずない

とかです。使わない手はない。CloudLaTeX使えばクラウド上への保存が出来ますが、差分の記録をとるためにはgitが必要でしょう。

bitbucket

gitというとgithubが有名ですが論文ならbitbucketがオススメです。なぜなら非公開リポジトリを使いやすいからです。bitbucketだとアクセスできる人数が5人以下の非公開リポジトリなら作り放題です。論文は基本的に管理する自分一人が見れれば良いのでこれで十分でしょう。githubにもアカデミックプランがあり、加入すれば5つ非公開リポジトリが使えるようになりますが、アカデミックプランへの申し込みはメールを送る必要があり、承認に時間がかかります。(2週間とか?)githubでは公開できるようなもの、bitbukcetでは非公開のものを置くという使い方が良いかなと思います。

alias

gitconfig中で以下のように書くと、シェルコマンドの短縮ができます

~/.gitconfig
[alias] aa=add -A    co = checkout     cm = commit -m     st = status    br = branch

grep

もともとシェルにgrepコマンドがありますが、「git grep」でローカルリポジトリ内の文字列検索が楽にできます。

おわりに

正直どのツールにしても自分が使いこなせてるとは言い切れないですし、初歩的な内容ですが、この辺のツールは自分で色々設定を変えれて楽しいしオススメです。便利情報があればコメントして頂けると嬉しいです。

Viewing all 5692 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>