Author Archives: Garry Lachman (Admin)

jQuery Simple Popup Rect Window

Written by Garry Lachman (Admin). Filed under jQuery. Tagged , , , , , , , , , , , . .

Hi,
I wrote a light and simple popup rect window with auto resize mode and buttons.

Popup Options

  • width, height = size of window
  • top, left = position in px set 0 set center
  • send_button = show send button
  • send_button_caption = send button caption
  • send_button_disabled = disbale send button
  • cancel_button = show cancel button
  • cancel_button_caption = disable cancel button

Popup Public Methods

  • enable_auto_resize = enable auto resize mode by content, for auto resize use Ben Alman jQuery resize
    event plugin from here: http://benalman.com/projects/jquery-resize-plugin/
  • change_height = change height (height in px, is using transcation)
  • set_content = send html content
  • get_content = get content rect
  • disbaled = disable and enable popup
  • send_button_disabled = disable and enable send button
  • add_click_event = add event to send and cancel buttons
  • close = close window

jquery.popup_rect.js file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/*
(c) By Garry Lachman (http://www.garry-lachman.com), GPL License

Options:
* width, height = size of window
* top, left = position in px set 0 set center
* send_button = show send button
* send_button_caption = send button caption
* send_button_disabled = disbale send button
* cancel_button = show cancel button
* cancel_button_caption = disable cancel button

Methods
* enable_auto_resize = enable auto resize mode by content, for auto resize use Ben Alman jQuery resize
event plugin from here: http://benalman.com/projects/jquery-resize-plugin/
* change_height = change height (height in px, is using transcation)
* set_content = send html content
* get_content = get content rect
* disbaled = disable and enable popup
* send_button_disabled = disbale and enable send button
* add_click_event = add event to send and cancel buttons
* close = close window

*/


if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}

var popup_rect = {
    init: function(options, elem)   {
        this.options = $.extend(true,{}, this.options, options);
       
        this.elem = elem;
        this.$elem = $(elem);

        this._build();
    },
    options:    {
        width: 100,
        height: 100,
        top: 0,
        left: 0,
        send_button: true,
        send_button_caption: "Save",
        send_button_disabled: false,
        cancel_button: true,
        cancel_button_caption: "Cancel"
    },
    _build: function()  {
        var _this = this;
        this.$elem.hide();
        this.$elem.addClass("popup_rect");
        this.$elem.css({width: this.options.width,
                height: this.options.height,
                top: this.options.top,
                left: this.options.left-this.options.width});

        this.$elem.append("<div id='popup_content' class='popup_rect_content'></div>");
        this.$elem.append("<div class='popup_rect_buttons'></div>");

        if (this.options.send_button)   {
            this.$elem.find(".popup_rect_buttons").append("<div id='popup_rect_send_button' class='popup_rect_button'>"+this.options.send_button_caption+"</div>");
        }
        if (this.options.cancel_button)   {
                        this.$elem.find(".popup_rect_buttons").append("<div id='popup_rect_cancel_button' class='popup_rect_button'>"+this.options.cancel_button_caption+"</div>");
                }

        this.$elem.find(".popup_rect_buttons").children().addClass("hand_cursor");
    },
    change_height: function(_h, _no_fx) {
        var _this = this;
        if (_no_fx) {
            this.$elem.height(_h);
            if (_this.options.top ==0 && _this.options.left == 0)       {
                _this.$elem.center({transition: 100});
            }
        }   else    {
            this.$elem.animate({
                height: _h
            }, 500, function(){
                if (_this.options.top ==0 && _this.options.left == 0)       {
                                _this.$elem.center({transition: 100});
                        }  
            });
        }
    },
    enable_auto_resize: function()  {
        var _this = this;
        this.$elem.find("#popup_content").resize(function(_event){
            _this.change_height(_event.target.clientHeight + 15 + _this.$elem.find(".popup_rect_buttons").height(),true);
        });
    },
    set_content: function(_content) {
        this.$elem.find("#popup_content").html(_content);
        this.$elem.show();
    },
    get_content: function() {
        return this.$elem.find("#popup_content");
    },
    add_click_event: function(_button, _function)   {
        var self = this;
        switch (_button)    {
            case "send":
                this.$elem.find(".popup_rect_buttons").find("#popup_rect_send_button").click(function(){
                    if (!self.options.send_button_disabled) {
                        _function();
                    }
                });
            break;

            case "cancel":
                                this.$elem.find(".popup_rect_buttons").find("#popup_rect_cancel_button").click(_function);
                        break;
        }
    },
    show_rect: function()   {
        this.$elem.show();
        if (this.options.top ==0 && this.options.left == 0)       {
                        this.$elem.center({transition: 100});
                }
    },
    disbaled: function (is_disbaled)    {
        if (is_disbaled)    {
            this.$elem.prepend("<div class='popup_rect_disbaled'></div>");
            this.$elem.find(".popup_rect_disbaled").css({width: this.options.width,
                                    height: this.options.height});
        }   else    {
            this.$elem.find(".popup_rect_disbaled").remove();
        }
    },
    send_button_disabled: function(is_disbaled) {
        this.options.send_button_disabled = is_disbaled;
        var fadeVal = is_disbaled ? 0.5 : 1;
        this.$elem.find(".popup_rect_buttons").find("#popup_rect_send_button").fadeTo('slow', fadeVal);
       
    },
    close: function(_this)  {
        _this = _this ? _this : this;
        _this.$elem.fadeOut('fast', function(){
                        $(_this).empty();
                });
    }

};

