Project Unknown's Blog

Peojct.Unknownと言う名前で細々とアプリ開発をやってるメンバーのブログです。

テーブルで余計なセパレータが表示されてしまう問題

どうも、どうまずです。

TableViewのセパレータですが、ちょっと変な動作をします。

次の画像をご覧下さい。

f:id:project-unknown:20170604203048p:plain

これですが、
TableViewのセルは色付き2つだけなんです。
しかし、余計なセパレータが引かれてしまい、複数のセルがあるように見えてしまいます。

セル数が固定の場合、TableViewの高さを調節すればいいのですが、
動的の場合、TabelViewの高さ調整をするのは、正直めんどくさいです。

どうにかセパレータを非表示にする方法はないのか?

いろいろ設定を変更などしてみましたが、
どうやら、最後のセルの高さを継承して、セパレータが引かれてしまうようです。

苦肉の索として、
このセパレータ問題用にセクションを一つ用意する。

そのセルのサイズを画面サイズと合わせます。
そうすると、余計な罫線が見えなくなります。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
     
   if (indexPath.section == testTable.numberOfSections - 1) {
       // 最後のセクションの場合、高さを画面サイズに合わせる
       return UIScreen.main.bounds.size.height
   } else {
       return 50.0
   }
}

しかし、このままでは、タップしたときに、セルの色が変わってしまい、背景感が無くなってしまいます。

そのため、最後のセクションのセルをタップされた場合、色がかわらないように設定します。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell = UITableViewCell()
   if (indexPath.section == testTable.numberOfSections - 1) {
       // 最後のセクションの場合、タップされても、色が変わらないように設定(背景感UP)
       cell.selectionStyle = UITableViewCellSelectionStyle.none
   }   
   return cell
}

これでまるで背景のようなセルが完成です。

f:id:project-unknown:20170604203227p:plain


余計なセパレータが表示されないようになります。
(正確には「余計なセパレータが表示されていないかのようになります。」ですかねぇ・・・)

Unityのディレクトリ/フォルダ構成 (2017年8月時点)

はじめに

Unityが初心者すぎるが所以か、ディレクトリ構成にものすごく毎日頭を悩ませております。 (神経質過ぎる性格なせいで、ディレクトリ等のProject管理系がしっかりしていないと何事も集中できない面倒な性格です。。。)

なので、一回自分なりに管理しやすいUnityのディレクトリ管理について纏めます。 多分正解はないと思うし、日々updateしていく考え方だと思うので、定期的にこの記事は更新できれば良いなーと思う所存です。

参考にさせていただいたサイト様

以下2つを参考にさせていただいております

komaken.me

qiita.com

2017年6月時点でのディレクトリ構成

Assets/
{$GameName}/ Gameの名前のディレクトリを1つ作って、開発するものをこの中に全部突っ込む。AssetStore等で外部から持ってきたAssetがフォルダを崩さないようにする(上述サイト様の受け売り)
Animations/ Gameで使うAnimationを設置
Audio/ Gameで使う音楽ファイルを設置
Fonts/ Gameで使うフォントを設置
Shaders/ Gameで使うシェーダーを設置
Materials/ Gameで使うMaterialを設置
Scripts/ Gameで使うScriptを設置
{$namaspace}/ 名前空間ごとにフォルダを切る(これは目からウロコ) Arborとかで作ったものをここに置くと良いかも
Editor/ エディタ拡張用
Behavior/ MonoBehaviorを継承したもの
Librarys/ MonoBehaviorを継承していないが他で使いたいもの
Scene/ Scene設置
Test/ Test用のScene
Game/ ゲームで使うScene
Prefabs/ ゲームで利用するPrefab
Object/ 基本はここ以下に設置。量が増えるので種類ごとに分ける
Particle/ パーティクル
Etc/ その他
Physics Materials/ ゲーム内の物理エンジンで利用するPhysics Materialを設置
Texture/ ゲームで利用するTextureを設置
Editor/ Unityのエディタ拡張の為設置
Externals/ AssetStoreunitypackageで取ってきたものを設置
License/ LICENSE(主にAssetsや他の作者様の物を使った時等)とかを纏めておく
Models/ FBXとか
Plugins/ dll置き場
ProjectUnknown-Kit/ 自分達のProject共通Package
{$Framework_name} フレームワーク毎にフォルダを命名します(バッティング防止の為) 、これより以下は、上記{$GameName}/と同じ構成
Resources/ Resources.Loadで読み込むものを設置

