开发者

Vim: insert text from a file at current cursor position

开发者 https://www.devze.com 2023-02-09 23:54 出处:网络
To insert text from a file in the current Vim buffer I use :r filename to insert the开发者_Go百科 text below the cursor or :0r filename to insert in the first line.

To insert text from a file in the current Vim buffer I use :r filename to insert the开发者_Go百科 text below the cursor or :0r filename to insert in the first line.

How do you insert the contents of a file where [Cursor] is located?

Actual line with some coding [Cursor]  // TODO for later version  
Line below actual line ...


This inserts the contents of the file whose path is at the cursor position:

:r <cfile>


Insert a line break, read the file, and then take out the line break...


I propose Ctrl-R Ctrl-O = join(readfile('filename','b'), "\n")

Other solution:

Possibly open the other file in another window, use :%yh (h is a register name) and in your original file, in normal mode use "hp or "hP or in insert mode, Ctrl-R Ctrl-O h


To expand on the accepted answer with actual code, since I tried the suggestion and it worked nicely;

Here is an example of it working to insert a little php snippet:

`nnoremap <leader>php a<CR><ESC>:.-1read $SNIPPETS/php<CR>I<BS><ESC>j0i<BS><ESC>l`

In general the syntax is

`nnoremap [KEY SEQUENCE] a<CR><ESC>:.-1read [FILE PATH]<CR>I<BS><ESC>j0i<BS><ESC>l`

Just to break it down:

nnoremap : I'm about to define a new key mapping for normal mode

<leader>php : I would like to trigger the command sequence when this key combination is pressed. In my case <leader> is , so I type ,php to trigger the command.

Now for the command, bit by bit:

a<CR><ESC> : go into insert mode (after the cursor), insert a line break, go back into normal mode.

:.-1read <file><CR> : this enters the desired file on the line above the current line.

I<BS><ESC> : jump to the start of the line, delete line break, return to normal mode.

j0i<BS><ESC>l : Go down one line (to the remainder of the line that you were initially on), jump to the start, enter insert mode, delete the line break, return to normal mode.

l : position the cursor to the right of the pasted file (this just made the command work more like how you expect it to).


note

You have a choice of whether to paste before or after the cursor. I have chosen in this example to paste after the cursor because that is how the p command usually works to paste yanked text. Alternately, to paste before the cursor you should change the a at the start of the command to an i. You could use one of these exclusively, or you could bind them both to different but related key sequences. For example:

`nnoremap <leader>php i<CR><ESC>:.-1read $SNIPPETS/php<CR>I<BS><ESC>j0i<BS><ESC>l`

Could paste text before the cursor,

and :

`nnoremap <leader><leader>php a<CR><ESC>:.-1read $SNIPPETS/php<CR>I<BS><ESC>j0i<BS><ESC>l`

could paste text after the cursor. Or vice versa. I have made 'before the cursor' easier to trigger because I use it more often when pasting in-line.


other note

This solution is mainly useful if you're reading from a file that you expect to use often enough that it's worthwhile setting up a key mapping for it (ie reading a snippet from a file). This doesn't really help if you just want to read in a random files whenever since you won't have the key mapping ready.

Since it is very formulaic, I'm sure it would be possible to define a function that would take the file name as an argument and do the same thing though. I've never written a function in vimscript though so if someone who knows more feels like editing this answer to contain that solution - I urge them to do so!


" put this in your ~/.vimrc
" in insert mode press ,n
"
imap ,n <c-r>=expand("%:p")<cr>

Read more in wikia.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号