2021年4月27日火曜日

日本語でタグジャンプができるようにする(最新版)

 

なぜか、うまく動かなかったので、修正!!!!!!!!!



= @タグジャンプ作成 

日本語でタグジャンプができるようにする(最新版)


1. tagファイル作成

~/myprg/tags.pl

#!/bin/sh

find . -name "*.*" -print -exec grep -E -o -dskip '\*[^*]{1,20}\*' {} + | ~/myprg/


#grepまでの出力結果は以下となる

#アスタリスクがある場合はダブルクオーテーションで囲う必要がある

#f#ind . -name "*.txt" -print -exec grep -E -o -dskip '\*[^*]{1,20}\*' {} +

#./tmp.txt:*standard-output*


~/myprg/tags.sh

#!/usr/bin/perl


use utf8;

use warnings;

binmode STDOUT, ":utf8";

binmode STDIN, ":utf8";


#tags.shのgrepまでの出力は、以下のようなパターンの行が複数ならんでいる

#./tmp.txt:*standard-output*

# それをこのtags.plで キーワードに一致する行を取り出し 書く特殊変数

# に代入して、以下のパターンが並ぶ複数行のtagsファイルを作成するいく

# standard-output   ./tmp   /*standard-output*


# 最終的に tags_jump.vim tags_jump.pl で

# vim ./tmp  -c /*standard-output* が実行され、

# ファイル./tmp のstandard-outputがある行にジャンプする

while ($line = <>) {

    #if をいれないとUse of uninitialized value $2 in concatenation

    #と怒られる

    if ($line =~ /^(.*):\*(.*)\*/){

        #$lineは bbb ./tmp5.txt  /*bbb* のように出力される

        #以下で  **で囲まれた文字列で空白文字があれば削除

        # * aaa* など

        if (!($2 =~ /\s/)){

            print "$2\t$1\t/*$2*\n";

        }

  }

}


2. ファイル上で日本語を選択ヤンクして、C-kでタグジャンプする。

  戻るときは:qでファイルを閉じて後、リターン


~/myprg/tags_jump.vim

split /home/moto/myprg/yank_file.txt

normal ggdG"0p

set fileencoding=utf-8

set fileformat=unix

wq

!/home/moto/myprg/tags_jump.pl

"ジャンプしたい文字列を選択ヤンク後C-kでジャンプ。

"戻るときは:q後リターン。


~/myprg/tags_jump.pl

#!/usr/bin/perl

package pkg1;

use strict;

use warnings;


#カレントディレクトリを求める

use Cwd 'getcwd';

my $cur_dir = getcwd;


#参考サイト

#http://www.nct9.ne.jp/m_hiroi/linux/perl04.html

#1

#use utf8;を設定すると、

#プログラム中の文字列は内部形式の文字列として扱われます。

#プログラム中の日本語、例えば「あいうえお」を5文字と認識するようになる。

#use utf8;を設定しないと15文字と認識する(length関数の結果)

#

#正規表現で日本語を使う場合

#通常、Perl は文字列をバイト単位で取り扱います。これを「バイト文字列」と呼

#ぶことにしましょう。一般に、日本語の 1 文字は複数のバイトを使って表されて

#います。正規表現を使うとき、このままでは文字単位で照合することができませ

#ん。Perl の場合、内部では文字列をユニコードで表しています。バイト文字列を

#内部形式の文字列に変換すると、正規表現でも日本語を使うことができるように

#なります。


#まず、プログラムに書かれている文字列ですが、何も指定しなければ「バイト文

#字列」として扱われます。ファイルの先頭で use utf8; を設定すると、プログラ

#ム中の文字列は内部形式の文字列として扱われます。なお、プログラムを UTF-8

#で記述したとしても、use utf8; を指定しないかぎり、文字列はバイト文字列と

#して扱われます。



#2

#ただし、use utf8; で内部形式の文字列になるのはプログラム中に記述された

#文字列だけです。外部 (ファイルハンドルやコマンドライン引数など) からの

#入力された文字列は「バイト文字列」として扱われます。



#3 入力で内部形式の文字列を受け取る

#ファイルをリードオープンするとき、open の第 2 引数に

#:utf8 を指定すると、内部形式に変換された文字列を受け取る

#open に渡すファイル名はosのバイト文字列して渡す。

#open my $in, "<:utf8", encode('utf-8', $file);


#openやunlinkなどの関数にファイル名を指定するときは、OSのバイト文字列に

