Humanity

Edit the world by your favorite way

Vim の端末ウィンドウから別のウィンドウに移る時にコマンドを実行中にしておく

tyru.hatenablog.com

を書いた後 vimrc を整理していたら書きかけの設定があったのでこれも公開。 autocmd vimrcvimrc は適当に変えてください(分からない人はそのままでもいいです)。

" Enter Terminal-Job mode when leaving terminal window
autocmd vimrc TerminalOpen *
\ autocmd vimrc WinLeave <buffer>
\   if term_getstatus('') =~# '\<normal\>' |
\     execute 'normal! GA'                 |
\   endif

これを vimrc に書くと、端末ウィンドウで <C-w>N で一旦端末ノーマルモードに移って出力を止めた後、 そのまま別のバッファに移動しようとすると端末ジョブモードに戻してコマンドを実行中の状態にします。 すごくニッチですが、個人的には端末ノーマルモードにしたいのはコピペする時や遡って出力を見たい時ぐらいなので、 別ウィンドウに移る時は端末ジョブモードにしておいて欲しいというのがあります。 上記の設定はそれを行ってくれます。

f:id:tyru:20180925004513g:plain

Vim で端末ウィンドウを複製する

Vim で端末ウィンドウを使ってるとスクロールされた出力を見たくなる時があると思います。 ただシェルでコマンド実行中なので、 <C-w>N すると出力も止まってしまう。なるべくなら出力を止めたくないと思います(たぶん)。

そういう時は以下を vimrc に貼り付ければ <C-w>y で端末ウィンドウの複製バッファができます。色とかもそのまま。

追記 (9/25) すみません、以下のコードだとやっぱりスクロールされた出力は見れませんでした…直すのでお待ちください…というか誰か直してください…

tnoremap <C-w>y <C-w>:<C-u>call <SID>dup_term_buf()<CR>

function! s:dup_term_buf() abort
  let file = tempname()
  call term_dumpwrite('', file)
  call term_dumpload(file)
  setlocal nolist
  call delete(file)
endfunction

追記

しばらく Prolog やってみた感想

ここ最近 Prolog を書いていて、「Prolog はどうせ遅いし Prolog の良さはそこじゃない」がやっと体感的に分かってきた気がします。

今の私なりの解釈で言うと、効率の良いデータ構造とアルゴリズムを考えるのが第一義の場面では Prolog の良さは発揮できないという事です。

Prolog でもデータ構造をちゃんと設計してカット多様すればそれなりに速いプログラムを作れるのかもしれませんが、それは普通に逐次的な(手続き的な)プログラムを書いてるのと同じで*1、それよりもバックトラックでナイーブにルールを総当たりする所が Prolog の強みの一つなんだなというのがようやく実感と共に分かった気がします。

しばらく Prolog やってみた今の私の場合、シンプルに素早く人間の思考に近い形で宣言的に書いたコードがそのまま動いてほしい、って事なら Prolog を選ぶと思います。

こう書くと誇張していて良いことずくめの様に聞こえますが、実際にプログラムを作ってさらに公開するとなるとユーザーの環境に合わせる必要があり、その中で選択肢が段々限られてくるので当てはまるケースは意外と少なくなってきます。

他にも必須ではないものの、

  • ワンバイナリで動くと良い (Go, Rust) とか
  • WindowsGUI を使いたいなら .NET 系が楽とか
  • 様々な目的でユーザーが多い言語のが良いとか
    • コントリビューションを貰いたいとか
    • 仕事だったら人員確保のためとか

ちょっと挙げてみただけでも、公開するとなるとユーザーが介入してくるため色々取捨選択をしたり考える事が結構あり、 まぁ当たり前なんですがプログラミング言語はシンプルに素早く人間の思考に近い形で宣言的に書いたコードがそのまま動くだけでは良くないので、必然的に選べる選択肢は狭まります。

私はプログラミングとは目的を達成するために最適なアルゴリズムとデータ構造を考える事だと思っています(いました)。 しかし Prolog 「らしい」コードはそれをむしろ放棄して、アルゴリズム(手順)の代わりにロジック(論理式)を書き、データ構造の代わりに記号操作とユニフィケーションの対応を考えると自然とプログラムが出来上がります。 どちらが優れているという話ではなく、扱っている抽象度のレベルは明らかに Prolog の方が高い。

前述したように Prolog でも手続き的に書いたり、データ構造をモジュールとして定義して提供する事もできますが、そういう使い方が生きる言語というよりは「計算機に計算させたい」というニーズが一番にあってそれを書き下すと勝手に解いてくれる言語、それが Prolog という言語なんだな、というのが今の所の感想です。

*1:それぞれの目標 (goals) 一つ一つの直前にカットを差し込めば、バックトラックがない単純に上から下へ書いた順に動くコードになります