Wednesday, July 1, 2015

Vim hangs and consums 24% of CPU

The Linux Command Line: A Complete Introduction
free book http://linuxcommand.org/tlcl.php 13.07 July 6, 2013 Second Internet Edition, 537 pages
18 months after the Kindle Edition 480 pages
good reviews on http://www.amazon.com/The-Linux-Command-Line-Introduction-ebook/dp/B006X2QEQS

read this book with flash cards

# Part 1 – Learning The Shell 1
## 1 – What Is The Shell? 2
When we speak of the command line, we are really referring to the shell
Operating system shells use a command-line interface (CLI) or a graphical user interface (GUI)
The shell passes commands to the operating system
Almost all Linux distributions supply a shell program from the GNU Project called bash

Terminal Emulators 2
terminal gives access to shell, which passes commands to the OS

Your First Keystrokes 2
$ is user prompt
# is superuser prompt

Command History 3
arrow up-down

Cursor Movement 3
arrow left-right

Ending A Terminal Session 5
$ exit

## 2 – Navigation 7
Understanding The File System Tree 7
Hierarchical directory structure starts at root
The system administrator mounts storage devices at various points on the tree

The Current Working Directory 7
Each user account is given its own home directory
home is the only place a regular user is allowed to write files
$ pwd

Listing The Contents Of A Directory 8
$ ls

Changing The Current Working Directory 9
$ cd

Absolute Pathnames 9
Absolute pathnames are from root directory to destination

Relative Pathnames 9
Relative pathnames are from the working directory to destination
"." is the working directory, ".." is the parent directory
$ cd bin
"./" is implied, same as
$ cd ./bin

Some Helpful Shortcuts 11
Do not embed spaces in filenames, use underscores instead

Important Facts About Filenames 11
Change working directory to your home directory
$ cd

Change working directory to previous working directory
$ cd -

Change the working directory to the home directory of user_name
$ cd ~user_name

## 3 – Exploring The System 13
More Fun With ls 13
specify directory to list
$ ls /usr
specify multiple directories to list
$ ls ~ /usr
longform
$ ls -l /usr

Options And Arguments 14
command options are single dash and char, where chars can be strung together
long options are two dashes and word
Table 3-1: Common ls Options
OPTION LONG OPTION DESCRIPTION
-a --all List all files, even hidden files
-A --almost-all Like the -a option above except it
does not list . (current directory) and .. (parent directory).
-d --directory Ordinarily, ls lists the contents of directory, not the directory itself.
Use this option in conjunction with the -l option to
see details about the directory rather than its contents.
-F --classify This option appends an indicator character to the end of each listed name.
/ = directory, * = executable, @ = symbolic link
-h --human-readable Use this option in conjunction with the -l option to
display file sizes in human readable format rather than in bytes.
-l Display results in long format.
-r --reverse Display the results in reverse order.
Normally, ls displays its results in ascending alphabetical order.
-S Sort results by file size.
-t Sort by modification time.

A Longer Look At Long Format 16
$ ls -la
-rw-r--r--. 1 wolfv wolfv 4323 Jun 28 22:55 .vimrc
where columns describe file's
-rw-r--r--. access rights (Chapter 9 – Permissions)
1 number of hard links
wolfv owner
wolfv group
4323 size in bytes
Jun 28 22:55 date last modified
.vimrc name

Determining A File's Type With file 17
$ file picture.jpg
picture.jpg: JPEG image data, JFIF standard 1.01

Viewing File Contents With less 17
many configuration files are text files
less is a text-file viewer (better than more)
$ less filename
Table 3-3: less Commands
COMMAND ACTION
Page Up b Scroll back one page
Page Down space Scroll forward one page
Up Arrow k Scroll up one line
Down Arrow j Scroll down one line
G Move to the end of the text file
g Move to the beginning of the text file
/characters Search forward to the next occurrence of characters
n Search for the next occurrence of the previous search
h Display help screen
q Quit less

If a command output is more than a screen full, you can navigate in less
$ ls | less
less can be navigated like vi
http://www.thegeekstuff.com/2010/02/unix-less-command-10-tips-for-effective-navigation/
Or you can scroll with gnome-terminal scroll buffer (not good with nav-layer key)
Shift+PgUp/PgDn/Home/End or scroll wheel