#変換して指定する必要があります。



#4 出力で内部形式からバイト文字に変換してしないとダメ

#日本語を正規表現で扱う場合 内部文字列にしないとだめ

#ただし内部文字をそのままprintで出力するとワーニングが表示されます。

#それで encodeでバイト文字に変換する

#すでにオープンされているファイルハンドルの場合、関数 binmode で :utf8

#を指定すると、内部形式の文字列からバイト文字列の変換を行うことができる

#つまりprint文だけで表示できる

#binmode STDIN, ":utf8";

#binmode STDOUT, ":utf8";


use utf8;

#だし、use utf8; で内部形式の文字列になるのはプログラム中に記述された文字

#列だけです。外部 (ファイルハンドルやコマンドライン引数など) からの入力さ

#れた文字列は「バイト文字列」として扱われます。


#ファイルをリードオープンするとき、open の第 2 引数に :utf8 を指定すると、

#内部形式に変換された文字列を受け取ることができます

#open my $in, "<:utf8", $filename;


#すでにオープンされているファイルハンドルの場合、関数 binmode で :utf8 を

#指定すると、内部形式の文字列とバイト文字列の変換を行うことができます。


#binmode STDIN, ":utf8";

#binmode STDOUT, ":utf8";

#binmode で STDOUT に :utf8 を設定すると、内部形式の文字列をバイト文字列

#(OS の文字コード) に変換して出力します。


binmode STDOUT, ":utf8";

binmode STDIN , ":utf8";


my $word;

my $line;

my $file = "";

my $kensaku = "";


#検索文字列取得をyank_file.txtから取得

## 下一行書くことによりEncode::decode ではなくdecodeとかける

use Encode;


my $inputfile = "/home/moto/myprg/yank_file.txt";

open my $in1, "<:utf8", Encode::encode('utf-8', $inputfile) or die "$!";

#open my $in1, "<:utf8", $inputfile or die "$!";

while (<$in1>){

    $word = $_;

    #print $word;

}

close $in1;

#print "\n";


#文字列最後の改行を削除

chomp($word);

#print $word;

#print "\n";



#if ( 文字列 =~ /パターン/) もし「文字列」の中に「パターン」

#が含まれていれば (パターンマッチすれば真


#tagsから検索文字列(word)のある行を取得

#$lint = 'word  ./filename  /*word*'となる


#\s 空白文字(スペース、タブ、改行) /S 空白文字以外

#()でグループ化して$2,$3の変数で受け取る


#$word = "ポインタ";

#$word = "struct";

my $tags = "/tags";

#文字列の結合 tagsファイルのフルパスを取得

my $tags_path = "$cur_dir$tags";

#print $tags_path;

#print "\n";


# tagsファイルは 以下のパターンが並ぶ複数行のファイル

# standard-output   ./tmp   /*standard-output*

# それを$2に./tmp を代入 $3に/*standard-output* を代入している

#

my $count = 0;

open ( my $in2, "<:utf8", encode('utf-8', $tags_path) ) or die "$!";

while (my $line = <$in2>){

    #print $line;

    # iオプション 小文字 大文字を無視する

    if ( $line =~ /^($word)\s(\S+)\s(\S+)/i ){

        #$file = "$cur_dir.substr($2, 1)";

        $file = substr($2, 1);

        $file = "$cur_dir$file";

        $kensaku = $3;

        $count ++;


        #print "if";

        #print "\n";

        #print $line;

        #print "\n";

        #print $file;

        #print "\n";

        #print $word;

        #print "\n";

        #print $kensaku;

        #print "\n";

    }

}

#print $word;

#print "\n";

close $in2;



#以下エラーでる時がある

#VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Oct 13 2020 16:04:38)

#引数がありません: "-c"


#検索文字列のあるファイルを開き検索文字列を検索

my $vim = 'vim.nox-py2';

#...vimでfileを開くと同時に$kensakuを実行

#$vim $fileとスペースをいれる


# eq 文字列の完全一致

if ($count == 1){

    my $cmd = "$vim $file -c $kensaku";

    #...コマンド実行

    system ($cmd);

}elsif ($count >= 2){

    print "複数定義されています";

}else{

    print "一致する文字列がありません\n";

}



~/.vimrc設定

"tagsジャンプ

"日本語でタグジャンプ

nnoremap <C-k> :so /home/moto/myprg/tags_jump.vim<CR>

":q リターン で元に戻る


[2013-08-16 15:06]


0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts