タグ

ブックマーク / thinca.hatenablog.com (25)

  • Vim の問題を調査したときの記録 - 永遠に未完成

    先日私の環境で起きた Vim に関する問題を調査した際の記録。一例なので汎用的に使える手法ではないけど、こういう感じのことをしているよというのを書き留めておきます。 結果的に無駄だった工程も書いています。1 道で調査が進むことの方が珍しく、だいたい回り道します。 問題 「cgn で検索のマッチ対象を別のキーワードに置き換えたあと . で繰り返すと、Bell が発生する。」 cgn は c + gn で、gn は検索にマッチした範囲です。つまり検索にマッチした内容を c で書き換え、. で次のマッチ対象にも同様の変更を行います。1 つずつ確認しながら置換したい場合などによく使われる操作です。 問題について Vim では不正な操作をした場合など様々な場面で警告としてベルを鳴らします。 例えばノーマルモードでそれ以上移動できない方向に移動しようとした場合など、割と些細なことでも鳴ったりします。

    Vim の問題を調査したときの記録 - 永遠に未完成
  • Vim script で AtCoder に参戦する方法 - 永遠に未完成

    先週、進捗キャンプという知り合いで集まって進捗を出す会に行ってきて、そこで @haya14busa さんと表題の件について色々話した。 その後個人的に手法をカイゼンしたりしたので、結果をまとめておく。 AtCoder とは http://atcoder.jp/ 私自身も「とは」と言って語れるほど詳しくはないので簡単に説明すると、主に日人向けの競技プログラミングサイト。 問題は全て日語で、定期的に様々なコンテストが開催されている。問題の難易度が低い初心者向けのコンテスト(AtCoder Beginner Contest 通称 ABC)なんかもあるので、競技プログラミングの入口としては最適だ。 AtCoder の対応言語 競技プログラミングでは、ソースコードを提出し、提出されたコードが正しく動くかどうかサーバ側で実際に動かして検証を行う。つまり、サーバ側に各言語の処理系が必要であり、競技プ

    Vim script で AtCoder に参戦する方法 - 永遠に未完成
  • スクリプトローカルな関数を手軽に呼び出す - 永遠に未完成

    この記事は Vim Advent Calendar 2011 の 28 日目の代打です。 急遽代打をやることになった*1けどネタが浮かばなかったので、適当に vimrc の中から便利かもしれない関数を晒すことにします。 スクリプトローカルな関数を呼び出したい Vim script を書いてると、スクリプトローカルな関数をコマンドラインモードから直接呼び出して挙動を確認したくなること、ないですか? デバッグで呼び出したい 既存プラグインを拡張したくなった 中身覗くの大好き なんか知らんけど急に呼び出したくなった まあそれなりにシチュエーションはあるかと思います。あることにします。 Vim script ではがんばればスクリプトローカルな関数を呼び出せますが、正直いちいちがんばりたくないです。 スクリプトローカルな関数を呼び出す関数 私の vimrc から抜粋した以下の関数を vimrc に書

    スクリプトローカルな関数を手軽に呼び出す - 永遠に未完成
  • ssh 越しにクリップボード共有したり URL 開いたりする lemonade の便利設定 - 永遠に未完成

    私は普段は Windows マシンから自宅サーバの Linux に ssh で接続して作業しており、端末内で作業が完結している間はいいのだけど、Web ブラウザはローカル側なので、URL を開いたりクリップボードのやりとりなどが面倒。 そこで便利なのが lemonade! GitHub - lemonade-command/lemonade: Lemonade is a remote utility tool. (copy, paste and open browser) over TCP. ssh 越しから URL を飛ばしてローカルでブラウザを開いたり、リモート側からローカルのクリップボードの読み書きができる。便利。 lemonade を使う上であれこれやったのでメモ。 port forwarding lemonade 作者の pocke さんはローカルマシン内で動いている仮想環境との

    ssh 越しにクリップボード共有したり URL 開いたりする lemonade の便利設定 - 永遠に未完成
  • Vim の help を見せてくれる hubot スクリプトを作った - 永遠に未完成

    先週は Vim で help が引ける npm パッケージを作ったのだけど、そもそもなぜ作りたかったかというと、bot で使いたかったから。 と言うわけで vimhelp パッケージを使って、hubot-vimhelp を作りました。 https://www.npmjs.com/package/hubot-vimhelp https://github.com/thinca/hubot-vimhelp README は面倒になってあまりちゃんと書いてない。 導入方法 hubot スクリプトなので、hubot の使い方や hubot スクリプトの導入自体は省略(README に簡単には書いてあるけど)。 このスクリプト自体の導入については、スクリプトのソースの先頭にコメントで簡単な設定用の変数について書いてあるのだけど、ひとまず使いたいのであれば、 bot が動いている環境に vim コマンド

    Vim の help を見せてくれる hubot スクリプトを作った - 永遠に未完成
  • カラースキームに個人的に求めるもの - 永遠に未完成

    最近 Vim のカラースキームの自作に関する記事をちらほら見かける。 私自身も最近、いいカラースキームないかなーと探していたりするので(作る気は皆無)、私が探す際のポイントなんかを書いておく。 ちなみにこの記事では主にカラースキームの機能面についてのみ言及する。 配色に関しては私はセンスがほぼないので、色について完全に感覚で選んでいて参考にならない。 一通りの色が定義してある 最重要項目なのだけど、できていないものが多い。個人的には全て設定されていてほしい。 大きく分けて Vim 自身が使う部品のハイライトと、テキスト内の構文ハイライトで使うものがある。 前者の一覧は :help highlight-groups で見ることができる。この記事を書いている時点での最新版である Vim 7.4.1639 では以下の 45 個だ。たまーに体への機能追加で増えるので、注意したい。 *hl-Col

    カラースキームに個人的に求めるもの - 永遠に未完成
  • vimrc のどこが重いのかを調べるもう1つの方法 - 永遠に未完成

    何やら mattn さんがプラグインを書いたみたい。 Big Sky :: vimrcのどこが重いのかを調べられるプラグイン書いた。 どうやらvimrcの各行にreltimeで時間差を取るコードを埋め込んで実行することで計測している模様。 ところでVimには+profileって機能がある。これを使うとVim scriptの各行が何回実行されてどれくらい時間がかかったのか調べられる。+profileはHuge版Vimでのみ使える。 早速やってみる vimrc を計測したいのならコマンドラインから以下のようにする。 $ vim --cmd "profile start profile.txt" --cmd "profile file $HOME/.vimrc" +q && vim profile.txtprofile.txt に結果を吐き出すように設定してプロファイリングを開始し、.vimrc

    vimrc のどこが重いのかを調べるもう1つの方法 - 永遠に未完成
  • foldmethod=expr が重い場合の対処法 - 永遠に未完成

    この前vim_fold.vim 作ったんだけど、これが結構重い。 foldmethod=expr ではその性質上折り畳みレベルを計算するために該当関数が全行に対して呼ばれる。行数が多ければ当然重くなる。呼び出されるタイミングについては help に明記されていないのだけれど、どうやらテキストが変更されるたびに呼ばれているっぽい。つまり1文字入力する度にバッファの行数分関数が呼ばれる。まままじか!? こりゃたまらんぞ プラグイン側である程度は最適化できるかもしれないけれどたかが知れてるし、何よりこの程度で重いのでは他の同タイプのプラグインでも同じ問題が起きるだろう。 と言うわけで、対処法の一例を紹介することにする。 この設定で Insert mode に入った際に一時的に foldmethod=manual に変更し、Normal mode に戻った際に再び foldmethod=expr

    foldmethod=expr が重い場合の対処法 - 永遠に未完成
  • gf-user で gf の動作を拡張する - 永遠に未完成

    Vim Advent Calendar 2013 の 114 日目の記事です。 gf の問題について gf は、カーソル下のファイルを開く便利機能です。例えば、"foo.c" とバッファに書かれていた場合、ここにカーソルをのせて gf を押すと、foo.c を開いてくれます。更に gF を使うと、"foo.c:23" みたいになっていた場合に、foo.c の 23 行目を開いてくれるので、更に便利です。 便利なんですが、これ、Windows だとうまく動きません。なぜかと言うと、Windows では 'isfname' に : が含まれているから。 'isfname' は、ファイル名として認識する文字のセットを指定するオプションで、gf はこれを使ってカーソル位置のファイルを認識します。しかし Windows ではドライブレター(C:とか)の関係で : が isfname に含まれているた

    gf-user で gf の動作を拡張する - 永遠に未完成
  • vim_fold.vim 作った - 永遠に未完成

    Vim script には今まで fold marker を埋め込んでいたのだけど、毎回埋め込むの面倒だし、見た目もあまりイケてないので foldexpr で折り畳むことにした。 https://github.com/thinca/vim-ft-vim_fold 折り畳まれる箇所 function 〜 endfunction augroup 〜 augroup END 行継続 (:help line-continuation) 'foldmarker' 特に行継続の折り畳みは 'foldtext' をいじって中身が1行に見えるようになってる。例えば、 これが、 こうなる。 'foldmarker' にもある程度対応しているので、関数とは別にカテゴリ別に折り畳みたいって場合でも併用できる。 とりあえず自分が欲しいものを作っただけなのでもし要望とかあれば言ってくれれば取り込むかも。

  • git pull したときに自動で git stash save と git stash pop をする - 永遠に未完成

    なんか作業している時に最新版取ってきたいとき、git stash してから git pull してまた git stash pop するのダルいので自動でやる設定。 [rebase] autostash = true 設定の名前見るとわかるけど、rebase の時にも動く。当然 conflict した場合は手動の時と同じように対応が必要。 便利。

    git pull したときに自動で git stash save と git stash pop をする - 永遠に未完成
  • KaoriYa 版で追加される機能まとめ - 永遠に未完成

    KaoriYa 版 Vim では日語を使う際に便利な patch が多数当てられている。patch 自体は体に付属しているが、そこ以外で体との差分をまとめたものが見当たらなかったので、patch を参考に家からの変更点をまとめてみた。 足りない部分や勘違いしている部分がある可能性があるので、突っ込み歓迎。 確認に使ったバージョン Vim 7.2-20090321 香り屋版 runtime syntax/memo.vim 新規に追加。どんなものかは README_w32j.txt を開いてみればわかる(このファイルが ft=memo に設定されている)。 syntax/java.vim javadoc コメント内の最初の一文は専用の色でハイライトされるが、"." だけでなく "。" で終わる部分も文として認識するように修正されている。 syntax/2html.vim ftp://~

    KaoriYa 版で追加される機能まとめ - 永遠に未完成
  • 本当にキモい Vim script - 正規表現編 - 永遠に未完成

    Vim Advent Calendar 2012 の 339 日目の記事です。 先日、Lingr で :s コマンドの引数をパースする方法についての話になりました。 :s はご存知の通り、置換コマンドです。 :[range]s[ubstitute]/{pattern}/{string}/[flags] [count]今回 [range] と [count] は無視するとして、それ以外の {pattern} と {string} と [flags]、あとはパターン内でエスケープされているかもしれない区切り文字(多くの場合は /) が何になるか知りたい。 結果的にできたのは以下のような正規表現です。 \v^s%[ubstitute]([\x00-\xff]&[^\\"|[:alnum:][:blank:]])(%(\\.|.){-})%(\1(%(\\.|.){-})%(\1([&cegiIn

    本当にキモい Vim script - 正規表現編 - 永遠に未完成
  • commit --amend 時にコミットログの入力を省く - 永遠に未完成

    git commit --amend を使うと、直前のコミットでやり忘れた変更を付け足せるのでとても便利。 でも、多くの場合は変更部分に typo を見つけた場合とかファイルを追加し忘れていた場合などで、コミットログの編集を行うことはほとんどない。でも --amend をするとコミットログの編集用にエディタが立ち上がる。すぐに終了すればいいんだけど、エディタって場合によっては立ち上がるの遅いし必要ないなら立ち上がってほしくない。これを避ける方法。 git commit --amend -C HEADこれで OK。-C は既存のログメッセージを再利用するオプション。 私は以下のように alias を設定している。 cia = commit --amend -a -C HEAD私は -a を付けるタイプ。ここは好みで。 ついでに日時を更新する git commit --amend では、コミッ

    commit --amend 時にコミットログの入力を省く - 永遠に未完成
  • カラースキームを作ってみよう - 永遠に未完成

    Vim Advent Calendar 2012 の 131 日目の記事です。 毎日のように Vim を使っているみなさんは、恐らくお気に入りのカラースキームがあったりすると思います。中には一部が気にわなくて改造してみたり、更にはすでに自作している方もいるかもしれません。 今回は、「カラースキーム作ってみたいけど作り方がよくわからない><」「改造して使ってるけど実はよくわかってないんだよね…」といった方を対象に、カラースキームの作り方について簡単に説明してみようと思います。長くならないように、適時端折っていこうと思います。 始めに ぶっちゃけてしまうと、最初は既存のカラースキームを改造するところから入るのが楽です。真似して書くとだいたいそれっぽくなるものです。 この記事では 0 から作ることを想定して解説していきますが、チュートリアル的な内容と言うより知識的な解説になっているので、改造だ

  • submode.vim とその設定例なんかを紹介 - 永遠に未完成

    Vim Advent Calendar 2012 の 62 日目の記事です。 私が毎日のようにお世話になっているプラグインの1つに、kana さん作の submode.vim と言うのがあります。結構昔からあり、かなり便利なのにあまり知られていないような気がします。これはもったいない!と言うことで今回はこの submode.vim について書こうと思います。 submode.vim とは https://github.com/kana/vim-submode submode.vim は、ユーザが自由にサブモードを定義できるプラグインです。…と言っても何のことやらさっぱりですね。 Vim には、複数のキー、つまりキーシーケンスによって成立するコマンドがたくさんあります。例えば <C-w>+ は現在のウィンドウの高さを変更します。そして、この複数のキー入力が必要な割に、連続で入力したいコマンド

    submode.vim とその設定例なんかを紹介 - 永遠に未完成
  • 端末の Vim でも Alt キーを使う - 永遠に未完成

    当は Vim Hacks のネタにしようと思ってたんだけど、どの環境でも動くかよくわからんし確認もしようがなかったのでメモ代わりにこっちに書いておく。というわけで環境によっては動かないかもしれないのであしからず。 端末の Vim のノーマルモードで Alt キーにマッピングする小技。 nmap <ESC>a <M-a> 見ての通り で始まるので挿入モードなどでは使えない。いや、使ってもいいけど挿入モードから抜ける度にキー待ちが発生するのでやめた方がいい。 なお、a を直接機能にマッピングする方法も考えられるけど、そうすると gVim と設定が共存できない。素直に にマッピングするのが無難。 また、 を押すと が送られてくるようなので、逆に が来たら になるようにしておく。 map <NUL> <C-Space> map! <NUL> <C-Space> こっちは挿入モードでも使える。なの

    端末の Vim でも Alt キーを使う - 永遠に未完成
  • puttyでリモートからWindowsのクリップボードにコピー - 永遠に未完成

    できる patch を id:guyon が作ってくれた。 id:guyon++。 PuTTYを使ってリモートのシェル操作でWindowsのクリップボードにテキストをコピーする - Guyon Diary 素晴らしすぎる。素晴らしすぎるので少し補足など。 winclip コピペできるVer. #!/bin/sh echo -ne "\e[5i" cat $* echo -ne "\e[4i" Vim vnoremap <silent> "+Y :w !winclip<CR><CR> vnoremap <silent> "*Y :w !winclip<CR><CR> 行指向で良ければこれだけで大丈夫。{lhs}は単に好みです。 が2つあるのは、 hit-enter-prompt が出ちゃうから。 'cmdheight' が2以上の人は要らないと思う。 あ、winclipにはパス通してあります

    puttyでリモートからWindowsのクリップボードにコピー - 永遠に未完成
  • Vimスクリプト基礎文法最速マスター - 永遠に未完成

    流行ってるみたいなので遅ればせながら便乗。需要?何それおいしいの? Perl基礎文法最速マスター - サンプルコードによるPerl入門 - Perlプログラミングの基礎から応用まで Route 477(2010-01-25) PHP基礎文法最速マスター - Shin x blog Python基礎文法最速マスター - LazyLife@Diary VBA基礎文法最速マスター - いろいろ解析日記 Java基礎文法最速マスター - いろいろ解析日記 Bash基礎文法最速マスター - いろいろ解析日記 Haskell基礎文法最速マスター - think and error Brainf*ck基礎文法最速マスター - このブログは証明できない。 VBScript 基礎文法最速マスター - CX's VBScript Diary - VBScript グループ JavaScript基礎文法最速マス

    Vimスクリプト基礎文法最速マスター - 永遠に未完成
  • Vim プラグインの開発スタイルのお話 - 永遠に未完成

    Vim のプラグインって作ってる最中は Vim 自体の動作も不安定になりがちだし、普段の環境と同じ環境で作ってるとなにかと弊害が起きがち。ちょっとした変更ならまだしも、大規模な変更は 1 度の作業で終わらないこともあるし、作業中断して別のことをやることになったりするとさらに面倒。 または、VCS でプラグインを管理したくて、プラグインごとにリポジトリを独立したいけど環境分けるのが面倒だとか。 というわけで私が普段やってる Vim プラグインの開発スタイルを晒してみようと思う。 設定 私の vimrc には最後の方に以下の記述がある。 " Load settings for each location. augroup vimrc-local autocmd! autocmd BufNewFile,BufReadPost * call s:vimrc_local(expand('<afile

    Vim プラグインの開発スタイルのお話 - 永遠に未完成