$.fn.extend({
  center: function (options) {  
       var options =  $.extend({ // Default values
            inside:window, // element, center into window
            transition: 0, // millisecond, transition time
            minX:0, // pixel, minimum left element value
            minY:0, // pixel, minimum top element value
            withScrolling:true, // booleen, take care of the scrollbar (scrollTop)
            vertical:true, // booleen, center vertical
            horizontal:true // booleen, center horizontal
       }, options);
       return this.each(function() {
            var props = {position:'absolute'};
            if (options.vertical) {
                 var top = ($(options.inside).height() - $(this).outerHeight()) / 2;
                 if (options.withScrolling) top += $(options.inside).scrollTop() || 0;
                 top = (top > options.minY ? top : options.minY);
                 $.extend(props, {top: top+'px'});
            }
               
            if (options.horizontal) {
                  var left = ($(options.inside).width() - $(this).outerWidth()) / 2;
                  if (options.withScrolling) left += $(options.inside).scrollLeft() || 0;
                  left = (left > options.minX ? left : options.minX);
                  $.extend(props, {left: left+'px'});
            }
            if (options.transition > 0) {
            $(this).animate(props, options.transition);
        } else {
            $(this).css(props);
        }
            return $(this);
               
       });     
  }
});

jquery.popup_rect.css file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.popup_rect {
    background-color: #f7f7f7;
    border: 2px solid #949494;
    border-radius: 5px;
    position: absolute;
    z-index: 999999;
}
.popup_rect_content {
    padding: 20px;
}
.popup_rect_buttons {
    padding: 20px;
    position: absolute;
    bottom: 0px;
    right: 0px;
}
.popup_rect_button  {
    float: right;
    margin-left: 15px;
    border-radius: 5px;
    color: #000;
    font-weight: bold;
    padding-top: 2px; padding-bottom: 2px; padding-left: 5px; padding-right: 5px;
}

.popup_rect_disbaled    {
    position: absolute;
    background-color: white;
    z-index: 999;
    opacity: 0.6;
    filter: alpha(opacity=60);
}

test.html file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<script type"text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="jquery.popup_rect.js"></script>
<link href="jquery.popup_rect.css" rel="stylesheet" type="text/css" />

<div id="test_div"></div>

<script>
var rect = Object.create(popup_rect);
rect.init({
    height: 200,
    width: 300
}, $("#test_div"));
rect.get_content().append("<span>The Content</span>");
rect.show_rect();

rect.add_click_event("cancel", function(){
    alert("cancel");
});

rect.add_click_event("send", function(){
    alert("send");
});
</script>

Have fun,
Garry Lachman

Share

Merge CSS files into one file with PHP

Written by Garry Lachman (Admin). Filed under PHP + mySQL. Tagged , , . .

Hey,
Most of the big websites have many css files and the browser need to load them one by one.
There is a easy solution to merge them to one file using php.

css_loader.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// First of all send css header
header("Content-type: text/css");

// Array of css files
$css = array(
    'main.css',
    'menu.css',
    'content.css'
);

// Loop the css Array
foreach ($css as $css_file) {

    // Load the content of the css file
    $css_content = file_get_contents($css_file);

    // print the css content
    echo $css_content;
}
?>

Not include the CSS Loader file

1
<link href="css_loader.php" rel="stylesheet" type="text/css" />

Now all the CSS files are merged into one file.

Have Fun,
Garry

Share

Develop PHP Facebook Application Locally – Dev Mode

Written by Garry Lachman (Admin). Filed under PHP + mySQL. Tagged , , . .

Hi,
As you know Facebook doesn’t have develop mode to that allow you to work locally.
But there is way to do it – and its very easy to deployment.