A Guided Tour 19
Good to know where the files are when configuring or trouble shooting the OS
As we go about our tour, try the following:
1. navigate into a given directory
$ cd
2. List the directory contents
$ ls -lF | less
3. If you see an interesting file, determine its contents
double click on a filename to copy
$ file [paste filename]
4. If it looks like it might be text, try viewing it
$ less [paste filename]
DIRECTORY COMMENTS
/ The root directory. Where everything begins.
/bin Contains binaries (programs) that must be present for the system to boot and run.
/boot Contains the Linux kernel, initial RAM disk image (for drivers needed at boot time),
and the boot loader. Interesting files:
/boot/grub/grub.conf or menu.lst, which are used to configure the boot loader.
/boot/vmlinuz, the Linux kernel.
/dev This is a special directory which contains device nodes.
"Everything is a file" also applies to devices.
Here is where the kernel maintains a list of all the devices it understands.
/etc The /etc directory contains all of the system-wide configuration files. It also contains
a collection of shell scripts which start each of the system services at boot time.
Everything in this directory should be readable text. Most interesting files:
/etc/crontab, a file that defines when automated jobs will run.
/etc/fstab, a table of storage devices and their associated mount points.
/etc/passwd, a list of the user accounts.
/home In normal configurations, each user is given a directory in /home.
Ordinary users can only write files in their home directories.
This limitation protects the system from errant user activity.
/lib Contains shared library files used by the core system programs.
These are similar to DLLs in Windows.
/lost+found Each formatted partition or device using a Linux file system, such as ext3,
will have this directory.
It is used in the case of a partial recovery from a file system corruption event.
Unless something really bad has happened to your system, this directory will remain empty.
/media On modern Linux systems, the /media directory will contain the mount points for removable
media such as USB drives, CD-ROMs, etc. that are mounted automatically at insertion.
/mnt On older Linux systems, the /mnt directory contains mount points for removable devices
that have been mounted manually.
/opt The /opt directory is used to install "optional" software. This is mainly used to
hold commercial software products that may be installed on your system.
/proc The /proc directory is special. It's not a real file system in the sense of files stored
on your hard drive. Rather, it is a virtual file system maintained by the Linux kernel.
The "files" it contains are peepholes into the kernel itself.
The files are readable and will give you a picture of how the kernel sees your computer.
/root This is the home directory for the root account.
/sbin This directory contains "system" binaries. These are programs that perform
vital system tasks that are generally reserved for the superuser.
/tmp The /tmp directory is intended for storage of temporary,
transient files created by various programs.
Some configurations cause this directory to be emptied each time the system is rebooted.
/usr The /usr directory tree is likely the largest one on a Linux system.
It contains all the programs and support files used by regular users.
/usr/bin /usr/bin contains the executable programs installed by your Linux distribution.
It is not uncommon for this directory to hold thousands of programs.
/usr/lib The shared libraries for the programs in /usr/bin.
/usr/local The /usr/local tree is where programs that are not included with your distribution
but are intended for system- wide use are installed. Programs compiled from source code
are normally installed in /usr/local/bin. On a newly installed Linux system,
this tree exists, but it will be empty until the system administrator puts something in it.
/usr/sbin Contains more system administration programs.
/usr/share /usr/share contains all the shared data used by programs in /usr/bin. This includes
things like default configuration files, icons, screen backgrounds, sound files, etc.
/usr/share/doc Most packages installed on the system will include some kind of documentation.
In /usr/share/doc, we will find documentation files organized by package.
/var With the exception of /tmp and /home, the directories we have looked at so far
remain relatively static, that is, their contents don't change.
The /var directory tree is where data that is likely to change is stored.
Various databases, spool files, user mail, etc. are located here.
/var/log contains log files, records of various system activity. These are very important
and should be monitored from time to time. The most useful one is /var/log/messages.
For security reasons on some systems, you must be the superuser to view log files.
also on https://en.wikipedia.org/wiki/Unix_filesystem#Conventional_directory_layout

Symbolic Links 23
Directory listings with an arrow are symbolic links (aka soft link):
lrwxrwxrwx 1 root root 11 2007-08-11 07:34 foo -> foo-2.6
Sym links are useful to reference multiple files with one name e.g.
install foo-2.6 and create symlink to it
symlink foo -> foo-2.6
programs that depend on foo can find file foo-2.6
when foo is upgraded to version foo-2.7, delete the symlink and create a new one
symlink foo -> foo-2.7
this solves the problem of the version upgrade, and allows us to keep both versions
if foo-2.7 has a bug, we can revert to foo-2.6

Hard Links 24
Hard links also allow files to have multiple names, but they do it in a different way

## 4 – Manipulating Files And Directories 25
While it is easy to perform simple file manipulations with a graphical file manager,
complicated tasks can be easier with the command line programs.
Wildcards 25
WILDCARD MEANING
* Matches any characters
? Matches any single character
and more tables of patterns in book

mkdir – Create Directories 28
$ mkdir directory...
"..." means the argument can be repeated

cp – Copy Files And Directories 28
$ cp item1 item2
$ cp item... directory
"item" can be a file or directory

Useful Options And Examples 29
interactive option prompts user for before overwriting file
$ cp -i item1 item2
see cp tables in book

