???「効率的な環境を整備したところで,研究しなきゃ意味なくない?」
この記事は東京大学航空宇宙工学科/専攻 Advent Calendar 2019の2日目の記事です.
0. はじめに
どうもこんばんは,人生さんです.助けてください.
人生さんは勉強も研究にロクにしていないので他の人のような学術的なアドベントカレンダーは書けません.
そこで,勉強と研究をなおざりにしつつかき集めたしょうもないtipsを遺言として書き記しておこうと思います.
知っている人にとっては当たり前な,しょうもないtips集ですが,ほんの数人かのほんの少しの労力だけでも削減できればいいなと思います.
記事の対象はもっぱらWindowsユーザーですので,シャレオツまか~やリナックスチョットデキルメン/ウーメンには読む価値はほとんどないものと思います.
1. エクスプローラー編
Windowsユーザーはファイルの操作にエクスプローラーを多用するものと思います.
しかしGUI操作はやはり疲れるので(疲れるとは言っていない),できればキーボードで操作したいものです.
移動・ファイル操作
以下に示すキー操作は全てエクスプローラーのウィンドウがアクティブになっている状態で有効です.
ウィンドウがアクティブになっていない場合は,Alt+Tabキーでアクティブにするか,ウィンドウの適当なところをクリックしてください.
まず,Alt+↑で上のディレクトリに移動できます.あるディレクトリに入った後,カーソルは一番上のファイルまたはディレクトリにいます.
この状態でSpaceキーを押すと,一番上のファイルまたはディレクトリが選択される状態になります.
この"選択状態"になっていると,お馴染みのCtrl+Cが使えたり,Enterキーで既定のアプリに遷移できたりします.
ディレクトリを選択している場合はそのディレクトリに移動できます.また,上下矢印キーでファイルへのカーソルを移動することもできます.
あるディレクトリに入った直後に↓キーを押すと,カーソルは2つ目のファイルで有効になります.
これはおそらく,カーソルの初期位置が1つ目のファイルだからだと思っています.カーソル移動はファイル名によっても可能です.
あるディレクトリにいるときにファイルの名前を打ち込むと,そのファイルに逐次カーソルが飛んで選択状態になってくれます.
検索順は現在のカーソル位置の1個下から下方向で,折り返し検索が有効です.このキー入力は一定時間(1秒くらい?)の間,連続した打ち込みが可能で,一定時間待つかEscキーで入力をリセットできます.
実際に使うには,ファイル名全てを打ち込むのではなくて,お目当てのファイルに近いところまでファイル名押下で移動して,上下キーで移動,という感じでしょうか.
以上に挙げたキー操作で,エクスプローラー内での移動はほとんどキーボードだけで完結できるかと思います.
アドレスバー
アドレスバーで,パスが通っているコマンド,プログラムを走らせることができます.
Alt+Dでカーソルが移動して入力できる状態になるほか,F4でアドレスバーに打ち込んだことがあるコマンドの履歴が表示・選択できます.
ここから起動したプログラムは,作業パスがエクスプローラーでのパスに設定された状態で起動されます.
このディレクトリにあるファイルをgnuplotで可視化したい,gvimで開きたい,なんて時に役立ちます.
一応起動オプションを渡すこともできます(e.g. "gvim hoge.txt")が,履歴が汚れるのであまり使いたくありません.
小ネタ
- Spaceキーで選択/選択解除はShift/Ctrlキーと併用すると楽しい.
- F2キーでファイル名を変更できる.
- Alt+Enterでオプションを開ける.
- Shift+Deleteでゴミ箱を介さずにファイルを消せる.大いなる力には大いなる責任が伴うので注意.
- Ctrl+Shift+Nで新しいフォルダを作れる.
- 左上のかどっこをダブルクリックするとウィンドウを消せるって友達のげってぃ君が言ってた.
2. PowerShell編
PowerShellを使おう
みんなもっとPowerShellを使えばいいのにと思っています.
(ちなみに私は未だにPowerShell v6を導入せずにv5を使っているし,Windows Terminalも試していないのであまり上から言えない)
例えば,理系の大学生のWindowsユーザーがターミナル(厳密にはPowerShellはシェルらしい)を使う用途ってほとんどがSSH接続用だと思うんですが(偏見),やれputtyやらやれCygwinやらを構築する必要もなく,PowerShellと最近のWindows10にデフォルトで入っているOpenSSHクライアントとの組み合わせで事足ります.
百歩譲ってWSL.使ったことほとんどないけどCygwinは無いと思ってる.
ちょっとしんどいけどX11も導入できます.
意外にもtarコマンドもデフォルトで入っている(C:\WINDOWS\system32\tar.exe)ので,unix系サーバとのファイルのやり取りもできます.
ただ,文字コードとか,その他の謎のエラーには非常に困らされるのが欠点.
ほとんどの人はPowerShellなんか使わないので,とにかく情報が少ないのである.
- PowerShellのイイところ
- PowerShellのクソなところ
色とフォント
フォントはともかく,デフォルトのPowerShellの配色は本当に酷い.
よほど頭がおかしくないと作れないだろってくらいに酷い.
Quality of PowerShell Lifeを上げるためにはカラースキームを適用することをお勧めします.
そのときの奮闘記がこちら.
sktakefumi.hatenablog.com
ただ,配色に関してはもしかしたら既存のWindowsのメジャーアップデートで既に改善されているかも?
ちなみに,この変更は全てのターミナルっぽいソフト(cmd.exe,gnuplot.exe,Git Bash.exe,vim.exe,python.exeなど)に適用されます.
プロンプトの変更
私はposh-gitを導入しているので,posh-git経由でプロンプトをカスタマイズしています.
github.com
Import-Module posh-git $GitPromptSettings.DefaultPromptPath.ForegroundColor='DarkOrange' $GitPromptSettings.DefaultPromptBeforeSuffix.Text = '`n $(Get-Date -f "HH:mm:ss") ' $GitPromptSettings.DefaultPromptBeforeSuffix.ForegroundColor = [ConsoleColor]::Magenta
上記の設定で下図右のようになります.posh-gitを導入していなくても,$PROFILEに下のコードを書き足してprompt関数を上書きすれば変更できます.
function prompt{ (Get-Host).UI.RawUI.WindowTitle = $pwd Write-Host (Get-Location) -ForegroundColor Yellow Write-Host (" " + (Get-Date -f "HH:mm:ss") + " ") -NoNewLine -ForegroundColor Magenta Write-Host ('>' * ($nestedPromptLevel + 1)) -NoNewLine return " " }
小ネタ
- Windowsキーから起動できるショートカット(C:\Users\USER\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell)は作業フォルダを変更できる.
- 例えば%HOMEDRIVE%%HOMEPATH%としておけばBash風にC:\Users\USER\で起動してくれる.
- チルダ"~"でC:\Users\USER\のTab補完が効く.
- パスは基本的にはスラッシュとバックスラッシュ両方受け付けてくれる.なんやねん.
- コマンドによっては片方しか受け付けないかもしれない.
- start (パス)で,パス位置でエクスプローラーを開いてくれる.
- PowerShellはなぜかAlt+F4でウィンドウを閉じられない.
- Exitと打ち込むか,viモードの場合はCtrl+Dで消せる.
- 環境変数にパスをぽこじゃか通してるとunixライクなコマンドが衝突しうるので注意.
3. vim編
便利な設定
alias emacs='vim'
vim-plug
プラグイン管理はvim-plugが良いと思っています.
github.com
別途Gitが必要ですが,導入が簡単ですし,vimrcの記述も非常に簡単です.
vim-plugの設定例を展開
"vim-plug call plug#begin('~/vimfiles/plugged') Plug 'lervag/vimtex' Plug 'Yggdroot/indentLine' Plug 'tomasr/molokai' Plug 'tyru/caw.vim' Plug 'bronson/vim-trailing-whitespace' Plug 'PProvost/vim-ps1' call plug#end()
guifontwide
シンタックスハイライトによって文字が斜体で装飾されるとき,下図左のように,文字が1文字分の枠を超えて隣の文字と重なってしまうことがある.これはgvimrcで
set guifont=Consolas:h12 set guifontwide=MS_Gothic:h12
のように,guifontで英数字用フォント,guifontwideで日本字用フォントを個別に指定することで解消できる.
日本語版vimユーザーが多く使っているであろうkaoriyaさん版vimに同封されているgvimrcは,初期状態で
set guifont=MS_Gothic:h12:cSHIFTJIS
としか書かれていない.
このため,斜体フォントが用意されていない日本語用フォントを無理やりせん断変形することで,隣の字に重なるということが生じるらしい.
vimrc小ネタ
set shellslash set isfname-={,}
1つ目はパス補完とかで出るパスの区切り文字を"\"から"/"に変更する.
2つ目は最近知ったもので,波かっこ"{"の後でのCtrl-X+Ctrl-Fによるパス補完を有効にする.
Windowsではファイル名に"{ }"を含められないための処置が関係しているのだろう.
4. LaTeX編
コーディング環境について
のコーディング環境にはTeXworksやTeXstudioのような統合環境があるようですが,私はvimで書いてます.
vimユーザーかつユーザーの方にはぜひvimtexをお勧めしたいです.
github.com
このプラグインはハチャメチャに高機能で,各種コマンドが利用可能になるほか,例えば適切なlatexmkの設定をしていれば,コードの変更を検知して再コンパイルしてくれたり,ログをパースしてquickfixウィンドウに出してくれて,エラー箇所にジャンプできたり,文書をパースして,本文との行き来が可能なtable of contentsを作ってくれたりします.機能が多すぎて未だに全機能を把握しきれていませんが,簡単なコマンドだけでも大きな助けになります.
vimtexは設定がめんどくさいので,私のvimrcをupしておきます.
vimtex用vimrcを展開
""" vimtex let g:tex_flavor='latex' let g:tex_conceal='' let g:vimtex_include_search_enabled=0 let g:vimtex_fold_enabled=1 let g:vimtex_fold_manual=1 let g:vimtex_fold_types = { \ 'comments' : {'enabled' : 1}, \} let g:vimtex_complete_close_braces=1 let g:vimtex_complete_ref = { \ 'custom_patterns': [ \ '\\tref\*\?{[^}]*$', \ '\\eref\*\?{[^}]*$', \ '\\fref\*\?{[^}]*$', \ '\\sref\*\?{[^}]*$' \ ] \} let g:vimtex_compiler_latexmk={ \ 'backend': 'jobs', \ 'background': 1, \ 'build_dir': '', \ 'continuous': 1, \ 'executable': 'latexmk', \ 'options': [ \ '-lualatex', \ '-file-line-error', \ '-synctex=1', \ '-interaction=nonstopmode', \ ], \} let g:vimtex_view_general_viewer='C:\PROGRA~1\SumatraPDF\SumatraPDF.exe' let g:vimtex_view_general_options='-reuse-instance -forward-search @tex @line @pdf' let g:vimtex_view_general_options_latexmk='-reuse-instance' let g:vimtex_quickfix_latexlog = { \ 'ignore_filters' : ['Package caption Warning'], \}
TeXworksやTeXstudioを使うにしても,最低限latexmkとの連携はしておくと幸せになれると思います.
gnuplot-lua-tikz
グラフの貼りこみにはgnuplot-lua-tikzを使っています.
例えば以下のgnuplot設定ファイルを書いて,
gnuplotのコードを展開
reset session set term tikz size 144mm, 81mm set output "graph.tex" set key outside top center box Left spacing 4 width -18 set xl "$x$" set yl "$y$" set xtics pi format "$%.1P\\pi$" set mxtics 4 set mytics 5 set xr[-2*pi:2*pi] set yr[-1.5:1.5] f(x, n) = sum[m = 1:n] 4.0 / pi / (2*m-1) * sin((2*m-1)*x) set samples 1000 plot f(x, 10) w l t "$\\displaystyle f(x) = \\sum_{n=1}^{10} \\frac{4}{(2n-1)\\pi} \\sin ((2n-1)x)$, cited from \\cite{cite:graph}" set output
出力されるgraph.texをで\inputすると(タイプセットはLuaLaTexを使っています),
\begin{figure}[htbp] \centering \input{fig/graph.tex} \caption{Gnuplot-lua-tikzによるグラフ描画の例.} \label{fig:graph} \end{figure}
このような絵が描けます.次のようなメリット/デメリットがあると思っています.
- 良いところ
- グラフ中にの書式を使える
- 文献などの相互参照をねじ込むことも可能
- フォントサイズが文書基準に決定されるので図中の字の大きさに気を配らなくていい
- 悪いところ
== 2019/12/2 15時追記 ==
vimtex環境下でgnuplot-lua-tikzによるgraph.texを大量に\inputしていると,main.texの読み込みにえらい時間を食うようになる.
graph.texの実態はtikzのコマンドとベクターのパスを羅列している長大なファイルなため,読み込みやらパースやらなんやらに時間がかかるのであろう.
加えて,例えばmain.texをテンプレとして利用するために,graph.texが存在しない別のディレクトリに移した場合(移すな),graph.texが見つからないので,kpsewhichコマンドでgraph.texを検索し始めてしまい,さらに時間がかかる.
この\inputによる*.texの検索とパースは
let g:vimtex_include_indicators = ['include', 'subfile']
とすれば無効にできる.
==== さらに追記 ====
g:vimtex_include_indicatorsからinputを除くと,\input{}後のCtrl-X+Ctrl-Oファイル名補完が効かなくなってしまう.
流石にこの設定はできなさそうなので,その場しのぎにvimtex/autoload/vimtex/complete.vim内のs:completer_incをちょろっと書き換えて\input{}でも補完が効くようにした.
==== さらに追記終わり ====
== 追記終わり ==
図の大きさについて
\linewidth基準で指定するのが幸せだと思う.
\linewidthを超えるようなデカい図を貼りたい場合(貼るな),\includegraphicsを\makebox[0pt][c]{}で囲ってあげれば下図のように中心に来てくれる.
横並びの図をできるだけ大きく貼りたいときに便利.
だけど,正式な文書だと\linewidthを超えて図を貼りこむのはいかがなものかとも思う.
\begin{figure}[htbp] \centering \includegraphics[width=1.1\linewidth, height=30mm]{example-image-a} \caption{めっちゃでかい図が右に寄るでござる.} \label{fig:meccha_dekai_zu_zureru} \end{figure} \begin{figure}[htbp] \centering \makebox[0pt][c]{ \centering \includegraphics[width=1.1\linewidth, height=30mm]{example-image-b} } \caption{めっちゃでかい図が中心に来るでござる.} \label{fig:meccha_dekai_zu_mannnaka} \end{figure} \begin{figure}[htbp] \centering \makebox[0pt][c]{ \begin{minipage}[c]{0.6\linewidth} \centering \includegraphics[width=1\linewidth, height=30mm]{example-image-a} \subcaption{minipageの幅は0.6\textbackslash linewidth} \label{fig:meccha_dekai_zu_mannnaka_1maime} \end{minipage} \begin{minipage}[c]{0.6\linewidth} \centering \includegraphics[width=1\linewidth, height=30mm]{example-image-b} \subcaption{minipageの幅は0.6\textbackslash linewidth} \label{fig:meccha_dekai_zu_mannnaka_2maime} \end{minipage} } \caption{できる限り大きく横並びの図を貼りたいんじゃ.} \label{fig:meccha_dekai_zu_mannnaka_2mai} \end{figure}
体裁,禁止コマンドについて
文書の本質は当然ながら体裁より内容ですが,私はロクな内容が書けないので体裁を整えるのが趣味と化しています.
禁止コマンドはここ参照
ichiro-maruta.blogspot.com
5. その他
Officeにベクタ画像を貼るには
私はベクタ画像教教徒なのでOfficeの文書にもベクタ画像を貼りたくなります.
Mac版ならPDFでもSVGでもサクッと貼れるのですが,Windows版で貼るならEMFにするのが吉です.
EMFとSVGを比較すると,下図のように,編集画面上では,線の太さに多少の差はあるものの両者ともイイ感じに見られるのですが,PDFとして出力しようとするとSVGはどうも不安定になります.
下図は,左がエクスポート>PDF/XPSの作成,右が印刷>Microsoft Print to PDFで印刷,でPDFを作成したものです.
左ではSVGの線の太さがEMFに比べて太く,右ではSVGが謎の低解像度JPGに変換されてしまっています.
謎です.
gnuplot小ネタ
- statsコマンドを使えば合計値や標準偏差などの基本的な統計量がサクッと得られる.
- helpコマンドでヘルプが読める.
- ~/.gnuplotでgnuplotのデフォルトが設定できる.(gnuplotのインストールフォルダ)/share/gnuplotrcがテンプレ.
- 下のように書けば,罫線を描画させて,線の色をRGBの原色系にして,現在のパスを表示するようにできる.
set grid xtics ytics mxtics mytics lt -1 lc rgb "gray30", lt -1 lc rgb "gray" set colorsequence classic pwd
6. まとめ
研究しないでこんなことばっかりやってる院生になっちゃダメだよ.