First create 2 applications on Facebook, one for “dev” and one for “production”.
In dev application set you application url to the locally localhost if “127.0.0.1″ like:

http://127.0.0.1/your_app.

The second step is to create two “environments” in your application – “dev mode” and “production mode”.
Create a settings class that check if you work locally and return the Facebook API Key.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class ApplicationSettings   {
    private static $facebook_api = array(
        "dev"=>array(
            "key"=>"123",
            "secret"=>"123"    
        ),
        "prod"=>array(
            "key"=>"123",
            "secret"=>"123"    
        )
    );

    public static function get_facebook()   {
        if ($_SERVER['HTTP_HOST'] == "127.0.0.1")   {
            return self::$facebook_api["dev"];
        }
        return self::$facebook_api["prod"];
    }
}
?>

Set your Facebook API Key and Secret to the “dev” and “prod” modes.
Now we will change the way we connection to facebook api to get the
settings from our new class.

1
2
3
4
5
6
7
8
<?php
$facebook_settings = ApplicationSettings::get_facebook();

$facebook = new Facebook(array(
    'appId' => $facebook_settings["key"],
    'secret' => $facebook_settings["secret"],
));
?>

Now every time we connect to Facebook API the settings class will
check our domain and if we work on “127.0.0.1″ its automatically
gets the “dev mode” API that pointed to our local application.

Have Fun ;)
Garry Lachman

Share

Create Classes and Object in JavaScript & jQuery

Written by Garry Lachman (Admin). Filed under JavaScript, jQuery. Tagged , , , , . .

There is few ways to create javascript object and use its as class.
In this artical i will you my favorite way to implement javascript classes.
I will combaine jQuery in this example.

First of all lets create basic object:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var GarryObj = {
    init: function(options, target) {
        this.options = $.extends({}, this.options, options);
        this.$target = $(target);
        this._draw();
    },
    options:    {
        width: 100,
        height: 100,
    },
    _draw: function()   {
        this.$target.css({width: this.options.width,
                  height: this.options.height});
    }
}

We create here basic class that have 2 functions and one object to store the options.
the init class gets user options and the target (like html div).
then we merge the default options with the user options using jQuery extends function and
store the target as jQuery instance as $target.

The _draw function manipulate the target – here we build the ui by user options.

To create an instance of the class we need to add some code to the (i use to put it on js heaer file).

1
2
3
4
5
6
7
if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}

Now lets create a instance of our class:

We need to add target div:

1
<div id="test_div"></div>

and than

1
2
var garryTest = Object.create(GarryObj);
garryTest.init({width: 150, height: 150}, $("#test_div"));

Have fun ;)
Garry Lachman

Share

PHP: Get local ip adresses using ifconfig (linux only)

Written by Garry Lachman (Admin). Filed under PHP + mySQL. Tagged , , , , , , . .

Hi,

I wrote little code to get local machine ip address:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        function get_machine_ips()      {
                $ips = array();
                exec("/sbin/ifconfig", $catch);
                foreach($catch as $line){
                if (eregi('inet addr:', $line)) {
                        $line = str_replace(" ", ":", $line);
                        $line = explode(":", $line);
                        $line = array_filter($line);
                        foreach ($line as $v)   {
                                if (ip2long($v))        {
                                        $ips[] = $v;
                                }
                        }
                }
                }
                return $ips;
        }

have fun
Garry

Share

Requirements Specification for: Advance One Time URL script

Written by Garry Lachman (Admin). Filed under News. Tagged , , , , , , , , . .