mv – Move And Rename Files 30
$ mv item1 item2
$ mv item... directory
if second parameter exists, move, else rename
if both item1 and item2 are files, overwrite
$ mv file1 file2
safer to mv with -i

Useful Options And Examples 30
see mv tables in book

rm – Remove Files And Directories 31
$ rm item...

Useful Options And Examples 31
see rm tables in book
tip: Before you use wildcards with rm, test the wildcard first with ls.
Then press the up arrow key to recall the command and replace the ls with rm.

ln – Create Links 33
The ln command is used to create either hard or symbolic links

Hard Links 33
$ln file link
Hard links have two important limitations:
1. A hard link cannot reference a file outside its own file system. This means
a link cannot reference a file that is not on the same disk partition as the link itself.
2. A hard link may not reference a directory.
A hard link is indistinguishable from the file itself i.e. all files are pointed to by hard links
Hard links are the original Unix way of creating links. Modern practice prefers symbolic links.

Symbolic Links 33
$ ln -s item link
Symbolic links were created to overcome the limitations of hard links. Symbolic links work by
creating a special type of file that contains a text pointer to the referenced file or directory.
A file pointed to by a symbolic link, and the symbolic link itself
are largely indistinguishable from one another.
However when you delete a symbolic link, only the link is deleted, not the file itself.
If the file is deleted before the symbolic link, the link is broken.
ls command will display broken links in a distinguishing color.

Let's Build A Playground 34
Create a playground in home directory to play with file manipulation commands.

Creating Directories 34
$ cd
$ mkdir playground
$ cd playground
$ mkdir dir1 dir2

Copying Files 34
$ cp /etc/passwd .
$ ls -l
$ cp -v /etc/passwd .
$ cp -i /etc/passwd .

Moving And Renaming Files 35
rename passwd to fun
$ mv passwd fun
move fun to each directory
$ mv fun dir1
$ mv dir1/fun dir2
restore directory structure
$ mv dir2/fun .
stack the directories
$ mv fun dir1
$ mv dir1 dir2
$ ls -l dir2
$ ls -l dir2/dir1
restore directory structure
$ mv dir2/dir1 .
$ mv dir1/fun .
overwrite with mv
$ touch sad
$ mv fun sad
$ less sad
restore directory structure
$ mv -i sad fun

Creating Hard Links 37
$ ls -l
notice that fun has one hard link
$ ln fun fun-hard
$ ln fun dir1/fun-hard
$ ln fun dir2/fun-hard
$ ls -l
notice that fun now has four hard links
use -i option to list inode numbers (first field)
$ ls -li

inodes 37
I added this inodes section because the author is vague about inodes
the following is a traditional Unix file system; some of the newer files systems are more complex
inode is a structure that stores the file's metadata
metadata from POSIX standard:
The size of the file in bytes
Device ID
User ID of the file
Group ID of the file
The file mode that determines the permissions and type (regular, directory, symlink,..)
Additional system and user flags to further protect the file
Timestamps for inode and file content changes
A link counter that lists how many hard links point to the inode
Pointers to the disk blocks that store the file's contents
the disk blocks are file content and block addresses that point to more file content
directory is a file containing a list of paired file-names and inode numbers

FILE_CONTENT (content of a file that happens to be a directory)
file name1, inode number
file name2, inode number
file name3, inode number
/
INODE (inode of file name3)
metadata, disk blocks
/ \
/ BLOCK_ADDRESSES
/ / \
FILE_CONTENT FILE_CONTENT FILE_CONTENT
http://www.linux-mag.com/id/8658/
http://www.linux4windows.com/Articles/linux_concepts_for_beginners5.html
https://en.wikipedia.org/wiki/Inode
https://en.wikipedia.org/wiki/Inode_pointer_structure
http://unix.stackexchange.com/questions/193465/what-file-mode-is-a-symlink
http://www.unix.com/tips-and-tutorials/19060-unix-file-permissions.html

Creating Symbolic Links 38

Removing Files And Directories 39

Creating Symlinks With The GUI 40

Summing Up 41
Further Reading 41

to: bshotts@users.sourceforge.net
subj: The Linux Command Line erratum
The Linux Command Line, Second Internet Edition, page 23, "have a file referenced by multiple names" is inverted. Should read "reference multiple files with one name".
Nice book, and fewer erratum than most books :)
Thank you for writing such a beautiful book.

## 5 – Working With Commands 42
What Exactly Are Commands? 42
Identifying Commands 43
type – Display A Command's Type 43
which – Display An Executable's Location 43
Getting A Command's Documentation 44
help – Get Help For Shell Builtins 44
--help – Display Usage Information 45
iiman – Display A Program's Manual Page 45
apropos – Display Appropriate Commands 47
whatis – Display A Very Brief Description Of A Command 47
The Most Brutal Man Page Of Them All 48
info – Display A Program's Info Entry 48
README And Other Program Documentation Files 49
Creating Your Own Commands With alias 50
Summing Up 52
Further Reading 52