一旦これですすめようと思います。 他に良い管理法があればご教示頂ければmm

GitKrakenを試してみる

ゆう@あんのうんです。

普段SourceTreeを愛用しているのですが、前々からずっと気になっていたGitKrakenを試してみようと思い、その導入の際のメモを記します。 Git(GitKrakenも)は多彩な機能が搭載されていますが、今回はわかりやすく初期導入からcommit, pushまでを目指します。 操作はMac版で行っています(おそらくWindows版でもほぼ変わらないとは思います)

GitKrakenって?

一言で言えば、GitをGUIベースで扱えるようになるツールです。

f:id:project-unknown:20170603150238p:plain アイコンがどうみても、Githubのoctocatを意識しているとしか思えない…

f:id:project-unknown:20170603150319p:plain

GitKrakenはGithubが開発したElectronベースで作られたGitクライアントです(だからoctcatに似て…) 他のGitクライアントと比較して、後発なソフトな為、SourceTreeなどと比較してモダンな造りであったりグラフィカルな面では良い感じに見えますね。

f:id:project-unknown:20170603151257p:plain 公式の画像を取ってきましたが、ここだけ見てもかなりグラフィカルな所が伝わってきますね(=´▽`=)

GitKrakenのインストー

以下のサイトからpkgをダウンロードしてきます。 www.gitkraken.com

初回起動

落としたpkgを開いてみます。(イカが泳いだアニメーションがスプラッシュになっとる…)

f:id:project-unknown:20170603152028p:plain

どのアカウントでログインするかを求められるので、私の場合Githubアカウントを持っていたので、Githubでログインしました。 (持っていない場合は、GitKrakenのIDを作っちゃっても良いかもしれませんね)

ログイン後、GitKrakenの画面に戻ってくると f:id:project-unknown:20170603152402p:plain ライセンスが聞かれるので、斜め読みしてAgree

f:id:project-unknown:20170603152652p:plain (なんかAgree押しても何も置きなかったので再起動しました)

ここであることに気づきました。

あかん英語や…

SourceTreeでGitクライアントは日本語に慣れていたので、英語にうっとなりましたが、なんとな〜くわかるのでこのままで行きます。 どうしても気になる方は、非公式で日本語化の動きがあるみたいなので試してみても良いかもです。

tmegos.hatenablog.jp

GitKrakenでリポジトリ操作を行う。

ここでは、以下の2軸に分けて記載していきます。

  • 新規にローカルにリポジトリを作成してGitKraken管理していく
  • リモートにあるリポジトリを読み込んでGitKrakenで管理する

新規にローカルにリポジトリを作成してGitKraken管理していく

キャプチャベースで記載していきます。

f:id:project-unknown:20170603153132p:plain

f:id:project-unknown:20170603153246p:plain

f:id:project-unknown:20170603153444p:plain Licenseはこれから作成するリポジトリに適用させるLicenseを指定する形ですかね。 なので、誰かに公開とかしない場合は、何も選択しなくてよいと思います。

最後に、CreateRepositoryをClickします。

すると f:id:project-unknown:20170603153652p:plain 無事Git設定する事ができました。

ここで、適当にファイルを追加します。 f:id:project-unknown:20170603153931p:plain test.txtというファイルを追加しました。

ここでGitKrakenにって、Gitのタイムラインの所を見ると f:id:project-unknown:20170603154118p:plain 上記キャプチャで追加分と記載した部分が追加されています。

ここをClickすると、

f:id:project-unknown:20170603154238p:plain 変更分が列挙されるようになりました。 画面の見方ですが、左側が前回から変更されたファイルリストが表示され、この中から実際にcommitするファイルを選択すると、右側のリストに登録されます。 リストへの登録の仕方ですが、ファイルをマウスオーバーすると以下の様に「Stage File」をなっているので、それをClickするか。リスト先頭にある「Stage all change」をClickします。 f:id:project-unknown:20170603154725p:plain

これで↓の画面のように、Commit対象ファイルとして登録されました。(登録対象にしたくない場合はUnstage Fileを選択すればOKです) f:id:project-unknown:20170603154840p:plain

後は、以下の画面の様にCommit logを入力してCommitします。 f:id:project-unknown:20170603154938p:plain

これでGitのタイムラインが f:id:project-unknown:20170603155016p:plain

今commitしたものが並ぶようになりました。

これでローカルリポジトリの操作については完了です。

リモートにあるリポジトリを読み込んでGitKrakenで管理する

次は、リモートリポジトリを読み込んで管理してみましょう。 普段私はBitBucketを使っているので、ここではBitBucketのCloneURLを貼り付けてのやり方をしています。(ただ公開していないリポジトリなので殆どモザイク(;・∀・)

f:id:project-unknown:20170603155234p:plain

f:id:project-unknown:20170603160219p:plain

ここまでやると、Cloneが開始します。 f:id:project-unknown:20170603160338p:plain

Cloneが終わると、以下のようにリモートにPushしていた情報が取得できます。

f:id:project-unknown:20170603170532p:plain

この後は、ファイル編集 -> commit -> pushとなりますが、commitまではローカルの時と変わりないので割愛。

commitまで実施したら、サーバ上にcommit内容を送るためにPushします。

f:id:project-unknown:20170603170903p:plain (↑を押すだけ…(;・∀・)


とりあえず、GitKrakenを使って最低限のGit操作まで記載しました。 branchを分ける等はまた機会があれば。

FireBaseの曖昧な点を確認してみた。

FireBaseはGoogleが運営するサービスで、リアルタイムデータベースなどいろいろ使えて便利なようです。

基本無料ですが、容量制限などがあります。
有料にすれば、その制限を増やせたり、無制限にすることが可能です。

でも、アプリで使ってみようと思うと、ちょっと不安な点もあります。

例えば、

  • ゲームのユーザ情報をFireBaseのデータベースに保存していたけども、容量制限オーバーしたら、どうなるのか?
  • SPARKプランとかFRAMEプランって、アプリ単位?プロジェクト単位?

といろいろあります。

ここら辺の情報を質問してみました。
ちなみに、簡単なのは日本語の返信がありましたが、突っ込んだ質問になると、英語で回答されましたので、誤訳などがあっても、責任とりませんよ!

Q1. アカウント毎に複数のプロジェクトに紐付け可能ですが、上限を教えてください。
A1. 制限はありますが、アカウントに依存します。

具体的な数字は濫用の可能性があるため、開示できません。
プロジェクトの上限を増やすことも可能です。
また、新しいプロジェクトを作るために別のアカウントを使用することも可能です。

→上限をあまり気にせず使って良さそうですね。

Q2. プロジェクトに追加できるアプリケーション数に上限はありますか?
A2. ほとんど制限ありません。

→ほとんどってことは上限ありそうですが、具体的な数字は出て来ない気がしたので、とりあえず、納得することにしました。

Q3 リアルタイムデータベースのSparkまたはFlameプランストレージまたはダウンロード制限を超えるとどうなりますか?
A3 アプリの電源はオフになります。

予測可能な価格を提供するために、
SparkおよびFireBaseプランで利用可能なリソースに上限があります。
つまり、任意の月にプランの制限を超えた場合、
リソースの使用量や追加料金が発生しないように、アプリの電源はオフになります。

→自動的に有料プランにはならないようです。当たり前っちゃ当たり前ですが、具体的な記載がなかったので、これで安心。
ちなみにこの質問は、FireBaseのFAQの内容(英語)です。

Q4 「アプリの電源をオフ」の対象はプロジェクト内全てのアプリケーションでしょうか?それとも上限に達したサービスを利用しているアプリケーションを停止するのでしょうか?
A4 制限を超えたプロジェクトのすべてのアプリケーションは接続できません。

→ 1プロジェクトに複数のアプリを登録するのはなかなかリスクがありそうですね。
でも、アプリ単位に上限を設けれれば、いけるかもということで次の質問です。

Q5 SparkプランあるいはFrameプランで 1プロジェクトに複数のアプリケーションを登録した場合、アプリケーション単位で上限を定めることは可能でしょうか?
A5 これは現在不可能です。

ここでできることは、アプリケーションを別のプロジェクトに分けて、
制限を超えないようにすることです。

→ 1アプリごとに上限を設けることができれば、1プロジェクトで複数アプリの運用など可能と思い質問してみたのですが、なかなか厳しいようです。

Q6 1つのProjectAにアプリA, アプリB, アプリCを登録していて、途中でアプリBをProjectBに移したいとなった場合、それは出来るのか。
A6 プロジェクト間の移動はできません。

→ 素直に1アプリ、1プロジェクトが制限や料金的には安心なのかもしれませんね。

Q7 とあるアプリが攻撃を受けてしまってアプリのFirebaseへの接続を止めたい場合は、Firebase上から出来るのか
A7 現在のところ、コンソールからFirebase SDKを無効にする方法はありません。

→ 従量制のBlazeプランの場合は、特に注意しないととんでもない請求がくるかもしれませんね。

以上が質問をした結果です。

ちなみに、トラブルシューティングへの質問は5回までですが、1質問1回というわけではなく、1回に複数の質問を行なってもよいですし、最初の質問と無関係でなければ追加質問も可能だそうですので、不明点がある方は気軽に質問してみては如何でしょうか?

また、規約とか変わっている可能性もありますので、有料プラン移行時は自分で確認とってからの方がいいと思います。

A* Pathfinding Project Proを使ってみる

Navmeshの使い方もままならないのに、A* Pathfindingに手を出してしまって、Sample的な使い方をしているのでそのメモ。

以下は今回作ったものです。 適当にTerrainを用意して、カプセルをPlayerに、スフィアを目的地としています。

パターン1 直線距離で移動できる f:id:project-unknown:20170601012308g:plain

パターン2 直線距離を崖で塞ぐ f:id:project-unknown:20170601012440g:plain

うむ、まだNavmeshとの機能差異はさっぱわからない(;・∀・)

とりあえず、ここまでやった内容をメモがてらに記載します。


(Terrainとカプセル、スフィアを作るところは流石に割愛)

まず、A*をSceneに配置する為に空のGameObjectを置きます。 このObjectに「Pathfinder」をアタッチします。 f:id:project-unknown:20170601012719p:plain (Pathfinderでアタッチしたのに、ComponentがAster Path(Script)となっているのは気にしない)

そうすると、↓のようなComponentがアタッチされます。 f:id:project-unknown:20170601012830p:plain

GraphsがNavmeshっぽい所を意味しているっぽく、とりあえず意味も分からず「Grid Graph」を選択します。 すると追加されるので、Grid Graphの中身を見てみます。

f:id:project-unknown:20170601013022p:plain 上記のWidthとDepthはAの適用範囲を指しており、1010で指定すると以下のように見えます (後述しますが、nodeのサイズを10*10で敷き詰めています)

f:id:project-unknown:20170601013153p:plain 今回のTerrainを100100に設定しているので、Aもそれに合わせておきます。

次にnodeですが、これを細かく設定するときめ細やかにA*が設定され、小道などの小回りが聞くようになりますが高負荷っぽいです。 以下は、0.1で設定した際のキャプチャ f:id:project-unknown:20170601013545p:plain 今度は2で設定した際のキャプチャ f:id:project-unknown:20170601013608p:plain

Max Climbは登ることが出来る高さを設定しているっぽく、ここを大きく設定すると、頑張って崖を登るようになりました。 f:id:project-unknown:20170601013807g:plain

後はまだ良くわかってないので割愛(;・∀・)

このタイミングで、Scanを押してみると、設定したA*がどのように貼られるのかが見ることが出来ます。 f:id:project-unknown:20170601013858p:plain

次にカプセルにNavmeshで言うところのagent設定を行います。

まず、SeekerのComponentをアタッチします。 f:id:project-unknown:20170601014022p:plain

次に、カプセルにagent設定を行います。 今回はサンプルとして、「SampleAI.cs」を作って最低限必要な処理を書きます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Seeker))]
public class SampleAI : AIPath {

    void Start () {
        base.Start();
    }
    
    void Update () {
    }
}

(ほんとうに基礎の基礎ですな…

[RequireComponent(typeof(Seeker))]

を宣言することで、HierarchyでA* agentのパラメータが設定出来るようになります。

f:id:project-unknown:20170601014337p:plain ここのTargetにゴールとなるGameObjectを設定し、Speedとかをちょいちょいといじります。

void Start() {
    base.Start();
}

上記で経路探索して、移動を開始します。

途中で経路を再計算したい際は

base.Update();

で行けるっぽい。

ここまで設定することで、以下のように簡単に経路探索が出来るようになりました。 f:id:project-unknown:20170601012440g:plain

まだまだ初歩の初歩なのでNavmeshのほうが遥かに使えそうに見えますが…もうちょい勉強を重ねます。。。


https://www.assetstore.unity3d.com/jp/#!/content/87744

A* Pathfinding Project

Unity Cloud Buildを試す for iOS

Unity Developerにアクセスして、Projectを作成。

Do it!をClick f:id:project-unknown:20170531220232p:plain

Git(私はBitbucketを利用しました)のURLを入力 f:id:project-unknown:20170531220510p:plain

BitbucketをPrivateにしている場合(大体はそうだと思います)、Unity Cloud BuildからアクセスするためのSSHを登録する必要があります。 まず、Privateな場合、以下の画面になっていると思うので、SSH鍵をコピーします。 f:id:project-unknown:20170531220950p:plain

次に、管理しているBitbucketのリポジトリを開いて、設定をClick(最近BitbucketのUIが少し変わりましたね… f:id:project-unknown:20170531221130p:plain

Access keysをClick f:id:project-unknown:20170531221238p:plain

鍵を追加をClick f:id:project-unknown:20170531221310p:plain

Labelは管理しやすい適当な文言で、Keyのところに先程コピーしたSSH鍵を入力し鍵を追加ボタンをClickします。 f:id:project-unknown:20170531221346p:plain

ここで、Unity Cloud Buildに戻りNext. 暫くUnityのロゴが回転するのを行儀よく待ちます。

暫く待つと、以下の画面になります。 f:id:project-unknown:20170531221622p:plain

ここでは、iOSを選択します。

次に表示される画面でBuildの基本設定を入力します。

  • ラベルにBuildを識別出来る名前
  • Branch(Master以外のBranchを指定したい場合は選択)
  • Project Subfolderに、GitのRoot直下にProjectファイルやAssetsがなければ、それがあるところまでのPath
  • Unity Versionに、実行したいUnityのVersion(Always Use Latest 5.xで5系以上の最新版)

f:id:project-unknown:20170531222048p:plain

ここまで設定したらNext すると、次の画面でiOSアプリとしての設定が求められます。 f:id:project-unknown:20170531222733p:plain

一応細かく設定を見ていきます。

Bundle ID XCodeで指定するBundle Identifierですね。 ↓なやつ。 f:id:project-unknown:20170531222903p:plain

XCodeのバージョン 見たまんまなので割愛

Choose iOS Credentials 最初「お?」って思いましたが、見た感じProvisioning Profileを指していそうです。 ちょっとAndroid等の事はよくわかっていないのですが、iOSの場合実機等でBuildする場合、専用の証明書(Profile)が必要になります。 且つ、Buildの環境毎に違った種類のProvisioning Profileを用意する必要があります。 Unity Cloud Buildの場合、AdHocに該当するので、AdHoc用のProvisioning Profileを用意する必要があります(実機を接続しての証明書は使えません)

んで、今手元に丁度良いAdHocの証明書が無いので、この際に発行します。 以下のApple Developer Programにアクセスして、

Apple Developer Program - Apple Developer

アカウントから証明書を作成します。 Identifierから適当なAppIDを作成し、Provisitoning ProfileからAdHocを選択して、ContinueをClick f:id:project-unknown:20170531222615p:plain

次に、先程作成したAppIDを選択 f:id:project-unknown:20170531223544p:plain

次に紐付ける証明書を選択(Distributionで設定してください。 f:id:project-unknown:20170531223637p:plain

実機実行したいデバイスを選択してContinue f:id:project-unknown:20170531223728p:plain

これで証明書(AdHocなのでDistribusion形式)が作成出来ました f:id:project-unknown:20170531223854p:plain

後は、この証明書をダウンロードしておきます。

次にまたUnity Cloud Buildに戻り証明書を登録します。 f:id:project-unknown:20170531223959p:plain

以下のキャプチャにある通り、設定していきます。

  • 名前にKeyとして登録する名前(ラベル)
  • Mobile Prov Fileに先程作成したProvisioning Profileをuploadします。
  • p12ファイルにProvisioning Profileと紐付いているp12ファイルをuploadします(p12ファイルを紛失して酷い目にあいました。Keychainから取ってくればよかっただけだったのですが…
  • p12 passwordにp12ファイルを書き出した際に設定したPasswordを設定します

f:id:project-unknown:20170531224814p:plain

次にNextを押すと、buildが開始します。 f:id:project-unknown:20170531230512p:plain


ちなみにp12ファイルを紛失した際に、心が折れかけたキャプチャ f:id:project-unknown:20170531230611p:plain

Vimでペースト時に自動インデントをさせない方法

今日はいつもと違った毛色の投稿を…。 Vim上での作業をちょくちょくするのですが、コピペでVim上に貼り付ける際に、自動インデントされて凄い面倒な事に時たまなります。 しょっちゅう対応方法を失念してしまうのでメモ。

例えば、以下は他のサイト様を参考にカスタマイズしたzshの設定ファイルなのですが

# (d) is default on

# ------------------------------
# General Settings
# ------------------------------
export EDITOR=vim        # エディタをvimに設定
export LANG=ja_JP.UTF-8  # 文字コードをUTF-8に設定
export KCODE=u           # KCODEにUTF-8を設定
export AUTOFEATURE=true  # autotestでfeatureを動かす

bindkey -e               # キーバインドをemacsモードに設定
#bindkey -v              # キーバインドをviモードに設定

setopt no_beep           # ビープ音を鳴らさないようにする
setopt auto_cd           # ディレクトリ名の入力のみで移動する 
setopt auto_pushd        # cd時にディレクトリスタックにpushdする
setopt correct           # コマンドのスペルを訂正する
setopt magic_equal_subst # =以降も補完する(--prefix=/usrなど)
setopt prompt_subst      # プロンプト定義内で変数置換やコマンド置換を扱う
setopt notify            # バックグラウンドジョブの状態変化を即時報告する
setopt equals            # =commandを`which command`と同じ処理にする

### Complement ###
autoload -U compinit; compinit # 補完機能を有効にする
setopt auto_list               # 補完候補を一覧で表示する(d)
setopt auto_menu               # 補完キー連打で補完候補を順に表示する(d)
setopt list_packed             # 補完候補をできるだけ詰めて表示する
setopt list_types              # 補完候補にファイルの種類も表示する
bindkey "^[[Z" reverse-menu-complete  # Shift-Tabで補完候補を逆順する("\e[Z"でも動作する)

### zstyle ###
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # 補完時に大文字小文字を区別しない
zstyle ':completion:*' list-separator '-->'
zstyle ':completion:*:default' menu select=2

### Glob ###
setopt extended_glob # グロブ機能を拡張する
unsetopt caseglob    # ファイルグロブで大文字小文字を区別しない

### History ###
HISTFILE=~/.zsh_history   # ヒストリを保存するファイル
HISTSIZE=10000            # メモリに保存されるヒストリの件数
SAVEHIST=10000            # 保存されるヒストリの件数
setopt bang_hist          # !を使ったヒストリ展開を行う(d)
setopt extended_history   # ヒストリに実行時間も保存する
setopt hist_ignore_dups   # 直前と同じコマンドはヒストリに追加しない
setopt share_history      # 他のシェルのヒストリをリアルタイムで共有する
setopt hist_reduce_blanks # 余分なスペースを削除してヒストリに保存する

# マッチしたコマンドのヒストリを表示できるようにする
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end

# すべてのヒストリを表示する
function history-all { history -E 1 }


# ------------------------------
# Look And Feel Settings
# ------------------------------
### Ls Color ###
# 色の設定
export LSCOLORS=Exfxcxdxbxegedabagacad
# 補完時の色の設定
export LS_COLORS='di=01;34:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
# ZLS_COLORSとは?
export ZLS_COLORS=$LS_COLORS
# lsコマンド時、自動で色がつく(ls -Gのようなもの?)
export CLICOLOR=true
# 補完候補に色を付ける
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}

### Prompt ###
# プロンプトに色を付ける
autoload -U colors; colors
# 一般ユーザ時
tmp_prompt="%{${fg[cyan]}%}%n%# %{${reset_color}%}"
tmp_prompt2="%{${fg[cyan]}%}%_> %{${reset_color}%}"
tmp_rprompt="%{${fg[green]}%}[%~]%{${reset_color}%}"
tmp_sprompt="%{${fg[yellow]}%}%r is correct? [Yes, No, Abort, Edit]:%{${reset_color}%}"

# rootユーザ時(太字にし、アンダーバーをつける)
if [ ${UID} -eq 0 ]; then
  tmp_prompt="%B%U${tmp_prompt}%u%b"
  tmp_prompt2="%B%U${tmp_prompt2}%u%b"
  tmp_rprompt="%B%U${tmp_rprompt}%u%b"
  tmp_sprompt="%B%U${tmp_sprompt}%u%b"
fi

PROMPT=$tmp_prompt    # 通常のプロンプト
PROMPT2=$tmp_prompt2  # セカンダリのプロンプト(コマンドが2行以上の時に表示される)
RPROMPT=$tmp_rprompt  # 右側のプロンプト
SPROMPT=$tmp_sprompt  # スペル訂正用プロンプト
# SSHログイン時のプロンプト
[ -n "${REMOTEHOST}${SSH_CONNECTION}" ] &&
  PROMPT="%{${fg[white]}%}${HOST%%.*} ${PROMPT}"
;

### Title (user@hostname) ###
case "${TERM}" in
kterm*|xterm*|)
  precmd() {
    echo -ne "\033]0;${USER}@${HOST%%.*}\007"
  }
  ;;
esac


# ------------------------------
# Other Settings
# ------------------------------
### RVM ###
if [[ -s ~/.rvm/scripts/rvm ]] ; then source ~/.rvm/scripts/rvm ; fi

### Macports ###
case "${OSTYPE}" in
  darwin*)
    export PATH=/opt/local/bin:/opt/local/sbin:$PATH
    export MANPATH=/opt/local/share/man:/opt/local/man:$MANPATH
  ;;
esac

### Aliases ###
alias r=rails
alias v=vim

# cdコマンド実行後、lsを実行する
function cd() {
  builtin cd $@ && ls;
}

これをvim上で貼り付けようとすると以下の様になっちゃいます。

# (d) is default on
#
# # ------------------------------
# # General Settings
# # ------------------------------
# export EDITOR=vim        # エディタをvimに設定
# export LANG=ja_JP.UTF-8  # 文字コードをUTF-8に設定
# export KCODE=u           # KCODEにUTF-8を設定
# export AUTOFEATURE=true  # autotestでfeatureを動かす
#
# bindkey -e               # キーバインドをemacsモードに設定
# #bindkey -v              # キーバインドをviモードに設定
#
# setopt no_beep           # ビープ音を鳴らさないようにする
# setopt auto_cd           # ディレクトリ名の入力のみで移動する 
# setopt auto_pushd        # cd時にディレクトリスタックにpushdする
# setopt correct           # コマンドのスペルを訂正する
# setopt magic_equal_subst # =以降も補完する(--prefix=/usrなど)
# setopt prompt_subst      # プロンプト定義内で変数置換やコマンド置換を扱う
# setopt notify            # バックグラウンドジョブの状態変化を即時報告する
# setopt equals            # =commandを`which command`と同じ処理にする
#
# ### Complement ###
# autoload -U compinit; compinit # 補完機能を有効にする
# setopt auto_list               # 補完候補を一覧で表示する(d)
# setopt auto_menu               # 補完キー連打で補完候補を順に表示する(d)
# setopt list_packed             # 補完候補をできるだけ詰めて表示する
# setopt list_types              # 補完候補にファイルの種類も表示する
# bindkey "^[[Z" reverse-menu-complete  # Shift-Tabで補完候補を逆順する("\e[Z"でも動作する)
#
# ### zstyle ###
# zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # 補完時に大文字小文字を区別しない
# zstyle ':completion:*' list-separator '-->'
# zstyle ':completion:*:default' menu select=2
#
# ### Glob ###
# setopt extended_glob # グロブ機能を拡張する
# unsetopt caseglob    # ファイルグロブで大文字小文字を区別しない
#
# ### History ###
# HISTFILE=~/.zsh_history   # ヒストリを保存するファイル
# HISTSIZE=10000            # メモリに保存されるヒストリの件数
# SAVEHIST=10000            # 保存されるヒストリの件数
# setopt bang_hist          # !を使ったヒストリ展開を行う(d)
# setopt extended_history   # ヒストリに実行時間も保存する
# setopt hist_ignore_dups   # 直前と同じコマンドはヒストリに追加しない
# setopt share_history      # 他のシェルのヒストリをリアルタイムで共有する
# setopt hist_reduce_blanks # 余分なスペースを削除してヒストリに保存する
#
# # マッチしたコマンドのヒストリを表示できるようにする
# autoload history-search-end
# zle -N history-beginning-search-backward-end history-search-end
# zle -N history-beginning-search-forward-end history-search-end
# bindkey "^P" history-beginning-search-backward-end
# bindkey "^N" history-beginning-search-forward-end
#
# # すべてのヒストリを表示する
# function history-all { history -E 1 }
#
#
# # ------------------------------
# # Look And Feel Settings
# # ------------------------------
# ### Ls Color ###
# # 色の設定
# export LSCOLORS=Exfxcxdxbxegedabagacad
# # 補完時の色の設定
# export LS_COLORS='di=01;34:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
# # ZLS_COLORSとは?
# export ZLS_COLORS=$LS_COLORS
# # lsコマンド時、自動で色がつく(ls -Gのようなもの?)
# export CLICOLOR=true
# # 補完候補に色を付ける
# zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
#
# ### Prompt ###
# # プロンプトに色を付ける
# autoload -U colors; colors
# # 一般ユーザ時
# tmp_prompt="%{${fg[cyan]}%}%n%# %{${reset_color}%}"
# tmp_prompt2="%{${fg[cyan]}%}%_> %{${reset_color}%}"
# tmp_rprompt="%{${fg[green]}%}[%~]%{${reset_color}%}"
# tmp_sprompt="%{${fg[yellow]}%}%r is correct? [Yes, No, Abort, Edit]:%{${reset_color}%}"
#
# # rootユーザ時(太字にし、アンダーバーをつける)
# if [ ${UID} -eq 0 ]; then
#   tmp_prompt="%B%U${tmp_prompt}%u%b"
#     tmp_prompt2="%B%U${tmp_prompt2}%u%b"
#       tmp_rprompt="%B%U${tmp_rprompt}%u%b"
#         tmp_sprompt="%B%U${tmp_sprompt}%u%b"
#         fi
#
#         PROMPT=$tmp_prompt    # 通常のプロンプト
#         PROMPT2=$tmp_prompt2  # セカンダリのプロンプト(コマンドが2行以上の時に表示される)
#         RPROMPT=$tmp_rprompt  # 右側のプロンプト
#         SPROMPT=$tmp_sprompt  # スペル訂正用プロンプト
#         # SSHログイン時のプロンプト
#         [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] &&
   #           PROMPT="%{${fg[white]}%}${HOST%%.*} ${PROMPT}"
#           ;
#
#           ### Title (user@hostname) ###
#           case "${TERM}" in
#           kterm*|xterm*|)
#             precmd() {
#                 echo -ne "\033]0;${USER}@${HOST%%.*}\007"
#                   }
#                     ;;
#                     esac
#
#
#                     # ------------------------------
#                     # Other Settings
#                     # ------------------------------
#                     ### RVM ###
#                     if [[ -s ~/.rvm/scripts/rvm ]] ; then source ~/.rvm/scripts/rvm ; fi
#
#                     ### Macports ###
#                     case "${OSTYPE}" in
#                       darwin*)
#                           export PATH=/opt/local/bin:/opt/local/sbin:$PATH
#                               export MANPATH=/opt/local/share/man:/opt/local/man:$MANPATH
#                                 ;;
#                                 esac
#
#                                 ### Aliases ###
#                                 alias r=rails
#                                 alias v=vim
#
#                                 # cdコマンド実行後、lsを実行する
#                                 function cd() {
#                                   builtin cd $@ && ls;
#                                   }
#

(要は、.zshrcファイルをいじろうとしたので、「#」とか使ってしまうと、開業した際に自動コメントアウトが入っちゃうんでしょうね。

こんな時は以下のようにすると、きれいに貼り付けることが出来ます

ペーストモードを使う

  1. Vimを開く
  2. Vim上で以下のコマンドでペーストモードにする
:set paste
  1. ペーストしたいものを貼り付ける

alコマンドを使う

以下のやり方でも解決できます。

  1. Vimを開く
  2. Vim上で以下のコマンドを打つ
:al
  1. ペーストしたいものを貼り付ける

環境周りは、

GitHub - yuw-unknown/env

上記に上げてあるので、お使いください