Hi,
I`m planning to build new One Time URL script, after i found that the old version is bit problematic, i start to planning Advance One Time URL script.

Requirements Specification:

  1. using mySql as db.
  2. make one time url and store it in db.
  3. option to make few times url with limit.
  4. using http headers to force download – and not redirect as old script.
  5. mod_rewrite mode.
  6. regular link mode.
  7. install script – build the mySql schema.
  8. custom redirection for expired links.
  9. config file (db params, redirection params, default mode, etc…).

 

If you have more ideas, you can write it as comment.

Thanks,
Garry

Share

7 best jQuery charts engines

Written by Garry Lachman (Admin). Filed under JavaScript, jQuery. Tagged , , , , , . .

A chart is a graphical representation of data, in which “the data is represented by symbols, such as bars in a bar chart, lines in a line chart, or slices in a pie chart”.[1] A chart can represent tabular numeric data, functions or some kinds of qualitative structures. [wikipedia]

List of jQuery based Charts



jqPlot

Computation and drawing of lines, axes, shadows even the grid itself is handled by pluggable “renderers”. Not only are the plot elements customizable, plugins can expand functionality of the plot too! There are plenty of hooks into the core jqPlot code allowing for custom event handlers, creation of new plot types, adding canvases to the plot, and more!



Highcharts

Highcharts is a charting library written in pure JavaScript, offering intuitive, interactive charts to your web site or web application. Highcharts currently supports line, spline, area, areaspline, column, bar, pie and scatter chart types.



GraphUp

GraphUp is a very flexible and lightweight jQuery (v1.4+) plugin to spice up your data tables. It visualizes the values using color, bar charts and bubbles.



Flot

Flot is a pure Javascript plotting library for jQuery. It produces graphical plots of arbitrary datasets on-the-fly client-side.
The focus is on simple usage (all settings are optional), attractive looks and interactive features like zooming and mouse tracking.
The plugin works with Internet Explorer 6+, Firefox 2.x+, Safari 3.0+, Opera 9.5+ and Konqueror 4.x+ with the HTML canvas tag



JS Charts

JS Charts is a JavaScript based chart generator that requires little or no coding. With JS Charts drawing charts is a simple and easy task, since you only have to use client-side scripting (i.e. performed by your web browser). No additional plugins or server modules are required. Just include our scripts, prepare your chart data in XML, JSON or JavaScript Array and your chart is ready!



PlotKit

PlotKit is a Chart and Graph Plotting Library for Javascript. It has support for HTML Canvas and also SVG via Adobe SVG Viewer and native browser support.



Emprise JavaScript Charts

EJSChart has been fully tested and verified to work properly in the following browsers. This list covers roughly 95% of browser market share



Have Fun ;)
Garry

Share

PHP+REGEX – URL validation & split to elements

Written by Garry Lachman (Admin). Filed under PHP + mySQL. Tagged , , , , . .

Hi,
After searching the web i found a very good script to split the url to elements and validate it.
The result is:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
array(14) {
  ["scheme"]=>
  string(4) "http"
  ["authority"]=>
  string(17) "garry-lachman.com"
  ["userinfo"]=>
  string(0) ""
  ["host"]=>
  string(17) "garry-lachman.com"
  ["IP_literal"]=>
  string(0) ""
  ["IPV6address"]=>
  string(0) ""
  ["ls32"]=>
  string(0) ""
  ["IPvFuture"]=>
  string(0) ""
  ["IPv4address"]=>
  string(0) ""
  ["regname"]=>
  string(17) "garry-lachman.com"
  ["port"]=>
  string(0) ""
  ["path_abempty"]=>
  string(12) "/2011/10/17/"
  ["query"]=>
  string(22) "test_querystring=value"
  ["url"]=>
  string(59) "http://garry-lachman.com/2011/10/17/?test_querystring=value"
}

The script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// function url_valid($url) { Rev:20110423_2000
//
// Return associative array of valid URI components, or FALSE if $url is not
// RFC-3986 compliant. If the passed URL begins with: "www." or "ftp.", then
// "http://" or "ftp://" is prepended and the corrected full-url is stored in
// the return array with a key name "url". This value should be used by the caller.
//
// Return value: FALSE if $url is not valid, otherwise array of URI components:
// e.g.
// Given: "http://www.jmrware.com:80/articles?height=10&width=75#fragone"
// Array(
//    [scheme] => http
//    [authority] => www.jmrware.com:80
//    [userinfo] =>
//    [host] => www.jmrware.com
//    [IP_literal] =>
//    [IPV6address] =>
//    [ls32] =>
//    [IPvFuture] =>
//    [IPv4address] =>
//    [regname] => www.jmrware.com
//    [port] => 80
//    [path_abempty] => /articles
//    [query] => height=10&width=75
//    [fragment] => fragone
//    [url] => http://www.jmrware.com:80/articles?height=10&width=75#fragone
// )
function url_valid($url) {
    if (strpos($url, 'www.') === 0) $url = 'http://'. $url;
    if (strpos($url, 'ftp.') === 0) $url = 'ftp://'. $url;
    if (!preg_match('/# Valid absolute URI having a non-empty, valid DNS host.
        ^
        (?P<scheme>[A-Za-z][A-Za-z0-9+\-.]*):\/\/
        (?P<authority>
          (?:(?P<userinfo>(?:[A-Za-z0-9\-._~!$&\'()*+,;=:]|%[0-9A-Fa-f]{2})*)@)?
          (?P<host>
            (?P<IP_literal>
              \[
              (?:
                (?P<IPV6address>
                  (?:                                                (?:[0-9A-Fa-f]{1,4}:){6}
                  |                                                ::(?:[0-9A-Fa-f]{1,4}:){5}
                  | (?:                          [0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::   [0-9A-Fa-f]{1,4}:
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::
                  )
                  (?P<ls32>[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}
                  | (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
                       (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
                  )
                |   (?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::   [0-9A-Fa-f]{1,4}
                |   (?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::
                )
              | (?P<IPvFuture>[Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&\'()*+,;=:]+)
              )
              \]
            )
          | (?P<IPv4address>(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
                               (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))
          | (?P<regname>(?:[A-Za-z0-9\-._~!$&\'()*+,;=]|%[0-9A-Fa-f]{2})+)
          )
          (?::(?P<port>[0-9]*))?
        )
        (?P<path_abempty>(?:\/(?:[A-Za-z0-9\-._~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)
        (?:\?(?P<query>       (?:[A-Za-z0-9\-._~!$&\'()*+,;=:@\\/?]|%[0-9A-Fa-f]{2})*))?
        (?:\#(?P<fragment>    (?:[A-Za-z0-9\-._~!$&\'()*+,;=:@\\/?]|%[0-9A-Fa-f]{2})*))?
        $
        /mx'
, $url, $m)) return FALSE;
    switch ($m['scheme']) {
    case 'https':
    case 'http':
        if ($m['userinfo']) return FALSE; // HTTP scheme does not allow userinfo.
        break;
    case 'ftps':
    case 'ftp':
        break;
    default:
        return FALSE;   // Unrecognized URI scheme. Default to FALSE.
    }
    // Validate host name conforms to DNS "dot-separated-parts".
    if ($m['regname']) { // If host regname specified, check for DNS conformance.
        if (!preg_match('/# HTTP DNS host name.
            ^                      # Anchor to beginning of string.
            (?!.{256})             # Overall host length is less than 256 chars.
            (?:                    # Group dot separated host part alternatives.
              [A-Za-z0-9]\.        # Either a single alphanum followed by dot
            |                      # or... part has more than one char (63 chars max).
              [A-Za-z0-9]          # Part first char is alphanum (no dash).
              [A-Za-z0-9\-]{0,61}  # Internal chars are alphanum plus dash.
              [A-Za-z0-9]          # Part last char is alphanum (no dash).
              \.                   # Each part followed by literal dot.
            )*                     # Zero or more parts before top level domain.
            (?:                    # Explicitly specify top level domains.
              com|edu|gov|int|mil|net|org|biz|
              info|name|pro|aero|coop|museum|
              asia|cat|jobs|mobi|tel|travel|
              [A-Za-z]{2})         # Country codes are exactly two alpha chars.
              \.?                  # Top level domain can end in a dot.
            $                      # Anchor to end of string.
            /ix'
, $m['host'])) return FALSE;
    }
    $m['url'] = $url;
    for ($i = 0; isset($m[$i]); ++$i) unset($m[$i]);
    return $m; // return TRUE == array of useful named $matches plus the valid $url.
}

Have a nice day,
Garry Lachman

Share

Vim – Developers Best Friend – VIM Basics!!!

Written by Garry Lachman (Admin). Filed under Developer Tools. Tagged , , , , , , , . .

Hi,
Most of the web developers found them self working in SSH mode without any IDE, i`m working in this mode over 2 years and found VIM my best friend.
Its not a standard editor, in your first time and the second you will damn him and me for this advice but very its will be your best friend.

History of vim (wikipedia)

Vim is a text editor written in 1988 by Bram Moolenaar for the Amiga computer, but first released publicly (v1.14) in 1991. It was based on an earlier editor, Stevie, for the Atari ST, created by Tim Thompson, Tony Andrews and G.R. (Fred) Walter[original research?]. The name “Vim” is an acronym for “Vi IMproved” because Vim is an extended version of the vi editor, with many additional features designed to be helpful in editing program source code. Originally, the acronym stood for “Vi IMitation”, but that was changed with the release of Vim 2.0 in December 1993. A later comment states that the reason for changing the name was that Vim’s feature set surpassed that of vi.

Basic use

  • When you enter you are in read mode, if you want to start write text press i.
  • use ‘Esc’ button to exit each mode
  • save & quit: press ‘Esc’ to exit write mode than for save only press :w and quite press :q, save & quite :wq and quite without saving :q!
  • for search press / and the word to search: /something to search, use n for next
  • for search and replace without confirm every replace: :%s/findme/replacewith/g with confirm :%s/findme/replacewith/gc
  • for remove current line: dd
  • undo last change u


This is the basics of VIM Editor.
Have fun ;)
Garry

Share