出しちゃいます。
/dotfiles/vim/mattn-vimrc - CodeRepos::Share - Trac正直デカイです。
/dotfiles/vim/mattn-gvimrc - CodeRepos::Share - Trac
もう随分昔からあるvimrcなので使ってない機能もあれば、忘れてしまったノウハウもいっぱい...
あまり参考にならないかもしれませんが、どうぞ。
mattn the vimmer!
追記
マルチプラットフォーム用です。
/dotfiles/vim/mattn-vimrc - CodeRepos::Share - Trac正直デカイです。
/dotfiles/vim/mattn-gvimrc - CodeRepos::Share - Trac
別のサーバへファイルを送信します。--remote-silent [+{cmd}] {file} ...
+{cmd}により開く際にコマンドを併用出来ます。
--remote と同等ですが、エラー等が発生してもメッセージ出力されません。--remote-wait [+{cmd}] {file} ...
--remote と同等ですが、送信したvimが終了するまで待機します。--remote-wait-silent [+{cmd}] {file} ...
vimで編集した結果をどこかに送るシェルスクリプト等では使えるかもしれません。
--remote-wait と同等ですが、エラー等が発生してもメッセージ出力されません。--remote-tab [+{cmd}] {file} ...
--remote と似ていますが、指定されたファイルを全て別タブで開きます。--remote-tab-silent [+{cmd}] {file} ...
--remote-tab と同等ですが、エラー等が発生してもメッセージ出力されません。--remote-tab-wait [+{cmd}] {file} ...
--remote-tab と同等ですが、送信したvimが終了するまで待機します。--remote-tab-wait-silent [+{cmd}] {file} ...
--remote-tab-wait と同等ですが、エラー等が発生してもメッセージ出力されません。--servername {name}
リモートサーバを名称で指定します。リモートサーバ一覧を取得するには --serverlist を使用します。--remote-send {keys}
リモートサーバにキーを送ります。基本的にnormalコマンドで与える引数と同等です。--remote-expr {expr}
リモートサーバに式を送り、その結果を出力します。--serverlist
リモートサーバ一覧を出力します。
{server}に対して{string}という式を評価して貰います。remote_foreground({server})
:echo remote_expr("gvim", "2+2")と書くと4が表示されます。
{server}をフォアグラウンドにします。
remote_expr({server}, "foreground()")
と同等の機能ですね。
等がありますので、vimを起動しなくても色々な事が出来ます。
package Plagger::Plugin::Publish::Vim;
use strict;
use base qw( Plagger::Plugin );
our $VERSION = '0.01';
use Encode;
sub register {
my($self, $context) = @_;
$context->register_hook(
$self,
'plugin.init' => \&initialize,
'publish.entry' => \&add_entry,
);
}
sub initialize {
my($self,$context) = @_;
$self->{vim} = $self->conf->{vim};
$self->{vim} = "vim" if (!$self->{vim});
$self->{server} = $self->conf->{server};
if (!$self->{server}) {
open(IN, "vim --serverlist|");
$self->{server} = <IN>;
close(IN);
chomp $self->{server};
}
open(IN, sprintf("%s --servername %s --remote-expr \"&encoding\"|",
$self->{vim}, $self->{server}));
$self->{encoding} = <IN>;
print $self->{encoding}."\n";
close(IN);
my $command = sprintf("%s --servername %s --remote-send \"<C-\\\><C-N>:new<CR>i\"",
$self->{vim}, $self->{server});
system($command);
}
sub add_entry {
my($self, $context, $args) = @_;
$context->log(info => $self->{server});
my $command = sprintf("%s --servername %s --remote-send \"%s\n\t%s\n<C-W>\"",
$self->{vim}, $self->{server},
encode($self->{encoding} || 'utf8', $args->{entry}->{title}),
encode($self->{encoding} || 'utf8', $args->{entry}->{link}),
);
system($command);
}
1;
で、YAMLはこんな感じ
global:
assets_path: /home/user/plagger/assets
timezone: Asia/Tokyo
log:
level: info
plugins:
- module: Subscription::Config
config:
feed:
- http://b.hatena.ne.jp/t/vim?mode=rss
- module: Filter::BreakEntriesToFeeds
config:
use_entry_title: 1
- module: Publish::Vim
config:
#vim: vim7
#server: GVIM1
実行結果は
C:\TEMP> svn checkout http://google-gtags.googlecode.com/svn/trunk/ google-gtags
次に、以下のパッチを当てます。
Index: regexp.h
===================================================================
--- regexp.h (revision 57)
+++ regexp.h (working copy)
@@ -4,7 +4,9 @@
#ifndef TOOLS_TAGS_REGEXP_H__
#define TOOLS_TAGS_REGEXP_H__
+extern "C" {
#include <regex.h>
+}
#include "tagsutil.h"
class RegExp {
Index: configure
===================================================================
--- configure (revision 57)
+++ configure (working copy)
@@ -10,7 +10,7 @@
if [ ! -e "scons/scons.py" ]; then
pushd scons > /dev/null
echo "Unpacking scons..."
- tar xzvf scons-local.tar.gz > /dev/null
+ gzip -dc scons-local.tar.gz | tar xv > /dev/null
if [[ "$?" == 0 ]]; then
echo "Done"
else
Index: gtags.cc
===================================================================
--- gtags.cc (revision 57)
+++ gtags.cc (working copy)
@@ -49,6 +49,10 @@
#include "tagsoptionparser.h"
#include "tagsrequesthandler.h"
+#ifdef WIN32
+# include <winsock2.h>
+#endif
+
DEFINE_STRING(tags_file, "", "The file containing the tags information.");
@@ -78,6 +82,11 @@
return -1;
}
+#ifdef _WIN32
+ WSAData wsadata;
+ WSAStartup(MAKEWORD(2,0), &wsadata);
+#endif
+
logger = new StdErrLogger();
tags_request_handler = new TagsRequestHandler(GET_FLAG(tags_file),
@@ -90,4 +99,9 @@
delete tags_request_handler;
delete logger;
+
+
+#ifdef _WIN32
+ WSACleanup();
+#endif
}
Index: gtags.py
===================================================================
--- gtags.py (revision 57)
+++ gtags.py (working copy)
@@ -175,11 +175,11 @@
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = socket.getaddrinfo(host, port, socket.AF_INET,
socket.SOCK_STREAM)
- signal.signal(signal.SIGALRM, alarm_handler)
- signal.alarm(CONNECT_TIMEOUT)
+ #signal.signal(signal.SIGALRM, alarm_handler)
+ #signal.alarm(CONNECT_TIMEOUT)
s.connect(address[0][4])
- signal.alarm(0)
- signal.alarm(DATA_TIMEOUT)
+ #signal.alarm(0)
+ #signal.alarm(DATA_TIMEOUT)
# need \r\n to match telnet protocol
s.sendall(command + '\r\n')
@@ -191,7 +191,7 @@
while data:
buf.write(data)
data = s.recv(1024)
- signal.alarm(0)
+ #signal.alarm(0)
return buf.getvalue()
# Instance of connection_manager that forwards client requests to gtags server
Index: tags_logger.h
===================================================================
--- tags_logger.h (revision 57)
+++ tags_logger.h (working copy)
@@ -67,6 +67,7 @@
}
};
+#undef ERROR
const int INFO = 0, WARNING = 1, ERROR = 2, FATAL = 3, NUM_SEVERITIES = 4;
// uncomment out the standard google logger
Index: socket_server.cc
===================================================================
--- socket_server.cc (revision 57)
+++ socket_server.cc (working copy)
@@ -18,10 +18,14 @@
#include <assert.h>
#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <unistd.h>
+#ifdef WIN32
+# include <winsock2.h>
+#else
+# include <sys/socket.h>
+# include <netinet/in.h>
+# include <arpa/inet.h>
+# include <unistd.h>
+#endif
#include <string>
#include "tagsprofiler.h"
@@ -29,6 +33,12 @@
#include "tagsrequesthandler.h"
#include "socket_server.h"
+#ifdef WIN32
+typedef int socklen_t;
+#define write(x, y, z) send(x, y, z, 0)
+#define close(x) closesocket(x)
+#endif
+
extern GtagsLogger* logger;
DEFINE_INT32(tags_port, 2222, "port to tags server");
次にgoogle-gtagsのソースルートにregex for win32を解凍します。これで、gnu_regex_distというフォルダが出来ます。
sh configure
お持ちでない方でもconfigureの中身を見ると大体検討が付きます。
all: gtags.exe
gtags.exe : filename.cc gtags.cc sexpression.cc strutil.cc symboltable.cc tagsoptionparser.cc tagsprofiler.cc tagsrequesthandler.cc tagstable.cc socket_server.cc gnu_regex_dist/regex.c
gcc -DHAVE_STRING_H -c -I. gnu_regex_dist/regex.c
gcc -I. -Ignu_regex_dist -o gtags.exe filename.cc gtags.cc sexpression.cc strutil.cc symboltable.cc tagsoptionparser.cc tagsprofiler.cc tagsrequesthandler.cc tagstable.cc socket_server.cc regex.o -lstdc++ -lws2_32
あとはspiritlooseのはてなダイアリー - [Vim]Google Tags(GTags)を試してみた(with Vim)を参考に
lang_call_to_server = {
"c++" : { "definition" : [("localhost", 2222)],
"callgraph" : [] },
"java" : { "definition" : [],
"callgraph" : [] },
"python" : { "definition" : [],
"callgraph" : [] } }
等と設定して、vimrcに
exec "set runtimepath+=".escape(globpath(&runtimepath, 'gtags'), ' ')
nmap <C-]> :call Gtag(expand('<cword>'))<CR>
を追加します。
python c:/temp/google-gtags/gentags.py --etags=c:/emacs/bin/etags.exe --rtags=c:/temp/google-gtags/rtags.py --etags_to_tags=c:/temp/google-gtags/etags_to_tags.py
ここではetagsとしてemacsに含まれるバイナリを使用しましたが、ctags.exeをetags.exeにリネームしても同様に使えます。
c:/temp/gtags.exe --tags_file ./cpp.tags.gz --tags_port 2222 --gunzip
起動したらvim(gvim)を起動して、タグジャンプしたい部分でC-]します。このブログを応援する