## 6 – Redirection 53
Standard Input, Output, And Error 53
Redirecting Standard Output 54
Redirecting Standard Error 55
Redirecting Standard Output And Standard Error To One File 56
Disposing Of Unwanted Output 57
/dev/null In Unix Culture 57
Redirecting Standard Input 57
cat – Concatenate Files 57
Pipelines 59
The Difference Between > and | 60
Filters 61
uniq - Report Or Omit Repeated Lines 61
wc – Print Line, Word, And Byte Counts 62
grep – Print Lines Matching A Pattern 62
head / tail – Print First / Last Part Of Files 63
tee – Read From Stdin And Output To Stdout And Files 64
Summing Up 65
Linux Is About Imagination 65

## 7 – Seeing The World As The Shell Sees It67
Expansion67
Pathname Expansion68
Pathname Expansion Of Hidden Files69
Tilde Expansion69
Arithmetic Expansion70
Brace Expansion71
Parameter Expansion72
Command Substitution73
Quoting74
Double Quotes75
Single Quotes76
Escaping Characters77
Backslash Escape Sequences77
Summing Up78
Further Reading78

## 8 – Advanced Keyboard Tricks79
Command Line Editing79
Cursor Movement79
iiiModifying Text80
Cutting And Pasting (Killing And Yanking) Text80
The Meta Key81
Completion81
Programmable Completion83
Using History83
Searching History84
History Expansion86
script86
Summing Up86
Further Reading87

## 9 – Permissions88
Owners, Group Members, And Everybody Else89
Reading, Writing, And Executing90
chmod – Change File Mode92
What The Heck Is Octal?93
Setting File Mode With The GUI95
umask – Set Default Permissions96
Some Special Permissions98
Changing Identities99
su – Run A Shell With Substitute User And Group IDs99
sudo – Execute A Command As Another User101
Ubuntu And sudo101
chown – Change File Owner And Group102
chgrp – Change Group Ownership103
Exercising Our Privileges103
Changing Your Password106
Summing Up107
Further Reading107

## 10 – Processes108
How A Process Works108
Viewing Processes109
Viewing Processes Dynamically With top111
Controlling Processes113
Interrupting A Process114
Putting A Process In The Background114
Returning A Process To The Foreground115
Stopping (Pausing) A Process116
Signals117
Sending Signals To Processes With kill117
Sending Signals To Multiple Processes With killall120
More Process Related Commands120
Summing Up121

# Part 2 – Configuration And The Environment123

# Part 3 – Common Tasks And Essential Tools

# Part 4 – Writing Shell Scripts

set nocompatible " be iMproved, required
filetype off " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim'

Bundle 'gabrielelana/vim-markdown'
Plugin 'xolox/vim-misc'
Plugin 'xolox/vim-shell'

" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line


"code from default vimrc file *************************
set nocompatible
source $VIMRUNTIME/vimrc_example.vim

" from https://groups.yahoo.com/neo/groups/vim/conversations/messages/128040
" remove the FileType autocommands for filetype text, i.e. textwidth=78 in vimrc_example.vim
autocmd! vimrcEx FileType text

source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let eq = ''
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd'
let cmd = '"' . $VIMRUNTIME . '\diff"'
let eq = '""'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction

"User Preferences *************************

" only do this part when compiled with support for autocommands.
if has("autocmd")
"if 0
" set filetype markdown
autocmd BufRead,BufNewFile
\ {*.md,*.txt}
\ setlocal filetype=markdown
endif
This is a weird bug.

When the attached test_vim.txt file is opened in Vim, and scrolled down to line 372, Vim hangs and consumes 24% of CPU.
This only happens with the attached vimrc and test_vim.txt. All other files I tried work nice with the attached vimrc.

The test_vim.txt file works nice if it is:

* opened in less

* opened in vi

* opened in Vim with the last 7 lines of the attached vimrc commented

The test_vim.txt file also works nice if a blank line is inserted on line 372 like this:

FILE_CONTENT FILE_CONTENT FILE_CONTENT

http://www.linux4windows.com/Articles/linux_concepts_for_beginners5.html

The attached test_vim.txt file is 504 lines long.
I have reproduced the bug by copying lines 360 to line 375 into a new file, but it only hangs for a couple seconds. And does not hang if the last 7 lines of the vimrc are commented.

I am running Vim version 7.4.6.40 on Linux Fedora 22 on hardware Haswell Intel NUC Kit D54250WYK.

Thank you.

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment