質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

Q&A

解決済

2回答

6329閲覧

vimで現在開いているファイルのパスから、他のファイルを選択する方法

mitsuru793

総合スコア157

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

0グッド

1クリップ

投稿2015/08/21 03:49

vimで./category/cat/nya.txtを開いているとします。その時に、e ./category/cat/foo.txtとパスを打たずにさっと別ファイルを開きたいです。

Unite.vimを入れて、.vimrcに次を追加すればできると思いました。

bash

1 2" " sourcesを「今開いているファイルのディレクトリ」とする 3noremap :uff :<C-U>UniteWithBufferDir file -buffer-name=file<CR>

ですが、ctrl + uを押しても元のショートカットであるページ上へページ送りにしかなりません。どうしたらこのショートカットが使えるようになりますか?
また:uffとはどのキーのことを示しているのでしょうか?

ご回答、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

vimプラグインについては知識がないのでわかりませんが、やりたいことは簡単なのですから自分でコマンドでも書いてみたらどうでしょうか。

現在編集中のファイルについてそのパス名を得るのは組み込み関数expandを使ってexpand("%:p:h")とすれば良いだけです。例えば以下のように.vimrcに書けます。
"とりあえず関数にする
function OpenFileFromNowPath(filename)
let path=expand("%:p:h")."/"
execute "tabedit ".path.a:filename
endfunction
"コマンド化
command -nargs=1 CommandName OpenFileFromNowPath(<f-args>)
"大文字から打つのが面倒なら更にショートカットコマンド名をつける
cabbrev shortcut CommandName

これで:shotcut filenameと打てば現在開いているファイルのあるパスを基準に打てます。
まあ好き嫌いでしょうが私は極力得体の知れない人のコードが私の環境で走るのは嫌いなのでvimに関しては自分で全部書いてます。

投稿2015/08/21 15:50

henpon

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitsuru793

2015/08/23 11:47

まだunite.vimを使いこなしていないので、このプラグインに慣れようと思っております。 henponさんは、プラグインを使わず全部自分でコードを書いているのですね。uniteのようなGUIな感じの画面まで作れるようになるととても便利だと思います。 今回は、プラグインを使用しない場合のソースコードを掲示していただき、ありがとうございました。 参考にさせていただきます。
guest

0

ベストアンサー

カレントファイルのパスを基準に他のファイルを開くには単純に :e %:h/foo.txt のようにすれば良いです。

Ex コマンドのファイル名を要求する場所で % を使うとカレントファイル名に置き換えられます。
その後の :h でカレントファイルのディレクトリパスを取得しています。

例えばカレントファイルが category/cat/nya.txt なら、%category/cat/nya.txt となり、%:hcategory/cat になります。

ですが、ctrl + uを押しても元のショートカットであるページ上へページ送りにしかなりません。どうしたらこのショートカットが使えるようになりますか?
また:uffとはどのキーのことを示しているのでしょうか?

vim

1noremap :uff :<C-U>UniteWithBufferDir file -buffer-name=file<CR>

これは :uff:<C-U>UniteWithBufferDir file -buffer-name=file<CR> をマッピングしています。:uff とは単一のキーのことではなく、:, u, f, f という一連のキー入力を表しています。ノーマルモードなどでそのまま :uff と入力するとこのコマンドが実行されます。
<C-U> はコマンドラインモードでは行頭からカーソル位置までの全ての文字を削除するという機能を持ちます。
ビジュアルモードで範囲選択した状態で : を押してコマンドラインモードに移行すると :'<,'> と入力された状態でコマンドラインモードが開始されてしまうので、<C-U> を付けることでそれを取り除くようにしているだけで、<C-U> に対して何かをマッピングしているわけではありません。

質問内容とは関係無くなりますが、マッピングの接頭辞に : を使うのはあまりおすすめできません。
一般的にはこのようなマッピングの接頭辞には既存のマッピングが無い or ほとんど使われないバックスラッシュやカンマ、スペースなどを使うのが良いでしょう。

投稿2015/08/25 10:10

mitei

総合スコア89

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitsuru793

2015/08/25 12:22

:uffは連続したキーの入力なのですね。uffというイベントかと思いました。 連続したキーもトリガーにでいるとは便利ですね。マッピングの接頭辞のご指摘も大変ためになりました。 また:hについては知りませんでした。これはすごい便利ですね。もっとVimを使いこなしていきたいです。 ご回答頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問